1 line
1.2 MiB
1 line
1.2 MiB
{"version":3,"file":"xterm.js","mappings":"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C,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KA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","sources":["webpack://xterm/webpack/universalModuleDefinition","webpack://xterm/./src/browser/AccessibilityManager.ts","webpack://xterm/./src/browser/Clipboard.ts","webpack://xterm/./src/browser/ColorContrastCache.ts","webpack://xterm/./src/browser/ColorManager.ts","webpack://xterm/./src/browser/Dom.ts","webpack://xterm/./src/browser/Lifecycle.ts","webpack://xterm/./src/browser/Linkifier.ts","webpack://xterm/./src/browser/Linkifier2.ts","webpack://xterm/./src/browser/LocalizableStrings.ts","webpack://xterm/./src/browser/MouseZoneManager.ts","webpack://xterm/./src/browser/RenderDebouncer.ts","webpack://xterm/./src/browser/ScreenDprMonitor.ts","webpack://xterm/./src/browser/Terminal.ts","webpack://xterm/./src/browser/TimeBasedDebouncer.ts","webpack://xterm/./src/browser/Viewport.ts","webpack://xterm/./src/browser/decorations/BufferDecorationRenderer.ts","webpack://xterm/./src/browser/decorations/ColorZoneStore.ts","webpack://xterm/./src/browser/decorations/OverviewRulerRenderer.ts","webpack://xterm/./src/browser/input/CompositionHelper.ts","webpack://xterm/./src/browser/input/Mouse.ts","webpack://xterm/./src/browser/input/MoveToCell.ts","webpack://xterm/./src/browser/public/Terminal.ts","webpack://xterm/./src/browser/renderer/BaseRenderLayer.ts","webpack://xterm/./src/browser/renderer/CursorRenderLayer.ts","webpack://xterm/./src/browser/renderer/CustomGlyphs.ts","webpack://xterm/./src/browser/renderer/GridCache.ts","webpack://xterm/./src/browser/renderer/LinkRenderLayer.ts","webpack://xterm/./src/browser/renderer/Renderer.ts","webpack://xterm/./src/browser/renderer/RendererUtils.ts","webpack://xterm/./src/browser/renderer/SelectionRenderLayer.ts","webpack://xterm/./src/browser/renderer/TextRenderLayer.ts","webpack://xterm/./src/browser/renderer/atlas/BaseCharAtlas.ts","webpack://xterm/./src/browser/renderer/atlas/CharAtlasCache.ts","webpack://xterm/./src/browser/renderer/atlas/CharAtlasUtils.ts","webpack://xterm/./src/browser/renderer/atlas/Constants.ts","webpack://xterm/./src/browser/renderer/atlas/DynamicCharAtlas.ts","webpack://xterm/./src/browser/renderer/atlas/LRUMap.ts","webpack://xterm/./src/browser/renderer/dom/DomRenderer.ts","webpack://xterm/./src/browser/renderer/dom/DomRendererRowFactory.ts","webpack://xterm/./src/browser/selection/SelectionModel.ts","webpack://xterm/./src/browser/services/CharSizeService.ts","webpack://xterm/./src/browser/services/CharacterJoinerService.ts","webpack://xterm/./src/browser/services/CoreBrowserService.ts","webpack://xterm/./src/browser/services/MouseService.ts","webpack://xterm/./src/browser/services/RenderService.ts","webpack://xterm/./src/browser/services/SelectionService.ts","webpack://xterm/./src/browser/services/Services.ts","webpack://xterm/./src/browser/services/SoundService.ts","webpack://xterm/./src/common/CircularList.ts","webpack://xterm/./src/common/Clone.ts","webpack://xterm/./src/common/Color.ts","webpack://xterm/./src/common/CoreTerminal.ts","webpack://xterm/./src/common/EventEmitter.ts","webpack://xterm/./src/common/InputHandler.ts","webpack://xterm/./src/common/Lifecycle.ts","webpack://xterm/./src/common/Platform.ts","webpack://xterm/./src/common/SortedList.ts","webpack://xterm/./src/common/TypedArrayUtils.ts","webpack://xterm/./src/common/WindowsMode.ts","webpack://xterm/./src/common/buffer/AttributeData.ts","webpack://xterm/./src/common/buffer/Buffer.ts","webpack://xterm/./src/common/buffer/BufferLine.ts","webpack://xterm/./src/common/buffer/BufferRange.ts","webpack://xterm/./src/common/buffer/BufferReflow.ts","webpack://xterm/./src/common/buffer/BufferSet.ts","webpack://xterm/./src/common/buffer/CellData.ts","webpack://xterm/./src/common/buffer/Constants.ts","webpack://xterm/./src/common/buffer/Marker.ts","webpack://xterm/./src/common/data/Charsets.ts","webpack://xterm/./src/common/data/EscapeSequences.ts","webpack://xterm/./src/common/input/Keyboard.ts","webpack://xterm/./src/common/input/TextDecoder.ts","webpack://xterm/./src/common/input/UnicodeV6.ts","webpack://xterm/./src/common/input/WriteBuffer.ts","webpack://xterm/./src/common/input/XParseColor.ts","webpack://xterm/./src/common/parser/Constants.ts","webpack://xterm/./src/common/parser/DcsParser.ts","webpack://xterm/./src/common/parser/EscapeSequenceParser.ts","webpack://xterm/./src/common/parser/OscParser.ts","webpack://xterm/./src/common/parser/Params.ts","webpack://xterm/./src/common/public/AddonManager.ts","webpack://xterm/./src/common/public/BufferApiView.ts","webpack://xterm/./src/common/public/BufferLineApiView.ts","webpack://xterm/./src/common/public/BufferNamespaceApi.ts","webpack://xterm/./src/common/public/ParserApi.ts","webpack://xterm/./src/common/public/UnicodeApi.ts","webpack://xterm/./src/common/services/BufferService.ts","webpack://xterm/./src/common/services/CharsetService.ts","webpack://xterm/./src/common/services/CoreMouseService.ts","webpack://xterm/./src/common/services/CoreService.ts","webpack://xterm/./src/common/services/DecorationService.ts","webpack://xterm/./src/common/services/DirtyRowService.ts","webpack://xterm/./src/common/services/InstantiationService.ts","webpack://xterm/./src/common/services/LogService.ts","webpack://xterm/./src/common/services/OptionsService.ts","webpack://xterm/./src/common/services/ServiceRegistry.ts","webpack://xterm/./src/common/services/Services.ts","webpack://xterm/./src/common/services/UnicodeService.ts","webpack://xterm/webpack/bootstrap","webpack://xterm/webpack/startup"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse {\n\t\tvar a = factory();\n\t\tfor(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];\n\t}\n})(self, function() {\nreturn ","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport * as Strings from 'browser/LocalizableStrings';\nimport { ITerminal, IRenderDebouncer } from 'browser/Types';\nimport { IBuffer } from 'common/buffer/Types';\nimport { isMac } from 'common/Platform';\nimport { TimeBasedDebouncer } from 'browser/TimeBasedDebouncer';\nimport { addDisposableDomListener } from 'browser/Lifecycle';\nimport { Disposable } from 'common/Lifecycle';\nimport { ScreenDprMonitor } from 'browser/ScreenDprMonitor';\nimport { IRenderService } from 'browser/services/Services';\nimport { removeElementFromParent } from 'browser/Dom';\n\nconst MAX_ROWS_TO_READ = 20;\n\nconst enum BoundaryPosition {\n TOP,\n BOTTOM\n}\n\nexport class AccessibilityManager extends Disposable {\n private _accessibilityTreeRoot: HTMLElement;\n private _rowContainer: HTMLElement;\n private _rowElements: HTMLElement[];\n private _liveRegion: HTMLElement;\n private _liveRegionLineCount: number = 0;\n\n private _renderRowsDebouncer: IRenderDebouncer;\n private _screenDprMonitor: ScreenDprMonitor;\n\n private _topBoundaryFocusListener: (e: FocusEvent) => void;\n private _bottomBoundaryFocusListener: (e: FocusEvent) => void;\n\n /**\n * This queue has a character pushed to it for keys that are pressed, if the\n * next character added to the terminal is equal to the key char then it is\n * not announced (added to live region) because it has already been announced\n * by the textarea event (which cannot be canceled). There are some race\n * condition cases if there is typing while data is streaming, but this covers\n * the main case of typing into the prompt and inputting the answer to a\n * question (Y/N, etc.).\n */\n private _charsToConsume: string[] = [];\n\n private _charsToAnnounce: string = '';\n\n constructor(\n private readonly _terminal: ITerminal,\n private readonly _renderService: IRenderService\n ) {\n super();\n this._accessibilityTreeRoot = document.createElement('div');\n this._accessibilityTreeRoot.classList.add('xterm-accessibility');\n this._accessibilityTreeRoot.tabIndex = 0;\n\n this._rowContainer = document.createElement('div');\n this._rowContainer.setAttribute('role', 'list');\n this._rowContainer.classList.add('xterm-accessibility-tree');\n this._rowElements = [];\n for (let i = 0; i < this._terminal.rows; i++) {\n this._rowElements[i] = this._createAccessibilityTreeNode();\n this._rowContainer.appendChild(this._rowElements[i]);\n }\n\n this._topBoundaryFocusListener = e => this._onBoundaryFocus(e, BoundaryPosition.TOP);\n this._bottomBoundaryFocusListener = e => this._onBoundaryFocus(e, BoundaryPosition.BOTTOM);\n this._rowElements[0].addEventListener('focus', this._topBoundaryFocusListener);\n this._rowElements[this._rowElements.length - 1].addEventListener('focus', this._bottomBoundaryFocusListener);\n\n this._refreshRowsDimensions();\n this._accessibilityTreeRoot.appendChild(this._rowContainer);\n\n this._renderRowsDebouncer = new TimeBasedDebouncer(this._renderRows.bind(this));\n this._refreshRows();\n\n this._liveRegion = document.createElement('div');\n this._liveRegion.classList.add('live-region');\n this._liveRegion.setAttribute('aria-live', 'assertive');\n this._accessibilityTreeRoot.appendChild(this._liveRegion);\n\n if (!this._terminal.element) {\n throw new Error('Cannot enable accessibility before Terminal.open');\n }\n this._terminal.element.insertAdjacentElement('afterbegin', this._accessibilityTreeRoot);\n\n this.register(this._renderRowsDebouncer);\n this.register(this._terminal.onResize(e => this._onResize(e.rows)));\n this.register(this._terminal.onRender(e => this._refreshRows(e.start, e.end)));\n this.register(this._terminal.onScroll(() => this._refreshRows()));\n // Line feed is an issue as the prompt won't be read out after a command is run\n this.register(this._terminal.onA11yChar(char => this._onChar(char)));\n this.register(this._terminal.onLineFeed(() => this._onChar('\\n')));\n this.register(this._terminal.onA11yTab(spaceCount => this._onTab(spaceCount)));\n this.register(this._terminal.onKey(e => this._onKey(e.key)));\n this.register(this._terminal.onBlur(() => this._clearLiveRegion()));\n this.register(this._renderService.onDimensionsChange(() => this._refreshRowsDimensions()));\n\n this._screenDprMonitor = new ScreenDprMonitor();\n this.register(this._screenDprMonitor);\n this._screenDprMonitor.setListener(() => this._refreshRowsDimensions());\n // This shouldn't be needed on modern browsers but is present in case the\n // media query that drives the ScreenDprMonitor isn't supported\n this.register(addDisposableDomListener(window, 'resize', () => this._refreshRowsDimensions()));\n }\n\n public dispose(): void {\n super.dispose();\n removeElementFromParent(this._accessibilityTreeRoot);\n this._rowElements.length = 0;\n }\n\n private _onBoundaryFocus(e: FocusEvent, position: BoundaryPosition): void {\n const boundaryElement = e.target as HTMLElement;\n const beforeBoundaryElement = this._rowElements[position === BoundaryPosition.TOP ? 1 : this._rowElements.length - 2];\n\n // Don't scroll if the buffer top has reached the end in that direction\n const posInSet = boundaryElement.getAttribute('aria-posinset');\n const lastRowPos = position === BoundaryPosition.TOP ? '1' : `${this._terminal.buffer.lines.length}`;\n if (posInSet === lastRowPos) {\n return;\n }\n\n // Don't scroll when the last focused item was not the second row (focus is going the other\n // direction)\n if (e.relatedTarget !== beforeBoundaryElement) {\n return;\n }\n\n // Remove old boundary element from array\n let topBoundaryElement: HTMLElement;\n let bottomBoundaryElement: HTMLElement;\n if (position === BoundaryPosition.TOP) {\n topBoundaryElement = boundaryElement;\n bottomBoundaryElement = this._rowElements.pop()!;\n this._rowContainer.removeChild(bottomBoundaryElement);\n } else {\n topBoundaryElement = this._rowElements.shift()!;\n bottomBoundaryElement = boundaryElement;\n this._rowContainer.removeChild(topBoundaryElement);\n }\n\n // Remove listeners from old boundary elements\n topBoundaryElement.removeEventListener('focus', this._topBoundaryFocusListener);\n bottomBoundaryElement.removeEventListener('focus', this._bottomBoundaryFocusListener);\n\n // Add new element to array/DOM\n if (position === BoundaryPosition.TOP) {\n const newElement = this._createAccessibilityTreeNode();\n this._rowElements.unshift(newElement);\n this._rowContainer.insertAdjacentElement('afterbegin', newElement);\n } else {\n const newElement = this._createAccessibilityTreeNode();\n this._rowElements.push(newElement);\n this._rowContainer.appendChild(newElement);\n }\n\n // Add listeners to new boundary elements\n this._rowElements[0].addEventListener('focus', this._topBoundaryFocusListener);\n this._rowElements[this._rowElements.length - 1].addEventListener('focus', this._bottomBoundaryFocusListener);\n\n // Scroll up\n this._terminal.scrollLines(position === BoundaryPosition.TOP ? -1 : 1);\n\n // Focus new boundary before element\n this._rowElements[position === BoundaryPosition.TOP ? 1 : this._rowElements.length - 2].focus();\n\n // Prevent the standard behavior\n e.preventDefault();\n e.stopImmediatePropagation();\n }\n\n private _onResize(rows: number): void {\n // Remove bottom boundary listener\n this._rowElements[this._rowElements.length - 1].removeEventListener('focus', this._bottomBoundaryFocusListener);\n\n // Grow rows as required\n for (let i = this._rowContainer.children.length; i < this._terminal.rows; i++) {\n this._rowElements[i] = this._createAccessibilityTreeNode();\n this._rowContainer.appendChild(this._rowElements[i]);\n }\n // Shrink rows as required\n while (this._rowElements.length > rows) {\n this._rowContainer.removeChild(this._rowElements.pop()!);\n }\n\n // Add bottom boundary listener\n this._rowElements[this._rowElements.length - 1].addEventListener('focus', this._bottomBoundaryFocusListener);\n\n this._refreshRowsDimensions();\n }\n\n private _createAccessibilityTreeNode(): HTMLElement {\n const element = document.createElement('div');\n element.setAttribute('role', 'listitem');\n element.tabIndex = -1;\n this._refreshRowDimensions(element);\n return element;\n }\n\n private _onTab(spaceCount: number): void {\n for (let i = 0; i < spaceCount; i++) {\n this._onChar(' ');\n }\n }\n\n private _onChar(char: string): void {\n if (this._liveRegionLineCount < MAX_ROWS_TO_READ + 1) {\n if (this._charsToConsume.length > 0) {\n // Have the screen reader ignore the char if it was just input\n const shiftedChar = this._charsToConsume.shift();\n if (shiftedChar !== char) {\n this._charsToAnnounce += char;\n }\n } else {\n this._charsToAnnounce += char;\n }\n\n if (char === '\\n') {\n this._liveRegionLineCount++;\n if (this._liveRegionLineCount === MAX_ROWS_TO_READ + 1) {\n this._liveRegion.textContent += Strings.tooMuchOutput;\n }\n }\n\n // Only detach/attach on mac as otherwise messages can go unaccounced\n if (isMac) {\n if (this._liveRegion.textContent && this._liveRegion.textContent.length > 0 && !this._liveRegion.parentNode) {\n setTimeout(() => {\n this._accessibilityTreeRoot.appendChild(this._liveRegion);\n }, 0);\n }\n }\n }\n }\n\n private _clearLiveRegion(): void {\n this._liveRegion.textContent = '';\n this._liveRegionLineCount = 0;\n\n // Only detach/attach on mac as otherwise messages can go unaccounced\n if (isMac) {\n removeElementFromParent(this._liveRegion);\n }\n }\n\n private _onKey(keyChar: string): void {\n this._clearLiveRegion();\n this._charsToConsume.push(keyChar);\n }\n\n private _refreshRows(start?: number, end?: number): void {\n this._renderRowsDebouncer.refresh(start, end, this._terminal.rows);\n }\n\n private _renderRows(start: number, end: number): void {\n const buffer: IBuffer = this._terminal.buffer;\n const setSize = buffer.lines.length.toString();\n for (let i = start; i <= end; i++) {\n const lineData = buffer.translateBufferLineToString(buffer.ydisp + i, true);\n const posInSet = (buffer.ydisp + i + 1).toString();\n const element = this._rowElements[i];\n if (element) {\n if (lineData.length === 0) {\n element.innerText = '\\u00a0';\n } else {\n element.textContent = lineData;\n }\n element.setAttribute('aria-posinset', posInSet);\n element.setAttribute('aria-setsize', setSize);\n }\n }\n this._announceCharacters();\n }\n\n private _refreshRowsDimensions(): void {\n if (!this._renderService.dimensions.actualCellHeight) {\n return;\n }\n if (this._rowElements.length !== this._terminal.rows) {\n this._onResize(this._terminal.rows);\n }\n for (let i = 0; i < this._terminal.rows; i++) {\n this._refreshRowDimensions(this._rowElements[i]);\n }\n }\n\n private _refreshRowDimensions(element: HTMLElement): void {\n element.style.height = `${this._renderService.dimensions.actualCellHeight}px`;\n }\n\n private _announceCharacters(): void {\n if (this._charsToAnnounce.length === 0) {\n return;\n }\n this._liveRegion.textContent += this._charsToAnnounce;\n this._charsToAnnounce = '';\n }\n}\n","/**\n * Copyright (c) 2016 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ISelectionService } from 'browser/services/Services';\nimport { ICoreService } from 'common/services/Services';\n\n/**\n * Prepares text to be pasted into the terminal by normalizing the line endings\n * @param text The pasted text that needs processing before inserting into the terminal\n */\nexport function prepareTextForTerminal(text: string): string {\n return text.replace(/\\r?\\n/g, '\\r');\n}\n\n/**\n * Bracket text for paste, if necessary, as per https://cirw.in/blog/bracketed-paste\n * @param text The pasted text to bracket\n */\nexport function bracketTextForPaste(text: string, bracketedPasteMode: boolean): string {\n if (bracketedPasteMode) {\n return '\\x1b[200~' + text + '\\x1b[201~';\n }\n return text;\n}\n\n/**\n * Binds copy functionality to the given terminal.\n * @param ev The original copy event to be handled\n */\nexport function copyHandler(ev: ClipboardEvent, selectionService: ISelectionService): void {\n if (ev.clipboardData) {\n ev.clipboardData.setData('text/plain', selectionService.selectionText);\n }\n // Prevent or the original text will be copied.\n ev.preventDefault();\n}\n\n/**\n * Redirect the clipboard's data to the terminal's input handler.\n * @param ev The original paste event to be handled\n * @param term The terminal on which to apply the handled paste event\n */\nexport function handlePasteEvent(ev: ClipboardEvent, textarea: HTMLTextAreaElement, coreService: ICoreService): void {\n ev.stopPropagation();\n if (ev.clipboardData) {\n const text = ev.clipboardData.getData('text/plain');\n paste(text, textarea, coreService);\n }\n}\n\nexport function paste(text: string, textarea: HTMLTextAreaElement, coreService: ICoreService): void {\n text = prepareTextForTerminal(text);\n text = bracketTextForPaste(text, coreService.decPrivateModes.bracketedPasteMode);\n coreService.triggerDataEvent(text, true);\n textarea.value = '';\n}\n\n/**\n * Moves the textarea under the mouse cursor and focuses it.\n * @param ev The original right click event to be handled.\n * @param textarea The terminal's textarea.\n */\nexport function moveTextAreaUnderMouseCursor(ev: MouseEvent, textarea: HTMLTextAreaElement, screenElement: HTMLElement): void {\n\n // Calculate textarea position relative to the screen element\n const pos = screenElement.getBoundingClientRect();\n const left = ev.clientX - pos.left - 10;\n const top = ev.clientY - pos.top - 10;\n\n // Bring textarea at the cursor position\n textarea.style.width = '20px';\n textarea.style.height = '20px';\n textarea.style.left = `${left}px`;\n textarea.style.top = `${top}px`;\n textarea.style.zIndex = '1000';\n\n textarea.focus();\n}\n\n/**\n * Bind to right-click event and allow right-click copy and paste.\n * @param ev The original right click event to be handled.\n * @param textarea The terminal's textarea.\n * @param selectionService The terminal's selection manager.\n * @param shouldSelectWord If true and there is no selection the current word will be selected\n */\nexport function rightClickHandler(ev: MouseEvent, textarea: HTMLTextAreaElement, screenElement: HTMLElement, selectionService: ISelectionService, shouldSelectWord: boolean): void {\n moveTextAreaUnderMouseCursor(ev, textarea, screenElement);\n\n if (shouldSelectWord) {\n selectionService.rightClickSelect(ev);\n }\n\n // Get textarea ready to copy from the context menu\n textarea.value = selectionService.selectionText;\n textarea.select();\n}\n","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IColorContrastCache } from 'browser/Types';\nimport { IColor } from 'common/Types';\n\nexport class ColorContrastCache implements IColorContrastCache {\n private _color: { [bg: number]: { [fg: number]: IColor | null | undefined } | undefined } = {};\n private _rgba: { [bg: number]: { [fg: number]: string | null | undefined } | undefined } = {};\n\n public clear(): void {\n this._color = {};\n this._rgba = {};\n }\n\n public setCss(bg: number, fg: number, value: string | null): void {\n if (!this._rgba[bg]) {\n this._rgba[bg] = {};\n }\n this._rgba[bg]![fg] = value;\n }\n\n public getCss(bg: number, fg: number): string | null | undefined {\n return this._rgba[bg] ? this._rgba[bg]![fg] : undefined;\n }\n\n public setColor(bg: number, fg: number, value: IColor | null): void {\n if (!this._color[bg]) {\n this._color[bg] = {};\n }\n this._color[bg]![fg] = value;\n }\n\n public getColor(bg: number, fg: number): IColor | null | undefined {\n return this._color[bg] ? this._color[bg]![fg] : undefined;\n }\n}\n","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IColorManager, IColorSet, IColorContrastCache } from 'browser/Types';\nimport { ITheme } from 'common/services/Services';\nimport { channels, color, css } from 'common/Color';\nimport { ColorContrastCache } from 'browser/ColorContrastCache';\nimport { ColorIndex, IColor } from 'common/Types';\n\n\ninterface IRestoreColorSet {\n foreground: IColor;\n background: IColor;\n cursor: IColor;\n ansi: IColor[];\n}\n\n\nconst DEFAULT_FOREGROUND = css.toColor('#ffffff');\nconst DEFAULT_BACKGROUND = css.toColor('#000000');\nconst DEFAULT_CURSOR = css.toColor('#ffffff');\nconst DEFAULT_CURSOR_ACCENT = css.toColor('#000000');\nconst DEFAULT_SELECTION = {\n css: 'rgba(255, 255, 255, 0.3)',\n rgba: 0xFFFFFF4D\n};\n\n// An IIFE to generate DEFAULT_ANSI_COLORS.\nexport const DEFAULT_ANSI_COLORS = Object.freeze((() => {\n const colors = [\n // dark:\n css.toColor('#2e3436'),\n css.toColor('#cc0000'),\n css.toColor('#4e9a06'),\n css.toColor('#c4a000'),\n css.toColor('#3465a4'),\n css.toColor('#75507b'),\n css.toColor('#06989a'),\n css.toColor('#d3d7cf'),\n // bright:\n css.toColor('#555753'),\n css.toColor('#ef2929'),\n css.toColor('#8ae234'),\n css.toColor('#fce94f'),\n css.toColor('#729fcf'),\n css.toColor('#ad7fa8'),\n css.toColor('#34e2e2'),\n css.toColor('#eeeeec')\n ];\n\n // Fill in the remaining 240 ANSI colors.\n // Generate colors (16-231)\n const v = [0x00, 0x5f, 0x87, 0xaf, 0xd7, 0xff];\n for (let i = 0; i < 216; i++) {\n const r = v[(i / 36) % 6 | 0];\n const g = v[(i / 6) % 6 | 0];\n const b = v[i % 6];\n colors.push({\n css: channels.toCss(r, g, b),\n rgba: channels.toRgba(r, g, b)\n });\n }\n\n // Generate greys (232-255)\n for (let i = 0; i < 24; i++) {\n const c = 8 + i * 10;\n colors.push({\n css: channels.toCss(c, c, c),\n rgba: channels.toRgba(c, c, c)\n });\n }\n\n return colors;\n})());\n\n/**\n * Manages the source of truth for a terminal's colors.\n */\nexport class ColorManager implements IColorManager {\n public colors: IColorSet;\n private _ctx: CanvasRenderingContext2D;\n private _litmusColor: CanvasGradient;\n private _contrastCache: IColorContrastCache;\n private _restoreColors!: IRestoreColorSet;\n\n constructor(document: Document, public allowTransparency: boolean) {\n const canvas = document.createElement('canvas');\n canvas.width = 1;\n canvas.height = 1;\n const ctx = canvas.getContext('2d');\n if (!ctx) {\n throw new Error('Could not get rendering context');\n }\n this._ctx = ctx;\n this._ctx.globalCompositeOperation = 'copy';\n this._litmusColor = this._ctx.createLinearGradient(0, 0, 1, 1);\n this._contrastCache = new ColorContrastCache();\n this.colors = {\n foreground: DEFAULT_FOREGROUND,\n background: DEFAULT_BACKGROUND,\n cursor: DEFAULT_CURSOR,\n cursorAccent: DEFAULT_CURSOR_ACCENT,\n selectionTransparent: DEFAULT_SELECTION,\n selectionOpaque: color.blend(DEFAULT_BACKGROUND, DEFAULT_SELECTION),\n selectionForeground: undefined,\n ansi: DEFAULT_ANSI_COLORS.slice(),\n contrastCache: this._contrastCache\n };\n this._updateRestoreColors();\n }\n\n public onOptionsChange(key: string): void {\n if (key === 'minimumContrastRatio') {\n this._contrastCache.clear();\n }\n }\n\n /**\n * Sets the terminal's theme.\n * @param theme The theme to use. If a partial theme is provided then default\n * colors will be used where colors are not defined.\n */\n public setTheme(theme: ITheme = {}): void {\n this.colors.foreground = this._parseColor(theme.foreground, DEFAULT_FOREGROUND);\n this.colors.background = this._parseColor(theme.background, DEFAULT_BACKGROUND);\n this.colors.cursor = this._parseColor(theme.cursor, DEFAULT_CURSOR, true);\n this.colors.cursorAccent = this._parseColor(theme.cursorAccent, DEFAULT_CURSOR_ACCENT, true);\n this.colors.selectionTransparent = this._parseColor(theme.selection, DEFAULT_SELECTION, true);\n this.colors.selectionOpaque = color.blend(this.colors.background, this.colors.selectionTransparent);\n const nullColor: IColor = {\n css: '',\n rgba: 0\n };\n this.colors.selectionForeground = theme.selectionForeground ? this._parseColor(theme.selectionForeground, nullColor) : undefined;\n if (this.colors.selectionForeground === nullColor) {\n this.colors.selectionForeground = undefined;\n }\n\n /**\n * If selection color is opaque, blend it with background with 0.3 opacity\n * Issue #2737\n */\n if (color.isOpaque(this.colors.selectionTransparent)) {\n const opacity = 0.3;\n this.colors.selectionTransparent = color.opacity(this.colors.selectionTransparent, opacity);\n }\n this.colors.ansi[0] = this._parseColor(theme.black, DEFAULT_ANSI_COLORS[0]);\n this.colors.ansi[1] = this._parseColor(theme.red, DEFAULT_ANSI_COLORS[1]);\n this.colors.ansi[2] = this._parseColor(theme.green, DEFAULT_ANSI_COLORS[2]);\n this.colors.ansi[3] = this._parseColor(theme.yellow, DEFAULT_ANSI_COLORS[3]);\n this.colors.ansi[4] = this._parseColor(theme.blue, DEFAULT_ANSI_COLORS[4]);\n this.colors.ansi[5] = this._parseColor(theme.magenta, DEFAULT_ANSI_COLORS[5]);\n this.colors.ansi[6] = this._parseColor(theme.cyan, DEFAULT_ANSI_COLORS[6]);\n this.colors.ansi[7] = this._parseColor(theme.white, DEFAULT_ANSI_COLORS[7]);\n this.colors.ansi[8] = this._parseColor(theme.brightBlack, DEFAULT_ANSI_COLORS[8]);\n this.colors.ansi[9] = this._parseColor(theme.brightRed, DEFAULT_ANSI_COLORS[9]);\n this.colors.ansi[10] = this._parseColor(theme.brightGreen, DEFAULT_ANSI_COLORS[10]);\n this.colors.ansi[11] = this._parseColor(theme.brightYellow, DEFAULT_ANSI_COLORS[11]);\n this.colors.ansi[12] = this._parseColor(theme.brightBlue, DEFAULT_ANSI_COLORS[12]);\n this.colors.ansi[13] = this._parseColor(theme.brightMagenta, DEFAULT_ANSI_COLORS[13]);\n this.colors.ansi[14] = this._parseColor(theme.brightCyan, DEFAULT_ANSI_COLORS[14]);\n this.colors.ansi[15] = this._parseColor(theme.brightWhite, DEFAULT_ANSI_COLORS[15]);\n // Clear our the cache\n this._contrastCache.clear();\n this._updateRestoreColors();\n }\n\n public restoreColor(slot?: ColorIndex): void {\n // unset slot restores all ansi colors\n if (slot === undefined) {\n for (let i = 0; i < this._restoreColors.ansi.length; ++i) {\n this.colors.ansi[i] = this._restoreColors.ansi[i];\n }\n return;\n }\n switch (slot) {\n case ColorIndex.FOREGROUND:\n this.colors.foreground = this._restoreColors.foreground;\n break;\n case ColorIndex.BACKGROUND:\n this.colors.background = this._restoreColors.background;\n break;\n case ColorIndex.CURSOR:\n this.colors.cursor = this._restoreColors.cursor;\n break;\n default:\n this.colors.ansi[slot] = this._restoreColors.ansi[slot];\n }\n }\n\n private _updateRestoreColors(): void {\n this._restoreColors = {\n foreground: this.colors.foreground,\n background: this.colors.background,\n cursor: this.colors.cursor,\n ansi: this.colors.ansi.slice()\n };\n }\n\n private _parseColor(\n css: string | undefined,\n fallback: IColor,\n allowTransparency: boolean = this.allowTransparency\n ): IColor {\n if (css === undefined) {\n return fallback;\n }\n\n // If parsing the value results in failure, then it must be ignored, and the attribute must\n // retain its previous value.\n // -- https://html.spec.whatwg.org/multipage/canvas.html#fill-and-stroke-styles\n this._ctx.fillStyle = this._litmusColor;\n this._ctx.fillStyle = css;\n if (typeof this._ctx.fillStyle !== 'string') {\n console.warn(`Color: ${css} is invalid using fallback ${fallback.css}`);\n return fallback;\n }\n\n this._ctx.fillRect(0, 0, 1, 1);\n const data = this._ctx.getImageData(0, 0, 1, 1).data;\n\n // Check if the printed color was transparent\n if (data[3] !== 0xFF) {\n if (!allowTransparency) {\n // Ideally we'd just ignore the alpha channel, but...\n //\n // Browsers may not give back exactly the same RGB values we put in, because most/all\n // convert the color to a pre-multiplied representation. getImageData converts that back to\n // a un-premultipled representation, but the precision loss may make the RGB channels unuable\n // on their own.\n //\n // E.g. In Chrome #12345610 turns into #10305010, and in the extreme case, 0xFFFFFF00 turns\n // into 0x00000000.\n //\n // \"Note: Due to the lossy nature of converting to and from premultiplied alpha color values,\n // pixels that have just been set using putImageData() might be returned to an equivalent\n // getImageData() as different values.\"\n // -- https://html.spec.whatwg.org/multipage/canvas.html#pixel-manipulation\n //\n // So let's just use the fallback color in this case instead.\n console.warn(\n `Color: ${css} is using transparency, but allowTransparency is false. ` +\n `Using fallback ${fallback.css}.`\n );\n return fallback;\n }\n\n // https://html.spec.whatwg.org/multipage/canvas.html#serialisation-of-a-color\n // the color value has alpha less than 1.0, and the string is the color value in the CSS rgba()\n const [r, g, b, a] = this._ctx.fillStyle.substring(5, this._ctx.fillStyle.length - 1).split(',').map(component => Number(component));\n const alpha = Math.round(a * 255);\n const rgba: number = channels.toRgba(r, g, b, alpha);\n return {\n rgba,\n css\n };\n }\n\n return {\n // https://html.spec.whatwg.org/multipage/canvas.html#serialisation-of-a-color\n // if it has alpha equal to 1.0, then the string is a lowercase six-digit hex value, prefixed with a \"#\" character\n css: this._ctx.fillStyle,\n rgba: channels.toRgba(data[0], data[1], data[2], data[3])\n };\n }\n}\n","/**\n * Copyright (c) 2020 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nexport function removeElementFromParent(...elements: (HTMLElement | undefined)[]): void {\n for (const e of elements) {\n e?.parentElement?.removeChild(e);\n }\n}\n","/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IDisposable } from 'common/Types';\n\n/**\n * Adds a disposable listener to a node in the DOM, returning the disposable.\n * @param type The event type.\n * @param handler The handler for the listener.\n */\nexport function addDisposableDomListener(\n node: Element | Window | Document,\n type: string,\n handler: (e: any) => void,\n options?: boolean | AddEventListenerOptions\n): IDisposable {\n node.addEventListener(type, handler, options);\n let disposed = false;\n return {\n dispose: () => {\n if (disposed) {\n return;\n }\n disposed = true;\n node.removeEventListener(type, handler, options);\n }\n };\n}\n","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ILinkifierEvent, ILinkMatcher, LinkMatcherHandler, ILinkMatcherOptions, ILinkifier, IMouseZoneManager, IMouseZone, IRegisteredLinkMatcher } from 'browser/Types';\nimport { IBufferStringIteratorResult } from 'common/buffer/Types';\nimport { EventEmitter, IEvent } from 'common/EventEmitter';\nimport { ILogService, IBufferService, IOptionsService, IUnicodeService } from 'common/services/Services';\n\n/**\n * Limit of the unwrapping line expansion (overscan) at the top and bottom\n * of the actual viewport in ASCII characters.\n * A limit of 2000 should match most sane urls.\n */\nconst OVERSCAN_CHAR_LIMIT = 2000;\n\n/**\n * The Linkifier applies links to rows shortly after they have been refreshed.\n */\nexport class Linkifier implements ILinkifier {\n /**\n * The time to wait after a row is changed before it is linkified. This prevents\n * the costly operation of searching every row multiple times, potentially a\n * huge amount of times.\n */\n protected static _timeBeforeLatency = 200;\n\n protected _linkMatchers: IRegisteredLinkMatcher[] = [];\n\n private _mouseZoneManager: IMouseZoneManager | undefined;\n private _element: HTMLElement | undefined;\n\n private _rowsTimeoutId: number | undefined;\n private _nextLinkMatcherId = 0;\n private _rowsToLinkify: { start: number | undefined, end: number | undefined };\n\n private _onShowLinkUnderline = new EventEmitter<ILinkifierEvent>();\n public get onShowLinkUnderline(): IEvent<ILinkifierEvent> { return this._onShowLinkUnderline.event; }\n private _onHideLinkUnderline = new EventEmitter<ILinkifierEvent>();\n public get onHideLinkUnderline(): IEvent<ILinkifierEvent> { return this._onHideLinkUnderline.event; }\n private _onLinkTooltip = new EventEmitter<ILinkifierEvent>();\n public get onLinkTooltip(): IEvent<ILinkifierEvent> { return this._onLinkTooltip.event; }\n\n constructor(\n @IBufferService protected readonly _bufferService: IBufferService,\n @ILogService private readonly _logService: ILogService,\n @IUnicodeService private readonly _unicodeService: IUnicodeService\n ) {\n this._rowsToLinkify = {\n start: undefined,\n end: undefined\n };\n }\n\n /**\n * Attaches the linkifier to the DOM, enabling linkification.\n * @param mouseZoneManager The mouse zone manager to register link zones with.\n */\n public attachToDom(element: HTMLElement, mouseZoneManager: IMouseZoneManager): void {\n this._element = element;\n this._mouseZoneManager = mouseZoneManager;\n }\n\n /**\n * Queue linkification on a set of rows.\n * @param start The row to linkify from (inclusive).\n * @param end The row to linkify to (inclusive).\n */\n public linkifyRows(start: number, end: number): void {\n // Don't attempt linkify if not yet attached to DOM\n if (!this._mouseZoneManager) {\n return;\n }\n\n // Increase range to linkify\n if (this._rowsToLinkify.start === undefined || this._rowsToLinkify.end === undefined) {\n this._rowsToLinkify.start = start;\n this._rowsToLinkify.end = end;\n } else {\n this._rowsToLinkify.start = Math.min(this._rowsToLinkify.start, start);\n this._rowsToLinkify.end = Math.max(this._rowsToLinkify.end, end);\n }\n\n // Clear out any existing links on this row range\n this._mouseZoneManager.clearAll(start, end);\n\n // Restart timer\n if (this._rowsTimeoutId) {\n clearTimeout(this._rowsTimeoutId);\n }\n\n // Cannot use window.setTimeout since tests need to run in node\n this._rowsTimeoutId = setTimeout(() => this._linkifyRows(), Linkifier._timeBeforeLatency) as any as number;\n }\n\n /**\n * Linkifies the rows requested.\n */\n private _linkifyRows(): void {\n this._rowsTimeoutId = undefined;\n const buffer = this._bufferService.buffer;\n\n if (this._rowsToLinkify.start === undefined || this._rowsToLinkify.end === undefined) {\n this._logService.debug('_rowToLinkify was unset before _linkifyRows was called');\n return;\n }\n\n // Ensure the start row exists\n const absoluteRowIndexStart = buffer.ydisp + this._rowsToLinkify.start;\n if (absoluteRowIndexStart >= buffer.lines.length) {\n return;\n }\n\n // Invalidate bad end row values (if a resize happened)\n const absoluteRowIndexEnd = buffer.ydisp + Math.min(this._rowsToLinkify.end, this._bufferService.rows) + 1;\n\n // Iterate over the range of unwrapped content strings within start..end\n // (excluding).\n // _doLinkifyRow gets full unwrapped lines with the start row as buffer offset\n // for every matcher.\n // The unwrapping is needed to also match content that got wrapped across\n // several buffer lines. To avoid a worst case scenario where the whole buffer\n // contains just a single unwrapped string we limit this line expansion beyond\n // the viewport to +OVERSCAN_CHAR_LIMIT chars (overscan) at top and bottom.\n // This comes with the tradeoff that matches longer than OVERSCAN_CHAR_LIMIT\n // chars will not match anymore at the viewport borders.\n const overscanLineLimit = Math.ceil(OVERSCAN_CHAR_LIMIT / this._bufferService.cols);\n const iterator = this._bufferService.buffer.iterator(\n false, absoluteRowIndexStart, absoluteRowIndexEnd, overscanLineLimit, overscanLineLimit);\n while (iterator.hasNext()) {\n const lineData: IBufferStringIteratorResult = iterator.next();\n for (let i = 0; i < this._linkMatchers.length; i++) {\n this._doLinkifyRow(lineData.range.first, lineData.content, this._linkMatchers[i]);\n }\n }\n\n this._rowsToLinkify.start = undefined;\n this._rowsToLinkify.end = undefined;\n }\n\n /**\n * Registers a link matcher, allowing custom link patterns to be matched and\n * handled.\n * @param regex The regular expression to search for. Specifically, this\n * searches the textContent of the rows. You will want to use \\s to match a\n * space ' ' character for example.\n * @param handler The callback when the link is called.\n * @param options Options for the link matcher.\n * @return The ID of the new matcher, this can be used to deregister.\n */\n public registerLinkMatcher(regex: RegExp, handler: LinkMatcherHandler, options: ILinkMatcherOptions = {}): number {\n if (!handler) {\n throw new Error('handler must be defined');\n }\n const matcher: IRegisteredLinkMatcher = {\n id: this._nextLinkMatcherId++,\n regex,\n handler,\n matchIndex: options.matchIndex,\n validationCallback: options.validationCallback,\n hoverTooltipCallback: options.tooltipCallback,\n hoverLeaveCallback: options.leaveCallback,\n willLinkActivate: options.willLinkActivate,\n priority: options.priority || 0\n };\n this._addLinkMatcherToList(matcher);\n return matcher.id;\n }\n\n /**\n * Inserts a link matcher to the list in the correct position based on the\n * priority of each link matcher. New link matchers of equal priority are\n * considered after older link matchers.\n * @param matcher The link matcher to be added.\n */\n private _addLinkMatcherToList(matcher: IRegisteredLinkMatcher): void {\n if (this._linkMatchers.length === 0) {\n this._linkMatchers.push(matcher);\n return;\n }\n\n for (let i = this._linkMatchers.length - 1; i >= 0; i--) {\n if (matcher.priority <= this._linkMatchers[i].priority) {\n this._linkMatchers.splice(i + 1, 0, matcher);\n return;\n }\n }\n\n this._linkMatchers.splice(0, 0, matcher);\n }\n\n /**\n * Deregisters a link matcher if it has been registered.\n * @param matcherId The link matcher's ID (returned after register)\n * @return Whether a link matcher was found and deregistered.\n */\n public deregisterLinkMatcher(matcherId: number): boolean {\n for (let i = 0; i < this._linkMatchers.length; i++) {\n if (this._linkMatchers[i].id === matcherId) {\n this._linkMatchers.splice(i, 1);\n return true;\n }\n }\n return false;\n }\n\n /**\n * Linkifies a row given a specific handler.\n * @param rowIndex The row index to linkify (absolute index).\n * @param text string content of the unwrapped row.\n * @param matcher The link matcher for this line.\n */\n private _doLinkifyRow(rowIndex: number, text: string, matcher: ILinkMatcher): void {\n // clone regex to do a global search on text\n const rex = new RegExp(matcher.regex.source, (matcher.regex.flags || '') + 'g');\n let match;\n let stringIndex = -1;\n while ((match = rex.exec(text)) !== null) {\n const uri = match[typeof matcher.matchIndex !== 'number' ? 0 : matcher.matchIndex];\n if (!uri) {\n // something matched but does not comply with the given matchIndex\n // since this is most likely a bug the regex itself we simply do nothing here\n this._logService.debug('match found without corresponding matchIndex', match, matcher);\n break;\n }\n\n // Get index, match.index is for the outer match which includes negated chars\n // therefore we cannot use match.index directly, instead we search the position\n // of the match group in text again\n // also correct regex and string search offsets for the next loop run\n stringIndex = text.indexOf(uri, stringIndex + 1);\n rex.lastIndex = stringIndex + uri.length;\n if (stringIndex < 0) {\n // invalid stringIndex (should not have happened)\n break;\n }\n\n // get the buffer index as [absolute row, col] for the match\n const bufferIndex = this._bufferService.buffer.stringIndexToBufferIndex(rowIndex, stringIndex);\n if (bufferIndex[0] < 0) {\n // invalid bufferIndex (should not have happened)\n break;\n }\n\n const line = this._bufferService.buffer.lines.get(bufferIndex[0]);\n if (!line) {\n break;\n }\n\n const attr = line.getFg(bufferIndex[1]);\n const fg = attr ? (attr >> 9) & 0x1ff : undefined;\n\n if (matcher.validationCallback) {\n matcher.validationCallback(uri, isValid => {\n // Discard link if the line has already changed\n if (this._rowsTimeoutId) {\n return;\n }\n if (isValid) {\n this._addLink(bufferIndex[1], bufferIndex[0] - this._bufferService.buffer.ydisp, uri, matcher, fg);\n }\n });\n } else {\n this._addLink(bufferIndex[1], bufferIndex[0] - this._bufferService.buffer.ydisp, uri, matcher, fg);\n }\n }\n }\n\n /**\n * Registers a link to the mouse zone manager.\n * @param x The column the link starts.\n * @param y The row the link is on.\n * @param uri The URI of the link.\n * @param matcher The link matcher for the link.\n * @param fg The link color for hover event.\n */\n private _addLink(x: number, y: number, uri: string, matcher: ILinkMatcher, fg: number | undefined): void {\n if (!this._mouseZoneManager || !this._element) {\n return;\n }\n // FIXME: get cell length from buffer to avoid mismatch after Unicode version change\n const width = this._unicodeService.getStringCellWidth(uri);\n const x1 = x % this._bufferService.cols;\n const y1 = y + Math.floor(x / this._bufferService.cols);\n let x2 = (x1 + width) % this._bufferService.cols;\n let y2 = y1 + Math.floor((x1 + width) / this._bufferService.cols);\n if (x2 === 0) {\n x2 = this._bufferService.cols;\n y2--;\n }\n\n this._mouseZoneManager.add(new MouseZone(\n x1 + 1,\n y1 + 1,\n x2 + 1,\n y2 + 1,\n e => {\n if (matcher.handler) {\n return matcher.handler(e, uri);\n }\n const newWindow = window.open();\n if (newWindow) {\n newWindow.opener = null;\n newWindow.location.href = uri;\n } else {\n console.warn('Opening link blocked as opener could not be cleared');\n }\n },\n () => {\n this._onShowLinkUnderline.fire(this._createLinkHoverEvent(x1, y1, x2, y2, fg));\n this._element!.classList.add('xterm-cursor-pointer');\n },\n e => {\n this._onLinkTooltip.fire(this._createLinkHoverEvent(x1, y1, x2, y2, fg));\n if (matcher.hoverTooltipCallback) {\n // Note that IViewportRange use 1-based coordinates to align with escape sequences such\n // as CUP which use 1,1 as the default for row/col\n matcher.hoverTooltipCallback(e, uri, { start: { x: x1, y: y1 }, end: { x: x2, y: y2 } });\n }\n },\n () => {\n this._onHideLinkUnderline.fire(this._createLinkHoverEvent(x1, y1, x2, y2, fg));\n this._element!.classList.remove('xterm-cursor-pointer');\n if (matcher.hoverLeaveCallback) {\n matcher.hoverLeaveCallback();\n }\n },\n e => {\n if (matcher.willLinkActivate) {\n return matcher.willLinkActivate(e, uri);\n }\n return true;\n }\n ));\n }\n\n private _createLinkHoverEvent(x1: number, y1: number, x2: number, y2: number, fg: number | undefined): ILinkifierEvent {\n return { x1, y1, x2, y2, cols: this._bufferService.cols, fg };\n }\n}\n\nexport class MouseZone implements IMouseZone {\n constructor(\n public x1: number,\n public y1: number,\n public x2: number,\n public y2: number,\n public clickCallback: (e: MouseEvent) => any,\n public hoverCallback: (e: MouseEvent) => any,\n public tooltipCallback: (e: MouseEvent) => any,\n public leaveCallback: () => void,\n public willLinkActivate: (e: MouseEvent) => boolean\n ) {\n }\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ILinkifier2, ILinkProvider, IBufferCellPosition, ILink, ILinkifierEvent, ILinkDecorations, ILinkWithState } from 'browser/Types';\nimport { IDisposable } from 'common/Types';\nimport { IMouseService, IRenderService } from './services/Services';\nimport { IBufferService } from 'common/services/Services';\nimport { EventEmitter, IEvent } from 'common/EventEmitter';\nimport { Disposable, getDisposeArrayDisposable, disposeArray } from 'common/Lifecycle';\nimport { addDisposableDomListener } from 'browser/Lifecycle';\n\nexport class Linkifier2 extends Disposable implements ILinkifier2 {\n private _element: HTMLElement | undefined;\n private _mouseService: IMouseService | undefined;\n private _renderService: IRenderService | undefined;\n private _linkProviders: ILinkProvider[] = [];\n public get currentLink(): ILinkWithState | undefined { return this._currentLink; }\n protected _currentLink: ILinkWithState | undefined;\n private _mouseDownLink: ILinkWithState | undefined;\n private _lastMouseEvent: MouseEvent | undefined;\n private _linkCacheDisposables: IDisposable[] = [];\n private _lastBufferCell: IBufferCellPosition | undefined;\n private _isMouseOut: boolean = true;\n private _activeProviderReplies: Map<Number, ILinkWithState[] | undefined> | undefined;\n private _activeLine: number = -1;\n\n private _onShowLinkUnderline = this.register(new EventEmitter<ILinkifierEvent>());\n public get onShowLinkUnderline(): IEvent<ILinkifierEvent> { return this._onShowLinkUnderline.event; }\n private _onHideLinkUnderline = this.register(new EventEmitter<ILinkifierEvent>());\n public get onHideLinkUnderline(): IEvent<ILinkifierEvent> { return this._onHideLinkUnderline.event; }\n\n constructor(\n @IBufferService private readonly _bufferService: IBufferService\n ) {\n super();\n this.register(getDisposeArrayDisposable(this._linkCacheDisposables));\n }\n\n public registerLinkProvider(linkProvider: ILinkProvider): IDisposable {\n this._linkProviders.push(linkProvider);\n return {\n dispose: () => {\n // Remove the link provider from the list\n const providerIndex = this._linkProviders.indexOf(linkProvider);\n\n if (providerIndex !== -1) {\n this._linkProviders.splice(providerIndex, 1);\n }\n }\n };\n }\n\n public attachToDom(element: HTMLElement, mouseService: IMouseService, renderService: IRenderService): void {\n this._element = element;\n this._mouseService = mouseService;\n this._renderService = renderService;\n\n this.register(addDisposableDomListener(this._element, 'mouseleave', () => {\n this._isMouseOut = true;\n this._clearCurrentLink();\n }));\n this.register(addDisposableDomListener(this._element, 'mousemove', this._onMouseMove.bind(this)));\n this.register(addDisposableDomListener(this._element, 'mousedown', this._handleMouseDown.bind(this)));\n this.register(addDisposableDomListener(this._element, 'mouseup', this._handleMouseUp.bind(this)));\n }\n\n private _onMouseMove(event: MouseEvent): void {\n this._lastMouseEvent = event;\n\n if (!this._element || !this._mouseService) {\n return;\n }\n\n const position = this._positionFromMouseEvent(event, this._element, this._mouseService);\n if (!position) {\n return;\n }\n this._isMouseOut = false;\n\n // Ignore the event if it's an embedder created hover widget\n const composedPath = event.composedPath() as HTMLElement[];\n for (let i = 0; i < composedPath.length; i++) {\n const target = composedPath[i];\n // Hit Terminal.element, break and continue\n if (target.classList.contains('xterm')) {\n break;\n }\n // It's a hover, don't respect hover event\n if (target.classList.contains('xterm-hover')) {\n return;\n }\n }\n\n if (!this._lastBufferCell || (position.x !== this._lastBufferCell.x || position.y !== this._lastBufferCell.y)) {\n this._onHover(position);\n this._lastBufferCell = position;\n }\n }\n\n private _onHover(position: IBufferCellPosition): void {\n // TODO: This currently does not cache link provider results across wrapped lines, activeLine should be something like `activeRange: {startY, endY}`\n // Check if we need to clear the link\n if (this._activeLine !== position.y) {\n this._clearCurrentLink();\n this._askForLink(position, false);\n return;\n }\n\n // Check the if the link is in the mouse position\n const isCurrentLinkInPosition = this._currentLink && this._linkAtPosition(this._currentLink.link, position);\n if (!isCurrentLinkInPosition) {\n this._clearCurrentLink();\n this._askForLink(position, true);\n }\n }\n\n private _askForLink(position: IBufferCellPosition, useLineCache: boolean): void {\n if (!this._activeProviderReplies || !useLineCache) {\n this._activeProviderReplies?.forEach(reply => {\n reply?.forEach(linkWithState => {\n if (linkWithState.link.dispose) {\n linkWithState.link.dispose();\n }\n });\n });\n this._activeProviderReplies = new Map();\n this._activeLine = position.y;\n }\n let linkProvided = false;\n\n // There is no link cached, so ask for one\n for (const [i, linkProvider] of this._linkProviders.entries()) {\n if (useLineCache) {\n const existingReply = this._activeProviderReplies?.get(i);\n // If there isn't a reply, the provider hasn't responded yet.\n\n // TODO: If there isn't a reply yet it means that the provider is still resolving. Ensuring\n // provideLinks isn't triggered again saves ILink.hover firing twice though. This probably\n // needs promises to get fixed\n if (existingReply) {\n linkProvided = this._checkLinkProviderResult(i, position, linkProvided);\n }\n } else {\n linkProvider.provideLinks(position.y, (links: ILink[] | undefined) => {\n if (this._isMouseOut) {\n return;\n }\n const linksWithState: ILinkWithState[] | undefined = links?.map(link => ({ link }));\n this._activeProviderReplies?.set(i, linksWithState);\n linkProvided = this._checkLinkProviderResult(i, position, linkProvided);\n\n // If all providers have responded, remove lower priority links that intersect ranges of\n // higher priority links\n if (this._activeProviderReplies?.size === this._linkProviders.length) {\n this._removeIntersectingLinks(position.y, this._activeProviderReplies);\n }\n });\n }\n }\n }\n\n private _removeIntersectingLinks(y: number, replies: Map<Number, ILinkWithState[] | undefined>): void {\n const occupiedCells = new Set<number>();\n for (let i = 0; i < replies.size; i++) {\n const providerReply = replies.get(i);\n if (!providerReply) {\n continue;\n }\n for (let i = 0; i < providerReply.length; i++) {\n const linkWithState = providerReply[i];\n const startX = linkWithState.link.range.start.y < y ? 0 : linkWithState.link.range.start.x;\n const endX = linkWithState.link.range.end.y > y ? this._bufferService.cols : linkWithState.link.range.end.x;\n for (let x = startX; x <= endX; x++) {\n if (occupiedCells.has(x)) {\n providerReply.splice(i--, 1);\n break;\n }\n occupiedCells.add(x);\n }\n }\n }\n }\n\n private _checkLinkProviderResult(index: number, position: IBufferCellPosition, linkProvided: boolean): boolean {\n if (!this._activeProviderReplies) {\n return linkProvided;\n }\n\n const links = this._activeProviderReplies.get(index);\n\n // Check if every provider before this one has come back undefined\n let hasLinkBefore = false;\n for (let j = 0; j < index; j++) {\n if (!this._activeProviderReplies.has(j) || this._activeProviderReplies.get(j)) {\n hasLinkBefore = true;\n }\n }\n\n // If all providers with higher priority came back undefined, then this provider's link for\n // the position should be used\n if (!hasLinkBefore && links) {\n const linkAtPosition = links.find(link => this._linkAtPosition(link.link, position));\n if (linkAtPosition) {\n linkProvided = true;\n this._handleNewLink(linkAtPosition);\n }\n }\n\n // Check if all the providers have responded\n if (this._activeProviderReplies.size === this._linkProviders.length && !linkProvided) {\n // Respect the order of the link providers\n for (let j = 0; j < this._activeProviderReplies.size; j++) {\n const currentLink = this._activeProviderReplies.get(j)?.find(link => this._linkAtPosition(link.link, position));\n if (currentLink) {\n linkProvided = true;\n this._handleNewLink(currentLink);\n break;\n }\n }\n }\n\n return linkProvided;\n }\n\n private _handleMouseDown(): void {\n this._mouseDownLink = this._currentLink;\n }\n\n private _handleMouseUp(event: MouseEvent): void {\n if (!this._element || !this._mouseService || !this._currentLink) {\n return;\n }\n\n const position = this._positionFromMouseEvent(event, this._element, this._mouseService);\n if (!position) {\n return;\n }\n\n if (this._mouseDownLink === this._currentLink && this._linkAtPosition(this._currentLink.link, position)) {\n this._currentLink.link.activate(event, this._currentLink.link.text);\n }\n }\n\n private _clearCurrentLink(startRow?: number, endRow?: number): void {\n if (!this._element || !this._currentLink || !this._lastMouseEvent) {\n return;\n }\n\n // If we have a start and end row, check that the link is within it\n if (!startRow || !endRow || (this._currentLink.link.range.start.y >= startRow && this._currentLink.link.range.end.y <= endRow)) {\n this._linkLeave(this._element, this._currentLink.link, this._lastMouseEvent);\n this._currentLink = undefined;\n disposeArray(this._linkCacheDisposables);\n }\n }\n\n private _handleNewLink(linkWithState: ILinkWithState): void {\n if (!this._element || !this._lastMouseEvent || !this._mouseService) {\n return;\n }\n\n const position = this._positionFromMouseEvent(this._lastMouseEvent, this._element, this._mouseService);\n\n if (!position) {\n return;\n }\n\n // Trigger hover if the we have a link at the position\n if (this._linkAtPosition(linkWithState.link, position)) {\n this._currentLink = linkWithState;\n this._currentLink.state = {\n decorations: {\n underline: linkWithState.link.decorations === undefined ? true : linkWithState.link.decorations.underline,\n pointerCursor: linkWithState.link.decorations === undefined ? true : linkWithState.link.decorations.pointerCursor\n },\n isHovered: true\n };\n this._linkHover(this._element, linkWithState.link, this._lastMouseEvent);\n\n // Add listener for tracking decorations changes\n linkWithState.link.decorations = {} as ILinkDecorations;\n Object.defineProperties(linkWithState.link.decorations, {\n pointerCursor: {\n get: () => this._currentLink?.state?.decorations.pointerCursor,\n set: v => {\n if (this._currentLink?.state && this._currentLink.state.decorations.pointerCursor !== v) {\n this._currentLink.state.decorations.pointerCursor = v;\n if (this._currentLink.state.isHovered) {\n this._element?.classList.toggle('xterm-cursor-pointer', v);\n }\n }\n }\n },\n underline: {\n get: () => this._currentLink?.state?.decorations.underline,\n set: v => {\n if (this._currentLink?.state && this._currentLink?.state?.decorations.underline !== v) {\n this._currentLink.state.decorations.underline = v;\n if (this._currentLink.state.isHovered) {\n this._fireUnderlineEvent(linkWithState.link, v);\n }\n }\n }\n }\n });\n\n // Add listener for rerendering\n if (this._renderService) {\n this._linkCacheDisposables.push(this._renderService.onRenderedViewportChange(e => {\n // When start is 0 a scroll most likely occurred, make sure links above the fold also get\n // cleared.\n const start = e.start === 0 ? 0 : e.start + 1 + this._bufferService.buffer.ydisp;\n this._clearCurrentLink(start, e.end + 1 + this._bufferService.buffer.ydisp);\n }));\n }\n }\n }\n\n protected _linkHover(element: HTMLElement, link: ILink, event: MouseEvent): void {\n if (this._currentLink?.state) {\n this._currentLink.state.isHovered = true;\n if (this._currentLink.state.decorations.underline) {\n this._fireUnderlineEvent(link, true);\n }\n if (this._currentLink.state.decorations.pointerCursor) {\n element.classList.add('xterm-cursor-pointer');\n }\n }\n\n if (link.hover) {\n link.hover(event, link.text);\n }\n }\n\n private _fireUnderlineEvent(link: ILink, showEvent: boolean): void {\n const range = link.range;\n const scrollOffset = this._bufferService.buffer.ydisp;\n const event = this._createLinkUnderlineEvent(range.start.x - 1, range.start.y - scrollOffset - 1, range.end.x, range.end.y - scrollOffset - 1, undefined);\n const emitter = showEvent ? this._onShowLinkUnderline : this._onHideLinkUnderline;\n emitter.fire(event);\n }\n\n protected _linkLeave(element: HTMLElement, link: ILink, event: MouseEvent): void {\n if (this._currentLink?.state) {\n this._currentLink.state.isHovered = false;\n if (this._currentLink.state.decorations.underline) {\n this._fireUnderlineEvent(link, false);\n }\n if (this._currentLink.state.decorations.pointerCursor) {\n element.classList.remove('xterm-cursor-pointer');\n }\n }\n\n if (link.leave) {\n link.leave(event, link.text);\n }\n }\n\n /**\n * Check if the buffer position is within the link\n * @param link\n * @param position\n */\n private _linkAtPosition(link: ILink, position: IBufferCellPosition): boolean {\n const sameLine = link.range.start.y === link.range.end.y;\n const wrappedFromLeft = link.range.start.y < position.y;\n const wrappedToRight = link.range.end.y > position.y;\n\n // If the start and end have the same y, then the position must be between start and end x\n // If not, then handle each case seperately, depending on which way it wraps\n return ((sameLine && link.range.start.x <= position.x && link.range.end.x >= position.x) ||\n (wrappedFromLeft && link.range.end.x >= position.x) ||\n (wrappedToRight && link.range.start.x <= position.x) ||\n (wrappedFromLeft && wrappedToRight)) &&\n link.range.start.y <= position.y &&\n link.range.end.y >= position.y;\n }\n\n /**\n * Get the buffer position from a mouse event\n * @param event\n */\n private _positionFromMouseEvent(event: MouseEvent, element: HTMLElement, mouseService: IMouseService): IBufferCellPosition | undefined {\n const coords = mouseService.getCoords(event, element, this._bufferService.cols, this._bufferService.rows);\n if (!coords) {\n return;\n }\n\n return { x: coords[0], y: coords[1] + this._bufferService.buffer.ydisp };\n }\n\n private _createLinkUnderlineEvent(x1: number, y1: number, x2: number, y2: number, fg: number | undefined): ILinkifierEvent {\n return { x1, y1, x2, y2, cols: this._bufferService.cols, fg };\n }\n}\n","/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\n// eslint-disable-next-line prefer-const\nexport let promptLabel = 'Terminal input';\n\n// eslint-disable-next-line prefer-const\nexport let tooMuchOutput = 'Too much output to announce, navigate to rows manually to read';\n","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { Disposable } from 'common/Lifecycle';\nimport { addDisposableDomListener } from 'browser/Lifecycle';\nimport { IMouseService, ISelectionService } from 'browser/services/Services';\nimport { IMouseZoneManager, IMouseZone } from 'browser/Types';\nimport { IBufferService, IOptionsService } from 'common/services/Services';\n\n/**\n * The MouseZoneManager allows components to register zones within the terminal\n * that trigger hover and click callbacks.\n *\n * This class was intentionally made not so robust initially as the only case it\n * needed to support was single-line links which never overlap. Improvements can\n * be made in the future.\n */\nexport class MouseZoneManager extends Disposable implements IMouseZoneManager {\n private _zones: IMouseZone[] = [];\n\n private _areZonesActive: boolean = false;\n private _mouseMoveListener: (e: MouseEvent) => any;\n private _mouseLeaveListener: (e: MouseEvent) => any;\n private _clickListener: (e: MouseEvent) => any;\n\n private _tooltipTimeout: number | undefined;\n private _currentZone: IMouseZone | undefined;\n private _lastHoverCoords: [number | undefined, number | undefined] = [undefined, undefined];\n private _initialSelectionLength: number = 0;\n\n constructor(\n private readonly _element: HTMLElement,\n private readonly _screenElement: HTMLElement,\n @IBufferService private readonly _bufferService: IBufferService,\n @IMouseService private readonly _mouseService: IMouseService,\n @ISelectionService private readonly _selectionService: ISelectionService,\n @IOptionsService private readonly _optionsService: IOptionsService\n ) {\n super();\n\n this.register(addDisposableDomListener(this._element, 'mousedown', e => this._onMouseDown(e)));\n\n // These events are expensive, only listen to it when mouse zones are active\n this._mouseMoveListener = e => this._onMouseMove(e);\n this._mouseLeaveListener = e => this._onMouseLeave(e);\n this._clickListener = e => this._onClick(e);\n }\n\n public dispose(): void {\n super.dispose();\n this._deactivate();\n }\n\n public add(zone: IMouseZone): void {\n this._zones.push(zone);\n if (this._zones.length === 1) {\n this._activate();\n }\n }\n\n public clearAll(start?: number, end?: number): void {\n // Exit if there's nothing to clear\n if (this._zones.length === 0) {\n return;\n }\n\n // Clear all if start/end weren't set\n if (!start || !end) {\n start = 0;\n end = this._bufferService.rows - 1;\n }\n\n // Iterate through zones and clear them out if they're within the range\n for (let i = 0; i < this._zones.length; i++) {\n const zone = this._zones[i];\n if ((zone.y1 > start && zone.y1 <= end + 1) ||\n (zone.y2 > start && zone.y2 <= end + 1) ||\n (zone.y1 < start && zone.y2 > end + 1)) {\n if (this._currentZone && this._currentZone === zone) {\n this._currentZone.leaveCallback();\n this._currentZone = undefined;\n }\n this._zones.splice(i--, 1);\n }\n }\n\n // Deactivate the mouse zone manager if all the zones have been removed\n if (this._zones.length === 0) {\n this._deactivate();\n }\n }\n\n private _activate(): void {\n if (!this._areZonesActive) {\n this._areZonesActive = true;\n this._element.addEventListener('mousemove', this._mouseMoveListener);\n this._element.addEventListener('mouseleave', this._mouseLeaveListener);\n this._element.addEventListener('click', this._clickListener);\n }\n }\n\n private _deactivate(): void {\n if (this._areZonesActive) {\n this._areZonesActive = false;\n this._element.removeEventListener('mousemove', this._mouseMoveListener);\n this._element.removeEventListener('mouseleave', this._mouseLeaveListener);\n this._element.removeEventListener('click', this._clickListener);\n }\n }\n\n private _onMouseMove(e: MouseEvent): void {\n // TODO: Ideally this would only clear the hover state when the mouse moves\n // outside of the mouse zone\n if (this._lastHoverCoords[0] !== e.pageX || this._lastHoverCoords[1] !== e.pageY) {\n this._onHover(e);\n // Record the current coordinates\n this._lastHoverCoords = [e.pageX, e.pageY];\n }\n }\n\n private _onHover(e: MouseEvent): void {\n const zone = this._findZoneEventAt(e);\n\n // Do nothing if the zone is the same\n if (zone === this._currentZone) {\n return;\n }\n\n // Fire the hover end callback and cancel any existing timer if a new zone\n // is being hovered\n if (this._currentZone) {\n this._currentZone.leaveCallback();\n this._currentZone = undefined;\n if (this._tooltipTimeout) {\n clearTimeout(this._tooltipTimeout);\n }\n }\n\n // Exit if there is not zone\n if (!zone) {\n return;\n }\n this._currentZone = zone;\n\n // Trigger the hover callback\n if (zone.hoverCallback) {\n zone.hoverCallback(e);\n }\n\n // Restart the tooltip timeout\n this._tooltipTimeout = window.setTimeout(() => this._onTooltip(e), this._optionsService.rawOptions.linkTooltipHoverDuration);\n }\n\n private _onTooltip(e: MouseEvent): void {\n this._tooltipTimeout = undefined;\n const zone = this._findZoneEventAt(e);\n zone?.tooltipCallback(e);\n }\n\n private _onMouseDown(e: MouseEvent): void {\n // Store current terminal selection length, to check if we're performing\n // a selection operation\n this._initialSelectionLength = this._getSelectionLength();\n\n // Ignore the event if there are no zones active\n if (!this._areZonesActive) {\n return;\n }\n\n // Find the active zone, prevent event propagation if found to prevent other\n // components from handling the mouse event.\n const zone = this._findZoneEventAt(e);\n if (zone?.willLinkActivate(e)) {\n e.preventDefault();\n e.stopImmediatePropagation();\n }\n }\n\n private _onMouseLeave(e: MouseEvent): void {\n // Fire the hover end callback and cancel any existing timer if the mouse\n // leaves the terminal element\n if (this._currentZone) {\n this._currentZone.leaveCallback();\n this._currentZone = undefined;\n if (this._tooltipTimeout) {\n clearTimeout(this._tooltipTimeout);\n }\n }\n }\n\n private _onClick(e: MouseEvent): void {\n // Find the active zone and click it if found and no selection was\n // being performed\n const zone = this._findZoneEventAt(e);\n const currentSelectionLength = this._getSelectionLength();\n\n if (zone && currentSelectionLength === this._initialSelectionLength) {\n zone.clickCallback(e);\n e.preventDefault();\n e.stopImmediatePropagation();\n }\n }\n\n private _getSelectionLength(): number {\n const selectionText = this._selectionService.selectionText;\n return selectionText ? selectionText.length : 0;\n }\n\n private _findZoneEventAt(e: MouseEvent): IMouseZone | undefined {\n const coords = this._mouseService.getCoords(e, this._screenElement, this._bufferService.cols, this._bufferService.rows);\n if (!coords) {\n return undefined;\n }\n const x = coords[0];\n const y = coords[1];\n for (let i = 0; i < this._zones.length; i++) {\n const zone = this._zones[i];\n if (zone.y1 === zone.y2) {\n // Single line link\n if (y === zone.y1 && x >= zone.x1 && x < zone.x2) {\n return zone;\n }\n } else {\n // Multi-line link\n if ((y === zone.y1 && x >= zone.x1) ||\n (y === zone.y2 && x < zone.x2) ||\n (y > zone.y1 && y < zone.y2)) {\n return zone;\n }\n }\n }\n return undefined;\n }\n}\n","/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IRenderDebouncerWithCallback } from 'browser/Types';\n\n/**\n * Debounces calls to render terminal rows using animation frames.\n */\nexport class RenderDebouncer implements IRenderDebouncerWithCallback {\n private _rowStart: number | undefined;\n private _rowEnd: number | undefined;\n private _rowCount: number | undefined;\n private _animationFrame: number | undefined;\n private _refreshCallbacks: FrameRequestCallback[] = [];\n\n constructor(\n private _renderCallback: (start: number, end: number) => void\n ) {\n }\n\n public dispose(): void {\n if (this._animationFrame) {\n window.cancelAnimationFrame(this._animationFrame);\n this._animationFrame = undefined;\n }\n }\n\n public addRefreshCallback(callback: FrameRequestCallback): number {\n this._refreshCallbacks.push(callback);\n if (!this._animationFrame) {\n this._animationFrame = window.requestAnimationFrame(() => this._innerRefresh());\n }\n return this._animationFrame;\n }\n\n public refresh(rowStart: number | undefined, rowEnd: number | undefined, rowCount: number): void {\n this._rowCount = rowCount;\n // Get the min/max row start/end for the arg values\n rowStart = rowStart !== undefined ? rowStart : 0;\n rowEnd = rowEnd !== undefined ? rowEnd : this._rowCount - 1;\n // Set the properties to the updated values\n this._rowStart = this._rowStart !== undefined ? Math.min(this._rowStart, rowStart) : rowStart;\n this._rowEnd = this._rowEnd !== undefined ? Math.max(this._rowEnd, rowEnd) : rowEnd;\n\n if (this._animationFrame) {\n return;\n }\n\n this._animationFrame = window.requestAnimationFrame(() => this._innerRefresh());\n }\n\n private _innerRefresh(): void {\n this._animationFrame = undefined;\n\n // Make sure values are set\n if (this._rowStart === undefined || this._rowEnd === undefined || this._rowCount === undefined) {\n this._runRefreshCallbacks();\n return;\n }\n\n // Clamp values\n const start = Math.max(this._rowStart, 0);\n const end = Math.min(this._rowEnd, this._rowCount - 1);\n\n // Reset debouncer (this happens before render callback as the render could trigger it again)\n this._rowStart = undefined;\n this._rowEnd = undefined;\n\n // Run render callback\n this._renderCallback(start, end);\n this._runRefreshCallbacks();\n }\n\n private _runRefreshCallbacks(): void {\n for (const callback of this._refreshCallbacks) {\n callback(0);\n }\n this._refreshCallbacks = [];\n }\n}\n","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { Disposable } from 'common/Lifecycle';\n\nexport type ScreenDprListener = (newDevicePixelRatio?: number, oldDevicePixelRatio?: number) => void;\n\n/**\n * The screen device pixel ratio monitor allows listening for when the\n * window.devicePixelRatio value changes. This is done not with polling but with\n * the use of window.matchMedia to watch media queries. When the event fires,\n * the listener will be reattached using a different media query to ensure that\n * any further changes will register.\n *\n * The listener should fire on both window zoom changes and switching to a\n * monitor with a different DPI.\n */\nexport class ScreenDprMonitor extends Disposable {\n private _currentDevicePixelRatio: number = window.devicePixelRatio;\n private _outerListener: ((this: MediaQueryList, ev: MediaQueryListEvent) => any) | undefined;\n private _listener: ScreenDprListener | undefined;\n private _resolutionMediaMatchList: MediaQueryList | undefined;\n\n public setListener(listener: ScreenDprListener): void {\n if (this._listener) {\n this.clearListener();\n }\n this._listener = listener;\n this._outerListener = () => {\n if (!this._listener) {\n return;\n }\n this._listener(window.devicePixelRatio, this._currentDevicePixelRatio);\n this._updateDpr();\n };\n this._updateDpr();\n }\n\n public dispose(): void {\n super.dispose();\n this.clearListener();\n }\n\n private _updateDpr(): void {\n if (!this._outerListener) {\n return;\n }\n\n // Clear listeners for old DPR\n this._resolutionMediaMatchList?.removeListener(this._outerListener);\n\n // Add listeners for new DPR\n this._currentDevicePixelRatio = window.devicePixelRatio;\n this._resolutionMediaMatchList = window.matchMedia(`screen and (resolution: ${window.devicePixelRatio}dppx)`);\n this._resolutionMediaMatchList.addListener(this._outerListener);\n }\n\n public clearListener(): void {\n if (!this._resolutionMediaMatchList || !this._listener || !this._outerListener) {\n return;\n }\n this._resolutionMediaMatchList.removeListener(this._outerListener);\n this._resolutionMediaMatchList = undefined;\n this._listener = undefined;\n this._outerListener = undefined;\n }\n}\n","/**\n * Copyright (c) 2014 The xterm.js authors. All rights reserved.\n * Copyright (c) 2012-2013, Christopher Jeffrey (MIT License)\n * @license MIT\n *\n * Originally forked from (with the author's permission):\n * Fabrice Bellard's javascript vt100 for jslinux:\n * http://bellard.org/jslinux/\n * Copyright (c) 2011 Fabrice Bellard\n * The original design remains. The terminal itself\n * has been extended to include xterm CSI codes, among\n * other features.\n *\n * Terminal Emulation References:\n * http://vt100.net/\n * http://invisible-island.net/xterm/ctlseqs/ctlseqs.txt\n * http://invisible-island.net/xterm/ctlseqs/ctlseqs.html\n * http://invisible-island.net/vttest/\n * http://www.inwap.com/pdp10/ansicode.txt\n * http://linux.die.net/man/4/console_codes\n * http://linux.die.net/man/7/urxvt\n */\n\nimport { ICompositionHelper, ITerminal, IBrowser, CustomKeyEventHandler, ILinkifier, IMouseZoneManager, LinkMatcherHandler, ILinkMatcherOptions, IViewport, ILinkifier2, CharacterJoinerHandler } from 'browser/Types';\nimport { IRenderer } from 'browser/renderer/Types';\nimport { CompositionHelper } from 'browser/input/CompositionHelper';\nimport { Viewport } from 'browser/Viewport';\nimport { rightClickHandler, moveTextAreaUnderMouseCursor, handlePasteEvent, copyHandler, paste } from 'browser/Clipboard';\nimport { C0, C1_ESCAPED } from 'common/data/EscapeSequences';\nimport { WindowsOptionsReportType } from '../common/InputHandler';\nimport { Renderer } from 'browser/renderer/Renderer';\nimport { Linkifier } from 'browser/Linkifier';\nimport { SelectionService } from 'browser/services/SelectionService';\nimport * as Browser from 'common/Platform';\nimport { addDisposableDomListener } from 'browser/Lifecycle';\nimport * as Strings from 'browser/LocalizableStrings';\nimport { SoundService } from 'browser/services/SoundService';\nimport { MouseZoneManager } from 'browser/MouseZoneManager';\nimport { AccessibilityManager } from './AccessibilityManager';\nimport { ITheme, IMarker, IDisposable, ISelectionPosition, ILinkProvider, IDecorationOptions, IDecoration } from 'xterm';\nimport { DomRenderer } from 'browser/renderer/dom/DomRenderer';\nimport { KeyboardResultType, CoreMouseEventType, CoreMouseButton, CoreMouseAction, ITerminalOptions, ScrollSource, IColorEvent, ColorIndex, ColorRequestType } from 'common/Types';\nimport { evaluateKeyboardEvent } from 'common/input/Keyboard';\nimport { EventEmitter, IEvent, forwardEvent } from 'common/EventEmitter';\nimport { DEFAULT_ATTR_DATA } from 'common/buffer/BufferLine';\nimport { ColorManager } from 'browser/ColorManager';\nimport { RenderService } from 'browser/services/RenderService';\nimport { ICharSizeService, IRenderService, IMouseService, ISelectionService, ISoundService, ICoreBrowserService, ICharacterJoinerService } from 'browser/services/Services';\nimport { CharSizeService } from 'browser/services/CharSizeService';\nimport { IBuffer } from 'common/buffer/Types';\nimport { MouseService } from 'browser/services/MouseService';\nimport { Linkifier2 } from 'browser/Linkifier2';\nimport { CoreBrowserService } from 'browser/services/CoreBrowserService';\nimport { CoreTerminal } from 'common/CoreTerminal';\nimport { color, rgba } from 'common/Color';\nimport { CharacterJoinerService } from 'browser/services/CharacterJoinerService';\nimport { toRgbString } from 'common/input/XParseColor';\nimport { BufferDecorationRenderer } from 'browser/decorations/BufferDecorationRenderer';\nimport { OverviewRulerRenderer } from 'browser/decorations/OverviewRulerRenderer';\nimport { DecorationService } from 'common/services/DecorationService';\nimport { IDecorationService } from 'common/services/Services';\n\n// Let it work inside Node.js for automated testing purposes.\nconst document: Document = (typeof window !== 'undefined') ? window.document : null as any;\n\nexport class Terminal extends CoreTerminal implements ITerminal {\n public textarea: HTMLTextAreaElement | undefined;\n public element: HTMLElement | undefined;\n public screenElement: HTMLElement | undefined;\n\n private _document: Document | undefined;\n private _viewportScrollArea: HTMLElement | undefined;\n private _viewportElement: HTMLElement | undefined;\n private _helperContainer: HTMLElement | undefined;\n private _compositionView: HTMLElement | undefined;\n\n private _overviewRulerRenderer: OverviewRulerRenderer | undefined;\n\n // private _visualBellTimer: number;\n\n public browser: IBrowser = Browser as any;\n\n private _customKeyEventHandler: CustomKeyEventHandler | undefined;\n\n // browser services\n private _decorationService: DecorationService;\n private _charSizeService: ICharSizeService | undefined;\n private _mouseService: IMouseService | undefined;\n private _renderService: IRenderService | undefined;\n private _characterJoinerService: ICharacterJoinerService | undefined;\n private _selectionService: ISelectionService | undefined;\n private _soundService: ISoundService | undefined;\n\n /**\n * Records whether the keydown event has already been handled and triggered a data event, if so\n * the keypress event should not trigger a data event but should still print to the textarea so\n * screen readers will announce it.\n */\n private _keyDownHandled: boolean = false;\n\n /**\n * Records whether a keydown event has occured since the last keyup event, i.e. whether a key\n * is currently \"pressed\".\n */\n private _keyDownSeen: boolean = false;\n\n /**\n * Records whether the keypress event has already been handled and triggered a data event, if so\n * the input event should not trigger a data event but should still print to the textarea so\n * screen readers will announce it.\n */\n private _keyPressHandled: boolean = false;\n\n /**\n * Records whether there has been a keydown event for a dead key without a corresponding keydown\n * event for the composed/alternative character. If we cancel the keydown event for the dead key,\n * no events will be emitted for the final character.\n */\n private _unprocessedDeadKey: boolean = false;\n\n public linkifier: ILinkifier;\n public linkifier2: ILinkifier2;\n public viewport: IViewport | undefined;\n private _compositionHelper: ICompositionHelper | undefined;\n private _mouseZoneManager: IMouseZoneManager | undefined;\n private _accessibilityManager: AccessibilityManager | undefined;\n private _colorManager: ColorManager | undefined;\n private _theme: ITheme | undefined;\n\n private _onCursorMove = new EventEmitter<void>();\n public get onCursorMove(): IEvent<void> { return this._onCursorMove.event; }\n private _onKey = new EventEmitter<{ key: string, domEvent: KeyboardEvent }>();\n public get onKey(): IEvent<{ key: string, domEvent: KeyboardEvent }> { return this._onKey.event; }\n private _onRender = new EventEmitter<{ start: number, end: number }>();\n public get onRender(): IEvent<{ start: number, end: number }> { return this._onRender.event; }\n private _onSelectionChange = new EventEmitter<void>();\n public get onSelectionChange(): IEvent<void> { return this._onSelectionChange.event; }\n private _onTitleChange = new EventEmitter<string>();\n public get onTitleChange(): IEvent<string> { return this._onTitleChange.event; }\n private _onBell = new EventEmitter<void>();\n public get onBell(): IEvent<void> { return this._onBell.event; }\n\n private _onFocus = new EventEmitter<void>();\n public get onFocus(): IEvent<void> { return this._onFocus.event; }\n private _onBlur = new EventEmitter<void>();\n public get onBlur(): IEvent<void> { return this._onBlur.event; }\n private _onA11yCharEmitter = new EventEmitter<string>();\n public get onA11yChar(): IEvent<string> { return this._onA11yCharEmitter.event; }\n private _onA11yTabEmitter = new EventEmitter<number>();\n public get onA11yTab(): IEvent<number> { return this._onA11yTabEmitter.event; }\n\n /**\n * Creates a new `Terminal` object.\n *\n * @param options An object containing a set of options, the available options are:\n * - `cursorBlink` (boolean): Whether the terminal cursor blinks\n * - `cols` (number): The number of columns of the terminal (horizontal size)\n * - `rows` (number): The number of rows of the terminal (vertical size)\n *\n * @public\n * @class Xterm Xterm\n * @alias module:xterm/src/xterm\n */\n constructor(\n options: Partial<ITerminalOptions> = {}\n ) {\n super(options);\n\n this._setup();\n\n this.linkifier = this._instantiationService.createInstance(Linkifier);\n this.linkifier2 = this.register(this._instantiationService.createInstance(Linkifier2));\n this._decorationService = this._instantiationService.createInstance(DecorationService);\n this._instantiationService.setService(IDecorationService, this._decorationService);\n\n // Setup InputHandler listeners\n this.register(this._inputHandler.onRequestBell(() => this.bell()));\n this.register(this._inputHandler.onRequestRefreshRows((start, end) => this.refresh(start, end)));\n this.register(this._inputHandler.onRequestSendFocus(() => this._reportFocus()));\n this.register(this._inputHandler.onRequestReset(() => this.reset()));\n this.register(this._inputHandler.onRequestWindowsOptionsReport(type => this._reportWindowsOptions(type)));\n this.register(this._inputHandler.onColor((event) => this._handleColorEvent(event)));\n this.register(forwardEvent(this._inputHandler.onCursorMove, this._onCursorMove));\n this.register(forwardEvent(this._inputHandler.onTitleChange, this._onTitleChange));\n this.register(forwardEvent(this._inputHandler.onA11yChar, this._onA11yCharEmitter));\n this.register(forwardEvent(this._inputHandler.onA11yTab, this._onA11yTabEmitter));\n\n // Setup listeners\n this.register(this._bufferService.onResize(e => this._afterResize(e.cols, e.rows)));\n }\n\n /**\n * Handle color event from inputhandler for OSC 4|104 | 10|110 | 11|111 | 12|112.\n * An event from OSC 4|104 may contain multiple set or report requests, and multiple\n * or none restore requests (resetting all),\n * while an event from OSC 10|110 | 11|111 | 12|112 always contains a single request.\n */\n private _handleColorEvent(event: IColorEvent): void {\n if (!this._colorManager) return;\n for (const req of event) {\n let acc: 'foreground' | 'background' | 'cursor' | 'ansi' | undefined = undefined;\n let ident = '';\n switch (req.index) {\n case ColorIndex.FOREGROUND: // OSC 10 | 110\n acc = 'foreground';\n ident = '10';\n break;\n case ColorIndex.BACKGROUND: // OSC 11 | 111\n acc = 'background';\n ident = '11';\n break;\n case ColorIndex.CURSOR: // OSC 12 | 112\n acc = 'cursor';\n ident = '12';\n break;\n default: // OSC 4 | 104\n // we can skip the [0..255] range check here (already done in inputhandler)\n acc = 'ansi';\n ident = '4;' + req.index;\n }\n if (acc) {\n switch (req.type) {\n case ColorRequestType.REPORT:\n const channels = color.toColorRGB(acc === 'ansi'\n ? this._colorManager.colors.ansi[req.index]\n : this._colorManager.colors[acc]);\n this.coreService.triggerDataEvent(`${C0.ESC}]${ident};${toRgbString(channels)}${C1_ESCAPED.ST}`);\n break;\n case ColorRequestType.SET:\n if (acc === 'ansi') this._colorManager.colors.ansi[req.index] = rgba.toColor(...req.color);\n else this._colorManager.colors[acc] = rgba.toColor(...req.color);\n break;\n case ColorRequestType.RESTORE:\n this._colorManager.restoreColor(req.index);\n break;\n }\n }\n }\n this._renderService?.setColors(this._colorManager.colors);\n this.viewport?.onThemeChange(this._colorManager.colors);\n }\n\n public dispose(): void {\n if (this._isDisposed) {\n return;\n }\n super.dispose();\n this._renderService?.dispose();\n this._customKeyEventHandler = undefined;\n this.write = () => { };\n this.element?.parentNode?.removeChild(this.element);\n }\n\n protected _setup(): void {\n super._setup();\n\n this._customKeyEventHandler = undefined;\n }\n\n /**\n * Convenience property to active buffer.\n */\n public get buffer(): IBuffer {\n return this.buffers.active;\n }\n\n /**\n * Focus the terminal. Delegates focus handling to the terminal's DOM element.\n */\n public focus(): void {\n if (this.textarea) {\n this.textarea.focus({ preventScroll: true });\n }\n }\n\n protected _updateOptions(key: string): void {\n super._updateOptions(key);\n\n // TODO: These listeners should be owned by individual components\n switch (key) {\n case 'fontFamily':\n case 'fontSize':\n // When the font changes the size of the cells may change which requires a renderer clear\n this._renderService?.clear();\n this._charSizeService?.measure();\n break;\n case 'cursorBlink':\n case 'cursorStyle':\n // The DOM renderer needs a row refresh to update the cursor styles\n this.refresh(this.buffer.y, this.buffer.y);\n break;\n case 'customGlyphs':\n case 'drawBoldTextInBrightColors':\n case 'letterSpacing':\n case 'lineHeight':\n case 'fontWeight':\n case 'fontWeightBold':\n case 'minimumContrastRatio':\n // When the font changes the size of the cells may change which requires a renderer clear\n if (this._renderService) {\n this._renderService.clear();\n this._renderService.onResize(this.cols, this.rows);\n this.refresh(0, this.rows - 1);\n }\n break;\n case 'rendererType':\n if (this._renderService) {\n this._renderService.setRenderer(this._createRenderer());\n this._renderService.onResize(this.cols, this.rows);\n }\n break;\n case 'scrollback':\n this.viewport?.syncScrollArea();\n break;\n case 'screenReaderMode':\n if (this.optionsService.rawOptions.screenReaderMode) {\n if (!this._accessibilityManager && this._renderService) {\n this._accessibilityManager = new AccessibilityManager(this, this._renderService);\n }\n } else {\n this._accessibilityManager?.dispose();\n this._accessibilityManager = undefined;\n }\n break;\n case 'tabStopWidth': this.buffers.setupTabStops(); break;\n case 'theme':\n this._setTheme(this.optionsService.rawOptions.theme);\n break;\n }\n }\n\n /**\n * Binds the desired focus behavior on a given terminal object.\n */\n private _onTextAreaFocus(ev: KeyboardEvent): void {\n if (this.coreService.decPrivateModes.sendFocus) {\n this.coreService.triggerDataEvent(C0.ESC + '[I');\n }\n this.updateCursorStyle(ev);\n this.element!.classList.add('focus');\n this._showCursor();\n this._onFocus.fire();\n }\n\n /**\n * Blur the terminal, calling the blur function on the terminal's underlying\n * textarea.\n */\n public blur(): void {\n return this.textarea?.blur();\n }\n\n /**\n * Binds the desired blur behavior on a given terminal object.\n */\n private _onTextAreaBlur(): void {\n // Text can safely be removed on blur. Doing it earlier could interfere with\n // screen readers reading it out.\n this.textarea!.value = '';\n this.refresh(this.buffer.y, this.buffer.y);\n if (this.coreService.decPrivateModes.sendFocus) {\n this.coreService.triggerDataEvent(C0.ESC + '[O');\n }\n this.element!.classList.remove('focus');\n this._onBlur.fire();\n }\n\n private _syncTextArea(): void {\n if (!this.textarea || !this.buffer.isCursorInViewport || this._compositionHelper!.isComposing || !this._renderService) {\n return;\n }\n const cursorY = this.buffer.ybase + this.buffer.y;\n const bufferLine = this.buffer.lines.get(cursorY);\n if (!bufferLine) {\n return;\n }\n const cursorX = Math.min(this.buffer.x, this.cols - 1);\n const cellHeight = this._renderService.dimensions.actualCellHeight;\n const width = bufferLine.getWidth(cursorX);\n const cellWidth = this._renderService.dimensions.actualCellWidth * width;\n const cursorTop = this.buffer.y * this._renderService.dimensions.actualCellHeight;\n const cursorLeft = cursorX * this._renderService.dimensions.actualCellWidth;\n\n // Sync the textarea to the exact position of the composition view so the IME knows where the\n // text is.\n this.textarea.style.left = cursorLeft + 'px';\n this.textarea.style.top = cursorTop + 'px';\n this.textarea.style.width = cellWidth + 'px';\n this.textarea.style.height = cellHeight + 'px';\n this.textarea.style.lineHeight = cellHeight + 'px';\n this.textarea.style.zIndex = '-5';\n }\n\n /**\n * Initialize default behavior\n */\n private _initGlobal(): void {\n this._bindKeys();\n\n // Bind clipboard functionality\n this.register(addDisposableDomListener(this.element!, 'copy', (event: ClipboardEvent) => {\n // If mouse events are active it means the selection manager is disabled and\n // copy should be handled by the host program.\n if (!this.hasSelection()) {\n return;\n }\n copyHandler(event, this._selectionService!);\n }));\n const pasteHandlerWrapper = (event: ClipboardEvent): void => handlePasteEvent(event, this.textarea!, this.coreService);\n this.register(addDisposableDomListener(this.textarea!, 'paste', pasteHandlerWrapper));\n this.register(addDisposableDomListener(this.element!, 'paste', pasteHandlerWrapper));\n\n // Handle right click context menus\n if (Browser.isFirefox) {\n // Firefox doesn't appear to fire the contextmenu event on right click\n this.register(addDisposableDomListener(this.element!, 'mousedown', (event: MouseEvent) => {\n if (event.button === 2) {\n rightClickHandler(event, this.textarea!, this.screenElement!, this._selectionService!, this.options.rightClickSelectsWord);\n }\n }));\n } else {\n this.register(addDisposableDomListener(this.element!, 'contextmenu', (event: MouseEvent) => {\n rightClickHandler(event, this.textarea!, this.screenElement!, this._selectionService!, this.options.rightClickSelectsWord);\n }));\n }\n\n // Move the textarea under the cursor when middle clicking on Linux to ensure\n // middle click to paste selection works. This only appears to work in Chrome\n // at the time is writing.\n if (Browser.isLinux) {\n // Use auxclick event over mousedown the latter doesn't seem to work. Note\n // that the regular click event doesn't fire for the middle mouse button.\n this.register(addDisposableDomListener(this.element!, 'auxclick', (event: MouseEvent) => {\n if (event.button === 1) {\n moveTextAreaUnderMouseCursor(event, this.textarea!, this.screenElement!);\n }\n }));\n }\n }\n\n /**\n * Apply key handling to the terminal\n */\n private _bindKeys(): void {\n this.register(addDisposableDomListener(this.textarea!, 'keyup', (ev: KeyboardEvent) => this._keyUp(ev), true));\n this.register(addDisposableDomListener(this.textarea!, 'keydown', (ev: KeyboardEvent) => this._keyDown(ev), true));\n this.register(addDisposableDomListener(this.textarea!, 'keypress', (ev: KeyboardEvent) => this._keyPress(ev), true));\n this.register(addDisposableDomListener(this.textarea!, 'compositionstart', () => this._compositionHelper!.compositionstart()));\n this.register(addDisposableDomListener(this.textarea!, 'compositionupdate', (e: CompositionEvent) => this._compositionHelper!.compositionupdate(e)));\n this.register(addDisposableDomListener(this.textarea!, 'compositionend', () => this._compositionHelper!.compositionend()));\n this.register(addDisposableDomListener(this.textarea!, 'input', (ev: InputEvent) => this._inputEvent(ev), true));\n this.register(this.onRender(() => this._compositionHelper!.updateCompositionElements()));\n this.register(this.onRender(e => this._queueLinkification(e.start, e.end)));\n }\n\n /**\n * Opens the terminal within an element.\n *\n * @param parent The element to create the terminal within.\n */\n public open(parent: HTMLElement): void {\n if (!parent) {\n throw new Error('Terminal requires a parent element.');\n }\n\n if (!parent.isConnected) {\n this._logService.debug('Terminal.open was called on an element that was not attached to the DOM');\n }\n\n this._document = parent.ownerDocument!;\n\n // Create main element container\n this.element = this._document.createElement('div');\n this.element.dir = 'ltr'; // xterm.css assumes LTR\n this.element.classList.add('terminal');\n this.element.classList.add('xterm');\n this.element.setAttribute('tabindex', '0');\n parent.appendChild(this.element);\n\n // Performance: Use a document fragment to build the terminal\n // viewport and helper elements detached from the DOM\n const fragment = document.createDocumentFragment();\n this._viewportElement = document.createElement('div');\n this._viewportElement.classList.add('xterm-viewport');\n fragment.appendChild(this._viewportElement);\n\n this._viewportScrollArea = document.createElement('div');\n this._viewportScrollArea.classList.add('xterm-scroll-area');\n this._viewportElement.appendChild(this._viewportScrollArea);\n\n this.screenElement = document.createElement('div');\n this.screenElement.classList.add('xterm-screen');\n // Create the container that will hold helpers like the textarea for\n // capturing DOM Events. Then produce the helpers.\n this._helperContainer = document.createElement('div');\n this._helperContainer.classList.add('xterm-helpers');\n this.screenElement.appendChild(this._helperContainer);\n fragment.appendChild(this.screenElement);\n\n this.textarea = document.createElement('textarea');\n this.textarea.classList.add('xterm-helper-textarea');\n this.textarea.setAttribute('aria-label', Strings.promptLabel);\n this.textarea.setAttribute('aria-multiline', 'false');\n this.textarea.setAttribute('autocorrect', 'off');\n this.textarea.setAttribute('autocapitalize', 'off');\n this.textarea.setAttribute('spellcheck', 'false');\n this.textarea.tabIndex = 0;\n this.register(addDisposableDomListener(this.textarea, 'focus', (ev: KeyboardEvent) => this._onTextAreaFocus(ev)));\n this.register(addDisposableDomListener(this.textarea, 'blur', () => this._onTextAreaBlur()));\n this._helperContainer.appendChild(this.textarea);\n\n const coreBrowserService = this._instantiationService.createInstance(CoreBrowserService, this.textarea);\n this._instantiationService.setService(ICoreBrowserService, coreBrowserService);\n\n this._charSizeService = this._instantiationService.createInstance(CharSizeService, this._document, this._helperContainer);\n this._instantiationService.setService(ICharSizeService, this._charSizeService);\n\n this._theme = this.options.theme || this._theme;\n this._colorManager = new ColorManager(document, this.options.allowTransparency);\n this.register(this.optionsService.onOptionChange(e => this._colorManager!.onOptionsChange(e)));\n this._colorManager.setTheme(this._theme);\n\n this._characterJoinerService = this._instantiationService.createInstance(CharacterJoinerService);\n this._instantiationService.setService(ICharacterJoinerService, this._characterJoinerService);\n\n const renderer = this._createRenderer();\n this._renderService = this.register(this._instantiationService.createInstance(RenderService, renderer, this.rows, this.screenElement));\n this._instantiationService.setService(IRenderService, this._renderService);\n this.register(this._renderService.onRenderedViewportChange(e => this._onRender.fire(e)));\n this.onResize(e => this._renderService!.resize(e.cols, e.rows));\n\n this._compositionView = document.createElement('div');\n this._compositionView.classList.add('composition-view');\n this._compositionHelper = this._instantiationService.createInstance(CompositionHelper, this.textarea, this._compositionView);\n this._helperContainer.appendChild(this._compositionView);\n\n // Performance: Add viewport and helper elements from the fragment\n this.element.appendChild(fragment);\n\n this._soundService = this._instantiationService.createInstance(SoundService);\n this._instantiationService.setService(ISoundService, this._soundService);\n this._mouseService = this._instantiationService.createInstance(MouseService);\n this._instantiationService.setService(IMouseService, this._mouseService);\n\n this.viewport = this._instantiationService.createInstance(Viewport,\n (amount: number) => this.scrollLines(amount, true, ScrollSource.VIEWPORT),\n this._viewportElement,\n this._viewportScrollArea,\n this.element\n );\n this.viewport.onThemeChange(this._colorManager.colors);\n this.register(this._inputHandler.onRequestSyncScrollBar(() => this.viewport!.syncScrollArea()));\n this.register(this.viewport);\n\n this.register(this.onCursorMove(() => {\n this._renderService!.onCursorMove();\n this._syncTextArea();\n }));\n this.register(this.onResize(() => this._renderService!.onResize(this.cols, this.rows)));\n this.register(this.onBlur(() => this._renderService!.onBlur()));\n this.register(this.onFocus(() => this._renderService!.onFocus()));\n this.register(this._renderService.onDimensionsChange(() => this.viewport!.syncScrollArea()));\n\n this._selectionService = this.register(this._instantiationService.createInstance(SelectionService,\n this.element,\n this.screenElement,\n this.linkifier2\n ));\n this._instantiationService.setService(ISelectionService, this._selectionService);\n this.register(this._selectionService.onRequestScrollLines(e => this.scrollLines(e.amount, e.suppressScrollEvent)));\n this.register(this._selectionService.onSelectionChange(() => this._onSelectionChange.fire()));\n this.register(this._selectionService.onRequestRedraw(e => this._renderService!.onSelectionChanged(e.start, e.end, e.columnSelectMode)));\n this.register(this._selectionService.onLinuxMouseSelection(text => {\n // If there's a new selection, put it into the textarea, focus and select it\n // in order to register it as a selection on the OS. This event is fired\n // only on Linux to enable middle click to paste selection.\n this.textarea!.value = text;\n this.textarea!.focus();\n this.textarea!.select();\n }));\n this.register(this._onScroll.event(ev => {\n this.viewport!.syncScrollArea();\n this._selectionService!.refresh();\n }));\n this.register(addDisposableDomListener(this._viewportElement, 'scroll', () => this._selectionService!.refresh()));\n\n this._mouseZoneManager = this._instantiationService.createInstance(MouseZoneManager, this.element, this.screenElement);\n this.register(this._mouseZoneManager);\n this.register(this.onScroll(() => this._mouseZoneManager!.clearAll()));\n this.linkifier.attachToDom(this.element, this._mouseZoneManager);\n this.linkifier2.attachToDom(this.screenElement, this._mouseService, this._renderService);\n this.register(this._instantiationService.createInstance(BufferDecorationRenderer, this.screenElement));\n // This event listener must be registered aftre MouseZoneManager is created\n this.register(addDisposableDomListener(this.element, 'mousedown', (e: MouseEvent) => this._selectionService!.onMouseDown(e)));\n\n // apply mouse event classes set by escape codes before terminal was attached\n if (this.coreMouseService.areMouseEventsActive) {\n this._selectionService.disable();\n this.element.classList.add('enable-mouse-events');\n } else {\n this._selectionService.enable();\n }\n\n if (this.options.screenReaderMode) {\n // Note that this must be done *after* the renderer is created in order to\n // ensure the correct order of the dprchange event\n this._accessibilityManager = new AccessibilityManager(this, this._renderService);\n }\n\n if (this.options.overviewRulerWidth) {\n this._overviewRulerRenderer = this._instantiationService.createInstance(OverviewRulerRenderer, this._viewportElement, this.screenElement);\n }\n this.optionsService.onOptionChange(() => {\n if (!this._overviewRulerRenderer && this.options.overviewRulerWidth && this._viewportElement && this.screenElement) {\n this._overviewRulerRenderer = this._instantiationService.createInstance(OverviewRulerRenderer, this._viewportElement, this.screenElement);\n }\n });\n // Measure the character size\n this._charSizeService.measure();\n\n // Setup loop that draws to screen\n this.refresh(0, this.rows - 1);\n\n // Initialize global actions that need to be taken on the document.\n this._initGlobal();\n\n // Listen for mouse events and translate\n // them into terminal mouse protocols.\n this.bindMouse();\n }\n\n private _createRenderer(): IRenderer {\n switch (this.options.rendererType) {\n case 'canvas': return this._instantiationService.createInstance(Renderer, this._colorManager!.colors, this.screenElement!, this.linkifier, this.linkifier2);\n case 'dom': return this._instantiationService.createInstance(DomRenderer, this._colorManager!.colors, this.element!, this.screenElement!, this._viewportElement!, this.linkifier, this.linkifier2);\n default: throw new Error(`Unrecognized rendererType \"${this.options.rendererType}\"`);\n }\n }\n\n /**\n * Sets the theme on the renderer. The renderer must have been initialized.\n * @param theme The theme to set.\n */\n private _setTheme(theme: ITheme): void {\n this._theme = theme;\n this._colorManager?.setTheme(theme);\n this._renderService?.setColors(this._colorManager!.colors);\n this.viewport?.onThemeChange(this._colorManager!.colors);\n }\n\n /**\n * Bind certain mouse events to the terminal.\n * By default only 3 button + wheel up/down is ativated. For higher buttons\n * no mouse report will be created. Typically the standard actions will be active.\n *\n * There are several reasons not to enable support for higher buttons/wheel:\n * - Button 4 and 5 are typically used for history back and forward navigation,\n * there is no straight forward way to supress/intercept those standard actions.\n * - Support for higher buttons does not work in some platform/browser combinations.\n * - Left/right wheel was not tested.\n * - Emulators vary in mouse button support, typically only 3 buttons and\n * wheel up/down work reliable.\n *\n * TODO: Move mouse event code into its own file.\n */\n public bindMouse(): void {\n const self = this;\n const el = this.element!;\n\n // send event to CoreMouseService\n function sendEvent(ev: MouseEvent | WheelEvent): boolean {\n // get mouse coordinates\n const pos = self._mouseService!.getRawByteCoords(ev, self.screenElement!, self.cols, self.rows);\n if (!pos) {\n return false;\n }\n\n let but: CoreMouseButton;\n let action: CoreMouseAction | undefined;\n switch ((ev as any).overrideType || ev.type) {\n case 'mousemove':\n action = CoreMouseAction.MOVE;\n if (ev.buttons === undefined) {\n // buttons is not supported on macOS, try to get a value from button instead\n but = CoreMouseButton.NONE;\n if (ev.button !== undefined) {\n but = ev.button < 3 ? ev.button : CoreMouseButton.NONE;\n }\n } else {\n // according to MDN buttons only reports up to button 5 (AUX2)\n but = ev.buttons & 1 ? CoreMouseButton.LEFT :\n ev.buttons & 4 ? CoreMouseButton.MIDDLE :\n ev.buttons & 2 ? CoreMouseButton.RIGHT :\n CoreMouseButton.NONE; // fallback to NONE\n }\n break;\n case 'mouseup':\n action = CoreMouseAction.UP;\n but = ev.button < 3 ? ev.button : CoreMouseButton.NONE;\n break;\n case 'mousedown':\n action = CoreMouseAction.DOWN;\n but = ev.button < 3 ? ev.button : CoreMouseButton.NONE;\n break;\n case 'wheel':\n const amount = self.viewport!.getLinesScrolled(ev as WheelEvent);\n\n if (amount === 0) {\n return false;\n }\n\n action = (ev as WheelEvent).deltaY < 0 ? CoreMouseAction.UP : CoreMouseAction.DOWN;\n but = CoreMouseButton.WHEEL;\n break;\n default:\n // dont handle other event types by accident\n return false;\n }\n\n // exit if we cannot determine valid button/action values\n // do nothing for higher buttons than wheel\n if (action === undefined || but === undefined || but > CoreMouseButton.WHEEL) {\n return false;\n }\n\n return self.coreMouseService.triggerMouseEvent({\n col: pos.x - 33, // FIXME: why -33 here?\n row: pos.y - 33,\n button: but,\n action,\n ctrl: ev.ctrlKey,\n alt: ev.altKey,\n shift: ev.shiftKey\n });\n }\n\n /**\n * Event listener state handling.\n * We listen to the onProtocolChange event of CoreMouseService and put\n * requested listeners in `requestedEvents`. With this the listeners\n * have all bits to do the event listener juggling.\n * Note: 'mousedown' currently is \"always on\" and not managed\n * by onProtocolChange.\n */\n const requestedEvents: { [key: string]: ((ev: Event) => void) | null } = {\n mouseup: null,\n wheel: null,\n mousedrag: null,\n mousemove: null\n };\n const eventListeners: { [key: string]: (ev: any) => void | boolean } = {\n mouseup: (ev: MouseEvent) => {\n sendEvent(ev);\n if (!ev.buttons) {\n // if no other button is held remove global handlers\n this._document!.removeEventListener('mouseup', requestedEvents.mouseup!);\n if (requestedEvents.mousedrag) {\n this._document!.removeEventListener('mousemove', requestedEvents.mousedrag);\n }\n }\n return this.cancel(ev);\n },\n wheel: (ev: WheelEvent) => {\n sendEvent(ev);\n return this.cancel(ev, true);\n },\n mousedrag: (ev: MouseEvent) => {\n // deal only with move while a button is held\n if (ev.buttons) {\n sendEvent(ev);\n }\n },\n mousemove: (ev: MouseEvent) => {\n // deal only with move without any button\n if (!ev.buttons) {\n sendEvent(ev);\n }\n }\n };\n this.register(this.coreMouseService.onProtocolChange(events => {\n // apply global changes on events\n if (events) {\n if (this.optionsService.rawOptions.logLevel === 'debug') {\n this._logService.debug('Binding to mouse events:', this.coreMouseService.explainEvents(events));\n }\n this.element!.classList.add('enable-mouse-events');\n this._selectionService!.disable();\n } else {\n this._logService.debug('Unbinding from mouse events.');\n this.element!.classList.remove('enable-mouse-events');\n this._selectionService!.enable();\n }\n\n // add/remove handlers from requestedEvents\n\n if (!(events & CoreMouseEventType.MOVE)) {\n el.removeEventListener('mousemove', requestedEvents.mousemove!);\n requestedEvents.mousemove = null;\n } else if (!requestedEvents.mousemove) {\n el.addEventListener('mousemove', eventListeners.mousemove);\n requestedEvents.mousemove = eventListeners.mousemove;\n }\n\n if (!(events & CoreMouseEventType.WHEEL)) {\n el.removeEventListener('wheel', requestedEvents.wheel!);\n requestedEvents.wheel = null;\n } else if (!requestedEvents.wheel) {\n el.addEventListener('wheel', eventListeners.wheel, { passive: false });\n requestedEvents.wheel = eventListeners.wheel;\n }\n\n if (!(events & CoreMouseEventType.UP)) {\n this._document!.removeEventListener('mouseup', requestedEvents.mouseup!);\n requestedEvents.mouseup = null;\n } else if (!requestedEvents.mouseup) {\n requestedEvents.mouseup = eventListeners.mouseup;\n }\n\n if (!(events & CoreMouseEventType.DRAG)) {\n this._document!.removeEventListener('mousemove', requestedEvents.mousedrag!);\n requestedEvents.mousedrag = null;\n } else if (!requestedEvents.mousedrag) {\n requestedEvents.mousedrag = eventListeners.mousedrag;\n }\n }));\n // force initial onProtocolChange so we dont miss early mouse requests\n this.coreMouseService.activeProtocol = this.coreMouseService.activeProtocol;\n\n /**\n * \"Always on\" event listeners.\n */\n this.register(addDisposableDomListener(el, 'mousedown', (ev: MouseEvent) => {\n ev.preventDefault();\n this.focus();\n\n // Don't send the mouse button to the pty if mouse events are disabled or\n // if the selection manager is having selection forced (ie. a modifier is\n // held).\n if (!this.coreMouseService.areMouseEventsActive || this._selectionService!.shouldForceSelection(ev)) {\n return;\n }\n\n sendEvent(ev);\n\n // Register additional global handlers which should keep reporting outside\n // of the terminal element.\n // Note: Other emulators also do this for 'mousedown' while a button\n // is held, we currently limit 'mousedown' to the terminal only.\n if (requestedEvents.mouseup) {\n this._document!.addEventListener('mouseup', requestedEvents.mouseup);\n }\n if (requestedEvents.mousedrag) {\n this._document!.addEventListener('mousemove', requestedEvents.mousedrag);\n }\n\n return this.cancel(ev);\n }));\n\n this.register(addDisposableDomListener(el, 'wheel', (ev: WheelEvent) => {\n // do nothing, if app side handles wheel itself\n if (requestedEvents.wheel) return;\n\n if (!this.buffer.hasScrollback) {\n // Convert wheel events into up/down events when the buffer does not have scrollback, this\n // enables scrolling in apps hosted in the alt buffer such as vim or tmux.\n const amount = this.viewport!.getLinesScrolled(ev);\n\n // Do nothing if there's no vertical scroll\n if (amount === 0) {\n return;\n }\n\n // Construct and send sequences\n const sequence = C0.ESC + (this.coreService.decPrivateModes.applicationCursorKeys ? 'O' : '[') + (ev.deltaY < 0 ? 'A' : 'B');\n let data = '';\n for (let i = 0; i < Math.abs(amount); i++) {\n data += sequence;\n }\n this.coreService.triggerDataEvent(data, true);\n return this.cancel(ev, true);\n }\n\n // normal viewport scrolling\n // conditionally stop event, if the viewport still had rows to scroll within\n if (this.viewport!.onWheel(ev)) {\n return this.cancel(ev);\n }\n }, { passive: false }));\n\n this.register(addDisposableDomListener(el, 'touchstart', (ev: TouchEvent) => {\n if (this.coreMouseService.areMouseEventsActive) return;\n this.viewport!.onTouchStart(ev);\n return this.cancel(ev);\n }, { passive: true }));\n\n this.register(addDisposableDomListener(el, 'touchmove', (ev: TouchEvent) => {\n if (this.coreMouseService.areMouseEventsActive) return;\n if (!this.viewport!.onTouchMove(ev)) {\n return this.cancel(ev);\n }\n }, { passive: false }));\n }\n\n\n /**\n * Tells the renderer to refresh terminal content between two rows (inclusive) at the next\n * opportunity.\n * @param start The row to start from (between 0 and this.rows - 1).\n * @param end The row to end at (between start and this.rows - 1).\n */\n public refresh(start: number, end: number): void {\n this._renderService?.refreshRows(start, end);\n }\n\n /**\n * Queues linkification for the specified rows.\n * @param start The row to start from (between 0 and this.rows - 1).\n * @param end The row to end at (between start and this.rows - 1).\n */\n private _queueLinkification(start: number, end: number): void {\n this.linkifier?.linkifyRows(start, end);\n }\n\n /**\n * Change the cursor style for different selection modes\n */\n public updateCursorStyle(ev: KeyboardEvent): void {\n if (this._selectionService?.shouldColumnSelect(ev)) {\n this.element!.classList.add('column-select');\n } else {\n this.element!.classList.remove('column-select');\n }\n }\n\n /**\n * Display the cursor element\n */\n private _showCursor(): void {\n if (!this.coreService.isCursorInitialized) {\n this.coreService.isCursorInitialized = true;\n this.refresh(this.buffer.y, this.buffer.y);\n }\n }\n\n public scrollLines(disp: number, suppressScrollEvent?: boolean, source = ScrollSource.TERMINAL): void {\n super.scrollLines(disp, suppressScrollEvent, source);\n this.refresh(0, this.rows - 1);\n }\n\n public paste(data: string): void {\n paste(data, this.textarea!, this.coreService);\n }\n\n /**\n * Attaches a custom key event handler which is run before keys are processed,\n * giving consumers of xterm.js ultimate control as to what keys should be\n * processed by the terminal and what keys should not.\n * @param customKeyEventHandler The custom KeyboardEvent handler to attach.\n * This is a function that takes a KeyboardEvent, allowing consumers to stop\n * propagation and/or prevent the default action. The function returns whether\n * the event should be processed by xterm.js.\n */\n public attachCustomKeyEventHandler(customKeyEventHandler: CustomKeyEventHandler): void {\n this._customKeyEventHandler = customKeyEventHandler;\n }\n\n /**\n * Registers a link matcher, allowing custom link patterns to be matched and\n * handled.\n * @param regex The regular expression to search for, specifically\n * this searches the textContent of the rows. You will want to use \\s to match\n * a space ' ' character for example.\n * @param handler The callback when the link is called.\n * @param options Options for the link matcher.\n * @return The ID of the new matcher, this can be used to deregister.\n */\n public registerLinkMatcher(regex: RegExp, handler: LinkMatcherHandler, options?: ILinkMatcherOptions): number {\n const matcherId = this.linkifier.registerLinkMatcher(regex, handler, options);\n this.refresh(0, this.rows - 1);\n return matcherId;\n }\n\n /**\n * Deregisters a link matcher if it has been registered.\n * @param matcherId The link matcher's ID (returned after register)\n */\n public deregisterLinkMatcher(matcherId: number): void {\n if (this.linkifier.deregisterLinkMatcher(matcherId)) {\n this.refresh(0, this.rows - 1);\n }\n }\n\n public registerLinkProvider(linkProvider: ILinkProvider): IDisposable {\n return this.linkifier2.registerLinkProvider(linkProvider);\n }\n\n public registerCharacterJoiner(handler: CharacterJoinerHandler): number {\n if (!this._characterJoinerService) {\n throw new Error('Terminal must be opened first');\n }\n const joinerId = this._characterJoinerService.register(handler);\n this.refresh(0, this.rows - 1);\n return joinerId;\n }\n\n public deregisterCharacterJoiner(joinerId: number): void {\n if (!this._characterJoinerService) {\n throw new Error('Terminal must be opened first');\n }\n if (this._characterJoinerService.deregister(joinerId)) {\n this.refresh(0, this.rows - 1);\n }\n }\n\n public get markers(): IMarker[] {\n return this.buffer.markers;\n }\n\n public addMarker(cursorYOffset: number): IMarker | undefined {\n // Disallow markers on the alt buffer\n if (this.buffer !== this.buffers.normal) {\n return;\n }\n\n return this.buffer.addMarker(this.buffer.ybase + this.buffer.y + cursorYOffset);\n }\n\n public registerDecoration(decorationOptions: IDecorationOptions): IDecoration | undefined {\n return this._decorationService.registerDecoration(decorationOptions);\n }\n\n /**\n * Gets whether the terminal has an active selection.\n */\n public hasSelection(): boolean {\n return this._selectionService ? this._selectionService.hasSelection : false;\n }\n\n /**\n * Selects text within the terminal.\n * @param column The column the selection starts at..\n * @param row The row the selection starts at.\n * @param length The length of the selection.\n */\n public select(column: number, row: number, length: number): void {\n this._selectionService!.setSelection(column, row, length);\n }\n\n /**\n * Gets the terminal's current selection, this is useful for implementing copy\n * behavior outside of xterm.js.\n */\n public getSelection(): string {\n return this._selectionService ? this._selectionService.selectionText : '';\n }\n\n public getSelectionPosition(): ISelectionPosition | undefined {\n if (!this._selectionService || !this._selectionService.hasSelection) {\n return undefined;\n }\n\n return {\n startColumn: this._selectionService.selectionStart![0],\n startRow: this._selectionService.selectionStart![1],\n endColumn: this._selectionService.selectionEnd![0],\n endRow: this._selectionService.selectionEnd![1]\n };\n }\n\n /**\n * Clears the current terminal selection.\n */\n public clearSelection(): void {\n this._selectionService?.clearSelection();\n }\n\n /**\n * Selects all text within the terminal.\n */\n public selectAll(): void {\n this._selectionService?.selectAll();\n }\n\n public selectLines(start: number, end: number): void {\n this._selectionService?.selectLines(start, end);\n }\n\n /**\n * Handle a keydown event\n * Key Resources:\n * - https://developer.mozilla.org/en-US/docs/DOM/KeyboardEvent\n * @param ev The keydown event to be handled.\n */\n protected _keyDown(event: KeyboardEvent): boolean | undefined {\n this._keyDownHandled = false;\n this._keyDownSeen = true;\n\n if (this._customKeyEventHandler && this._customKeyEventHandler(event) === false) {\n return false;\n }\n\n // Ignore composing with Alt key on Mac when macOptionIsMeta is enabled\n const shouldIgnoreComposition = this.browser.isMac && this.options.macOptionIsMeta && event.altKey;\n\n if (!shouldIgnoreComposition && !this._compositionHelper!.keydown(event)) {\n if (this.buffer.ybase !== this.buffer.ydisp) {\n this._bufferService.scrollToBottom();\n }\n return false;\n }\n\n if (!shouldIgnoreComposition && (event.key === 'Dead' || event.key === 'AltGraph')) {\n this._unprocessedDeadKey = true;\n }\n\n const result = evaluateKeyboardEvent(event, this.coreService.decPrivateModes.applicationCursorKeys, this.browser.isMac, this.options.macOptionIsMeta);\n\n this.updateCursorStyle(event);\n\n if (result.type === KeyboardResultType.PAGE_DOWN || result.type === KeyboardResultType.PAGE_UP) {\n const scrollCount = this.rows - 1;\n this.scrollLines(result.type === KeyboardResultType.PAGE_UP ? -scrollCount : scrollCount);\n return this.cancel(event, true);\n }\n\n if (result.type === KeyboardResultType.SELECT_ALL) {\n this.selectAll();\n }\n\n if (this._isThirdLevelShift(this.browser, event)) {\n return true;\n }\n\n if (result.cancel) {\n // The event is canceled at the end already, is this necessary?\n this.cancel(event, true);\n }\n\n if (!result.key) {\n return true;\n }\n\n // HACK: Process A-Z in the keypress event to fix an issue with macOS IMEs where lower case\n // letters cannot be input while caps lock is on.\n if (event.key && !event.ctrlKey && !event.altKey && !event.metaKey && event.key.length === 1) {\n if (event.key.charCodeAt(0) >= 65 && event.key.charCodeAt(0) <= 90) {\n return true;\n }\n }\n\n if (this._unprocessedDeadKey) {\n this._unprocessedDeadKey = false;\n return true;\n }\n\n // If ctrl+c or enter is being sent, clear out the textarea. This is done so that screen readers\n // will announce deleted characters. This will not work 100% of the time but it should cover\n // most scenarios.\n if (result.key === C0.ETX || result.key === C0.CR) {\n this.textarea!.value = '';\n }\n\n this._onKey.fire({ key: result.key, domEvent: event });\n this._showCursor();\n this.coreService.triggerDataEvent(result.key, true);\n\n // Cancel events when not in screen reader mode so events don't get bubbled up and handled by\n // other listeners. When screen reader mode is enabled, this could cause issues if the event\n // is handled at a higher level, this is a compromise in order to echo keys to the screen\n // reader.\n if (!this.optionsService.rawOptions.screenReaderMode) {\n return this.cancel(event, true);\n }\n\n this._keyDownHandled = true;\n }\n\n private _isThirdLevelShift(browser: IBrowser, ev: KeyboardEvent): boolean {\n const thirdLevelKey =\n (browser.isMac && !this.options.macOptionIsMeta && ev.altKey && !ev.ctrlKey && !ev.metaKey) ||\n (browser.isWindows && ev.altKey && ev.ctrlKey && !ev.metaKey) ||\n (browser.isWindows && ev.getModifierState('AltGraph'));\n\n if (ev.type === 'keypress') {\n return thirdLevelKey;\n }\n\n // Don't invoke for arrows, pageDown, home, backspace, etc. (on non-keypress events)\n return thirdLevelKey && (!ev.keyCode || ev.keyCode > 47);\n }\n\n protected _keyUp(ev: KeyboardEvent): void {\n this._keyDownSeen = false;\n\n if (this._customKeyEventHandler && this._customKeyEventHandler(ev) === false) {\n return;\n }\n\n if (!wasModifierKeyOnlyEvent(ev)) {\n this.focus();\n }\n\n this.updateCursorStyle(ev);\n this._keyPressHandled = false;\n }\n\n /**\n * Handle a keypress event.\n * Key Resources:\n * - https://developer.mozilla.org/en-US/docs/DOM/KeyboardEvent\n * @param ev The keypress event to be handled.\n */\n protected _keyPress(ev: KeyboardEvent): boolean {\n let key;\n\n this._keyPressHandled = false;\n\n if (this._keyDownHandled) {\n return false;\n }\n\n if (this._customKeyEventHandler && this._customKeyEventHandler(ev) === false) {\n return false;\n }\n\n this.cancel(ev);\n\n if (ev.charCode) {\n key = ev.charCode;\n } else if (ev.which === null || ev.which === undefined) {\n key = ev.keyCode;\n } else if (ev.which !== 0 && ev.charCode !== 0) {\n key = ev.which;\n } else {\n return false;\n }\n\n if (!key || (\n (ev.altKey || ev.ctrlKey || ev.metaKey) && !this._isThirdLevelShift(this.browser, ev)\n )) {\n return false;\n }\n\n key = String.fromCharCode(key);\n\n this._onKey.fire({ key, domEvent: ev });\n this._showCursor();\n this.coreService.triggerDataEvent(key, true);\n\n this._keyPressHandled = true;\n\n // The key was handled so clear the dead key state, otherwise certain keystrokes like arrow\n // keys could be ignored\n this._unprocessedDeadKey = false;\n\n return true;\n }\n\n /**\n * Handle an input event.\n * Key Resources:\n * - https://developer.mozilla.org/en-US/docs/Web/API/InputEvent\n * @param ev The input event to be handled.\n */\n protected _inputEvent(ev: InputEvent): boolean {\n // Only support emoji IMEs when screen reader mode is disabled as the event must bubble up to\n // support reading out character input which can doubling up input characters\n // Based on these event traces: https://github.com/xtermjs/xterm.js/issues/3679\n if (ev.data && ev.inputType === 'insertText' && (!ev.composed || !this._keyDownSeen) && !this.optionsService.rawOptions.screenReaderMode) {\n if (this._keyPressHandled) {\n return false;\n }\n\n // The key was handled so clear the dead key state, otherwise certain keystrokes like arrow\n // keys could be ignored\n this._unprocessedDeadKey = false;\n\n const text = ev.data;\n this.coreService.triggerDataEvent(text, true);\n\n this.cancel(ev);\n return true;\n }\n\n return false;\n }\n\n /**\n * Ring the bell.\n * Note: We could do sweet things with webaudio here\n */\n public bell(): void {\n if (this._soundBell()) {\n this._soundService?.playBellSound();\n }\n\n this._onBell.fire();\n\n // if (this._visualBell()) {\n // this.element.classList.add('visual-bell-active');\n // clearTimeout(this._visualBellTimer);\n // this._visualBellTimer = window.setTimeout(() => {\n // this.element.classList.remove('visual-bell-active');\n // }, 200);\n // }\n }\n\n /**\n * Resizes the terminal.\n *\n * @param x The number of columns to resize to.\n * @param y The number of rows to resize to.\n */\n public resize(x: number, y: number): void {\n if (x === this.cols && y === this.rows) {\n // Check if we still need to measure the char size (fixes #785).\n if (this._charSizeService && !this._charSizeService.hasValidSize) {\n this._charSizeService.measure();\n }\n return;\n }\n\n super.resize(x, y);\n }\n\n private _afterResize(x: number, y: number): void {\n this._charSizeService?.measure();\n\n // Sync the scroll area to make sure scroll events don't fire and scroll the viewport to an\n // invalid location\n this.viewport?.syncScrollArea(true);\n }\n\n /**\n * Clear the entire buffer, making the prompt line the new first line.\n */\n public clear(): void {\n if (this.buffer.ybase === 0 && this.buffer.y === 0) {\n // Don't clear if it's already clear\n return;\n }\n this.buffer.clearAllMarkers();\n this.buffer.lines.set(0, this.buffer.lines.get(this.buffer.ybase + this.buffer.y)!);\n this.buffer.lines.length = 1;\n this.buffer.ydisp = 0;\n this.buffer.ybase = 0;\n this.buffer.y = 0;\n for (let i = 1; i < this.rows; i++) {\n this.buffer.lines.push(this.buffer.getBlankLine(DEFAULT_ATTR_DATA));\n }\n this.refresh(0, this.rows - 1);\n this._onScroll.fire({ position: this.buffer.ydisp, source: ScrollSource.TERMINAL });\n }\n\n /**\n * Reset terminal.\n * Note: Calling this directly from JS is synchronous but does not clear\n * input buffers and does not reset the parser, thus the terminal will\n * continue to apply pending input data.\n * If you need in band reset (synchronous with input data) consider\n * using DECSTR (soft reset, CSI ! p) or RIS instead (hard reset, ESC c).\n */\n public reset(): void {\n /**\n * Since _setup handles a full terminal creation, we have to carry forward\n * a few things that should not reset.\n */\n this.options.rows = this.rows;\n this.options.cols = this.cols;\n const customKeyEventHandler = this._customKeyEventHandler;\n\n this._setup();\n super.reset();\n this._selectionService?.reset();\n this._decorationService.reset();\n\n // reattach\n this._customKeyEventHandler = customKeyEventHandler;\n\n // do a full screen refresh\n this.refresh(0, this.rows - 1);\n this.viewport?.syncScrollArea();\n }\n\n public clearTextureAtlas(): void {\n this._renderService?.clearTextureAtlas();\n }\n\n private _reportFocus(): void {\n if (this.element?.classList.contains('focus')) {\n this.coreService.triggerDataEvent(C0.ESC + '[I');\n } else {\n this.coreService.triggerDataEvent(C0.ESC + '[O');\n }\n }\n\n private _reportWindowsOptions(type: WindowsOptionsReportType): void {\n if (!this._renderService) {\n return;\n }\n\n switch (type) {\n case WindowsOptionsReportType.GET_WIN_SIZE_PIXELS:\n const canvasWidth = this._renderService.dimensions.scaledCanvasWidth.toFixed(0);\n const canvasHeight = this._renderService.dimensions.scaledCanvasHeight.toFixed(0);\n this.coreService.triggerDataEvent(`${C0.ESC}[4;${canvasHeight};${canvasWidth}t`);\n break;\n case WindowsOptionsReportType.GET_CELL_SIZE_PIXELS:\n const cellWidth = this._renderService.dimensions.scaledCellWidth.toFixed(0);\n const cellHeight = this._renderService.dimensions.scaledCellHeight.toFixed(0);\n this.coreService.triggerDataEvent(`${C0.ESC}[6;${cellHeight};${cellWidth}t`);\n break;\n }\n }\n\n // TODO: Remove cancel function and cancelEvents option\n public cancel(ev: Event, force?: boolean): boolean | undefined {\n if (!this.options.cancelEvents && !force) {\n return;\n }\n ev.preventDefault();\n ev.stopPropagation();\n return false;\n }\n\n private _visualBell(): boolean {\n return false;\n // return this.options.bellStyle === 'visual' ||\n // this.options.bellStyle === 'both';\n }\n\n private _soundBell(): boolean {\n return this.options.bellStyle === 'sound';\n // return this.options.bellStyle === 'sound' ||\n // this.options.bellStyle === 'both';\n }\n}\n\n/**\n * Helpers\n */\n\nfunction wasModifierKeyOnlyEvent(ev: KeyboardEvent): boolean {\n return ev.keyCode === 16 || // Shift\n ev.keyCode === 17 || // Ctrl\n ev.keyCode === 18; // Alt\n}\n","/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nconst RENDER_DEBOUNCE_THRESHOLD_MS = 1000; // 1 Second\n\nimport { IRenderDebouncer } from 'browser/Types';\n\n/**\n * Debounces calls to update screen readers to update at most once configurable interval of time.\n */\nexport class TimeBasedDebouncer implements IRenderDebouncer {\n private _rowStart: number | undefined;\n private _rowEnd: number | undefined;\n private _rowCount: number | undefined;\n\n // The last moment that the Terminal was refreshed at\n private _lastRefreshMs = 0;\n // Whether a trailing refresh should be triggered due to a refresh request that was throttled\n private _additionalRefreshRequested = false;\n\n private _refreshTimeoutID: number | undefined;\n\n constructor(\n private _renderCallback: (start: number, end: number) => void,\n private readonly _debounceThresholdMS = RENDER_DEBOUNCE_THRESHOLD_MS\n ) {\n }\n\n public dispose(): void {\n if (this._refreshTimeoutID) {\n clearTimeout(this._refreshTimeoutID);\n }\n }\n\n public refresh(rowStart: number | undefined, rowEnd: number | undefined, rowCount: number): void {\n this._rowCount = rowCount;\n // Get the min/max row start/end for the arg values\n rowStart = rowStart !== undefined ? rowStart : 0;\n rowEnd = rowEnd !== undefined ? rowEnd : this._rowCount - 1;\n // Set the properties to the updated values\n this._rowStart = this._rowStart !== undefined ? Math.min(this._rowStart, rowStart) : rowStart;\n this._rowEnd = this._rowEnd !== undefined ? Math.max(this._rowEnd, rowEnd) : rowEnd;\n\n // Only refresh if the time since last refresh is above a threshold, otherwise wait for\n // enough time to pass before refreshing again.\n const refreshRequestTime: number = Date.now();\n if (refreshRequestTime - this._lastRefreshMs >= this._debounceThresholdMS) {\n // Enough time has lapsed since the last refresh; refresh immediately\n this._lastRefreshMs = refreshRequestTime;\n this._innerRefresh();\n } else if (!this._additionalRefreshRequested) {\n // This is the first additional request throttled; set up trailing refresh\n const elapsed = refreshRequestTime - this._lastRefreshMs;\n const waitPeriodBeforeTrailingRefresh = this._debounceThresholdMS - elapsed;\n this._additionalRefreshRequested = true;\n\n this._refreshTimeoutID = window.setTimeout(() => {\n this._lastRefreshMs = Date.now();\n this._innerRefresh();\n this._additionalRefreshRequested = false;\n this._refreshTimeoutID = undefined; // No longer need to clear the timeout\n }, waitPeriodBeforeTrailingRefresh);\n }\n }\n\n private _innerRefresh(): void {\n // Make sure values are set\n if (this._rowStart === undefined || this._rowEnd === undefined || this._rowCount === undefined) {\n return;\n }\n\n // Clamp values\n const start = Math.max(this._rowStart, 0);\n const end = Math.min(this._rowEnd, this._rowCount - 1);\n\n // Reset debouncer (this happens before render callback as the render could trigger it again)\n this._rowStart = undefined;\n this._rowEnd = undefined;\n\n // Run render callback\n this._renderCallback(start, end);\n }\n}\n\n","/**\n * Copyright (c) 2016 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { Disposable } from 'common/Lifecycle';\nimport { addDisposableDomListener } from 'browser/Lifecycle';\nimport { IColorSet, IViewport } from 'browser/Types';\nimport { ICharSizeService, IRenderService } from 'browser/services/Services';\nimport { IBufferService, IOptionsService } from 'common/services/Services';\nimport { IBuffer } from 'common/buffer/Types';\nimport { IRenderDimensions } from 'browser/renderer/Types';\n\nconst FALLBACK_SCROLL_BAR_WIDTH = 15;\n\n/**\n * Represents the viewport of a terminal, the visible area within the larger buffer of output.\n * Logic for the virtual scroll bar is included in this object.\n */\nexport class Viewport extends Disposable implements IViewport {\n public scrollBarWidth: number = 0;\n private _currentRowHeight: number = 0;\n private _currentScaledCellHeight: number = 0;\n private _lastRecordedBufferLength: number = 0;\n private _lastRecordedViewportHeight: number = 0;\n private _lastRecordedBufferHeight: number = 0;\n private _lastTouchY: number = 0;\n private _lastScrollTop: number = 0;\n private _activeBuffer: IBuffer;\n private _renderDimensions: IRenderDimensions;\n\n // Stores a partial line amount when scrolling, this is used to keep track of how much of a line\n // is scrolled so we can \"scroll\" over partial lines and feel natural on touchpads. This is a\n // quick fix and could have a more robust solution in place that reset the value when needed.\n private _wheelPartialScroll: number = 0;\n\n private _refreshAnimationFrame: number | null = null;\n private _ignoreNextScrollEvent: boolean = false;\n\n constructor(\n private readonly _scrollLines: (amount: number) => void,\n private readonly _viewportElement: HTMLElement,\n private readonly _scrollArea: HTMLElement,\n private readonly _element: HTMLElement,\n @IBufferService private readonly _bufferService: IBufferService,\n @IOptionsService private readonly _optionsService: IOptionsService,\n @ICharSizeService private readonly _charSizeService: ICharSizeService,\n @IRenderService private readonly _renderService: IRenderService\n ) {\n super();\n\n // Measure the width of the scrollbar. If it is 0 we can assume it's an OSX overlay scrollbar.\n // Unfortunately the overlay scrollbar would be hidden underneath the screen element in that case,\n // therefore we account for a standard amount to make it visible\n this.scrollBarWidth = (this._viewportElement.offsetWidth - this._scrollArea.offsetWidth) || FALLBACK_SCROLL_BAR_WIDTH;\n this.register(addDisposableDomListener(this._viewportElement, 'scroll', this._onScroll.bind(this)));\n\n // Track properties used in performance critical code manually to avoid using slow getters\n this._activeBuffer = this._bufferService.buffer;\n this.register(this._bufferService.buffers.onBufferActivate(e => this._activeBuffer = e.activeBuffer));\n this._renderDimensions = this._renderService.dimensions;\n this.register(this._renderService.onDimensionsChange(e => this._renderDimensions = e));\n\n // Perform this async to ensure the ICharSizeService is ready.\n setTimeout(() => this.syncScrollArea(), 0);\n }\n\n public onThemeChange(colors: IColorSet): void {\n this._viewportElement.style.backgroundColor = colors.background.css;\n }\n\n /**\n * Refreshes row height, setting line-height, viewport height and scroll area height if\n * necessary.\n */\n private _refresh(immediate: boolean): void {\n if (immediate) {\n this._innerRefresh();\n if (this._refreshAnimationFrame !== null) {\n cancelAnimationFrame(this._refreshAnimationFrame);\n }\n return;\n }\n if (this._refreshAnimationFrame === null) {\n this._refreshAnimationFrame = requestAnimationFrame(() => this._innerRefresh());\n }\n }\n\n private _innerRefresh(): void {\n if (this._charSizeService.height > 0) {\n this._currentRowHeight = this._renderService.dimensions.scaledCellHeight / window.devicePixelRatio;\n this._currentScaledCellHeight = this._renderService.dimensions.scaledCellHeight;\n this._lastRecordedViewportHeight = this._viewportElement.offsetHeight;\n const newBufferHeight = Math.round(this._currentRowHeight * this._lastRecordedBufferLength) + (this._lastRecordedViewportHeight - this._renderService.dimensions.canvasHeight);\n if (this._lastRecordedBufferHeight !== newBufferHeight) {\n this._lastRecordedBufferHeight = newBufferHeight;\n this._scrollArea.style.height = this._lastRecordedBufferHeight + 'px';\n }\n }\n\n // Sync scrollTop\n const scrollTop = this._bufferService.buffer.ydisp * this._currentRowHeight;\n if (this._viewportElement.scrollTop !== scrollTop) {\n // Ignore the next scroll event which will be triggered by setting the scrollTop as we do not\n // want this event to scroll the terminal\n this._ignoreNextScrollEvent = true;\n this._viewportElement.scrollTop = scrollTop;\n }\n\n this._refreshAnimationFrame = null;\n }\n\n /**\n * Updates dimensions and synchronizes the scroll area if necessary.\n */\n public syncScrollArea(immediate: boolean = false): void {\n // If buffer height changed\n if (this._lastRecordedBufferLength !== this._bufferService.buffer.lines.length) {\n this._lastRecordedBufferLength = this._bufferService.buffer.lines.length;\n this._refresh(immediate);\n return;\n }\n\n // If viewport height changed\n if (this._lastRecordedViewportHeight !== this._renderService.dimensions.canvasHeight) {\n this._refresh(immediate);\n return;\n }\n\n // If the buffer position doesn't match last scroll top\n if (this._lastScrollTop !== this._activeBuffer.ydisp * this._currentRowHeight) {\n this._refresh(immediate);\n return;\n }\n\n // If row height changed\n if (this._renderDimensions.scaledCellHeight !== this._currentScaledCellHeight) {\n this._refresh(immediate);\n return;\n }\n }\n\n /**\n * Handles scroll events on the viewport, calculating the new viewport and requesting the\n * terminal to scroll to it.\n * @param ev The scroll event.\n */\n private _onScroll(ev: Event): void {\n // Record current scroll top position\n this._lastScrollTop = this._viewportElement.scrollTop;\n\n // Don't attempt to scroll if the element is not visible, otherwise scrollTop will be corrupt\n // which causes the terminal to scroll the buffer to the top\n if (!this._viewportElement.offsetParent) {\n return;\n }\n\n // Ignore the event if it was flagged to ignore (when the source of the event is from Viewport)\n if (this._ignoreNextScrollEvent) {\n this._ignoreNextScrollEvent = false;\n // Still trigger the scroll so lines get refreshed\n this._scrollLines(0);\n return;\n }\n\n const newRow = Math.round(this._lastScrollTop / this._currentRowHeight);\n const diff = newRow - this._bufferService.buffer.ydisp;\n this._scrollLines(diff);\n }\n\n /**\n * Handles bubbling of scroll event in case the viewport has reached top or bottom\n * @param ev The scroll event.\n * @param amount The amount scrolled\n */\n private _bubbleScroll(ev: Event, amount: number): boolean {\n const scrollPosFromTop = this._viewportElement.scrollTop + this._lastRecordedViewportHeight;\n if ((amount < 0 && this._viewportElement.scrollTop !== 0) ||\n (amount > 0 && scrollPosFromTop < this._lastRecordedBufferHeight)) {\n if (ev.cancelable) {\n ev.preventDefault();\n }\n return false;\n }\n return true;\n }\n\n /**\n * Handles mouse wheel events by adjusting the viewport's scrollTop and delegating the actual\n * scrolling to `onScroll`, this event needs to be attached manually by the consumer of\n * `Viewport`.\n * @param ev The mouse wheel event.\n */\n public onWheel(ev: WheelEvent): boolean {\n const amount = this._getPixelsScrolled(ev);\n if (amount === 0) {\n return false;\n }\n this._viewportElement.scrollTop += amount;\n return this._bubbleScroll(ev, amount);\n }\n\n private _getPixelsScrolled(ev: WheelEvent): number {\n // Do nothing if it's not a vertical scroll event\n if (ev.deltaY === 0 || ev.shiftKey) {\n return 0;\n }\n\n // Fallback to WheelEvent.DOM_DELTA_PIXEL\n let amount = this._applyScrollModifier(ev.deltaY, ev);\n if (ev.deltaMode === WheelEvent.DOM_DELTA_LINE) {\n amount *= this._currentRowHeight;\n } else if (ev.deltaMode === WheelEvent.DOM_DELTA_PAGE) {\n amount *= this._currentRowHeight * this._bufferService.rows;\n }\n return amount;\n }\n\n /**\n * Gets the number of pixels scrolled by the mouse event taking into account what type of delta\n * is being used.\n * @param ev The mouse wheel event.\n */\n public getLinesScrolled(ev: WheelEvent): number {\n // Do nothing if it's not a vertical scroll event\n if (ev.deltaY === 0 || ev.shiftKey) {\n return 0;\n }\n\n // Fallback to WheelEvent.DOM_DELTA_LINE\n let amount = this._applyScrollModifier(ev.deltaY, ev);\n if (ev.deltaMode === WheelEvent.DOM_DELTA_PIXEL) {\n amount /= this._currentRowHeight + 0.0; // Prevent integer division\n this._wheelPartialScroll += amount;\n amount = Math.floor(Math.abs(this._wheelPartialScroll)) * (this._wheelPartialScroll > 0 ? 1 : -1);\n this._wheelPartialScroll %= 1;\n } else if (ev.deltaMode === WheelEvent.DOM_DELTA_PAGE) {\n amount *= this._bufferService.rows;\n }\n return amount;\n }\n\n private _applyScrollModifier(amount: number, ev: WheelEvent): number {\n const modifier = this._optionsService.rawOptions.fastScrollModifier;\n // Multiply the scroll speed when the modifier is down\n if ((modifier === 'alt' && ev.altKey) ||\n (modifier === 'ctrl' && ev.ctrlKey) ||\n (modifier === 'shift' && ev.shiftKey)) {\n return amount * this._optionsService.rawOptions.fastScrollSensitivity * this._optionsService.rawOptions.scrollSensitivity;\n }\n\n return amount * this._optionsService.rawOptions.scrollSensitivity;\n }\n\n /**\n * Handles the touchstart event, recording the touch occurred.\n * @param ev The touch event.\n */\n public onTouchStart(ev: TouchEvent): void {\n this._lastTouchY = ev.touches[0].pageY;\n }\n\n /**\n * Handles the touchmove event, scrolling the viewport if the position shifted.\n * @param ev The touch event.\n */\n public onTouchMove(ev: TouchEvent): boolean {\n const deltaY = this._lastTouchY - ev.touches[0].pageY;\n this._lastTouchY = ev.touches[0].pageY;\n if (deltaY === 0) {\n return false;\n }\n this._viewportElement.scrollTop += deltaY;\n return this._bubbleScroll(ev, deltaY);\n }\n}\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { addDisposableDomListener } from 'browser/Lifecycle';\nimport { IRenderService } from 'browser/services/Services';\nimport { Disposable } from 'common/Lifecycle';\nimport { IBufferService, IDecorationService, IInternalDecoration } from 'common/services/Services';\n\nexport class BufferDecorationRenderer extends Disposable {\n private readonly _container: HTMLElement;\n private readonly _decorationElements: Map<IInternalDecoration, HTMLElement> = new Map();\n\n private _animationFrame: number | undefined;\n private _altBufferIsActive: boolean = false;\n private _dimensionsChanged: boolean = false;\n\n constructor(\n private readonly _screenElement: HTMLElement,\n @IBufferService private readonly _bufferService: IBufferService,\n @IDecorationService private readonly _decorationService: IDecorationService,\n @IRenderService private readonly _renderService: IRenderService\n ) {\n super();\n\n this._container = document.createElement('div');\n this._container.classList.add('xterm-decoration-container');\n this._screenElement.appendChild(this._container);\n\n this.register(this._renderService.onRenderedViewportChange(() => this._queueRefresh()));\n this.register(this._renderService.onDimensionsChange(() => {\n this._dimensionsChanged = true;\n this._queueRefresh();\n }));\n this.register(addDisposableDomListener(window, 'resize', () => this._queueRefresh()));\n this.register(this._bufferService.buffers.onBufferActivate(() => {\n this._altBufferIsActive = this._bufferService.buffer === this._bufferService.buffers.alt;\n }));\n this.register(this._decorationService.onDecorationRegistered(() => this._queueRefresh()));\n this.register(this._decorationService.onDecorationRemoved(decoration => this._removeDecoration(decoration)));\n }\n\n public override dispose(): void {\n this._container.remove();\n this._decorationElements.clear();\n super.dispose();\n }\n\n private _queueRefresh(): void {\n if (this._animationFrame !== undefined) {\n return;\n }\n this._animationFrame = this._renderService.addRefreshCallback(() => {\n this.refreshDecorations();\n this._animationFrame = undefined;\n });\n }\n\n public refreshDecorations(): void {\n for (const decoration of this._decorationService.decorations) {\n this._renderDecoration(decoration);\n }\n this._dimensionsChanged = false;\n }\n\n private _renderDecoration(decoration: IInternalDecoration): void {\n this._refreshStyle(decoration);\n if (this._dimensionsChanged) {\n this._refreshXPosition(decoration);\n }\n }\n\n private _createElement(decoration: IInternalDecoration): HTMLElement {\n const element = document.createElement('div');\n element.classList.add('xterm-decoration');\n element.style.width = `${Math.round((decoration.options.width || 1) * this._renderService.dimensions.actualCellWidth)}px`;\n element.style.height = `${(decoration.options.height || 1) * this._renderService.dimensions.actualCellHeight}px`;\n element.style.top = `${(decoration.marker.line - this._bufferService.buffers.active.ydisp) * this._renderService.dimensions.actualCellHeight}px`;\n element.style.lineHeight = `${this._renderService.dimensions.actualCellHeight}px`;\n\n const x = decoration.options.x ?? 0;\n if (x && x > this._bufferService.cols) {\n // exceeded the container width, so hide\n element.style.display = 'none';\n }\n this._refreshXPosition(decoration, element);\n\n return element;\n }\n\n private _refreshStyle(decoration: IInternalDecoration): void {\n const line = decoration.marker.line - this._bufferService.buffers.active.ydisp;\n if (line < 0 || line >= this._bufferService.rows) {\n // outside of viewport\n if (decoration.element) {\n decoration.element.style.display = 'none';\n decoration.onRenderEmitter.fire(decoration.element);\n }\n } else {\n let element = this._decorationElements.get(decoration);\n if (!element) {\n decoration.onDispose(() => this._removeDecoration(decoration));\n element = this._createElement(decoration);\n decoration.element = element;\n this._decorationElements.set(decoration, element);\n this._container.appendChild(element);\n }\n element.style.top = `${line * this._renderService.dimensions.actualCellHeight}px`;\n element.style.display = this._altBufferIsActive ? 'none' : 'block';\n decoration.onRenderEmitter.fire(element);\n }\n }\n\n private _refreshXPosition(decoration: IInternalDecoration, element: HTMLElement | undefined = decoration.element): void {\n if (!element) {\n return;\n }\n const x = decoration.options.x ?? 0;\n if ((decoration.options.anchor || 'left') === 'right') {\n element.style.right = x ? `${x * this._renderService.dimensions.actualCellWidth}px` : '';\n } else {\n element.style.left = x ? `${x * this._renderService.dimensions.actualCellWidth}px` : '';\n }\n }\n\n private _removeDecoration(decoration: IInternalDecoration): void {\n this._decorationElements.get(decoration)?.remove();\n this._decorationElements.delete(decoration);\n }\n}\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { IInternalDecoration } from 'common/services/Services';\n\nexport interface IColorZoneStore {\n readonly zones: IColorZone[];\n clear(): void;\n addDecoration(decoration: IInternalDecoration): void;\n /**\n * Sets the amount of padding in lines that will be added between zones, if new lines intersect\n * the padding they will be merged into the same zone.\n */\n setPadding(padding: { [position: string]: number }): void;\n}\n\nexport interface IColorZone {\n /** Color in a format supported by canvas' fillStyle. */\n color: string;\n position: 'full' | 'left' | 'center' | 'right' | undefined;\n startBufferLine: number;\n endBufferLine: number;\n}\n\ninterface IMinimalDecorationForColorZone {\n marker: Pick<IInternalDecoration['marker'], 'line'>;\n options: Pick<IInternalDecoration['options'], 'overviewRulerOptions'>;\n}\n\nexport class ColorZoneStore implements IColorZoneStore {\n private _zones: IColorZone[] = [];\n\n // The zone pool is used to keep zone objects from being freed between clearing the color zone\n // store and fetching the zones. This helps reduce GC pressure since the color zones are\n // accumulated on potentially every scroll event.\n private _zonePool: IColorZone[] = [];\n private _zonePoolIndex = 0;\n\n private _linePadding: { [position: string]: number } = {\n full: 0,\n left: 0,\n center: 0,\n right: 0\n };\n\n public get zones(): IColorZone[] {\n // Trim the zone pool to free unused memory\n this._zonePool.length = Math.min(this._zonePool.length, this._zones.length);\n return this._zones;\n }\n\n public clear(): void {\n this._zones.length = 0;\n this._zonePoolIndex = 0;\n }\n\n public addDecoration(decoration: IMinimalDecorationForColorZone): void {\n if (!decoration.options.overviewRulerOptions) {\n return;\n }\n for (const z of this._zones) {\n if (z.color === decoration.options.overviewRulerOptions.color &&\n z.position === decoration.options.overviewRulerOptions.position) {\n if (this._lineIntersectsZone(z, decoration.marker.line)) {\n return;\n }\n if (this._lineAdjacentToZone(z, decoration.marker.line, decoration.options.overviewRulerOptions.position)) {\n this._addLineToZone(z, decoration.marker.line);\n return;\n }\n }\n }\n // Create using zone pool if possible\n if (this._zonePoolIndex < this._zonePool.length) {\n this._zonePool[this._zonePoolIndex].color = decoration.options.overviewRulerOptions.color;\n this._zonePool[this._zonePoolIndex].position = decoration.options.overviewRulerOptions.position;\n this._zonePool[this._zonePoolIndex].startBufferLine = decoration.marker.line;\n this._zonePool[this._zonePoolIndex].endBufferLine = decoration.marker.line;\n this._zones.push(this._zonePool[this._zonePoolIndex++]);\n return;\n }\n // Create\n this._zones.push({\n color: decoration.options.overviewRulerOptions.color,\n position: decoration.options.overviewRulerOptions.position,\n startBufferLine: decoration.marker.line,\n endBufferLine: decoration.marker.line\n });\n this._zonePool.push(this._zones[this._zones.length - 1]);\n this._zonePoolIndex++;\n }\n\n public setPadding(padding: { [position: string]: number }): void {\n this._linePadding = padding;\n }\n\n private _lineIntersectsZone(zone: IColorZone, line: number): boolean {\n return (\n line >= zone.startBufferLine &&\n line <= zone.endBufferLine\n );\n }\n\n private _lineAdjacentToZone(zone: IColorZone, line: number, position: IColorZone['position']): boolean {\n return (\n (line >= zone.startBufferLine - this._linePadding[position || 'full']) &&\n (line <= zone.endBufferLine + this._linePadding[position || 'full'])\n );\n }\n\n private _addLineToZone(zone: IColorZone, line: number): void {\n zone.startBufferLine = Math.min(zone.startBufferLine, line);\n zone.endBufferLine = Math.max(zone.endBufferLine, line);\n }\n}\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { ColorZoneStore, IColorZone, IColorZoneStore } from 'browser/decorations/ColorZoneStore';\nimport { addDisposableDomListener } from 'browser/Lifecycle';\nimport { IRenderService } from 'browser/services/Services';\nimport { Disposable } from 'common/Lifecycle';\nimport { IBufferService, IDecorationService, IInternalDecoration, IOptionsService } from 'common/services/Services';\n\n// Helper objects to avoid excessive calculation and garbage collection during rendering. These are\n// static values for each render and can be accessed using the decoration position as the key.\nconst drawHeight = {\n full: 0,\n left: 0,\n center: 0,\n right: 0\n};\nconst drawWidth = {\n full: 0,\n left: 0,\n center: 0,\n right: 0\n};\nconst drawX = {\n full: 0,\n left: 0,\n center: 0,\n right: 0\n};\n\nexport class OverviewRulerRenderer extends Disposable {\n private readonly _canvas: HTMLCanvasElement;\n private readonly _ctx: CanvasRenderingContext2D;\n private readonly _colorZoneStore: IColorZoneStore = new ColorZoneStore();\n private get _width(): number {\n return this._optionsService.options.overviewRulerWidth || 0;\n }\n private _animationFrame: number | undefined;\n\n private _shouldUpdateDimensions: boolean | undefined = true;\n private _shouldUpdateAnchor: boolean | undefined = true;\n private _lastKnownBufferLength: number = 0;\n\n private _containerHeight: number | undefined;\n\n constructor(\n private readonly _viewportElement: HTMLElement,\n private readonly _screenElement: HTMLElement,\n @IBufferService private readonly _bufferService: IBufferService,\n @IDecorationService private readonly _decorationService: IDecorationService,\n @IRenderService private readonly _renderService: IRenderService,\n @IOptionsService private readonly _optionsService: IOptionsService\n ) {\n super();\n this._canvas = document.createElement('canvas');\n this._canvas.classList.add('xterm-decoration-overview-ruler');\n this._refreshCanvasDimensions();\n this._viewportElement.parentElement?.insertBefore(this._canvas, this._viewportElement);\n const ctx = this._canvas.getContext('2d');\n if (!ctx) {\n throw new Error('Ctx cannot be null');\n } else {\n this._ctx = ctx;\n }\n this._registerDecorationListeners();\n this._registerBufferChangeListeners();\n this._registerDimensionChangeListeners();\n }\n\n /**\n * On decoration add or remove, redraw\n */\n private _registerDecorationListeners(): void {\n this.register(this._decorationService.onDecorationRegistered(() => this._queueRefresh(undefined, true)));\n this.register(this._decorationService.onDecorationRemoved(() => this._queueRefresh(undefined, true)));\n }\n\n /**\n * On buffer change, redraw\n * and hide the canvas if the alt buffer is active\n */\n private _registerBufferChangeListeners(): void {\n this.register(this._renderService.onRenderedViewportChange(() => this._queueRefresh()));\n this.register(this._bufferService.buffers.onBufferActivate(() => {\n this._canvas!.style.display = this._bufferService.buffer === this._bufferService.buffers.alt ? 'none' : 'block';\n }));\n this.register(this._bufferService.onScroll(() => {\n if (this._lastKnownBufferLength !== this._bufferService.buffers.normal.lines.length) {\n this._refreshDrawHeightConstants();\n this._refreshColorZonePadding();\n }\n }));\n }\n /**\n * On dimension change, update canvas dimensions\n * and then redraw\n */\n private _registerDimensionChangeListeners(): void {\n // container height changed\n this.register(this._renderService.onRender((): void => {\n if (!this._containerHeight || this._containerHeight !== this._screenElement.clientHeight) {\n this._queueRefresh(true);\n this._containerHeight = this._screenElement.clientHeight;\n }\n }));\n // overview ruler width changed\n this.register(this._optionsService.onOptionChange(o => {\n if (o === 'overviewRulerWidth') {\n this._queueRefresh(true);\n }\n }));\n // device pixel ratio changed\n this.register(addDisposableDomListener(window, 'resize', () => {\n this._queueRefresh(true);\n }));\n // set the canvas dimensions\n this._queueRefresh(true);\n }\n\n public override dispose(): void {\n this._canvas?.remove();\n super.dispose();\n }\n\n private _refreshDrawConstants(): void {\n // width\n const outerWidth = Math.floor(this._canvas.width / 3);\n const innerWidth = Math.ceil(this._canvas.width / 3);\n drawWidth.full = this._canvas.width;\n drawWidth.left = outerWidth;\n drawWidth.center = innerWidth;\n drawWidth.right = outerWidth;\n // height\n this._refreshDrawHeightConstants();\n // x\n drawX.full = 0;\n drawX.left = 0;\n drawX.center = drawWidth.left;\n drawX.right = drawWidth.left + drawWidth.center;\n }\n\n private _refreshDrawHeightConstants(): void {\n drawHeight.full = Math.round(2 * window.devicePixelRatio);\n // Calculate actual pixels per line\n const pixelsPerLine = this._canvas.height / this._bufferService.buffer.lines.length;\n // Clamp actual pixels within a range\n const nonFullHeight = Math.round(Math.max(Math.min(pixelsPerLine, 12), 6) * window.devicePixelRatio);\n drawHeight.left = nonFullHeight;\n drawHeight.center = nonFullHeight;\n drawHeight.right = nonFullHeight;\n }\n\n private _refreshColorZonePadding(): void {\n this._colorZoneStore.setPadding({\n full: Math.floor(this._bufferService.buffers.active.lines.length / (this._canvas.height - 1) * drawHeight.full),\n left: Math.floor(this._bufferService.buffers.active.lines.length / (this._canvas.height - 1) * drawHeight.left),\n center: Math.floor(this._bufferService.buffers.active.lines.length / (this._canvas.height - 1) * drawHeight.center),\n right: Math.floor(this._bufferService.buffers.active.lines.length / (this._canvas.height - 1) * drawHeight.right)\n });\n this._lastKnownBufferLength = this._bufferService.buffers.normal.lines.length;\n }\n\n private _refreshCanvasDimensions(): void {\n this._canvas.style.width = `${this._width}px`;\n this._canvas.width = Math.round(this._width * window.devicePixelRatio);\n this._canvas.style.height = `${this._screenElement.clientHeight}px`;\n this._canvas.height = Math.round(this._screenElement.clientHeight * window.devicePixelRatio);\n this._refreshDrawConstants();\n this._refreshColorZonePadding();\n }\n\n private _refreshDecorations(): void {\n if (this._shouldUpdateDimensions) {\n this._refreshCanvasDimensions();\n }\n this._ctx.clearRect(0, 0, this._canvas.width, this._canvas.height);\n this._colorZoneStore.clear();\n for (const decoration of this._decorationService.decorations) {\n this._colorZoneStore.addDecoration(decoration);\n }\n this._ctx.lineWidth = 1;\n const zones = this._colorZoneStore.zones;\n for (const zone of zones) {\n if (zone.position !== 'full') {\n this._renderColorZone(zone);\n }\n }\n for (const zone of zones) {\n if (zone.position === 'full') {\n this._renderColorZone(zone);\n }\n }\n this._shouldUpdateDimensions = false;\n this._shouldUpdateAnchor = false;\n }\n\n private _renderColorZone(zone: IColorZone): void {\n // TODO: Is _decorationElements needed?\n\n this._ctx.fillStyle = zone.color;\n this._ctx.fillRect(\n /* x */ drawX[zone.position || 'full'],\n /* y */ Math.round(\n (this._canvas.height - 1) * // -1 to ensure at least 2px are allowed for decoration on last line\n (zone.startBufferLine / this._bufferService.buffers.active.lines.length) - drawHeight[zone.position || 'full'] / 2\n ),\n /* w */ drawWidth[zone.position || 'full'],\n /* h */ Math.round(\n (this._canvas.height - 1) * // -1 to ensure at least 2px are allowed for decoration on last line\n ((zone.endBufferLine - zone.startBufferLine) / this._bufferService.buffers.active.lines.length) + drawHeight[zone.position || 'full']\n )\n );\n }\n\n private _queueRefresh(updateCanvasDimensions?: boolean, updateAnchor?: boolean): void {\n this._shouldUpdateDimensions = updateCanvasDimensions || this._shouldUpdateDimensions;\n this._shouldUpdateAnchor = updateAnchor || this._shouldUpdateAnchor;\n if (this._animationFrame !== undefined) {\n return;\n }\n this._animationFrame = window.requestAnimationFrame(() => {\n this._refreshDecorations();\n this._animationFrame = undefined;\n });\n }\n}\n","/**\n * Copyright (c) 2016 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IRenderService } from 'browser/services/Services';\nimport { IBufferService, ICoreService, IOptionsService } from 'common/services/Services';\n\ninterface IPosition {\n start: number;\n end: number;\n}\n\n/**\n * Encapsulates the logic for handling compositionstart, compositionupdate and compositionend\n * events, displaying the in-progress composition to the UI and forwarding the final composition\n * to the handler.\n */\nexport class CompositionHelper {\n /**\n * Whether input composition is currently happening, eg. via a mobile keyboard, speech input or\n * IME. This variable determines whether the compositionText should be displayed on the UI.\n */\n private _isComposing: boolean;\n public get isComposing(): boolean { return this._isComposing; }\n\n /**\n * The position within the input textarea's value of the current composition.\n */\n private _compositionPosition: IPosition;\n\n /**\n * Whether a composition is in the process of being sent, setting this to false will cancel any\n * in-progress composition.\n */\n private _isSendingComposition: boolean;\n\n /**\n * Data already sent due to keydown event.\n */\n private _dataAlreadySent: string;\n\n constructor(\n private readonly _textarea: HTMLTextAreaElement,\n private readonly _compositionView: HTMLElement,\n @IBufferService private readonly _bufferService: IBufferService,\n @IOptionsService private readonly _optionsService: IOptionsService,\n @ICoreService private readonly _coreService: ICoreService,\n @IRenderService private readonly _renderService: IRenderService\n ) {\n this._isComposing = false;\n this._isSendingComposition = false;\n this._compositionPosition = { start: 0, end: 0 };\n this._dataAlreadySent = '';\n }\n\n /**\n * Handles the compositionstart event, activating the composition view.\n */\n public compositionstart(): void {\n this._isComposing = true;\n this._compositionPosition.start = this._textarea.value.length;\n this._compositionView.textContent = '';\n this._dataAlreadySent = '';\n this._compositionView.classList.add('active');\n }\n\n /**\n * Handles the compositionupdate event, updating the composition view.\n * @param ev The event.\n */\n public compositionupdate(ev: Pick<CompositionEvent, 'data'>): void {\n this._compositionView.textContent = ev.data;\n this.updateCompositionElements();\n setTimeout(() => {\n this._compositionPosition.end = this._textarea.value.length;\n }, 0);\n }\n\n /**\n * Handles the compositionend event, hiding the composition view and sending the composition to\n * the handler.\n */\n public compositionend(): void {\n this._finalizeComposition(true);\n }\n\n /**\n * Handles the keydown event, routing any necessary events to the CompositionHelper functions.\n * @param ev The keydown event.\n * @return Whether the Terminal should continue processing the keydown event.\n */\n public keydown(ev: KeyboardEvent): boolean {\n if (this._isComposing || this._isSendingComposition) {\n if (ev.keyCode === 229) {\n // Continue composing if the keyCode is the \"composition character\"\n return false;\n }\n if (ev.keyCode === 16 || ev.keyCode === 17 || ev.keyCode === 18) {\n // Continue composing if the keyCode is a modifier key\n return false;\n }\n // Finish composition immediately. This is mainly here for the case where enter is\n // pressed and the handler needs to be triggered before the command is executed.\n this._finalizeComposition(false);\n }\n\n if (ev.keyCode === 229) {\n // If the \"composition character\" is used but gets to this point it means a non-composition\n // character (eg. numbers and punctuation) was pressed when the IME was active.\n this._handleAnyTextareaChanges();\n return false;\n }\n\n return true;\n }\n\n /**\n * Finalizes the composition, resuming regular input actions. This is called when a composition\n * is ending.\n * @param waitForPropagation Whether to wait for events to propagate before sending\n * the input. This should be false if a non-composition keystroke is entered before the\n * compositionend event is triggered, such as enter, so that the composition is sent before\n * the command is executed.\n */\n private _finalizeComposition(waitForPropagation: boolean): void {\n this._compositionView.classList.remove('active');\n this._isComposing = false;\n\n if (!waitForPropagation) {\n // Cancel any delayed composition send requests and send the input immediately.\n this._isSendingComposition = false;\n const input = this._textarea.value.substring(this._compositionPosition.start, this._compositionPosition.end);\n this._coreService.triggerDataEvent(input, true);\n } else {\n // Make a deep copy of the composition position here as a new compositionstart event may\n // fire before the setTimeout executes.\n const currentCompositionPosition = {\n start: this._compositionPosition.start,\n end: this._compositionPosition.end\n };\n\n // Since composition* events happen before the changes take place in the textarea on most\n // browsers, use a setTimeout with 0ms time to allow the native compositionend event to\n // complete. This ensures the correct character is retrieved.\n // This solution was used because:\n // - The compositionend event's data property is unreliable, at least on Chromium\n // - The last compositionupdate event's data property does not always accurately describe\n // the character, a counter example being Korean where an ending consonsant can move to\n // the following character if the following input is a vowel.\n this._isSendingComposition = true;\n setTimeout(() => {\n // Ensure that the input has not already been sent\n if (this._isSendingComposition) {\n this._isSendingComposition = false;\n let input;\n // Add length of data already sent due to keydown event,\n // otherwise input characters can be duplicated. (Issue #3191)\n currentCompositionPosition.start += this._dataAlreadySent.length;\n if (this._isComposing) {\n // Use the end position to get the string if a new composition has started.\n input = this._textarea.value.substring(currentCompositionPosition.start, currentCompositionPosition.end);\n } else {\n // Don't use the end position here in order to pick up any characters after the\n // composition has finished, for example when typing a non-composition character\n // (eg. 2) after a composition character.\n input = this._textarea.value.substring(currentCompositionPosition.start);\n }\n if (input.length > 0) {\n this._coreService.triggerDataEvent(input, true);\n }\n }\n }, 0);\n }\n }\n\n /**\n * Apply any changes made to the textarea after the current event chain is allowed to complete.\n * This should be called when not currently composing but a keydown event with the \"composition\n * character\" (229) is triggered, in order to allow non-composition text to be entered when an\n * IME is active.\n */\n private _handleAnyTextareaChanges(): void {\n const oldValue = this._textarea.value;\n setTimeout(() => {\n // Ignore if a composition has started since the timeout\n if (!this._isComposing) {\n const newValue = this._textarea.value;\n const diff = newValue.replace(oldValue, '');\n if (diff.length > 0) {\n this._dataAlreadySent = diff;\n this._coreService.triggerDataEvent(diff, true);\n }\n }\n }, 0);\n }\n\n /**\n * Positions the composition view on top of the cursor and the textarea just below it (so the\n * IME helper dialog is positioned correctly).\n * @param dontRecurse Whether to use setTimeout to recursively trigger another update, this is\n * necessary as the IME events across browsers are not consistently triggered.\n */\n public updateCompositionElements(dontRecurse?: boolean): void {\n if (!this._isComposing) {\n return;\n }\n\n if (this._bufferService.buffer.isCursorInViewport) {\n const cursorX = Math.min(this._bufferService.buffer.x, this._bufferService.cols - 1);\n\n const cellHeight = this._renderService.dimensions.actualCellHeight;\n const cursorTop = this._bufferService.buffer.y * this._renderService.dimensions.actualCellHeight;\n const cursorLeft = cursorX * this._renderService.dimensions.actualCellWidth;\n\n this._compositionView.style.left = cursorLeft + 'px';\n this._compositionView.style.top = cursorTop + 'px';\n this._compositionView.style.height = cellHeight + 'px';\n this._compositionView.style.lineHeight = cellHeight + 'px';\n this._compositionView.style.fontFamily = this._optionsService.rawOptions.fontFamily;\n this._compositionView.style.fontSize = this._optionsService.rawOptions.fontSize + 'px';\n // Sync the textarea to the exact position of the composition view so the IME knows where the\n // text is.\n const compositionViewBounds = this._compositionView.getBoundingClientRect();\n this._textarea.style.left = cursorLeft + 'px';\n this._textarea.style.top = cursorTop + 'px';\n // Ensure the text area is at least 1x1, otherwise certain IMEs may break\n this._textarea.style.width = Math.max(compositionViewBounds.width, 1) + 'px';\n this._textarea.style.height = Math.max(compositionViewBounds.height, 1) + 'px';\n this._textarea.style.lineHeight = compositionViewBounds.height + 'px';\n }\n\n if (!dontRecurse) {\n setTimeout(() => this.updateCompositionElements(true), 0);\n }\n }\n}\n","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nexport function getCoordsRelativeToElement(window: Pick<Window, 'getComputedStyle'>, event: {clientX: number, clientY: number}, element: HTMLElement): [number, number] {\n const rect = element.getBoundingClientRect();\n const elementStyle = window.getComputedStyle(element);\n const leftPadding = parseInt(elementStyle.getPropertyValue('padding-left'));\n const topPadding = parseInt(elementStyle.getPropertyValue('padding-top'));\n return [\n event.clientX - rect.left - leftPadding,\n event.clientY - rect.top - topPadding\n ];\n}\n\n/**\n * Gets coordinates within the terminal for a particular mouse event. The result\n * is returned as an array in the form [x, y] instead of an object as it's a\n * little faster and this function is used in some low level code.\n * @param event The mouse event.\n * @param element The terminal's container element.\n * @param colCount The number of columns in the terminal.\n * @param rowCount The number of rows n the terminal.\n * @param isSelection Whether the request is for the selection or not. This will\n * apply an offset to the x value such that the left half of the cell will\n * select that cell and the right half will select the next cell.\n */\nexport function getCoords(window: Pick<Window, 'getComputedStyle'>, event: {clientX: number, clientY: number}, element: HTMLElement, colCount: number, rowCount: number, hasValidCharSize: boolean, actualCellWidth: number, actualCellHeight: number, isSelection?: boolean): [number, number] | undefined {\n // Coordinates cannot be measured if there are no valid\n if (!hasValidCharSize) {\n return undefined;\n }\n\n const coords = getCoordsRelativeToElement(window, event, element);\n if (!coords) {\n return undefined;\n }\n\n coords[0] = Math.ceil((coords[0] + (isSelection ? actualCellWidth / 2 : 0)) / actualCellWidth);\n coords[1] = Math.ceil(coords[1] / actualCellHeight);\n\n // Ensure coordinates are within the terminal viewport. Note that selections\n // need an addition point of precision to cover the end point (as characters\n // cover half of one char and half of the next).\n coords[0] = Math.min(Math.max(coords[0], 1), colCount + (isSelection ? 1 : 0));\n coords[1] = Math.min(Math.max(coords[1], 1), rowCount);\n\n return coords;\n}\n\n/**\n * Gets coordinates within the terminal for a particular mouse event, wrapping\n * them to the bounds of the terminal and adding 32 to both the x and y values\n * as expected by xterm.\n */\nexport function getRawByteCoords(coords: [number, number] | undefined): { x: number, y: number } | undefined {\n if (!coords) {\n return undefined;\n }\n\n // xterm sends raw bytes and starts at 32 (SP) for each.\n return { x: coords[0] + 32, y: coords[1] + 32 };\n}\n","/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { C0 } from 'common/data/EscapeSequences';\nimport { IBufferService } from 'common/services/Services';\n\nconst enum Direction {\n UP = 'A',\n DOWN = 'B',\n RIGHT = 'C',\n LEFT = 'D'\n}\n\n/**\n * Concatenates all the arrow sequences together.\n * Resets the starting row to an unwrapped row, moves to the requested row,\n * then moves to requested col.\n */\nexport function moveToCellSequence(targetX: number, targetY: number, bufferService: IBufferService, applicationCursor: boolean): string {\n const startX = bufferService.buffer.x;\n const startY = bufferService.buffer.y;\n\n // The alt buffer should try to navigate between rows\n if (!bufferService.buffer.hasScrollback) {\n return resetStartingRow(startX, startY, targetX, targetY, bufferService, applicationCursor) +\n moveToRequestedRow(startY, targetY, bufferService, applicationCursor) +\n moveToRequestedCol(startX, startY, targetX, targetY, bufferService, applicationCursor);\n }\n\n // Only move horizontally for the normal buffer\n let direction;\n if (startY === targetY) {\n direction = startX > targetX ? Direction.LEFT : Direction.RIGHT;\n return repeat(Math.abs(startX - targetX), sequence(direction, applicationCursor));\n }\n direction = startY > targetY ? Direction.LEFT : Direction.RIGHT;\n const rowDifference = Math.abs(startY - targetY);\n const cellsToMove = colsFromRowEnd(startY > targetY ? targetX : startX, bufferService) +\n (rowDifference - 1) * bufferService.cols + 1 /* wrap around 1 row */ +\n colsFromRowBeginning(startY > targetY ? startX : targetX, bufferService);\n return repeat(cellsToMove, sequence(direction, applicationCursor));\n}\n\n/**\n * Find the number of cols from a row beginning to a col.\n */\nfunction colsFromRowBeginning(currX: number, bufferService: IBufferService): number {\n return currX - 1;\n}\n\n/**\n * Find the number of cols from a col to row end.\n */\nfunction colsFromRowEnd(currX: number, bufferService: IBufferService): number {\n return bufferService.cols - currX;\n}\n\n/**\n * If the initial position of the cursor is on a row that is wrapped, move the\n * cursor up to the first row that is not wrapped to have accurate vertical\n * positioning.\n */\nfunction resetStartingRow(startX: number, startY: number, targetX: number, targetY: number, bufferService: IBufferService, applicationCursor: boolean): string {\n if (moveToRequestedRow(startY, targetY, bufferService, applicationCursor).length === 0) {\n return '';\n }\n return repeat(bufferLine(\n startX, startY, startX,\n startY - wrappedRowsForRow(bufferService, startY), false, bufferService\n ).length, sequence(Direction.LEFT, applicationCursor));\n}\n\n/**\n * Using the reset starting and ending row, move to the requested row,\n * ignoring wrapped rows\n */\nfunction moveToRequestedRow(startY: number, targetY: number, bufferService: IBufferService, applicationCursor: boolean): string {\n const startRow = startY - wrappedRowsForRow(bufferService, startY);\n const endRow = targetY - wrappedRowsForRow(bufferService, targetY);\n\n const rowsToMove = Math.abs(startRow - endRow) - wrappedRowsCount(startY, targetY, bufferService);\n\n return repeat(rowsToMove, sequence(verticalDirection(startY, targetY), applicationCursor));\n}\n\n/**\n * Move to the requested col on the ending row\n */\nfunction moveToRequestedCol(startX: number, startY: number, targetX: number, targetY: number, bufferService: IBufferService, applicationCursor: boolean): string {\n let startRow;\n if (moveToRequestedRow(startY, targetY, bufferService, applicationCursor).length > 0) {\n startRow = targetY - wrappedRowsForRow(bufferService, targetY);\n } else {\n startRow = startY;\n }\n\n const endRow = targetY;\n const direction = horizontalDirection(startX, startY, targetX, targetY, bufferService, applicationCursor);\n\n return repeat(bufferLine(\n startX, startRow, targetX, endRow,\n direction === Direction.RIGHT, bufferService\n ).length, sequence(direction, applicationCursor));\n}\n\n/**\n * Utility functions\n */\n\n/**\n * Calculates the number of wrapped rows between the unwrapped starting and\n * ending rows. These rows need to ignored since the cursor skips over them.\n */\nfunction wrappedRowsCount(startY: number, targetY: number, bufferService: IBufferService): number {\n let wrappedRows = 0;\n const startRow = startY - wrappedRowsForRow(bufferService, startY);\n const endRow = targetY - wrappedRowsForRow(bufferService, targetY);\n\n for (let i = 0; i < Math.abs(startRow - endRow); i++) {\n const direction = verticalDirection(startY, targetY) === Direction.UP ? -1 : 1;\n const line = bufferService.buffer.lines.get(startRow + (direction * i));\n if (line?.isWrapped) {\n wrappedRows++;\n }\n }\n\n return wrappedRows;\n}\n\n/**\n * Calculates the number of wrapped rows that make up a given row.\n * @param currentRow The row to determine how many wrapped rows make it up\n */\nfunction wrappedRowsForRow(bufferService: IBufferService, currentRow: number): number {\n let rowCount = 0;\n let line = bufferService.buffer.lines.get(currentRow);\n let lineWraps = line?.isWrapped;\n\n while (lineWraps && currentRow >= 0 && currentRow < bufferService.rows) {\n rowCount++;\n line = bufferService.buffer.lines.get(--currentRow);\n lineWraps = line?.isWrapped;\n }\n\n return rowCount;\n}\n\n/**\n * Direction determiners\n */\n\n/**\n * Determines if the right or left arrow is needed\n */\nfunction horizontalDirection(startX: number, startY: number, targetX: number, targetY: number, bufferService: IBufferService, applicationCursor: boolean): Direction {\n let startRow;\n if (moveToRequestedRow(targetX, targetY, bufferService, applicationCursor).length > 0) {\n startRow = targetY - wrappedRowsForRow(bufferService, targetY);\n } else {\n startRow = startY;\n }\n\n if ((startX < targetX &&\n startRow <= targetY) || // down/right or same y/right\n (startX >= targetX &&\n startRow < targetY)) { // down/left or same y/left\n return Direction.RIGHT;\n }\n return Direction.LEFT;\n}\n\n/**\n * Determines if the up or down arrow is needed\n */\nfunction verticalDirection(startY: number, targetY: number): Direction {\n return startY > targetY ? Direction.UP : Direction.DOWN;\n}\n\n/**\n * Constructs the string of chars in the buffer from a starting row and col\n * to an ending row and col\n * @param startCol The starting column position\n * @param startRow The starting row position\n * @param endCol The ending column position\n * @param endRow The ending row position\n * @param forward Direction to move\n */\nfunction bufferLine(\n startCol: number,\n startRow: number,\n endCol: number,\n endRow: number,\n forward: boolean,\n bufferService: IBufferService\n): string {\n let currentCol = startCol;\n let currentRow = startRow;\n let bufferStr = '';\n\n while (currentCol !== endCol || currentRow !== endRow) {\n currentCol += forward ? 1 : -1;\n\n if (forward && currentCol > bufferService.cols - 1) {\n bufferStr += bufferService.buffer.translateBufferLineToString(\n currentRow, false, startCol, currentCol\n );\n currentCol = 0;\n startCol = 0;\n currentRow++;\n } else if (!forward && currentCol < 0) {\n bufferStr += bufferService.buffer.translateBufferLineToString(\n currentRow, false, 0, startCol + 1\n );\n currentCol = bufferService.cols - 1;\n startCol = currentCol;\n currentRow--;\n }\n }\n\n return bufferStr + bufferService.buffer.translateBufferLineToString(\n currentRow, false, startCol, currentCol\n );\n}\n\n/**\n * Constructs the escape sequence for clicking an arrow\n * @param direction The direction to move\n */\nfunction sequence(direction: Direction, applicationCursor: boolean): string {\n const mod = applicationCursor ? 'O' : '[';\n return C0.ESC + mod + direction;\n}\n\n/**\n * Returns a string repeated a given number of times\n * Polyfill from https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/repeat\n * @param count The number of times to repeat the string\n * @param string The string that is to be repeated\n */\nfunction repeat(count: number, str: string): string {\n count = Math.floor(count);\n let rpt = '';\n for (let i = 0; i < count; i++) {\n rpt += str;\n }\n return rpt;\n}\n","/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { Terminal as ITerminalApi, IMarker, IDisposable, ILinkMatcherOptions, ITheme, ILocalizableStrings, ITerminalAddon, ISelectionPosition, IBufferNamespace as IBufferNamespaceApi, IParser, ILinkProvider, IUnicodeHandling, FontWeight, IModes, IDecorationOptions, IDecoration } from 'xterm';\nimport { ITerminal } from 'browser/Types';\nimport { Terminal as TerminalCore } from 'browser/Terminal';\nimport * as Strings from 'browser/LocalizableStrings';\nimport { IEvent } from 'common/EventEmitter';\nimport { ParserApi } from 'common/public/ParserApi';\nimport { UnicodeApi } from 'common/public/UnicodeApi';\nimport { AddonManager } from 'common/public/AddonManager';\nimport { BufferNamespaceApi } from 'common/public/BufferNamespaceApi';\nimport { ITerminalOptions } from 'common/Types';\n\n/**\n * The set of options that only have an effect when set in the Terminal constructor.\n */\nconst CONSTRUCTOR_ONLY_OPTIONS = ['cols', 'rows'];\n\nexport class Terminal implements ITerminalApi {\n private _core: ITerminal;\n private _addonManager: AddonManager;\n private _parser: IParser | undefined;\n private _buffer: BufferNamespaceApi | undefined;\n private _publicOptions: ITerminalOptions;\n\n constructor(options?: ITerminalOptions) {\n this._core = new TerminalCore(options);\n this._addonManager = new AddonManager();\n\n this._publicOptions = { ... this._core.options };\n const getter = (propName: string): any => {\n return this._core.options[propName];\n };\n const setter = (propName: string, value: any): void => {\n this._checkReadonlyOptions(propName);\n this._core.options[propName] = value;\n };\n\n for (const propName in this._core.options) {\n const desc = {\n get: getter.bind(this, propName),\n set: setter.bind(this, propName)\n };\n Object.defineProperty(this._publicOptions, propName, desc);\n }\n }\n\n private _checkReadonlyOptions(propName: string): void {\n // Throw an error if any constructor only option is modified\n // from terminal.options\n // Modifications from anywhere else are allowed\n if (CONSTRUCTOR_ONLY_OPTIONS.includes(propName)) {\n throw new Error(`Option \"${propName}\" can only be set in the constructor`);\n }\n }\n\n private _checkProposedApi(): void {\n if (!this._core.optionsService.rawOptions.allowProposedApi) {\n throw new Error('You must set the allowProposedApi option to true to use proposed API');\n }\n }\n\n public get onBell(): IEvent<void> { return this._core.onBell; }\n public get onBinary(): IEvent<string> { return this._core.onBinary; }\n public get onCursorMove(): IEvent<void> { return this._core.onCursorMove; }\n public get onData(): IEvent<string> { return this._core.onData; }\n public get onKey(): IEvent<{ key: string, domEvent: KeyboardEvent }> { return this._core.onKey; }\n public get onLineFeed(): IEvent<void> { return this._core.onLineFeed; }\n public get onRender(): IEvent<{ start: number, end: number }> { return this._core.onRender; }\n public get onResize(): IEvent<{ cols: number, rows: number }> { return this._core.onResize; }\n public get onScroll(): IEvent<number> { return this._core.onScroll; }\n public get onSelectionChange(): IEvent<void> { return this._core.onSelectionChange; }\n public get onTitleChange(): IEvent<string> { return this._core.onTitleChange; }\n public get onWriteParsed(): IEvent<void> { return this._core.onWriteParsed; }\n\n public get element(): HTMLElement | undefined { return this._core.element; }\n public get parser(): IParser {\n this._checkProposedApi();\n if (!this._parser) {\n this._parser = new ParserApi(this._core);\n }\n return this._parser;\n }\n public get unicode(): IUnicodeHandling {\n this._checkProposedApi();\n return new UnicodeApi(this._core);\n }\n public get textarea(): HTMLTextAreaElement | undefined { return this._core.textarea; }\n public get rows(): number { return this._core.rows; }\n public get cols(): number { return this._core.cols; }\n public get buffer(): IBufferNamespaceApi {\n this._checkProposedApi();\n if (!this._buffer) {\n this._buffer = new BufferNamespaceApi(this._core);\n }\n return this._buffer;\n }\n public get markers(): ReadonlyArray<IMarker> {\n this._checkProposedApi();\n return this._core.markers;\n }\n public get modes(): IModes {\n const m = this._core.coreService.decPrivateModes;\n let mouseTrackingMode: 'none' | 'x10' | 'vt200' | 'drag' | 'any' = 'none';\n switch (this._core.coreMouseService.activeProtocol) {\n case 'X10': mouseTrackingMode = 'x10'; break;\n case 'VT200': mouseTrackingMode = 'vt200'; break;\n case 'DRAG': mouseTrackingMode = 'drag'; break;\n case 'ANY': mouseTrackingMode = 'any'; break;\n }\n return {\n applicationCursorKeysMode: m.applicationCursorKeys,\n applicationKeypadMode: m.applicationKeypad,\n bracketedPasteMode: m.bracketedPasteMode,\n insertMode: this._core.coreService.modes.insertMode,\n mouseTrackingMode: mouseTrackingMode,\n originMode: m.origin,\n reverseWraparoundMode: m.reverseWraparound,\n sendFocusMode: m.sendFocus,\n wraparoundMode: m.wraparound\n };\n }\n public get options(): ITerminalOptions {\n return this._publicOptions;\n }\n public set options(options: ITerminalOptions) {\n for (const propName in options) {\n this._publicOptions[propName] = options[propName];\n }\n }\n public blur(): void {\n this._core.blur();\n }\n public focus(): void {\n this._core.focus();\n }\n public resize(columns: number, rows: number): void {\n this._verifyIntegers(columns, rows);\n this._core.resize(columns, rows);\n }\n public open(parent: HTMLElement): void {\n this._core.open(parent);\n }\n public attachCustomKeyEventHandler(customKeyEventHandler: (event: KeyboardEvent) => boolean): void {\n this._core.attachCustomKeyEventHandler(customKeyEventHandler);\n }\n public registerLinkMatcher(regex: RegExp, handler: (event: MouseEvent, uri: string) => void, options?: ILinkMatcherOptions): number {\n this._checkProposedApi();\n return this._core.registerLinkMatcher(regex, handler, options);\n }\n public deregisterLinkMatcher(matcherId: number): void {\n this._checkProposedApi();\n this._core.deregisterLinkMatcher(matcherId);\n }\n public registerLinkProvider(linkProvider: ILinkProvider): IDisposable {\n this._checkProposedApi();\n return this._core.registerLinkProvider(linkProvider);\n }\n public registerCharacterJoiner(handler: (text: string) => [number, number][]): number {\n this._checkProposedApi();\n return this._core.registerCharacterJoiner(handler);\n }\n public deregisterCharacterJoiner(joinerId: number): void {\n this._checkProposedApi();\n this._core.deregisterCharacterJoiner(joinerId);\n }\n public registerMarker(cursorYOffset: number = 0): IMarker | undefined {\n this._checkProposedApi();\n this._verifyIntegers(cursorYOffset);\n return this._core.addMarker(cursorYOffset);\n }\n public registerDecoration(decorationOptions: IDecorationOptions): IDecoration | undefined {\n this._checkProposedApi();\n this._verifyPositiveIntegers(decorationOptions.x ?? 0, decorationOptions.width ?? 0, decorationOptions.height ?? 0);\n return this._core.registerDecoration(decorationOptions);\n }\n public addMarker(cursorYOffset: number): IMarker | undefined {\n return this.registerMarker(cursorYOffset);\n }\n public hasSelection(): boolean {\n return this._core.hasSelection();\n }\n public select(column: number, row: number, length: number): void {\n this._verifyIntegers(column, row, length);\n this._core.select(column, row, length);\n }\n public getSelection(): string {\n return this._core.getSelection();\n }\n public getSelectionPosition(): ISelectionPosition | undefined {\n return this._core.getSelectionPosition();\n }\n public clearSelection(): void {\n this._core.clearSelection();\n }\n public selectAll(): void {\n this._core.selectAll();\n }\n public selectLines(start: number, end: number): void {\n this._verifyIntegers(start, end);\n this._core.selectLines(start, end);\n }\n public dispose(): void {\n this._addonManager.dispose();\n this._core.dispose();\n }\n public scrollLines(amount: number): void {\n this._verifyIntegers(amount);\n this._core.scrollLines(amount);\n }\n public scrollPages(pageCount: number): void {\n this._verifyIntegers(pageCount);\n this._core.scrollPages(pageCount);\n }\n public scrollToTop(): void {\n this._core.scrollToTop();\n }\n public scrollToBottom(): void {\n this._core.scrollToBottom();\n }\n public scrollToLine(line: number): void {\n this._verifyIntegers(line);\n this._core.scrollToLine(line);\n }\n public clear(): void {\n this._core.clear();\n }\n public write(data: string | Uint8Array, callback?: () => void): void {\n this._core.write(data, callback);\n }\n public writeUtf8(data: Uint8Array, callback?: () => void): void {\n this._core.write(data, callback);\n }\n public writeln(data: string | Uint8Array, callback?: () => void): void {\n this._core.write(data);\n this._core.write('\\r\\n', callback);\n }\n public paste(data: string): void {\n this._core.paste(data);\n }\n public getOption(key: 'bellSound' | 'bellStyle' | 'cursorStyle' | 'fontFamily' | 'logLevel' | 'rendererType' | 'termName' | 'wordSeparator'): string;\n public getOption(key: 'allowTransparency' | 'altClickMovesCursor' | 'cancelEvents' | 'convertEol' | 'cursorBlink' | 'disableStdin' | 'macOptionIsMeta' | 'rightClickSelectsWord' | 'popOnBell' | 'visualBell'): boolean;\n public getOption(key: 'cols' | 'fontSize' | 'letterSpacing' | 'lineHeight' | 'rows' | 'tabStopWidth' | 'scrollback'): number;\n public getOption(key: 'fontWeight' | 'fontWeightBold'): FontWeight;\n public getOption(key: string): any;\n public getOption(key: any): any {\n return this._core.optionsService.getOption(key);\n }\n public setOption(key: 'bellSound' | 'fontFamily' | 'termName' | 'wordSeparator', value: string): void;\n public setOption(key: 'fontWeight' | 'fontWeightBold', value: 'normal' | 'bold' | '100' | '200' | '300' | '400' | '500' | '600' | '700' | '800' | '900' | number): void;\n public setOption(key: 'logLevel', value: 'debug' | 'info' | 'warn' | 'error' | 'off'): void;\n public setOption(key: 'bellStyle', value: 'none' | 'visual' | 'sound' | 'both'): void;\n public setOption(key: 'cursorStyle', value: 'block' | 'underline' | 'bar'): void;\n public setOption(key: 'allowTransparency' | 'altClickMovesCursor' | 'cancelEvents' | 'convertEol' | 'cursorBlink' | 'disableStdin' | 'macOptionIsMeta' | 'rightClickSelectsWord' | 'popOnBell' | 'visualBell', value: boolean): void;\n public setOption(key: 'fontSize' | 'letterSpacing' | 'lineHeight' | 'tabStopWidth' | 'scrollback', value: number): void;\n public setOption(key: 'theme', value: ITheme): void;\n public setOption(key: 'cols' | 'rows', value: number): void;\n public setOption(key: string, value: any): void;\n public setOption(key: any, value: any): void {\n this._checkReadonlyOptions(key);\n this._core.optionsService.setOption(key, value);\n }\n public refresh(start: number, end: number): void {\n this._verifyIntegers(start, end);\n this._core.refresh(start, end);\n }\n public reset(): void {\n this._core.reset();\n }\n public clearTextureAtlas(): void {\n this._core.clearTextureAtlas();\n }\n public loadAddon(addon: ITerminalAddon): void {\n return this._addonManager.loadAddon(this, addon);\n }\n public static get strings(): ILocalizableStrings {\n return Strings;\n }\n\n private _verifyIntegers(...values: number[]): void {\n for (const value of values) {\n if (value === Infinity || isNaN(value) || value % 1 !== 0) {\n throw new Error('This API only accepts integers');\n }\n }\n }\n\n private _verifyPositiveIntegers(...values: number[]): void {\n for (const value of values) {\n if (value && (value === Infinity || isNaN(value) || value % 1 !== 0 || value < 0)) {\n throw new Error('This API only accepts positive integers');\n }\n }\n }\n}\n","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IRenderDimensions, IRenderLayer } from 'browser/renderer/Types';\nimport { ICellData, IColor } from 'common/Types';\nimport { DEFAULT_COLOR, WHITESPACE_CELL_CHAR, WHITESPACE_CELL_CODE, Attributes } from 'common/buffer/Constants';\nimport { IGlyphIdentifier } from 'browser/renderer/atlas/Types';\nimport { DIM_OPACITY, INVERTED_DEFAULT_COLOR, TEXT_BASELINE } from 'browser/renderer/atlas/Constants';\nimport { BaseCharAtlas } from 'browser/renderer/atlas/BaseCharAtlas';\nimport { acquireCharAtlas } from 'browser/renderer/atlas/CharAtlasCache';\nimport { AttributeData } from 'common/buffer/AttributeData';\nimport { IColorSet } from 'browser/Types';\nimport { CellData } from 'common/buffer/CellData';\nimport { IBufferService, IDecorationService, IOptionsService } from 'common/services/Services';\nimport { excludeFromContrastRatioDemands, throwIfFalsy } from 'browser/renderer/RendererUtils';\nimport { channels, color, rgba } from 'common/Color';\nimport { removeElementFromParent } from 'browser/Dom';\nimport { tryDrawCustomChar } from 'browser/renderer/CustomGlyphs';\n\nexport abstract class BaseRenderLayer implements IRenderLayer {\n private _canvas: HTMLCanvasElement;\n protected _ctx!: CanvasRenderingContext2D;\n private _scaledCharWidth: number = 0;\n private _scaledCharHeight: number = 0;\n private _scaledCellWidth: number = 0;\n private _scaledCellHeight: number = 0;\n private _scaledCharLeft: number = 0;\n private _scaledCharTop: number = 0;\n\n private _selectionStart: [number, number] | undefined;\n private _selectionEnd: [number, number] | undefined;\n private _columnSelectMode: boolean = false;\n\n protected _charAtlas: BaseCharAtlas | undefined;\n\n /**\n * An object that's reused when drawing glyphs in order to reduce GC.\n */\n private _currentGlyphIdentifier: IGlyphIdentifier = {\n chars: '',\n code: 0,\n bg: 0,\n fg: 0,\n bold: false,\n dim: false,\n italic: false\n };\n\n constructor(\n private _container: HTMLElement,\n id: string,\n zIndex: number,\n private _alpha: boolean,\n protected _colors: IColorSet,\n private _rendererId: number,\n protected readonly _bufferService: IBufferService,\n protected readonly _optionsService: IOptionsService,\n protected readonly _decorationService: IDecorationService\n ) {\n this._canvas = document.createElement('canvas');\n this._canvas.classList.add(`xterm-${id}-layer`);\n this._canvas.style.zIndex = zIndex.toString();\n this._initCanvas();\n this._container.appendChild(this._canvas);\n }\n\n public dispose(): void {\n removeElementFromParent(this._canvas);\n this._charAtlas?.dispose();\n }\n\n private _initCanvas(): void {\n this._ctx = throwIfFalsy(this._canvas.getContext('2d', { alpha: this._alpha }));\n // Draw the background if this is an opaque layer\n if (!this._alpha) {\n this._clearAll();\n }\n }\n\n public onOptionsChanged(): void {}\n public onBlur(): void {}\n public onFocus(): void {}\n public onCursorMove(): void {}\n public onGridChanged(startRow: number, endRow: number): void {}\n\n public onSelectionChanged(start: [number, number] | undefined, end: [number, number] | undefined, columnSelectMode: boolean = false): void {\n this._selectionStart = start;\n this._selectionEnd = end;\n this._columnSelectMode = columnSelectMode;\n }\n\n public setColors(colorSet: IColorSet): void {\n this._refreshCharAtlas(colorSet);\n }\n\n protected _setTransparency(alpha: boolean): void {\n // Do nothing when alpha doesn't change\n if (alpha === this._alpha) {\n return;\n }\n\n // Create new canvas and replace old one\n const oldCanvas = this._canvas;\n this._alpha = alpha;\n // Cloning preserves properties\n this._canvas = this._canvas.cloneNode() as HTMLCanvasElement;\n this._initCanvas();\n this._container.replaceChild(this._canvas, oldCanvas);\n\n // Regenerate char atlas and force a full redraw\n this._refreshCharAtlas(this._colors);\n this.onGridChanged(0, this._bufferService.rows - 1);\n }\n\n /**\n * Refreshes the char atlas, aquiring a new one if necessary.\n * @param colorSet The color set to use for the char atlas.\n */\n private _refreshCharAtlas(colorSet: IColorSet): void {\n if (this._scaledCharWidth <= 0 && this._scaledCharHeight <= 0) {\n return;\n }\n this._charAtlas = acquireCharAtlas(this._optionsService.rawOptions, this._rendererId, colorSet, this._scaledCharWidth, this._scaledCharHeight);\n this._charAtlas.warmUp();\n }\n\n public resize(dim: IRenderDimensions): void {\n this._scaledCellWidth = dim.scaledCellWidth;\n this._scaledCellHeight = dim.scaledCellHeight;\n this._scaledCharWidth = dim.scaledCharWidth;\n this._scaledCharHeight = dim.scaledCharHeight;\n this._scaledCharLeft = dim.scaledCharLeft;\n this._scaledCharTop = dim.scaledCharTop;\n this._canvas.width = dim.scaledCanvasWidth;\n this._canvas.height = dim.scaledCanvasHeight;\n this._canvas.style.width = `${dim.canvasWidth}px`;\n this._canvas.style.height = `${dim.canvasHeight}px`;\n\n // Draw the background if this is an opaque layer\n if (!this._alpha) {\n this._clearAll();\n }\n\n this._refreshCharAtlas(this._colors);\n }\n\n public abstract reset(): void;\n\n public clearTextureAtlas(): void {\n this._charAtlas?.clear();\n }\n\n /**\n * Fills 1+ cells completely. This uses the existing fillStyle on the context.\n * @param x The column to start at.\n * @param y The row to start at\n * @param width The number of columns to fill.\n * @param height The number of rows to fill.\n */\n protected _fillCells(x: number, y: number, width: number, height: number): void {\n this._ctx.fillRect(\n x * this._scaledCellWidth,\n y * this._scaledCellHeight,\n width * this._scaledCellWidth,\n height * this._scaledCellHeight);\n }\n\n /**\n * Fills a 1px line (2px on HDPI) at the middle of the cell. This uses the\n * existing fillStyle on the context.\n * @param x The column to fill.\n * @param y The row to fill.\n */\n protected _fillMiddleLineAtCells(x: number, y: number, width: number = 1): void {\n const cellOffset = Math.ceil(this._scaledCellHeight * 0.5);\n this._ctx.fillRect(\n x * this._scaledCellWidth,\n (y + 1) * this._scaledCellHeight - cellOffset - window.devicePixelRatio,\n width * this._scaledCellWidth,\n window.devicePixelRatio);\n }\n\n /**\n * Fills a 1px line (2px on HDPI) at the bottom of the cell. This uses the\n * existing fillStyle on the context.\n * @param x The column to fill.\n * @param y The row to fill.\n */\n protected _fillBottomLineAtCells(x: number, y: number, width: number = 1): void {\n this._ctx.fillRect(\n x * this._scaledCellWidth,\n (y + 1) * this._scaledCellHeight - window.devicePixelRatio - 1 /* Ensure it's drawn within the cell */,\n width * this._scaledCellWidth,\n window.devicePixelRatio);\n }\n\n /**\n * Fills a 1px line (2px on HDPI) at the left of the cell. This uses the\n * existing fillStyle on the context.\n * @param x The column to fill.\n * @param y The row to fill.\n */\n protected _fillLeftLineAtCell(x: number, y: number, width: number): void {\n this._ctx.fillRect(\n x * this._scaledCellWidth,\n y * this._scaledCellHeight,\n window.devicePixelRatio * width,\n this._scaledCellHeight);\n }\n\n /**\n * Strokes a 1px rectangle (2px on HDPI) around a cell. This uses the existing\n * strokeStyle on the context.\n * @param x The column to fill.\n * @param y The row to fill.\n */\n protected _strokeRectAtCell(x: number, y: number, width: number, height: number): void {\n this._ctx.lineWidth = window.devicePixelRatio;\n this._ctx.strokeRect(\n x * this._scaledCellWidth + window.devicePixelRatio / 2,\n y * this._scaledCellHeight + (window.devicePixelRatio / 2),\n width * this._scaledCellWidth - window.devicePixelRatio,\n (height * this._scaledCellHeight) - window.devicePixelRatio);\n }\n\n /**\n * Clears the entire canvas.\n */\n protected _clearAll(): void {\n if (this._alpha) {\n this._ctx.clearRect(0, 0, this._canvas.width, this._canvas.height);\n } else {\n this._ctx.fillStyle = this._colors.background.css;\n this._ctx.fillRect(0, 0, this._canvas.width, this._canvas.height);\n }\n }\n\n /**\n * Clears 1+ cells completely.\n * @param x The column to start at.\n * @param y The row to start at.\n * @param width The number of columns to clear.\n * @param height The number of rows to clear.\n */\n protected _clearCells(x: number, y: number, width: number, height: number): void {\n if (this._alpha) {\n this._ctx.clearRect(\n x * this._scaledCellWidth,\n y * this._scaledCellHeight,\n width * this._scaledCellWidth,\n height * this._scaledCellHeight);\n } else {\n this._ctx.fillStyle = this._colors.background.css;\n this._ctx.fillRect(\n x * this._scaledCellWidth,\n y * this._scaledCellHeight,\n width * this._scaledCellWidth,\n height * this._scaledCellHeight);\n }\n }\n\n /**\n * Draws a truecolor character at the cell. The character will be clipped to\n * ensure that it fits with the cell, including the cell to the right if it's\n * a wide character. This uses the existing fillStyle on the context.\n * @param cell The cell data for the character to draw.\n * @param x The column to draw at.\n * @param y The row to draw at.\n * @param color The color of the character.\n */\n protected _fillCharTrueColor(cell: CellData, x: number, y: number): void {\n this._ctx.font = this._getFont(false, false);\n this._ctx.textBaseline = TEXT_BASELINE;\n this._clipRow(y);\n\n // Draw custom characters if applicable\n let drawSuccess = false;\n if (this._optionsService.rawOptions.customGlyphs !== false) {\n drawSuccess = tryDrawCustomChar(this._ctx, cell.getChars(), x * this._scaledCellWidth, y * this._scaledCellHeight, this._scaledCellWidth, this._scaledCellHeight);\n }\n\n // Draw the character\n if (!drawSuccess) {\n this._ctx.fillText(\n cell.getChars(),\n x * this._scaledCellWidth + this._scaledCharLeft,\n y * this._scaledCellHeight + this._scaledCharTop + this._scaledCharHeight);\n }\n }\n\n /**\n * Draws one or more characters at a cell. If possible this will draw using\n * the character atlas to reduce draw time.\n * @param chars The character or characters.\n * @param code The character code.\n * @param width The width of the characters.\n * @param x The column to draw at.\n * @param y The row to draw at.\n * @param fg The foreground color, in the format stored within the attributes.\n * @param bg The background color, in the format stored within the attributes.\n * This is used to validate whether a cached image can be used.\n * @param bold Whether the text is bold.\n */\n protected _drawChars(cell: ICellData, x: number, y: number): void {\n const contrastColor = this._getContrastColor(cell, x, y);\n\n // skip cache right away if we draw in RGB\n // Note: to avoid bad runtime JoinedCellData will be skipped\n // in the cache handler itself (atlasDidDraw == false) and\n // fall through to uncached later down below\n if (contrastColor || cell.isFgRGB() || cell.isBgRGB()) {\n this._drawUncachedChars(cell, x, y, contrastColor);\n return;\n }\n\n let fg;\n let bg;\n if (cell.isInverse()) {\n fg = (cell.isBgDefault()) ? INVERTED_DEFAULT_COLOR : cell.getBgColor();\n bg = (cell.isFgDefault()) ? INVERTED_DEFAULT_COLOR : cell.getFgColor();\n } else {\n bg = (cell.isBgDefault()) ? DEFAULT_COLOR : cell.getBgColor();\n fg = (cell.isFgDefault()) ? DEFAULT_COLOR : cell.getFgColor();\n }\n\n const drawInBrightColor = this._optionsService.rawOptions.drawBoldTextInBrightColors && cell.isBold() && fg < 8;\n\n fg += drawInBrightColor ? 8 : 0;\n this._currentGlyphIdentifier.chars = cell.getChars() || WHITESPACE_CELL_CHAR;\n this._currentGlyphIdentifier.code = cell.getCode() || WHITESPACE_CELL_CODE;\n this._currentGlyphIdentifier.bg = bg;\n this._currentGlyphIdentifier.fg = fg;\n this._currentGlyphIdentifier.bold = !!cell.isBold();\n this._currentGlyphIdentifier.dim = !!cell.isDim();\n this._currentGlyphIdentifier.italic = !!cell.isItalic();\n\n // Don't try cache the glyph if it uses any decoration foreground/background override.\n let hasOverrides = false;\n for (const d of this._decorationService.getDecorationsAtCell(x, y)) {\n if (d.backgroundColorRGB || d.foregroundColorRGB) {\n hasOverrides = true;\n break;\n }\n }\n\n const atlasDidDraw = hasOverrides ? false : this._charAtlas?.draw(this._ctx, this._currentGlyphIdentifier, x * this._scaledCellWidth + this._scaledCharLeft, y * this._scaledCellHeight + this._scaledCharTop);\n\n if (!atlasDidDraw) {\n this._drawUncachedChars(cell, x, y);\n }\n }\n\n /**\n * Draws one or more characters at one or more cells. The character(s) will be\n * clipped to ensure that they fit with the cell(s), including the cell to the\n * right if the last character is a wide character.\n * @param chars The character.\n * @param width The width of the character.\n * @param fg The foreground color, in the format stored within the attributes.\n * @param x The column to draw at.\n * @param y The row to draw at.\n */\n private _drawUncachedChars(cell: ICellData, x: number, y: number, fgOverride?: IColor): void {\n this._ctx.save();\n this._ctx.font = this._getFont(!!cell.isBold(), !!cell.isItalic());\n this._ctx.textBaseline = TEXT_BASELINE;\n\n if (cell.isInverse()) {\n if (fgOverride) {\n this._ctx.fillStyle = fgOverride.css;\n } else if (cell.isBgDefault()) {\n this._ctx.fillStyle = color.opaque(this._colors.background).css;\n } else if (cell.isBgRGB()) {\n this._ctx.fillStyle = `rgb(${AttributeData.toColorRGB(cell.getBgColor()).join(',')})`;\n } else {\n let bg = cell.getBgColor();\n if (this._optionsService.rawOptions.drawBoldTextInBrightColors && cell.isBold() && bg < 8) {\n bg += 8;\n }\n this._ctx.fillStyle = this._colors.ansi[bg].css;\n }\n } else {\n if (fgOverride) {\n this._ctx.fillStyle = fgOverride.css;\n } else if (cell.isFgDefault()) {\n this._ctx.fillStyle = this._colors.foreground.css;\n } else if (cell.isFgRGB()) {\n this._ctx.fillStyle = `rgb(${AttributeData.toColorRGB(cell.getFgColor()).join(',')})`;\n } else {\n let fg = cell.getFgColor();\n if (this._optionsService.rawOptions.drawBoldTextInBrightColors && cell.isBold() && fg < 8) {\n fg += 8;\n }\n this._ctx.fillStyle = this._colors.ansi[fg].css;\n }\n }\n\n this._clipRow(y);\n\n // Apply alpha to dim the character\n if (cell.isDim()) {\n this._ctx.globalAlpha = DIM_OPACITY;\n }\n\n // Draw custom characters if applicable\n let drawSuccess = false;\n if (this._optionsService.rawOptions.customGlyphs !== false) {\n drawSuccess = tryDrawCustomChar(this._ctx, cell.getChars(), x * this._scaledCellWidth, y * this._scaledCellHeight, this._scaledCellWidth, this._scaledCellHeight);\n }\n\n // Draw the character\n if (!drawSuccess) {\n this._ctx.fillText(\n cell.getChars(),\n x * this._scaledCellWidth + this._scaledCharLeft,\n y * this._scaledCellHeight + this._scaledCharTop + this._scaledCharHeight);\n }\n\n this._ctx.restore();\n }\n\n\n /**\n * Clips a row to ensure no pixels will be drawn outside the cells in the row.\n * @param y The row to clip.\n */\n private _clipRow(y: number): void {\n this._ctx.beginPath();\n this._ctx.rect(\n 0,\n y * this._scaledCellHeight,\n this._bufferService.cols * this._scaledCellWidth,\n this._scaledCellHeight);\n this._ctx.clip();\n }\n\n /**\n * Gets the current font.\n * @param isBold If we should use the bold fontWeight.\n */\n protected _getFont(isBold: boolean, isItalic: boolean): string {\n const fontWeight = isBold ? this._optionsService.rawOptions.fontWeightBold : this._optionsService.rawOptions.fontWeight;\n const fontStyle = isItalic ? 'italic' : '';\n\n return `${fontStyle} ${fontWeight} ${this._optionsService.rawOptions.fontSize * window.devicePixelRatio}px ${this._optionsService.rawOptions.fontFamily}`;\n }\n\n private _getContrastColor(cell: CellData, x: number, y: number): IColor | undefined {\n // Get any decoration foreground/background overrides, this must be fetched before the early\n // exist but applied after inverse\n let bgOverride: number | undefined;\n let fgOverride: number | undefined;\n let isTop = false;\n for (const d of this._decorationService.getDecorationsAtCell(x, y)) {\n if (d.options.layer !== 'top' && isTop) {\n continue;\n }\n if (d.backgroundColorRGB) {\n bgOverride = d.backgroundColorRGB.rgba;\n }\n if (d.foregroundColorRGB) {\n fgOverride = d.foregroundColorRGB.rgba;\n }\n isTop = d.options.layer === 'top';\n }\n\n // Apply selection foreground if applicable\n if (!isTop) {\n if (this._colors.selectionForeground && this._isCellInSelection(x, y)) {\n fgOverride = this._colors.selectionForeground.rgba;\n }\n }\n\n if (!bgOverride && !fgOverride && (this._optionsService.rawOptions.minimumContrastRatio === 1 || excludeFromContrastRatioDemands(cell.getCode()))) {\n return undefined;\n }\n\n if (!bgOverride && !fgOverride) {\n // Try get from cache\n const adjustedColor = this._colors.contrastCache.getColor(cell.bg, cell.fg);\n if (adjustedColor !== undefined) {\n return adjustedColor || undefined;\n }\n }\n\n let fgColor = cell.getFgColor();\n let fgColorMode = cell.getFgColorMode();\n let bgColor = cell.getBgColor();\n let bgColorMode = cell.getBgColorMode();\n const isInverse = !!cell.isInverse();\n const isBold = !!cell.isInverse();\n if (isInverse) {\n const temp = fgColor;\n fgColor = bgColor;\n bgColor = temp;\n const temp2 = fgColorMode;\n fgColorMode = bgColorMode;\n bgColorMode = temp2;\n }\n\n const bgRgba = this._resolveBackgroundRgba(bgOverride !== undefined ? Attributes.CM_RGB : bgColorMode, bgOverride ?? bgColor, isInverse);\n const fgRgba = this._resolveForegroundRgba(fgColorMode, fgColor, isInverse, isBold);\n let result = rgba.ensureContrastRatio(bgOverride ?? bgRgba, fgOverride ?? fgRgba, this._optionsService.rawOptions.minimumContrastRatio);\n\n if (!result) {\n if (!fgOverride) {\n this._colors.contrastCache.setColor(cell.bg, cell.fg, null);\n return undefined;\n }\n // If it was an override and there was no contrast change, set as the result\n result = fgOverride;\n }\n\n const color: IColor = {\n css: channels.toCss(\n (result >> 24) & 0xFF,\n (result >> 16) & 0xFF,\n (result >> 8) & 0xFF\n ),\n rgba: result\n };\n if (!bgOverride && !fgOverride) {\n this._colors.contrastCache.setColor(cell.bg, cell.fg, color);\n }\n\n return color;\n }\n\n private _resolveBackgroundRgba(bgColorMode: number, bgColor: number, inverse: boolean): number {\n switch (bgColorMode) {\n case Attributes.CM_P16:\n case Attributes.CM_P256:\n return this._colors.ansi[bgColor].rgba;\n case Attributes.CM_RGB:\n return bgColor << 8;\n case Attributes.CM_DEFAULT:\n default:\n if (inverse) {\n return this._colors.foreground.rgba;\n }\n return this._colors.background.rgba;\n }\n }\n\n private _resolveForegroundRgba(fgColorMode: number, fgColor: number, inverse: boolean, bold: boolean): number {\n switch (fgColorMode) {\n case Attributes.CM_P16:\n case Attributes.CM_P256:\n if (this._optionsService.rawOptions.drawBoldTextInBrightColors && bold && fgColor < 8) {\n fgColor += 8;\n }\n return this._colors.ansi[fgColor].rgba;\n case Attributes.CM_RGB:\n return fgColor << 8;\n case Attributes.CM_DEFAULT:\n default:\n if (inverse) {\n return this._colors.background.rgba;\n }\n return this._colors.foreground.rgba;\n }\n }\n\n private _isCellInSelection(x: number, y: number): boolean {\n const start = this._selectionStart;\n const end = this._selectionEnd;\n if (!start || !end) {\n return false;\n }\n if (this._columnSelectMode) {\n return x >= start[0] && y >= start[1] &&\n x < end[0] && y < end[1];\n }\n return (y > start[1] && y < end[1]) ||\n (start[1] === end[1] && y === start[1] && x >= start[0] && x < end[0]) ||\n (start[1] < end[1] && y === end[1] && x < end[0]) ||\n (start[1] < end[1] && y === start[1] && x >= start[0]);\n }\n}\n\n","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IRenderDimensions, IRequestRedrawEvent } from 'browser/renderer/Types';\nimport { BaseRenderLayer } from 'browser/renderer/BaseRenderLayer';\nimport { ICellData } from 'common/Types';\nimport { CellData } from 'common/buffer/CellData';\nimport { IColorSet } from 'browser/Types';\nimport { IBufferService, IOptionsService, ICoreService, IDecorationService } from 'common/services/Services';\nimport { IEventEmitter } from 'common/EventEmitter';\nimport { ICoreBrowserService } from 'browser/services/Services';\n\ninterface ICursorState {\n x: number;\n y: number;\n isFocused: boolean;\n style: string;\n width: number;\n}\n\n/**\n * The time between cursor blinks.\n */\nconst BLINK_INTERVAL = 600;\n\nexport class CursorRenderLayer extends BaseRenderLayer {\n private _state: ICursorState;\n private _cursorRenderers: {[key: string]: (x: number, y: number, cell: ICellData) => void};\n private _cursorBlinkStateManager: CursorBlinkStateManager | undefined;\n private _cell: ICellData = new CellData();\n\n constructor(\n container: HTMLElement,\n zIndex: number,\n colors: IColorSet,\n rendererId: number,\n private _onRequestRedraw: IEventEmitter<IRequestRedrawEvent>,\n @IBufferService bufferService: IBufferService,\n @IOptionsService optionsService: IOptionsService,\n @ICoreService private readonly _coreService: ICoreService,\n @ICoreBrowserService private readonly _coreBrowserService: ICoreBrowserService,\n @IDecorationService decorationService: IDecorationService\n ) {\n super(container, 'cursor', zIndex, true, colors, rendererId, bufferService, optionsService, decorationService);\n this._state = {\n x: 0,\n y: 0,\n isFocused: false,\n style: '',\n width: 0\n };\n this._cursorRenderers = {\n 'bar': this._renderBarCursor.bind(this),\n 'block': this._renderBlockCursor.bind(this),\n 'underline': this._renderUnderlineCursor.bind(this)\n };\n }\n\n public dispose(): void {\n if (this._cursorBlinkStateManager) {\n this._cursorBlinkStateManager.dispose();\n this._cursorBlinkStateManager = undefined;\n }\n super.dispose();\n }\n\n public resize(dim: IRenderDimensions): void {\n super.resize(dim);\n // Resizing the canvas discards the contents of the canvas so clear state\n this._state = {\n x: 0,\n y: 0,\n isFocused: false,\n style: '',\n width: 0\n };\n }\n\n public reset(): void {\n this._clearCursor();\n this._cursorBlinkStateManager?.restartBlinkAnimation();\n this.onOptionsChanged();\n }\n\n public onBlur(): void {\n this._cursorBlinkStateManager?.pause();\n this._onRequestRedraw.fire({ start: this._bufferService.buffer.y, end: this._bufferService.buffer.y });\n }\n\n public onFocus(): void {\n this._cursorBlinkStateManager?.resume();\n this._onRequestRedraw.fire({ start: this._bufferService.buffer.y, end: this._bufferService.buffer.y });\n }\n\n public onOptionsChanged(): void {\n if (this._optionsService.rawOptions.cursorBlink) {\n if (!this._cursorBlinkStateManager) {\n this._cursorBlinkStateManager = new CursorBlinkStateManager(this._coreBrowserService.isFocused, () => {\n this._render(true);\n });\n }\n } else {\n this._cursorBlinkStateManager?.dispose();\n this._cursorBlinkStateManager = undefined;\n }\n // Request a refresh from the terminal as management of rendering is being\n // moved back to the terminal\n this._onRequestRedraw.fire({ start: this._bufferService.buffer.y, end: this._bufferService.buffer.y });\n }\n\n public onCursorMove(): void {\n this._cursorBlinkStateManager?.restartBlinkAnimation();\n }\n\n public onGridChanged(startRow: number, endRow: number): void {\n if (!this._cursorBlinkStateManager || this._cursorBlinkStateManager.isPaused) {\n this._render(false);\n } else {\n this._cursorBlinkStateManager.restartBlinkAnimation();\n }\n }\n\n private _render(triggeredByAnimationFrame: boolean): void {\n // Don't draw the cursor if it's hidden\n if (!this._coreService.isCursorInitialized || this._coreService.isCursorHidden) {\n this._clearCursor();\n return;\n }\n\n const cursorY = this._bufferService.buffer.ybase + this._bufferService.buffer.y;\n const viewportRelativeCursorY = cursorY - this._bufferService.buffer.ydisp;\n\n // Don't draw the cursor if it's off-screen\n if (viewportRelativeCursorY < 0 || viewportRelativeCursorY >= this._bufferService.rows) {\n this._clearCursor();\n return;\n }\n\n // in case cursor.x == cols adjust visual cursor to cols - 1\n const cursorX = Math.min(this._bufferService.buffer.x, this._bufferService.cols - 1);\n this._bufferService.buffer.lines.get(cursorY)!.loadCell(cursorX, this._cell);\n if (this._cell.content === undefined) {\n return;\n }\n\n if (!this._coreBrowserService.isFocused) {\n this._clearCursor();\n this._ctx.save();\n this._ctx.fillStyle = this._colors.cursor.css;\n const cursorStyle = this._optionsService.rawOptions.cursorStyle;\n if (cursorStyle && cursorStyle !== 'block') {\n this._cursorRenderers[cursorStyle](cursorX, viewportRelativeCursorY, this._cell);\n } else {\n this._renderBlurCursor(cursorX, viewportRelativeCursorY, this._cell);\n }\n this._ctx.restore();\n this._state.x = cursorX;\n this._state.y = viewportRelativeCursorY;\n this._state.isFocused = false;\n this._state.style = cursorStyle;\n this._state.width = this._cell.getWidth();\n return;\n }\n\n // Don't draw the cursor if it's blinking\n if (this._cursorBlinkStateManager && !this._cursorBlinkStateManager.isCursorVisible) {\n this._clearCursor();\n return;\n }\n\n if (this._state) {\n // The cursor is already in the correct spot, don't redraw\n if (this._state.x === cursorX &&\n this._state.y === viewportRelativeCursorY &&\n this._state.isFocused === this._coreBrowserService.isFocused &&\n this._state.style === this._optionsService.rawOptions.cursorStyle &&\n this._state.width === this._cell.getWidth()) {\n return;\n }\n this._clearCursor();\n }\n\n this._ctx.save();\n this._cursorRenderers[this._optionsService.rawOptions.cursorStyle || 'block'](cursorX, viewportRelativeCursorY, this._cell);\n this._ctx.restore();\n\n this._state.x = cursorX;\n this._state.y = viewportRelativeCursorY;\n this._state.isFocused = false;\n this._state.style = this._optionsService.rawOptions.cursorStyle;\n this._state.width = this._cell.getWidth();\n }\n\n private _clearCursor(): void {\n if (this._state) {\n // Avoid potential rounding errors when device pixel ratio is less than 1\n if (window.devicePixelRatio < 1) {\n this._clearAll();\n } else {\n this._clearCells(this._state.x, this._state.y, this._state.width, 1);\n }\n this._state = {\n x: 0,\n y: 0,\n isFocused: false,\n style: '',\n width: 0\n };\n }\n }\n\n private _renderBarCursor(x: number, y: number, cell: ICellData): void {\n this._ctx.save();\n this._ctx.fillStyle = this._colors.cursor.css;\n this._fillLeftLineAtCell(x, y, this._optionsService.rawOptions.cursorWidth);\n this._ctx.restore();\n }\n\n private _renderBlockCursor(x: number, y: number, cell: ICellData): void {\n this._ctx.save();\n this._ctx.fillStyle = this._colors.cursor.css;\n this._fillCells(x, y, cell.getWidth(), 1);\n this._ctx.fillStyle = this._colors.cursorAccent.css;\n this._fillCharTrueColor(cell, x, y);\n this._ctx.restore();\n }\n\n private _renderUnderlineCursor(x: number, y: number, cell: ICellData): void {\n this._ctx.save();\n this._ctx.fillStyle = this._colors.cursor.css;\n this._fillBottomLineAtCells(x, y);\n this._ctx.restore();\n }\n\n private _renderBlurCursor(x: number, y: number, cell: ICellData): void {\n this._ctx.save();\n this._ctx.strokeStyle = this._colors.cursor.css;\n this._strokeRectAtCell(x, y, cell.getWidth(), 1);\n this._ctx.restore();\n }\n}\n\nclass CursorBlinkStateManager {\n public isCursorVisible: boolean;\n\n private _animationFrame: number | undefined;\n private _blinkStartTimeout: number | undefined;\n private _blinkInterval: number | undefined;\n\n /**\n * The time at which the animation frame was restarted, this is used on the\n * next render to restart the timers so they don't need to restart the timers\n * multiple times over a short period.\n */\n private _animationTimeRestarted: number | undefined;\n\n constructor(\n isFocused: boolean,\n private _renderCallback: () => void\n ) {\n this.isCursorVisible = true;\n if (isFocused) {\n this._restartInterval();\n }\n }\n\n public get isPaused(): boolean { return !(this._blinkStartTimeout || this._blinkInterval); }\n\n public dispose(): void {\n if (this._blinkInterval) {\n window.clearInterval(this._blinkInterval);\n this._blinkInterval = undefined;\n }\n if (this._blinkStartTimeout) {\n window.clearTimeout(this._blinkStartTimeout);\n this._blinkStartTimeout = undefined;\n }\n if (this._animationFrame) {\n window.cancelAnimationFrame(this._animationFrame);\n this._animationFrame = undefined;\n }\n }\n\n public restartBlinkAnimation(): void {\n if (this.isPaused) {\n return;\n }\n // Save a timestamp so that the restart can be done on the next interval\n this._animationTimeRestarted = Date.now();\n // Force a cursor render to ensure it's visible and in the correct position\n this.isCursorVisible = true;\n if (!this._animationFrame) {\n this._animationFrame = window.requestAnimationFrame(() => {\n this._renderCallback();\n this._animationFrame = undefined;\n });\n }\n }\n\n private _restartInterval(timeToStart: number = BLINK_INTERVAL): void {\n // Clear any existing interval\n if (this._blinkInterval) {\n window.clearInterval(this._blinkInterval);\n this._blinkInterval = undefined;\n }\n\n // Setup the initial timeout which will hide the cursor, this is done before\n // the regular interval is setup in order to support restarting the blink\n // animation in a lightweight way (without thrashing clearInterval and\n // setInterval).\n this._blinkStartTimeout = window.setTimeout(() => {\n // Check if another animation restart was requested while this was being\n // started\n if (this._animationTimeRestarted) {\n const time = BLINK_INTERVAL - (Date.now() - this._animationTimeRestarted);\n this._animationTimeRestarted = undefined;\n if (time > 0) {\n this._restartInterval(time);\n return;\n }\n }\n\n // Hide the cursor\n this.isCursorVisible = false;\n this._animationFrame = window.requestAnimationFrame(() => {\n this._renderCallback();\n this._animationFrame = undefined;\n });\n\n // Setup the blink interval\n this._blinkInterval = window.setInterval(() => {\n // Adjust the animation time if it was restarted\n if (this._animationTimeRestarted) {\n // calc time diff\n // Make restart interval do a setTimeout initially?\n const time = BLINK_INTERVAL - (Date.now() - this._animationTimeRestarted);\n this._animationTimeRestarted = undefined;\n this._restartInterval(time);\n return;\n }\n\n // Invert visibility and render\n this.isCursorVisible = !this.isCursorVisible;\n this._animationFrame = window.requestAnimationFrame(() => {\n this._renderCallback();\n this._animationFrame = undefined;\n });\n }, BLINK_INTERVAL);\n }, timeToStart);\n }\n\n public pause(): void {\n this.isCursorVisible = true;\n if (this._blinkInterval) {\n window.clearInterval(this._blinkInterval);\n this._blinkInterval = undefined;\n }\n if (this._blinkStartTimeout) {\n window.clearTimeout(this._blinkStartTimeout);\n this._blinkStartTimeout = undefined;\n }\n if (this._animationFrame) {\n window.cancelAnimationFrame(this._animationFrame);\n this._animationFrame = undefined;\n }\n }\n\n public resume(): void {\n // Clear out any existing timers just in case\n this.pause();\n\n this._animationTimeRestarted = undefined;\n this._restartInterval();\n this.restartBlinkAnimation();\n }\n}\n","/**\n * Copyright (c) 2021 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { throwIfFalsy } from 'browser/renderer/RendererUtils';\n\ninterface IBlockVector {\n x: number;\n y: number;\n w: number;\n h: number;\n}\n\nexport const blockElementDefinitions: { [index: string]: IBlockVector[] | undefined } = {\n // Block elements (0x2580-0x2590)\n '▀': [{ x: 0, y: 0, w: 8, h: 4 }], // UPPER HALF BLOCK\n '▁': [{ x: 0, y: 7, w: 8, h: 1 }], // LOWER ONE EIGHTH BLOCK\n '▂': [{ x: 0, y: 6, w: 8, h: 2 }], // LOWER ONE QUARTER BLOCK\n '▃': [{ x: 0, y: 5, w: 8, h: 3 }], // LOWER THREE EIGHTHS BLOCK\n '▄': [{ x: 0, y: 4, w: 8, h: 4 }], // LOWER HALF BLOCK\n '▅': [{ x: 0, y: 3, w: 8, h: 5 }], // LOWER FIVE EIGHTHS BLOCK\n '▆': [{ x: 0, y: 2, w: 8, h: 6 }], // LOWER THREE QUARTERS BLOCK\n '▇': [{ x: 0, y: 1, w: 8, h: 7 }], // LOWER SEVEN EIGHTHS BLOCK\n '█': [{ x: 0, y: 0, w: 8, h: 8 }], // FULL BLOCK\n '▉': [{ x: 0, y: 0, w: 7, h: 8 }], // LEFT SEVEN EIGHTHS BLOCK\n '▊': [{ x: 0, y: 0, w: 6, h: 8 }], // LEFT THREE QUARTERS BLOCK\n '▋': [{ x: 0, y: 0, w: 5, h: 8 }], // LEFT FIVE EIGHTHS BLOCK\n '▌': [{ x: 0, y: 0, w: 4, h: 8 }], // LEFT HALF BLOCK\n '▍': [{ x: 0, y: 0, w: 3, h: 8 }], // LEFT THREE EIGHTHS BLOCK\n '▎': [{ x: 0, y: 0, w: 2, h: 8 }], // LEFT ONE QUARTER BLOCK\n '▏': [{ x: 0, y: 0, w: 1, h: 8 }], // LEFT ONE EIGHTH BLOCK\n '▐': [{ x: 4, y: 0, w: 4, h: 8 }], // RIGHT HALF BLOCK\n\n // Block elements (0x2594-0x2595)\n '▔': [{ x: 0, y: 0, w: 9, h: 1 }], // UPPER ONE EIGHTH BLOCK\n '▕': [{ x: 7, y: 0, w: 1, h: 8 }], // RIGHT ONE EIGHTH BLOCK\n\n // Terminal graphic characters (0x2596-0x259F)\n '▖': [{ x: 0, y: 4, w: 4, h: 4 }], // QUADRANT LOWER LEFT\n '▗': [{ x: 4, y: 4, w: 4, h: 4 }], // QUADRANT LOWER RIGHT\n '▘': [{ x: 0, y: 0, w: 4, h: 4 }], // QUADRANT UPPER LEFT\n '▙': [{ x: 0, y: 0, w: 4, h: 8 }, { x: 0, y: 4, w: 8, h: 4 }], // QUADRANT UPPER LEFT AND LOWER LEFT AND LOWER RIGHT\n '▚': [{ x: 0, y: 0, w: 4, h: 4 }, { x: 4, y: 4, w: 4, h: 4 }], // QUADRANT UPPER LEFT AND LOWER RIGHT\n '▛': [{ x: 0, y: 0, w: 4, h: 8 }, { x: 0, y: 0, w: 4, h: 8 }], // QUADRANT UPPER LEFT AND UPPER RIGHT AND LOWER LEFT\n '▜': [{ x: 0, y: 0, w: 8, h: 4 }, { x: 4, y: 0, w: 4, h: 8 }], // QUADRANT UPPER LEFT AND UPPER RIGHT AND LOWER RIGHT\n '▝': [{ x: 4, y: 0, w: 4, h: 4 }], // QUADRANT UPPER RIGHT\n '▞': [{ x: 4, y: 0, w: 4, h: 4 }, { x: 0, y: 4, w: 4, h: 4 }], // QUADRANT UPPER RIGHT AND LOWER LEFT\n '▟': [{ x: 4, y: 0, w: 4, h: 8 }, { x: 0, y: 4, w: 8, h: 4 }], // QUADRANT UPPER RIGHT AND LOWER LEFT AND LOWER RIGHT\n\n // VERTICAL ONE EIGHTH BLOCK-2 through VERTICAL ONE EIGHTH BLOCK-7\n '\\u{1FB70}': [{ x: 1, y: 0, w: 1, h: 8 }],\n '\\u{1FB71}': [{ x: 2, y: 0, w: 1, h: 8 }],\n '\\u{1FB72}': [{ x: 3, y: 0, w: 1, h: 8 }],\n '\\u{1FB73}': [{ x: 4, y: 0, w: 1, h: 8 }],\n '\\u{1FB74}': [{ x: 5, y: 0, w: 1, h: 8 }],\n '\\u{1FB75}': [{ x: 6, y: 0, w: 1, h: 8 }],\n\n // HORIZONTAL ONE EIGHTH BLOCK-2 through HORIZONTAL ONE EIGHTH BLOCK-7\n '\\u{1FB76}': [{ x: 0, y: 1, w: 8, h: 1 }],\n '\\u{1FB77}': [{ x: 0, y: 2, w: 8, h: 1 }],\n '\\u{1FB78}': [{ x: 0, y: 3, w: 8, h: 1 }],\n '\\u{1FB79}': [{ x: 0, y: 4, w: 8, h: 1 }],\n '\\u{1FB7A}': [{ x: 0, y: 5, w: 8, h: 1 }],\n '\\u{1FB7B}': [{ x: 0, y: 6, w: 8, h: 1 }],\n\n // LEFT AND LOWER ONE EIGHTH BLOCK\n '\\u{1FB7C}': [{ x: 0, y: 0, w: 1, h: 8 }, { x: 0, y: 7, w: 8, h: 1 }],\n // LEFT AND UPPER ONE EIGHTH BLOCK\n '\\u{1FB7D}': [{ x: 0, y: 0, w: 1, h: 8 }, { x: 0, y: 0, w: 8, h: 1 }],\n // RIGHT AND UPPER ONE EIGHTH BLOCK\n '\\u{1FB7E}': [{ x: 7, y: 0, w: 1, h: 8 }, { x: 0, y: 0, w: 8, h: 1 }],\n // RIGHT AND LOWER ONE EIGHTH BLOCK\n '\\u{1FB7F}': [{ x: 7, y: 0, w: 1, h: 8 }, { x: 0, y: 7, w: 8, h: 1 }],\n // UPPER AND LOWER ONE EIGHTH BLOCK\n '\\u{1FB80}': [{ x: 0, y: 0, w: 8, h: 1 }, { x: 0, y: 7, w: 8, h: 1 }],\n // HORIZONTAL ONE EIGHTH BLOCK-1358\n '\\u{1FB81}': [{ x: 0, y: 0, w: 8, h: 1 }, { x: 0, y: 2, w: 8, h: 1 }, { x: 0, y: 4, w: 8, h: 1 }, { x: 0, y: 7, w: 8, h: 1 }],\n\n // UPPER ONE QUARTER BLOCK\n '\\u{1FB82}': [{ x: 0, y: 0, w: 8, h: 2 }],\n // UPPER THREE EIGHTHS BLOCK\n '\\u{1FB83}': [{ x: 0, y: 0, w: 8, h: 3 }],\n // UPPER FIVE EIGHTHS BLOCK\n '\\u{1FB84}': [{ x: 0, y: 0, w: 8, h: 5 }],\n // UPPER THREE QUARTERS BLOCK\n '\\u{1FB85}': [{ x: 0, y: 0, w: 8, h: 6 }],\n // UPPER SEVEN EIGHTHS BLOCK\n '\\u{1FB86}': [{ x: 0, y: 0, w: 8, h: 7 }],\n\n // RIGHT ONE QUARTER BLOCK\n '\\u{1FB87}': [{ x: 6, y: 0, w: 2, h: 8 }],\n // RIGHT THREE EIGHTHS B0OCK\n '\\u{1FB88}': [{ x: 5, y: 0, w: 3, h: 8 }],\n // RIGHT FIVE EIGHTHS BL0CK\n '\\u{1FB89}': [{ x: 3, y: 0, w: 5, h: 8 }],\n // RIGHT THREE QUARTERS 0LOCK\n '\\u{1FB8A}': [{ x: 2, y: 0, w: 6, h: 8 }],\n // RIGHT SEVEN EIGHTHS B0OCK\n '\\u{1FB8B}': [{ x: 1, y: 0, w: 7, h: 8 }],\n\n // CHECKER BOARD FILL\n '\\u{1FB95}': [\n { x: 0, y: 0, w: 2, h: 2 }, { x: 4, y: 0, w: 2, h: 2 },\n { x: 2, y: 2, w: 2, h: 2 }, { x: 6, y: 2, w: 2, h: 2 },\n { x: 0, y: 4, w: 2, h: 2 }, { x: 4, y: 4, w: 2, h: 2 },\n { x: 2, y: 6, w: 2, h: 2 }, { x: 6, y: 6, w: 2, h: 2 }\n ],\n // INVERSE CHECKER BOARD FILL\n '\\u{1FB96}': [\n { x: 2, y: 0, w: 2, h: 2 }, { x: 6, y: 0, w: 2, h: 2 },\n { x: 0, y: 2, w: 2, h: 2 }, { x: 4, y: 2, w: 2, h: 2 },\n { x: 2, y: 4, w: 2, h: 2 }, { x: 6, y: 4, w: 2, h: 2 },\n { x: 0, y: 6, w: 2, h: 2 }, { x: 4, y: 6, w: 2, h: 2 }\n ],\n // HEAVY HORIZONTAL FILL (upper middle and lower one quarter block)\n '\\u{1FB97}': [{ x: 0, y: 2, w: 8, h: 2 }, { x: 0, y: 6, w: 8, h: 2 }]\n};\n\ntype PatternDefinition = number[][];\n\n/**\n * Defines the repeating pattern used by special characters, the pattern is made up of a 2d array of\n * pixel values to be filled (1) or not filled (0).\n */\nconst patternCharacterDefinitions: { [key: string]: PatternDefinition | undefined } = {\n // Shade characters (0x2591-0x2593)\n '░': [ // LIGHT SHADE (25%)\n [1, 0, 0, 0],\n [0, 0, 0, 0],\n [0, 0, 1, 0],\n [0, 0, 0, 0]\n ],\n '▒': [ // MEDIUM SHADE (50%)\n [1, 0],\n [0, 0],\n [0, 1],\n [0, 0]\n ],\n '▓': [ // DARK SHADE (75%)\n [0, 1],\n [1, 1],\n [1, 0],\n [1, 1]\n ]\n};\n\nconst enum Shapes {\n /** │ */ TOP_TO_BOTTOM = 'M.5,0 L.5,1',\n /** ─ */ LEFT_TO_RIGHT = 'M0,.5 L1,.5',\n\n /** └ */ TOP_TO_RIGHT = 'M.5,0 L.5,.5 L1,.5',\n /** ┘ */ TOP_TO_LEFT = 'M.5,0 L.5,.5 L0,.5',\n /** ┐ */ LEFT_TO_BOTTOM = 'M0,.5 L.5,.5 L.5,1',\n /** ┌ */ RIGHT_TO_BOTTOM = 'M0.5,1 L.5,.5 L1,.5',\n\n /** ╵ */ MIDDLE_TO_TOP = 'M.5,.5 L.5,0',\n /** ╴ */ MIDDLE_TO_LEFT = 'M.5,.5 L0,.5',\n /** ╶ */ MIDDLE_TO_RIGHT = 'M.5,.5 L1,.5',\n /** ╷ */ MIDDLE_TO_BOTTOM = 'M.5,.5 L.5,1',\n\n /** ┴ */ T_TOP = 'M0,.5 L1,.5 M.5,.5 L.5,0',\n /** ┤ */ T_LEFT = 'M.5,0 L.5,1 M.5,.5 L0,.5',\n /** ├ */ T_RIGHT = 'M.5,0 L.5,1 M.5,.5 L1,.5',\n /** ┬ */ T_BOTTOM = 'M0,.5 L1,.5 M.5,.5 L.5,1',\n\n /** ┼ */ CROSS = 'M0,.5 L1,.5 M.5,0 L.5,1',\n\n /** ╌ */ TWO_DASHES_HORIZONTAL = 'M.1,.5 L.4,.5 M.6,.5 L.9,.5', // .2 empty, .3 filled\n /** ┄ */ THREE_DASHES_HORIZONTAL = 'M.0667,.5 L.2667,.5 M.4,.5 L.6,.5 M.7333,.5 L.9333,.5', // .1333 empty, .2 filled\n /** ┉ */ FOUR_DASHES_HORIZONTAL = 'M.05,.5 L.2,.5 M.3,.5 L.45,.5 M.55,.5 L.7,.5 M.8,.5 L.95,.5', // .1 empty, .15 filled\n /** ╎ */ TWO_DASHES_VERTICAL = 'M.5,.1 L.5,.4 M.5,.6 L.5,.9',\n /** ┆ */ THREE_DASHES_VERTICAL = 'M.5,.0667 L.5,.2667 M.5,.4 L.5,.6 M.5,.7333 L.5,.9333',\n /** ┊ */ FOUR_DASHES_VERTICAL = 'M.5,.05 L.5,.2 M.5,.3 L.5,.45 L.5,.55 M.5,.7 L.5,.95',\n}\n\nconst enum Style {\n NORMAL = 1,\n BOLD = 3\n}\n\n/**\n * This contains the definitions of all box drawing characters in the format of SVG paths (ie. the\n * svg d attribute).\n */\nexport const boxDrawingDefinitions: { [character: string]: { [fontWeight: number]: string | ((xp: number, yp: number) => string) } | undefined } = {\n // Uniform normal and bold\n '─': { [Style.NORMAL]: Shapes.LEFT_TO_RIGHT },\n '━': { [Style.BOLD]: Shapes.LEFT_TO_RIGHT },\n '│': { [Style.NORMAL]: Shapes.TOP_TO_BOTTOM },\n '┃': { [Style.BOLD]: Shapes.TOP_TO_BOTTOM },\n '┌': { [Style.NORMAL]: Shapes.RIGHT_TO_BOTTOM },\n '┏': { [Style.BOLD]: Shapes.RIGHT_TO_BOTTOM },\n '┐': { [Style.NORMAL]: Shapes.LEFT_TO_BOTTOM },\n '┓': { [Style.BOLD]: Shapes.LEFT_TO_BOTTOM },\n '└': { [Style.NORMAL]: Shapes.TOP_TO_RIGHT },\n '┗': { [Style.BOLD]: Shapes.TOP_TO_RIGHT },\n '┘': { [Style.NORMAL]: Shapes.TOP_TO_LEFT },\n '┛': { [Style.BOLD]: Shapes.TOP_TO_LEFT },\n '├': { [Style.NORMAL]: Shapes.T_RIGHT },\n '┣': { [Style.BOLD]: Shapes.T_RIGHT },\n '┤': { [Style.NORMAL]: Shapes.T_LEFT },\n '┫': { [Style.BOLD]: Shapes.T_LEFT },\n '┬': { [Style.NORMAL]: Shapes.T_BOTTOM },\n '┳': { [Style.BOLD]: Shapes.T_BOTTOM },\n '┴': { [Style.NORMAL]: Shapes.T_TOP },\n '┻': { [Style.BOLD]: Shapes.T_TOP },\n '┼': { [Style.NORMAL]: Shapes.CROSS },\n '╋': { [Style.BOLD]: Shapes.CROSS },\n '╴': { [Style.NORMAL]: Shapes.MIDDLE_TO_LEFT },\n '╸': { [Style.BOLD]: Shapes.MIDDLE_TO_LEFT },\n '╵': { [Style.NORMAL]: Shapes.MIDDLE_TO_TOP },\n '╹': { [Style.BOLD]: Shapes.MIDDLE_TO_TOP },\n '╶': { [Style.NORMAL]: Shapes.MIDDLE_TO_RIGHT },\n '╺': { [Style.BOLD]: Shapes.MIDDLE_TO_RIGHT },\n '╷': { [Style.NORMAL]: Shapes.MIDDLE_TO_BOTTOM },\n '╻': { [Style.BOLD]: Shapes.MIDDLE_TO_BOTTOM },\n\n // Double border\n '═': { [Style.NORMAL]: (xp, yp) => `M0,${.5 - yp} L1,${.5 - yp} M0,${.5 + yp} L1,${.5 + yp}` },\n '║': { [Style.NORMAL]: (xp, yp) => `M${.5 - xp},0 L${.5 - xp},1 M${.5 + xp},0 L${.5 + xp},1` },\n '╒': { [Style.NORMAL]: (xp, yp) => `M.5,1 L.5,${.5 - yp} L1,${.5 - yp} M.5,${.5 + yp} L1,${.5 + yp}` },\n '╓': { [Style.NORMAL]: (xp, yp) => `M${.5 - xp},1 L${.5 - xp},.5 L1,.5 M${.5 + xp},.5 L${.5 + xp},1` },\n '╔': { [Style.NORMAL]: (xp, yp) => `M1,${.5 - yp} L${.5 - xp},${.5 - yp} L${.5 - xp},1 M1,${.5 + yp} L${.5 + xp},${.5 + yp} L${.5 + xp},1` },\n '╕': { [Style.NORMAL]: (xp, yp) => `M0,${.5 - yp} L.5,${.5 - yp} L.5,1 M0,${.5 + yp} L.5,${.5 + yp}` },\n '╖': { [Style.NORMAL]: (xp, yp) => `M${.5 + xp},1 L${.5 + xp},.5 L0,.5 M${.5 - xp},.5 L${.5 - xp},1` },\n '╗': { [Style.NORMAL]: (xp, yp) => `M0,${.5 + yp} L${.5 - xp},${.5 + yp} L${.5 - xp},1 M0,${.5 - yp} L${.5 + xp},${.5 - yp} L${.5 + xp},1` },\n '╘': { [Style.NORMAL]: (xp, yp) => `M.5,0 L.5,${.5 + yp} L1,${.5 + yp} M.5,${.5 - yp} L1,${.5 - yp}` },\n '╙': { [Style.NORMAL]: (xp, yp) => `M1,.5 L${.5 - xp},.5 L${.5 - xp},0 M${.5 + xp},.5 L${.5 + xp},0` },\n '╚': { [Style.NORMAL]: (xp, yp) => `M1,${.5 - yp} L${.5 + xp},${.5 - yp} L${.5 + xp},0 M1,${.5 + yp} L${.5 - xp},${.5 + yp} L${.5 - xp},0` },\n '╛': { [Style.NORMAL]: (xp, yp) => `M0,${.5 + yp} L.5,${.5 + yp} L.5,0 M0,${.5 - yp} L.5,${.5 - yp}` },\n '╜': { [Style.NORMAL]: (xp, yp) => `M0,.5 L${.5 + xp},.5 L${.5 + xp},0 M${.5 - xp},.5 L${.5 - xp},0` },\n '╝': { [Style.NORMAL]: (xp, yp) => `M0,${.5 - yp} L${.5 - xp},${.5 - yp} L${.5 - xp},0 M0,${.5 + yp} L${.5 + xp},${.5 + yp} L${.5 + xp},0` },\n '╞': { [Style.NORMAL]: (xp, yp) => `${Shapes.TOP_TO_BOTTOM} M.5,${.5 - yp} L1,${.5 - yp} M.5,${.5 + yp} L1,${.5 + yp}` },\n '╟': { [Style.NORMAL]: (xp, yp) => `M${.5 - xp},0 L${.5 - xp},1 M${.5 + xp},0 L${.5 + xp},1 M${.5 + xp},.5 L1,.5` },\n '╠': { [Style.NORMAL]: (xp, yp) => `M${.5 - xp},0 L${.5 - xp},1 M1,${.5 + yp} L${.5 + xp},${.5 + yp} L${.5 + xp},1 M1,${.5 - yp} L${.5 + xp},${.5 - yp} L${.5 + xp},0` },\n '╡': { [Style.NORMAL]: (xp, yp) => `${Shapes.TOP_TO_BOTTOM} M0,${.5 - yp} L.5,${.5 - yp} M0,${.5 + yp} L.5,${.5 + yp}` },\n '╢': { [Style.NORMAL]: (xp, yp) => `M0,.5 L${.5 - xp},.5 M${.5 - xp},0 L${.5 - xp},1 M${.5 + xp},0 L${.5 + xp},1` },\n '╣': { [Style.NORMAL]: (xp, yp) => `M${.5 + xp},0 L${.5 + xp},1 M0,${.5 + yp} L${.5 - xp},${.5 + yp} L${.5 - xp},1 M0,${.5 - yp} L${.5 - xp},${.5 - yp} L${.5 - xp},0` },\n '╤': { [Style.NORMAL]: (xp, yp) => `M0,${.5 - yp} L1,${.5 - yp} M0,${.5 + yp} L1,${.5 + yp} M.5,${.5 + yp} L.5,1` },\n '╥': { [Style.NORMAL]: (xp, yp) => `${Shapes.LEFT_TO_RIGHT} M${.5 - xp},.5 L${.5 - xp},1 M${.5 + xp},.5 L${.5 + xp},1` },\n '╦': { [Style.NORMAL]: (xp, yp) => `M0,${.5 - yp} L1,${.5 - yp} M0,${.5 + yp} L${.5 - xp},${.5 + yp} L${.5 - xp},1 M1,${.5 + yp} L${.5 + xp},${.5 + yp} L${.5 + xp},1` },\n '╧': { [Style.NORMAL]: (xp, yp) => `M.5,0 L.5,${.5 - yp} M0,${.5 - yp} L1,${.5 - yp} M0,${.5 + yp} L1,${.5 + yp}` },\n '╨': { [Style.NORMAL]: (xp, yp) => `${Shapes.LEFT_TO_RIGHT} M${.5 - xp},.5 L${.5 - xp},0 M${.5 + xp},.5 L${.5 + xp},0` },\n '╩': { [Style.NORMAL]: (xp, yp) => `M0,${.5 + yp} L1,${.5 + yp} M0,${.5 - yp} L${.5 - xp},${.5 - yp} L${.5 - xp},0 M1,${.5 - yp} L${.5 + xp},${.5 - yp} L${.5 + xp},0` },\n '╪': { [Style.NORMAL]: (xp, yp) => `${Shapes.TOP_TO_BOTTOM} M0,${.5 - yp} L1,${.5 - yp} M0,${.5 + yp} L1,${.5 + yp}` },\n '╫': { [Style.NORMAL]: (xp, yp) => `${Shapes.LEFT_TO_RIGHT} M${.5 - xp},0 L${.5 - xp},1 M${.5 + xp},0 L${.5 + xp},1` },\n '╬': { [Style.NORMAL]: (xp, yp) => `M0,${.5 + yp} L${.5 - xp},${.5 + yp} L${.5 - xp},1 M1,${.5 + yp} L${.5 + xp},${.5 + yp} L${.5 + xp},1 M0,${.5 - yp} L${.5 - xp},${.5 - yp} L${.5 - xp},0 M1,${.5 - yp} L${.5 + xp},${.5 - yp} L${.5 + xp},0` },\n\n // Diagonal\n '╱': { [Style.NORMAL]: 'M1,0 L0,1' },\n '╲': { [Style.NORMAL]: 'M0,0 L1,1' },\n '╳': { [Style.NORMAL]: 'M1,0 L0,1 M0,0 L1,1' },\n\n // Mixed weight\n '╼': { [Style.NORMAL]: Shapes.MIDDLE_TO_LEFT, [Style.BOLD]: Shapes.MIDDLE_TO_RIGHT },\n '╽': { [Style.NORMAL]: Shapes.MIDDLE_TO_TOP, [Style.BOLD]: Shapes.MIDDLE_TO_BOTTOM },\n '╾': { [Style.NORMAL]: Shapes.MIDDLE_TO_RIGHT, [Style.BOLD]: Shapes.MIDDLE_TO_LEFT },\n '╿': { [Style.NORMAL]: Shapes.MIDDLE_TO_BOTTOM, [Style.BOLD]: Shapes.MIDDLE_TO_TOP },\n '┍': { [Style.NORMAL]: Shapes.MIDDLE_TO_BOTTOM, [Style.BOLD]: Shapes.MIDDLE_TO_RIGHT },\n '┎': { [Style.NORMAL]: Shapes.MIDDLE_TO_RIGHT, [Style.BOLD]: Shapes.MIDDLE_TO_BOTTOM },\n '┑': { [Style.NORMAL]: Shapes.MIDDLE_TO_BOTTOM, [Style.BOLD]: Shapes.MIDDLE_TO_LEFT },\n '┒': { [Style.NORMAL]: Shapes.MIDDLE_TO_LEFT, [Style.BOLD]: Shapes.MIDDLE_TO_BOTTOM },\n '┕': { [Style.NORMAL]: Shapes.MIDDLE_TO_TOP, [Style.BOLD]: Shapes.MIDDLE_TO_RIGHT },\n '┖': { [Style.NORMAL]: Shapes.MIDDLE_TO_RIGHT, [Style.BOLD]: Shapes.MIDDLE_TO_TOP },\n '┙': { [Style.NORMAL]: Shapes.MIDDLE_TO_TOP, [Style.BOLD]: Shapes.MIDDLE_TO_LEFT },\n '┚': { [Style.NORMAL]: Shapes.MIDDLE_TO_LEFT, [Style.BOLD]: Shapes.MIDDLE_TO_TOP },\n '┝': { [Style.NORMAL]: Shapes.TOP_TO_BOTTOM, [Style.BOLD]: Shapes.MIDDLE_TO_RIGHT },\n '┞': { [Style.NORMAL]: Shapes.RIGHT_TO_BOTTOM, [Style.BOLD]: Shapes.MIDDLE_TO_TOP },\n '┟': { [Style.NORMAL]: Shapes.TOP_TO_RIGHT, [Style.BOLD]: Shapes.MIDDLE_TO_BOTTOM },\n '┠': { [Style.NORMAL]: Shapes.MIDDLE_TO_RIGHT, [Style.BOLD]: Shapes.TOP_TO_BOTTOM },\n '┡': { [Style.NORMAL]: Shapes.MIDDLE_TO_BOTTOM, [Style.BOLD]: Shapes.TOP_TO_RIGHT },\n '┢': { [Style.NORMAL]: Shapes.MIDDLE_TO_TOP, [Style.BOLD]: Shapes.RIGHT_TO_BOTTOM },\n '┥': { [Style.NORMAL]: Shapes.TOP_TO_BOTTOM, [Style.BOLD]: Shapes.MIDDLE_TO_LEFT },\n '┦': { [Style.NORMAL]: Shapes.LEFT_TO_BOTTOM, [Style.BOLD]: Shapes.MIDDLE_TO_TOP },\n '┧': { [Style.NORMAL]: Shapes.TOP_TO_LEFT, [Style.BOLD]: Shapes.MIDDLE_TO_BOTTOM },\n '┨': { [Style.NORMAL]: Shapes.MIDDLE_TO_LEFT, [Style.BOLD]: Shapes.TOP_TO_BOTTOM },\n '┩': { [Style.NORMAL]: Shapes.MIDDLE_TO_BOTTOM, [Style.BOLD]: Shapes.TOP_TO_LEFT },\n '┪': { [Style.NORMAL]: Shapes.MIDDLE_TO_TOP, [Style.BOLD]: Shapes.LEFT_TO_BOTTOM },\n '┭': { [Style.NORMAL]: Shapes.RIGHT_TO_BOTTOM, [Style.BOLD]: Shapes.MIDDLE_TO_LEFT },\n '┮': { [Style.NORMAL]: Shapes.LEFT_TO_BOTTOM, [Style.BOLD]: Shapes.MIDDLE_TO_RIGHT },\n '┯': { [Style.NORMAL]: Shapes.MIDDLE_TO_BOTTOM, [Style.BOLD]: Shapes.LEFT_TO_RIGHT },\n '┰': { [Style.NORMAL]: Shapes.LEFT_TO_RIGHT, [Style.BOLD]: Shapes.MIDDLE_TO_BOTTOM },\n '┱': { [Style.NORMAL]: Shapes.MIDDLE_TO_RIGHT, [Style.BOLD]: Shapes.LEFT_TO_BOTTOM },\n '┲': { [Style.NORMAL]: Shapes.MIDDLE_TO_LEFT, [Style.BOLD]: Shapes.RIGHT_TO_BOTTOM },\n '┵': { [Style.NORMAL]: Shapes.TOP_TO_RIGHT, [Style.BOLD]: Shapes.MIDDLE_TO_LEFT },\n '┶': { [Style.NORMAL]: Shapes.TOP_TO_LEFT, [Style.BOLD]: Shapes.MIDDLE_TO_RIGHT },\n '┷': { [Style.NORMAL]: Shapes.MIDDLE_TO_TOP, [Style.BOLD]: Shapes.LEFT_TO_RIGHT },\n '┸': { [Style.NORMAL]: Shapes.LEFT_TO_RIGHT, [Style.BOLD]: Shapes.MIDDLE_TO_TOP },\n '┹': { [Style.NORMAL]: Shapes.MIDDLE_TO_RIGHT, [Style.BOLD]: Shapes.TOP_TO_LEFT },\n '┺': { [Style.NORMAL]: Shapes.MIDDLE_TO_LEFT, [Style.BOLD]: Shapes.TOP_TO_RIGHT },\n '┽': { [Style.NORMAL]: `${Shapes.TOP_TO_BOTTOM} ${Shapes.MIDDLE_TO_RIGHT}`, [Style.BOLD]: Shapes.MIDDLE_TO_LEFT },\n '┾': { [Style.NORMAL]: `${Shapes.TOP_TO_BOTTOM} ${Shapes.MIDDLE_TO_LEFT}`, [Style.BOLD]: Shapes.MIDDLE_TO_RIGHT },\n '┿': { [Style.NORMAL]: Shapes.TOP_TO_BOTTOM, [Style.BOLD]: Shapes.LEFT_TO_RIGHT },\n '╀': { [Style.NORMAL]: `${Shapes.LEFT_TO_RIGHT} ${Shapes.MIDDLE_TO_BOTTOM}`, [Style.BOLD]: Shapes.MIDDLE_TO_TOP },\n '╁': { [Style.NORMAL]: `${Shapes.MIDDLE_TO_TOP} ${Shapes.LEFT_TO_RIGHT}`, [Style.BOLD]: Shapes.MIDDLE_TO_BOTTOM },\n '╂': { [Style.NORMAL]: Shapes.LEFT_TO_RIGHT, [Style.BOLD]: Shapes.TOP_TO_BOTTOM },\n '╃': { [Style.NORMAL]: Shapes.RIGHT_TO_BOTTOM, [Style.BOLD]: Shapes.TOP_TO_LEFT },\n '╄': { [Style.NORMAL]: Shapes.LEFT_TO_BOTTOM, [Style.BOLD]: Shapes.TOP_TO_RIGHT },\n '╅': { [Style.NORMAL]: Shapes.TOP_TO_RIGHT, [Style.BOLD]: Shapes.LEFT_TO_BOTTOM },\n '╆': { [Style.NORMAL]: Shapes.TOP_TO_LEFT, [Style.BOLD]: Shapes.RIGHT_TO_BOTTOM },\n '╇': { [Style.NORMAL]: Shapes.MIDDLE_TO_BOTTOM, [Style.BOLD]: `${Shapes.MIDDLE_TO_TOP} ${Shapes.LEFT_TO_RIGHT}` },\n '╈': { [Style.NORMAL]: Shapes.MIDDLE_TO_TOP, [Style.BOLD]: `${Shapes.LEFT_TO_RIGHT} ${Shapes.MIDDLE_TO_BOTTOM}` },\n '╉': { [Style.NORMAL]: Shapes.MIDDLE_TO_RIGHT, [Style.BOLD]: `${Shapes.TOP_TO_BOTTOM} ${Shapes.MIDDLE_TO_LEFT}` },\n '╊': { [Style.NORMAL]: Shapes.MIDDLE_TO_LEFT, [Style.BOLD]: `${Shapes.TOP_TO_BOTTOM} ${Shapes.MIDDLE_TO_RIGHT}` },\n\n // Dashed\n '╌': { [Style.NORMAL]: Shapes.TWO_DASHES_HORIZONTAL },\n '╍': { [Style.BOLD]: Shapes.TWO_DASHES_HORIZONTAL },\n '┄': { [Style.NORMAL]: Shapes.THREE_DASHES_HORIZONTAL },\n '┅': { [Style.BOLD]: Shapes.THREE_DASHES_HORIZONTAL },\n '┈': { [Style.NORMAL]: Shapes.FOUR_DASHES_HORIZONTAL },\n '┉': { [Style.BOLD]: Shapes.FOUR_DASHES_HORIZONTAL },\n '╎': { [Style.NORMAL]: Shapes.TWO_DASHES_VERTICAL },\n '╏': { [Style.BOLD]: Shapes.TWO_DASHES_VERTICAL },\n '┆': { [Style.NORMAL]: Shapes.THREE_DASHES_VERTICAL },\n '┇': { [Style.BOLD]: Shapes.THREE_DASHES_VERTICAL },\n '┊': { [Style.NORMAL]: Shapes.FOUR_DASHES_VERTICAL },\n '┋': { [Style.BOLD]: Shapes.FOUR_DASHES_VERTICAL },\n\n // Curved\n '╭': { [Style.NORMAL]: 'C.5,1,.5,.5,1,.5' },\n '╮': { [Style.NORMAL]: 'C.5,1,.5,.5,0,.5' },\n '╯': { [Style.NORMAL]: 'C.5,0,.5,.5,0,.5' },\n '╰': { [Style.NORMAL]: 'C.5,0,.5,.5,1,.5' }\n};\n\ninterface IVectorShape {\n d: string;\n type: VectorType;\n /** Padding to apply to the vector's x axis in CSS pixels. */\n horizontalPadding?: number;\n}\n\nconst enum VectorType {\n FILL,\n STROKE\n}\n\n/**\n * This contains the definitions of the primarily used box drawing characters as vector shapes. The\n * reason these characters are defined specially is to avoid common problems if a user's font has\n * not been patched with powerline characters and also to get pixel perfect rendering as rendering\n * issues can occur around AA/SPAA.\n *\n * Original symbols defined in https://github.com/powerline/fontpatcher\n */\nexport const powerlineDefinitions: { [index: string]: IVectorShape } = {\n // Right triangle solid\n '\\u{E0B0}': { d: 'M0,0 L1,.5 L0,1', type: VectorType.FILL },\n // Right triangle line\n '\\u{E0B1}': { d: 'M0,0 L1,.5 L0,1', type: VectorType.STROKE, horizontalPadding: 0.5 },\n // Left triangle solid\n '\\u{E0B2}': { d: 'M1,0 L0,.5 L1,1', type: VectorType.FILL },\n // Left triangle line\n '\\u{E0B3}': { d: 'M1,0 L0,.5 L1,1', type: VectorType.STROKE, horizontalPadding: 0.5 }\n};\n\n/**\n * Try drawing a custom block element or box drawing character, returning whether it was\n * successfully drawn.\n */\nexport function tryDrawCustomChar(\n ctx: CanvasRenderingContext2D,\n c: string,\n xOffset: number,\n yOffset: number,\n scaledCellWidth: number,\n scaledCellHeight: number\n): boolean {\n const blockElementDefinition = blockElementDefinitions[c];\n if (blockElementDefinition) {\n drawBlockElementChar(ctx, blockElementDefinition, xOffset, yOffset, scaledCellWidth, scaledCellHeight);\n return true;\n }\n\n const patternDefinition = patternCharacterDefinitions[c];\n if (patternDefinition) {\n drawPatternChar(ctx, patternDefinition, xOffset, yOffset, scaledCellWidth, scaledCellHeight);\n return true;\n }\n\n const boxDrawingDefinition = boxDrawingDefinitions[c];\n if (boxDrawingDefinition) {\n drawBoxDrawingChar(ctx, boxDrawingDefinition, xOffset, yOffset, scaledCellWidth, scaledCellHeight);\n return true;\n }\n\n const powerlineDefinition = powerlineDefinitions[c];\n if (powerlineDefinition) {\n drawPowerlineChar(ctx, powerlineDefinition, xOffset, yOffset, scaledCellWidth, scaledCellHeight);\n return true;\n }\n\n return false;\n}\n\nfunction drawBlockElementChar(\n ctx: CanvasRenderingContext2D,\n charDefinition: IBlockVector[],\n xOffset: number,\n yOffset: number,\n scaledCellWidth: number,\n scaledCellHeight: number\n): void {\n for (let i = 0; i < charDefinition.length; i++) {\n const box = charDefinition[i];\n const xEighth = scaledCellWidth / 8;\n const yEighth = scaledCellHeight / 8;\n ctx.fillRect(\n xOffset + box.x * xEighth,\n yOffset + box.y * yEighth,\n box.w * xEighth,\n box.h * yEighth\n );\n }\n}\n\nconst cachedPatterns: Map<PatternDefinition, Map</* fillStyle */string, CanvasPattern>> = new Map();\n\nfunction drawPatternChar(\n ctx: CanvasRenderingContext2D,\n charDefinition: number[][],\n xOffset: number,\n yOffset: number,\n scaledCellWidth: number,\n scaledCellHeight: number\n): void {\n let patternSet = cachedPatterns.get(charDefinition);\n if (!patternSet) {\n patternSet = new Map();\n cachedPatterns.set(charDefinition, patternSet);\n }\n const fillStyle = ctx.fillStyle;\n if (typeof fillStyle !== 'string') {\n throw new Error(`Unexpected fillStyle type \"${fillStyle}\"`);\n }\n let pattern = patternSet.get(fillStyle);\n if (!pattern) {\n const width = charDefinition[0].length;\n const height = charDefinition.length;\n const tmpCanvas = document.createElement('canvas');\n tmpCanvas.width = width;\n tmpCanvas.height = height;\n const tmpCtx = throwIfFalsy(tmpCanvas.getContext('2d'));\n const imageData = new ImageData(width, height);\n\n // Extract rgba from fillStyle\n let r: number;\n let g: number;\n let b: number;\n let a: number;\n if (fillStyle.startsWith('#')) {\n r = parseInt(fillStyle.slice(1, 3), 16);\n g = parseInt(fillStyle.slice(3, 5), 16);\n b = parseInt(fillStyle.slice(5, 7), 16);\n a = fillStyle.length > 7 && parseInt(fillStyle.slice(7, 9), 16) || 1;\n } else if (fillStyle.startsWith('rgba')) {\n ([r, g, b, a] = fillStyle.substring(5, fillStyle.length - 1).split(',').map(e => parseFloat(e)));\n } else {\n throw new Error(`Unexpected fillStyle color format \"${fillStyle}\" when drawing pattern glyph`);\n }\n\n for (let y = 0; y < height; y++) {\n for (let x = 0; x < width; x++) {\n imageData.data[(y * width + x) * 4 ] = r;\n imageData.data[(y * width + x) * 4 + 1] = g;\n imageData.data[(y * width + x) * 4 + 2] = b;\n imageData.data[(y * width + x) * 4 + 3] = charDefinition[y][x] * (a * 255);\n }\n }\n tmpCtx.putImageData(imageData, 0, 0);\n pattern = throwIfFalsy(ctx.createPattern(tmpCanvas, null));\n patternSet.set(fillStyle, pattern);\n }\n ctx.fillStyle = pattern;\n ctx.fillRect(xOffset, yOffset, scaledCellWidth, scaledCellHeight);\n}\n\n/**\n * Draws the following box drawing characters by mapping a subset of SVG d attribute instructions to\n * canvas draw calls.\n *\n * Box styles: ┎┰┒┍┯┑╓╥╖╒╤╕ ┏┳┓┌┲┓┌┬┐┏┱┐\n * ┌─┬─┐ ┏━┳━┓ ╔═╦═╗ ┠╂┨┝┿┥╟╫╢╞╪╡ ┡╇┩├╊┫┢╈┪┣╉┤\n * │ │ │ ┃ ┃ ┃ ║ ║ ║ ┖┸┚┕┷┙╙╨╜╘╧╛ └┴┘└┺┛┗┻┛┗┹┘\n * ├─┼─┤ ┣━╋━┫ ╠═╬═╣ ┏┱┐┌┲┓┌┬┐┌┬┐ ┏┳┓┌┮┓┌┬┐┏┭┐\n * │ │ │ ┃ ┃ ┃ ║ ║ ║ ┡╃┤├╄┩├╆┪┢╅┤ ┞╀┦├┾┫┟╁┧┣┽┤\n * └─┴─┘ ┗━┻━┛ ╚═╩═╝ └┴┘└┴┘└┺┛┗┹┘ └┴┘└┶┛┗┻┛┗┵┘\n *\n * Other:\n * ╭─╮ ╲ ╱ ╷╻╎╏┆┇┊┋ ╺╾╴ ╌╌╌ ┄┄┄ ┈┈┈\n * │ │ ╳ ╽╿╎╏┆┇┊┋ ╶╼╸ ╍╍╍ ┅┅┅ ┉┉┉\n * ╰─╯ ╱ ╲ ╹╵╎╏┆┇┊┋\n *\n * All box drawing characters:\n * ─ ━ │ ┃ ┄ ┅ ┆ ┇ ┈ ┉ ┊ ┋ ┌ ┍ ┎ ┏\n * ┐ ┑ ┒ ┓ └ ┕ ┖ ┗ ┘ ┙ ┚ ┛ ├ ┝ ┞ ┟\n * ┠ ┡ ┢ ┣ ┤ ┥ ┦ ┧ ┨ ┩ ┪ ┫ ┬ ┭ ┮ ┯\n * ┰ ┱ ┲ ┳ ┴ ┵ ┶ ┷ ┸ ┹ ┺ ┻ ┼ ┽ ┾ ┿\n * ╀ ╁ ╂ ╃ ╄ ╅ ╆ ╇ ╈ ╉ ╊ ╋ ╌ ╍ ╎ ╏\n * ═ ║ ╒ ╓ ╔ ╕ ╖ ╗ ╘ ╙ ╚ ╛ ╜ ╝ ╞ ╟\n * ╠ ╡ ╢ ╣ ╤ ╥ ╦ ╧ ╨ ╩ ╪ ╫ ╬ ╭ ╮ ╯\n * ╰ ╱ ╲ ╳ ╴ ╵ ╶ ╷ ╸ ╹ ╺ ╻ ╼ ╽ ╾ ╿\n *\n * ---\n *\n * Box drawing alignment tests: █\n * ▉\n * ╔══╦══╗ ┌──┬──┐ ╭──┬──╮ ╭──┬──╮ ┏━━┳━━┓ ┎┒┏┑ ╷ ╻ ┏┯┓ ┌┰┐ ▊ ╱╲╱╲╳╳╳\n * ║┌─╨─┐║ │╔═╧═╗│ │╒═╪═╕│ │╓─╁─╖│ ┃┌─╂─┐┃ ┗╃╄┙ ╶┼╴╺╋╸┠┼┨ ┝╋┥ ▋ ╲╱╲╱╳╳╳\n * ║│╲ ╱│║ │║ ║│ ││ │ ││ │║ ┃ ║│ ┃│ ╿ │┃ ┍╅╆┓ ╵ ╹ ┗┷┛ └┸┘ ▌ ╱╲╱╲╳╳╳\n * ╠╡ ╳ ╞╣ ├╢ ╟┤ ├┼─┼─┼┤ ├╫─╂─╫┤ ┣┿╾┼╼┿┫ ┕┛┖┚ ┌┄┄┐ ╎ ┏┅┅┓ ┋ ▍ ╲╱╲╱╳╳╳\n * ║│╱ ╲│║ │║ ║│ ││ │ ││ │║ ┃ ║│ ┃│ ╽ │┃ ░░▒▒▓▓██ ┊ ┆ ╎ ╏ ┇ ┋ ▎\n * ║└─╥─┘║ │╚═╤═╝│ │╘═╪═╛│ │╙─╀─╜│ ┃└─╂─┘┃ ░░▒▒▓▓██ ┊ ┆ ╎ ╏ ┇ ┋ ▏\n * ╚══╩══╝ └──┴──┘ ╰──┴──╯ ╰──┴──╯ ┗━━┻━━┛ └╌╌┘ ╎ ┗╍╍┛ ┋ ▁▂▃▄▅▆▇█\n *\n * Source: https://www.w3.org/2001/06/utf-8-test/UTF-8-demo.html\n */\nfunction drawBoxDrawingChar(\n ctx: CanvasRenderingContext2D,\n charDefinition: { [fontWeight: number]: string | ((xp: number, yp: number) => string) },\n xOffset: number,\n yOffset: number,\n scaledCellWidth: number,\n scaledCellHeight: number\n): void {\n ctx.strokeStyle = ctx.fillStyle;\n for (const [fontWeight, instructions] of Object.entries(charDefinition)) {\n ctx.beginPath();\n ctx.lineWidth = window.devicePixelRatio * Number.parseInt(fontWeight);\n let actualInstructions: string;\n if (typeof instructions === 'function') {\n const xp = .15;\n const yp = .15 / scaledCellHeight * scaledCellWidth;\n actualInstructions = instructions(xp, yp);\n } else {\n actualInstructions = instructions;\n }\n for (const instruction of actualInstructions.split(' ')) {\n const type = instruction[0];\n const f = svgToCanvasInstructionMap[type];\n if (!f) {\n console.error(`Could not find drawing instructions for \"${type}\"`);\n continue;\n }\n const args: string[] = instruction.substring(1).split(',');\n if (!args[0] || !args[1]) {\n continue;\n }\n f(ctx, translateArgs(args, scaledCellWidth, scaledCellHeight, xOffset, yOffset));\n }\n ctx.stroke();\n ctx.closePath();\n }\n}\n\nfunction drawPowerlineChar(\n ctx: CanvasRenderingContext2D,\n charDefinition: IVectorShape,\n xOffset: number,\n yOffset: number,\n scaledCellWidth: number,\n scaledCellHeight: number\n): void {\n ctx.beginPath();\n ctx.lineWidth = window.devicePixelRatio;\n for (const instruction of charDefinition.d.split(' ')) {\n const type = instruction[0];\n const f = svgToCanvasInstructionMap[type];\n if (!f) {\n console.error(`Could not find drawing instructions for \"${type}\"`);\n continue;\n }\n const args: string[] = instruction.substring(1).split(',');\n if (!args[0] || !args[1]) {\n continue;\n }\n f(ctx, translateArgs(args, scaledCellWidth, scaledCellHeight, xOffset, yOffset, charDefinition.horizontalPadding));\n }\n if (charDefinition.type === VectorType.STROKE) {\n ctx.strokeStyle = ctx.fillStyle;\n ctx.stroke();\n } else {\n ctx.fill();\n }\n ctx.closePath();\n}\n\nfunction clamp(value: number, max: number, min: number = 0): number {\n return Math.max(Math.min(value, max), min);\n}\n\nconst svgToCanvasInstructionMap: { [index: string]: any } = {\n 'C': (ctx: CanvasRenderingContext2D, args: number[]) => ctx.bezierCurveTo(args[0], args[1], args[2], args[3], args[4], args[5]),\n 'L': (ctx: CanvasRenderingContext2D, args: number[]) => ctx.lineTo(args[0], args[1]),\n 'M': (ctx: CanvasRenderingContext2D, args: number[]) => ctx.moveTo(args[0], args[1])\n};\n\nfunction translateArgs(args: string[], cellWidth: number, cellHeight: number, xOffset: number, yOffset: number, horizontalPadding: number = 0): number[] {\n const result = args.map(e => parseFloat(e) || parseInt(e));\n\n if (result.length < 2) {\n throw new Error('Too few arguments for instruction');\n }\n\n for (let x = 0; x < result.length; x += 2) {\n // Translate from 0-1 to 0-cellWidth\n result[x] *= cellWidth - (horizontalPadding * 2 * window.devicePixelRatio);\n // Ensure coordinate doesn't escape cell bounds and round to the nearest 0.5 to ensure a crisp\n // line at 100% devicePixelRatio\n if (result[x] !== 0) {\n result[x] = clamp(Math.round(result[x] + 0.5) - 0.5, cellWidth, 0);\n }\n // Apply the cell's offset (ie. x*cellWidth)\n result[x] += xOffset + (horizontalPadding * window.devicePixelRatio);\n }\n\n for (let y = 1; y < result.length; y += 2) {\n // Translate from 0-1 to 0-cellHeight\n result[y] *= cellHeight;\n // Ensure coordinate doesn't escape cell bounds and round to the nearest 0.5 to ensure a crisp\n // line at 100% devicePixelRatio\n if (result[y] !== 0) {\n result[y] = clamp(Math.round(result[y] + 0.5) - 0.5, cellHeight, 0);\n }\n // Apply the cell's offset (ie. x*cellHeight)\n result[y] += yOffset;\n }\n\n return result;\n}\n","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nexport class GridCache<T> {\n public cache: (T | undefined)[][];\n\n public constructor() {\n this.cache = [];\n }\n\n public resize(width: number, height: number): void {\n for (let x = 0; x < width; x++) {\n if (this.cache.length <= x) {\n this.cache.push([]);\n }\n for (let y = this.cache[x].length; y < height; y++) {\n this.cache[x].push(undefined);\n }\n this.cache[x].length = height;\n }\n this.cache.length = width;\n }\n\n public clear(): void {\n for (let x = 0; x < this.cache.length; x++) {\n for (let y = 0; y < this.cache[x].length; y++) {\n this.cache[x][y] = undefined;\n }\n }\n }\n}\n","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IRenderDimensions } from 'browser/renderer/Types';\nimport { BaseRenderLayer } from './BaseRenderLayer';\nimport { INVERTED_DEFAULT_COLOR } from 'browser/renderer/atlas/Constants';\nimport { is256Color } from 'browser/renderer/atlas/CharAtlasUtils';\nimport { IColorSet, ILinkifierEvent, ILinkifier, ILinkifier2 } from 'browser/Types';\nimport { IBufferService, IDecorationService, IOptionsService } from 'common/services/Services';\n\nexport class LinkRenderLayer extends BaseRenderLayer {\n private _state: ILinkifierEvent | undefined;\n\n constructor(\n container: HTMLElement,\n zIndex: number,\n colors: IColorSet,\n rendererId: number,\n linkifier: ILinkifier,\n linkifier2: ILinkifier2,\n @IBufferService bufferService: IBufferService,\n @IOptionsService optionsService: IOptionsService,\n @IDecorationService decorationService: IDecorationService\n ) {\n super(container, 'link', zIndex, true, colors, rendererId, bufferService, optionsService, decorationService);\n linkifier.onShowLinkUnderline(e => this._onShowLinkUnderline(e));\n linkifier.onHideLinkUnderline(e => this._onHideLinkUnderline(e));\n\n linkifier2.onShowLinkUnderline(e => this._onShowLinkUnderline(e));\n linkifier2.onHideLinkUnderline(e => this._onHideLinkUnderline(e));\n }\n\n public resize(dim: IRenderDimensions): void {\n super.resize(dim);\n // Resizing the canvas discards the contents of the canvas so clear state\n this._state = undefined;\n }\n\n public reset(): void {\n this._clearCurrentLink();\n }\n\n private _clearCurrentLink(): void {\n if (this._state) {\n this._clearCells(this._state.x1, this._state.y1, this._state.cols - this._state.x1, 1);\n const middleRowCount = this._state.y2 - this._state.y1 - 1;\n if (middleRowCount > 0) {\n this._clearCells(0, this._state.y1 + 1, this._state.cols, middleRowCount);\n }\n this._clearCells(0, this._state.y2, this._state.x2, 1);\n this._state = undefined;\n }\n }\n\n private _onShowLinkUnderline(e: ILinkifierEvent): void {\n if (e.fg === INVERTED_DEFAULT_COLOR) {\n this._ctx.fillStyle = this._colors.background.css;\n } else if (e.fg && is256Color(e.fg)) {\n // 256 color support\n this._ctx.fillStyle = this._colors.ansi[e.fg].css;\n } else {\n this._ctx.fillStyle = this._colors.foreground.css;\n }\n\n if (e.y1 === e.y2) {\n // Single line link\n this._fillBottomLineAtCells(e.x1, e.y1, e.x2 - e.x1);\n } else {\n // Multi-line link\n this._fillBottomLineAtCells(e.x1, e.y1, e.cols - e.x1);\n for (let y = e.y1 + 1; y < e.y2; y++) {\n this._fillBottomLineAtCells(0, y, e.cols);\n }\n this._fillBottomLineAtCells(0, e.y2, e.x2);\n }\n this._state = e;\n }\n\n private _onHideLinkUnderline(e: ILinkifierEvent): void {\n this._clearCurrentLink();\n }\n}\n","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { TextRenderLayer } from 'browser/renderer/TextRenderLayer';\nimport { SelectionRenderLayer } from 'browser/renderer/SelectionRenderLayer';\nimport { CursorRenderLayer } from 'browser/renderer/CursorRenderLayer';\nimport { IRenderLayer, IRenderer, IRenderDimensions, IRequestRedrawEvent } from 'browser/renderer/Types';\nimport { LinkRenderLayer } from 'browser/renderer/LinkRenderLayer';\nimport { Disposable } from 'common/Lifecycle';\nimport { IColorSet, ILinkifier, ILinkifier2 } from 'browser/Types';\nimport { ICharSizeService } from 'browser/services/Services';\nimport { IBufferService, IOptionsService, IInstantiationService } from 'common/services/Services';\nimport { removeTerminalFromCache } from 'browser/renderer/atlas/CharAtlasCache';\nimport { EventEmitter, IEvent } from 'common/EventEmitter';\n\nlet nextRendererId = 1;\n\nexport class Renderer extends Disposable implements IRenderer {\n private _id = nextRendererId++;\n\n private _renderLayers: IRenderLayer[];\n private _devicePixelRatio: number;\n\n public dimensions: IRenderDimensions;\n\n private _onRequestRedraw = new EventEmitter<IRequestRedrawEvent>();\n public get onRequestRedraw(): IEvent<IRequestRedrawEvent> { return this._onRequestRedraw.event; }\n\n constructor(\n private _colors: IColorSet,\n private readonly _screenElement: HTMLElement,\n linkifier: ILinkifier,\n linkifier2: ILinkifier2,\n @IInstantiationService instantiationService: IInstantiationService,\n @IBufferService private readonly _bufferService: IBufferService,\n @ICharSizeService private readonly _charSizeService: ICharSizeService,\n @IOptionsService private readonly _optionsService: IOptionsService\n ) {\n super();\n const allowTransparency = this._optionsService.rawOptions.allowTransparency;\n this._renderLayers = [\n instantiationService.createInstance(TextRenderLayer, this._screenElement, 0, this._colors, allowTransparency, this._id),\n instantiationService.createInstance(SelectionRenderLayer, this._screenElement, 1, this._colors, this._id),\n instantiationService.createInstance(LinkRenderLayer, this._screenElement, 2, this._colors, this._id, linkifier, linkifier2),\n instantiationService.createInstance(CursorRenderLayer, this._screenElement, 3, this._colors, this._id, this._onRequestRedraw)\n ];\n this.dimensions = {\n scaledCharWidth: 0,\n scaledCharHeight: 0,\n scaledCellWidth: 0,\n scaledCellHeight: 0,\n scaledCharLeft: 0,\n scaledCharTop: 0,\n scaledCanvasWidth: 0,\n scaledCanvasHeight: 0,\n canvasWidth: 0,\n canvasHeight: 0,\n actualCellWidth: 0,\n actualCellHeight: 0\n };\n this._devicePixelRatio = window.devicePixelRatio;\n this._updateDimensions();\n this.onOptionsChanged();\n }\n\n public dispose(): void {\n for (const l of this._renderLayers) {\n l.dispose();\n }\n super.dispose();\n removeTerminalFromCache(this._id);\n }\n\n public onDevicePixelRatioChange(): void {\n // If the device pixel ratio changed, the char atlas needs to be regenerated\n // and the terminal needs to refreshed\n if (this._devicePixelRatio !== window.devicePixelRatio) {\n this._devicePixelRatio = window.devicePixelRatio;\n this.onResize(this._bufferService.cols, this._bufferService.rows);\n }\n }\n\n public setColors(colors: IColorSet): void {\n this._colors = colors;\n // Clear layers and force a full render\n for (const l of this._renderLayers) {\n l.setColors(this._colors);\n l.reset();\n }\n }\n\n public onResize(cols: number, rows: number): void {\n // Update character and canvas dimensions\n this._updateDimensions();\n\n // Resize all render layers\n for (const l of this._renderLayers) {\n l.resize(this.dimensions);\n }\n\n // Resize the screen\n this._screenElement.style.width = `${this.dimensions.canvasWidth}px`;\n this._screenElement.style.height = `${this.dimensions.canvasHeight}px`;\n }\n\n public onCharSizeChanged(): void {\n this.onResize(this._bufferService.cols, this._bufferService.rows);\n }\n\n public onBlur(): void {\n this._runOperation(l => l.onBlur());\n }\n\n public onFocus(): void {\n this._runOperation(l => l.onFocus());\n }\n\n public onSelectionChanged(start: [number, number] | undefined, end: [number, number] | undefined, columnSelectMode: boolean = false): void {\n this._runOperation(l => l.onSelectionChanged(start, end, columnSelectMode));\n // Selection foreground requires a full re-render\n if (this._colors.selectionForeground) {\n this._onRequestRedraw.fire({ start: 0, end: this._bufferService.rows - 1 });\n }\n }\n\n public onCursorMove(): void {\n this._runOperation(l => l.onCursorMove());\n }\n\n public onOptionsChanged(): void {\n this._runOperation(l => l.onOptionsChanged());\n }\n\n public clear(): void {\n this._runOperation(l => l.reset());\n }\n\n private _runOperation(operation: (layer: IRenderLayer) => void): void {\n for (const l of this._renderLayers) {\n operation(l);\n }\n }\n\n /**\n * Performs the refresh loop callback, calling refresh only if a refresh is\n * necessary before queueing up the next one.\n */\n public renderRows(start: number, end: number): void {\n for (const l of this._renderLayers) {\n l.onGridChanged(start, end);\n }\n }\n\n public clearTextureAtlas(): void {\n for (const layer of this._renderLayers) {\n layer.clearTextureAtlas();\n }\n }\n\n /**\n * Recalculates the character and canvas dimensions.\n */\n private _updateDimensions(): void {\n if (!this._charSizeService.hasValidSize) {\n return;\n }\n\n // Calculate the scaled character width. Width is floored as it must be\n // drawn to an integer grid in order for the CharAtlas \"stamps\" to not be\n // blurry. When text is drawn to the grid not using the CharAtlas, it is\n // clipped to ensure there is no overlap with the next cell.\n this.dimensions.scaledCharWidth = Math.floor(this._charSizeService.width * window.devicePixelRatio);\n\n // Calculate the scaled character height. Height is ceiled in case\n // devicePixelRatio is a floating point number in order to ensure there is\n // enough space to draw the character to the cell.\n this.dimensions.scaledCharHeight = Math.ceil(this._charSizeService.height * window.devicePixelRatio);\n\n // Calculate the scaled cell height, if lineHeight is not 1 then the value\n // will be floored because since lineHeight can never be lower then 1, there\n // is a guarentee that the scaled line height will always be larger than\n // scaled char height.\n this.dimensions.scaledCellHeight = Math.floor(this.dimensions.scaledCharHeight * this._optionsService.rawOptions.lineHeight);\n\n // Calculate the y coordinate within a cell that text should draw from in\n // order to draw in the center of a cell.\n this.dimensions.scaledCharTop = this._optionsService.rawOptions.lineHeight === 1 ? 0 : Math.round((this.dimensions.scaledCellHeight - this.dimensions.scaledCharHeight) / 2);\n\n // Calculate the scaled cell width, taking the letterSpacing into account.\n this.dimensions.scaledCellWidth = this.dimensions.scaledCharWidth + Math.round(this._optionsService.rawOptions.letterSpacing);\n\n // Calculate the x coordinate with a cell that text should draw from in\n // order to draw in the center of a cell.\n this.dimensions.scaledCharLeft = Math.floor(this._optionsService.rawOptions.letterSpacing / 2);\n\n // Recalculate the canvas dimensions; scaled* define the actual number of\n // pixel in the canvas\n this.dimensions.scaledCanvasHeight = this._bufferService.rows * this.dimensions.scaledCellHeight;\n this.dimensions.scaledCanvasWidth = this._bufferService.cols * this.dimensions.scaledCellWidth;\n\n // The the size of the canvas on the page. It's very important that this\n // rounds to nearest integer and not ceils as browsers often set\n // window.devicePixelRatio as something like 1.100000023841858, when it's\n // actually 1.1. Ceiling causes blurriness as the backing canvas image is 1\n // pixel too large for the canvas element size.\n this.dimensions.canvasHeight = Math.round(this.dimensions.scaledCanvasHeight / window.devicePixelRatio);\n this.dimensions.canvasWidth = Math.round(this.dimensions.scaledCanvasWidth / window.devicePixelRatio);\n\n // Get the _actual_ dimensions of an individual cell. This needs to be\n // derived from the canvasWidth/Height calculated above which takes into\n // account window.devicePixelRatio. ICharSizeService.width/height by itself\n // is insufficient when the page is not at 100% zoom level as it's measured\n // in CSS pixels, but the actual char size on the canvas can differ.\n this.dimensions.actualCellHeight = this.dimensions.canvasHeight / this._bufferService.rows;\n this.dimensions.actualCellWidth = this.dimensions.canvasWidth / this._bufferService.cols;\n }\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nexport function throwIfFalsy<T>(value: T | undefined | null): T {\n if (!value) {\n throw new Error('value must not be falsy');\n }\n return value;\n}\n\nexport function isPowerlineGlyph(codepoint: number): boolean {\n // Only return true for Powerline symbols which require\n // different padding and should be excluded from minimum contrast\n // ratio standards\n return 0xE0A4 <= codepoint && codepoint <= 0xE0D6;\n}\n\nfunction isBoxOrBlockGlyph(codepoint: number): boolean {\n return (0x2500 <= codepoint && codepoint <= 0x259F);\n}\n\nexport function excludeFromContrastRatioDemands(codepoint: number): boolean {\n return isPowerlineGlyph(codepoint) || isBoxOrBlockGlyph(codepoint);\n}\n","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IRenderDimensions } from 'browser/renderer/Types';\nimport { BaseRenderLayer } from 'browser/renderer/BaseRenderLayer';\nimport { IColorSet } from 'browser/Types';\nimport { IBufferService, IDecorationService, IOptionsService } from 'common/services/Services';\n\ninterface ISelectionState {\n start?: [number, number];\n end?: [number, number];\n columnSelectMode?: boolean;\n ydisp?: number;\n}\n\nexport class SelectionRenderLayer extends BaseRenderLayer {\n private _state!: ISelectionState;\n\n constructor(\n container: HTMLElement,\n zIndex: number,\n colors: IColorSet,\n rendererId: number,\n @IBufferService bufferService: IBufferService,\n @IOptionsService optionsService: IOptionsService,\n @IDecorationService decorationService: IDecorationService\n ) {\n super(container, 'selection', zIndex, true, colors, rendererId, bufferService, optionsService, decorationService);\n this._clearState();\n }\n\n private _clearState(): void {\n this._state = {\n start: undefined,\n end: undefined,\n columnSelectMode: undefined,\n ydisp: undefined\n };\n }\n\n public resize(dim: IRenderDimensions): void {\n super.resize(dim);\n // Resizing the canvas discards the contents of the canvas so clear state\n this._clearState();\n }\n\n public reset(): void {\n if (this._state.start && this._state.end) {\n this._clearState();\n this._clearAll();\n }\n }\n\n public onSelectionChanged(start: [number, number] | undefined, end: [number, number] | undefined, columnSelectMode: boolean): void {\n super.onSelectionChanged(start, end, columnSelectMode);\n\n // Selection has not changed\n if (!this._didStateChange(start, end, columnSelectMode, this._bufferService.buffer.ydisp)) {\n return;\n }\n\n // Remove all selections\n this._clearAll();\n\n // Selection does not exist\n if (!start || !end) {\n this._clearState();\n return;\n }\n\n // Translate from buffer position to viewport position\n const viewportStartRow = start[1] - this._bufferService.buffer.ydisp;\n const viewportEndRow = end[1] - this._bufferService.buffer.ydisp;\n const viewportCappedStartRow = Math.max(viewportStartRow, 0);\n const viewportCappedEndRow = Math.min(viewportEndRow, this._bufferService.rows - 1);\n\n // No need to draw the selection\n if (viewportCappedStartRow >= this._bufferService.rows || viewportCappedEndRow < 0) {\n this._state.ydisp = this._bufferService.buffer.ydisp;\n return;\n }\n\n this._ctx.fillStyle = this._colors.selectionTransparent.css;\n\n if (columnSelectMode) {\n const startCol = start[0];\n const width = end[0] - startCol;\n const height = viewportCappedEndRow - viewportCappedStartRow + 1;\n this._fillCells(startCol, viewportCappedStartRow, width, height);\n } else {\n // Draw first row\n const startCol = viewportStartRow === viewportCappedStartRow ? start[0] : 0;\n const startRowEndCol = viewportCappedStartRow === viewportEndRow ? end[0] : this._bufferService.cols;\n this._fillCells(startCol, viewportCappedStartRow, startRowEndCol - startCol, 1);\n\n // Draw middle rows\n const middleRowsCount = Math.max(viewportCappedEndRow - viewportCappedStartRow - 1, 0);\n this._fillCells(0, viewportCappedStartRow + 1, this._bufferService.cols, middleRowsCount);\n\n // Draw final row\n if (viewportCappedStartRow !== viewportCappedEndRow) {\n // Only draw viewportEndRow if it's not the same as viewportStartRow\n const endCol = viewportEndRow === viewportCappedEndRow ? end[0] : this._bufferService.cols;\n this._fillCells(0, viewportCappedEndRow, endCol, 1);\n }\n }\n\n // Save state for next render\n this._state.start = [start[0], start[1]];\n this._state.end = [end[0], end[1]];\n this._state.columnSelectMode = columnSelectMode;\n this._state.ydisp = this._bufferService.buffer.ydisp;\n }\n\n private _didStateChange(start: [number, number] | undefined, end: [number, number] | undefined, columnSelectMode: boolean, ydisp: number): boolean {\n return !this._areCoordinatesEqual(start, this._state.start) ||\n !this._areCoordinatesEqual(end, this._state.end) ||\n columnSelectMode !== this._state.columnSelectMode ||\n ydisp !== this._state.ydisp;\n }\n\n private _areCoordinatesEqual(coord1: [number, number] | undefined, coord2: [number, number] | undefined): boolean {\n if (!coord1 || !coord2) {\n return false;\n }\n\n return coord1[0] === coord2[0] && coord1[1] === coord2[1];\n }\n}\n","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IRenderDimensions } from 'browser/renderer/Types';\nimport { CharData, ICellData } from 'common/Types';\nimport { GridCache } from 'browser/renderer/GridCache';\nimport { BaseRenderLayer } from 'browser/renderer/BaseRenderLayer';\nimport { AttributeData } from 'common/buffer/AttributeData';\nimport { NULL_CELL_CODE, Content } from 'common/buffer/Constants';\nimport { IColorSet } from 'browser/Types';\nimport { CellData } from 'common/buffer/CellData';\nimport { IOptionsService, IBufferService, IDecorationService } from 'common/services/Services';\nimport { ICharacterJoinerService } from 'browser/services/Services';\nimport { JoinedCellData } from 'browser/services/CharacterJoinerService';\n\n/**\n * This CharData looks like a null character, which will forc a clear and render\n * when the character changes (a regular space ' ' character may not as it's\n * drawn state is a cleared cell).\n */\n// const OVERLAP_OWNED_CHAR_DATA: CharData = [null, '', 0, -1];\n\nexport class TextRenderLayer extends BaseRenderLayer {\n private _state: GridCache<CharData>;\n private _characterWidth: number = 0;\n private _characterFont: string = '';\n private _characterOverlapCache: { [key: string]: boolean } = {};\n private _workCell = new CellData();\n\n constructor(\n container: HTMLElement,\n zIndex: number,\n colors: IColorSet,\n alpha: boolean,\n rendererId: number,\n @IBufferService bufferService: IBufferService,\n @IOptionsService optionsService: IOptionsService,\n @ICharacterJoinerService private readonly _characterJoinerService: ICharacterJoinerService,\n @IDecorationService decorationService: IDecorationService\n ) {\n super(container, 'text', zIndex, alpha, colors, rendererId, bufferService, optionsService, decorationService);\n this._state = new GridCache<CharData>();\n }\n\n public resize(dim: IRenderDimensions): void {\n super.resize(dim);\n\n // Clear the character width cache if the font or width has changed\n const terminalFont = this._getFont(false, false);\n if (this._characterWidth !== dim.scaledCharWidth || this._characterFont !== terminalFont) {\n this._characterWidth = dim.scaledCharWidth;\n this._characterFont = terminalFont;\n this._characterOverlapCache = {};\n }\n // Resizing the canvas discards the contents of the canvas so clear state\n this._state.clear();\n this._state.resize(this._bufferService.cols, this._bufferService.rows);\n }\n\n public reset(): void {\n this._state.clear();\n this._clearAll();\n }\n\n private _forEachCell(\n firstRow: number,\n lastRow: number,\n callback: (\n cell: ICellData,\n x: number,\n y: number\n ) => void\n ): void {\n for (let y = firstRow; y <= lastRow; y++) {\n const row = y + this._bufferService.buffer.ydisp;\n const line = this._bufferService.buffer.lines.get(row);\n const joinedRanges = this._characterJoinerService.getJoinedCharacters(row);\n for (let x = 0; x < this._bufferService.cols; x++) {\n line!.loadCell(x, this._workCell);\n let cell = this._workCell;\n\n // If true, indicates that the current character(s) to draw were joined.\n let isJoined = false;\n let lastCharX = x;\n\n // The character to the left is a wide character, drawing is owned by\n // the char at x-1\n if (cell.getWidth() === 0) {\n continue;\n }\n\n // Process any joined character ranges as needed. Because of how the\n // ranges are produced, we know that they are valid for the characters\n // and attributes of our input.\n if (joinedRanges.length > 0 && x === joinedRanges[0][0]) {\n isJoined = true;\n const range = joinedRanges.shift()!;\n\n // We already know the exact start and end column of the joined range,\n // so we get the string and width representing it directly\n cell = new JoinedCellData(\n this._workCell,\n line!.translateToString(true, range[0], range[1]),\n range[1] - range[0]\n );\n\n // Skip over the cells occupied by this range in the loop\n lastCharX = range[1] - 1;\n }\n\n // If the character is an overlapping char and the character to the\n // right is a space, take ownership of the cell to the right. We skip\n // this check for joined characters because their rendering likely won't\n // yield the same result as rendering the last character individually.\n if (!isJoined && this._isOverlapping(cell)) {\n // If the character is overlapping, we want to force a re-render on every\n // frame. This is specifically to work around the case where two\n // overlaping chars `a` and `b` are adjacent, the cursor is moved to b and a\n // space is added. Without this, the first half of `b` would never\n // get removed, and `a` would not re-render because it thinks it's\n // already in the correct state.\n // this._state.cache[x][y] = OVERLAP_OWNED_CHAR_DATA;\n if (lastCharX < line!.length - 1 && line!.getCodePoint(lastCharX + 1) === NULL_CELL_CODE) {\n // patch width to 2\n cell.content &= ~Content.WIDTH_MASK;\n cell.content |= 2 << Content.WIDTH_SHIFT;\n // this._clearChar(x + 1, y);\n // The overlapping char's char data will force a clear and render when the\n // overlapping char is no longer to the left of the character and also when\n // the space changes to another character.\n // this._state.cache[x + 1][y] = OVERLAP_OWNED_CHAR_DATA;\n }\n }\n\n callback(\n cell,\n x,\n y\n );\n\n x = lastCharX;\n }\n }\n }\n\n /**\n * Draws the background for a specified range of columns. Tries to batch adjacent cells of the\n * same color together to reduce draw calls.\n */\n private _drawBackground(firstRow: number, lastRow: number): void {\n const ctx = this._ctx;\n const cols = this._bufferService.cols;\n let startX: number = 0;\n let startY: number = 0;\n let prevFillStyle: string | null = null;\n\n ctx.save();\n\n this._forEachCell(firstRow, lastRow, (cell, x, y) => {\n // libvte and xterm both draw the background (but not foreground) of invisible characters,\n // so we should too.\n let nextFillStyle = null; // null represents default background color\n\n if (cell.isInverse()) {\n if (cell.isFgDefault()) {\n nextFillStyle = this._colors.foreground.css;\n } else if (cell.isFgRGB()) {\n nextFillStyle = `rgb(${AttributeData.toColorRGB(cell.getFgColor()).join(',')})`;\n } else {\n nextFillStyle = this._colors.ansi[cell.getFgColor()].css;\n }\n } else if (cell.isBgRGB()) {\n nextFillStyle = `rgb(${AttributeData.toColorRGB(cell.getBgColor()).join(',')})`;\n } else if (cell.isBgPalette()) {\n nextFillStyle = this._colors.ansi[cell.getBgColor()].css;\n }\n\n // Get any decoration foreground/background overrides, this must be fetched before the early\n // exist but applied after inverse\n let isTop = false;\n for (const d of this._decorationService.getDecorationsAtCell(x, this._bufferService.buffer.ydisp + y)) {\n if (d.options.layer !== 'top' && isTop) {\n continue;\n }\n if (d.backgroundColorRGB) {\n nextFillStyle = d.backgroundColorRGB.css;\n }\n isTop = d.options.layer === 'top';\n }\n\n if (prevFillStyle === null) {\n // This is either the first iteration, or the default background was set. Either way, we\n // don't need to draw anything.\n startX = x;\n startY = y;\n }\n\n if (y !== startY) {\n // our row changed, draw the previous row\n ctx.fillStyle = prevFillStyle || '';\n this._fillCells(startX, startY, cols - startX, 1);\n startX = x;\n startY = y;\n } else if (prevFillStyle !== nextFillStyle) {\n // our color changed, draw the previous characters in this row\n ctx.fillStyle = prevFillStyle || '';\n this._fillCells(startX, startY, x - startX, 1);\n startX = x;\n startY = y;\n }\n\n prevFillStyle = nextFillStyle;\n });\n\n // flush the last color we encountered\n if (prevFillStyle !== null) {\n ctx.fillStyle = prevFillStyle;\n this._fillCells(startX, startY, cols - startX, 1);\n }\n\n ctx.restore();\n }\n\n private _drawForeground(firstRow: number, lastRow: number): void {\n this._forEachCell(firstRow, lastRow, (cell, x, y) => {\n if (cell.isInvisible()) {\n return;\n }\n this._drawChars(cell, x, y);\n if (cell.isUnderline() || cell.isStrikethrough()) {\n this._ctx.save();\n\n if (cell.isInverse()) {\n if (cell.isBgDefault()) {\n this._ctx.fillStyle = this._colors.background.css;\n } else if (cell.isBgRGB()) {\n this._ctx.fillStyle = `rgb(${AttributeData.toColorRGB(cell.getBgColor()).join(',')})`;\n } else {\n let bg = cell.getBgColor();\n if (this._optionsService.rawOptions.drawBoldTextInBrightColors && cell.isBold() && bg < 8) {\n bg += 8;\n }\n this._ctx.fillStyle = this._colors.ansi[bg].css;\n }\n } else {\n if (cell.isFgDefault()) {\n this._ctx.fillStyle = this._colors.foreground.css;\n } else if (cell.isFgRGB()) {\n this._ctx.fillStyle = `rgb(${AttributeData.toColorRGB(cell.getFgColor()).join(',')})`;\n } else {\n let fg = cell.getFgColor();\n if (this._optionsService.rawOptions.drawBoldTextInBrightColors && cell.isBold() && fg < 8) {\n fg += 8;\n }\n this._ctx.fillStyle = this._colors.ansi[fg].css;\n }\n }\n\n if (cell.isStrikethrough()) {\n this._fillMiddleLineAtCells(x, y, cell.getWidth());\n }\n if (cell.isUnderline()) {\n this._fillBottomLineAtCells(x, y, cell.getWidth());\n }\n this._ctx.restore();\n }\n });\n }\n\n public onGridChanged(firstRow: number, lastRow: number): void {\n // Resize has not been called yet\n if (this._state.cache.length === 0) {\n return;\n }\n\n if (this._charAtlas) {\n this._charAtlas.beginFrame();\n }\n\n this._clearCells(0, firstRow, this._bufferService.cols, lastRow - firstRow + 1);\n this._drawBackground(firstRow, lastRow);\n this._drawForeground(firstRow, lastRow);\n }\n\n public onOptionsChanged(): void {\n this._setTransparency(this._optionsService.rawOptions.allowTransparency);\n }\n\n /**\n * Whether a character is overlapping to the next cell.\n */\n private _isOverlapping(cell: ICellData): boolean {\n // Only single cell characters can be overlapping, rendering issues can\n // occur without this check\n if (cell.getWidth() !== 1) {\n return false;\n }\n\n // We assume that any ascii character will not overlap\n if (cell.getCode() < 256) {\n return false;\n }\n\n const chars = cell.getChars();\n\n // Deliver from cache if available\n if (this._characterOverlapCache.hasOwnProperty(chars)) {\n return this._characterOverlapCache[chars];\n }\n\n // Setup the font\n this._ctx.save();\n this._ctx.font = this._characterFont;\n\n // Measure the width of the character, but Math.floor it\n // because that is what the renderer does when it calculates\n // the character dimensions we are comparing against\n const overlaps = Math.floor(this._ctx.measureText(chars).width) > this._characterWidth;\n\n // Restore the original context\n this._ctx.restore();\n\n // Cache and return\n this._characterOverlapCache[chars] = overlaps;\n return overlaps;\n }\n\n /**\n * Clear the charcater at the cell specified.\n * @param x The column of the char.\n * @param y The row of the char.\n */\n // private _clearChar(x: number, y: number): void {\n // let colsToClear = 1;\n // // Clear the adjacent character if it was wide\n // const state = this._state.cache[x][y];\n // if (state && state[CHAR_DATA_WIDTH_INDEX] === 2) {\n // colsToClear = 2;\n // }\n // this.clearCells(x, y, colsToClear, 1);\n // }\n}\n","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IGlyphIdentifier } from 'browser/renderer/atlas/Types';\nimport { IDisposable } from 'common/Types';\n\nexport abstract class BaseCharAtlas implements IDisposable {\n private _didWarmUp: boolean = false;\n\n public dispose(): void { }\n\n /**\n * Perform any work needed to warm the cache before it can be used. May be called multiple times.\n * Implement _doWarmUp instead if you only want to get called once.\n */\n public warmUp(): void {\n if (!this._didWarmUp) {\n this._doWarmUp();\n this._didWarmUp = true;\n }\n }\n\n /**\n * Perform any work needed to warm the cache before it can be used. Used by the default\n * implementation of warmUp(), and will only be called once.\n */\n private _doWarmUp(): void { }\n\n public clear(): void { }\n\n /**\n * Called when we start drawing a new frame.\n *\n * TODO: We rely on this getting called by TextRenderLayer. This should really be called by\n * Renderer instead, but we need to make Renderer the source-of-truth for the char atlas, instead\n * of BaseRenderLayer.\n */\n public beginFrame(): void { }\n\n /**\n * May be called before warmUp finishes, however it is okay for the implementation to\n * do nothing and return false in that case.\n *\n * @param ctx Where to draw the character onto.\n * @param glyph Information about what to draw\n * @param x The position on the context to start drawing at\n * @param y The position on the context to start drawing at\n * @returns The success state. True if we drew the character.\n */\n public abstract draw(\n ctx: CanvasRenderingContext2D,\n glyph: IGlyphIdentifier,\n x: number,\n y: number\n ): boolean;\n}\n","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { generateConfig, configEquals } from 'browser/renderer/atlas/CharAtlasUtils';\nimport { BaseCharAtlas } from 'browser/renderer/atlas/BaseCharAtlas';\nimport { DynamicCharAtlas } from 'browser/renderer/atlas/DynamicCharAtlas';\nimport { ICharAtlasConfig } from 'browser/renderer/atlas/Types';\nimport { IColorSet } from 'browser/Types';\nimport { ITerminalOptions } from 'common/services/Services';\n\ninterface ICharAtlasCacheEntry {\n atlas: BaseCharAtlas;\n config: ICharAtlasConfig;\n // N.B. This implementation potentially holds onto copies of the terminal forever, so\n // this may cause memory leaks.\n ownedBy: number[];\n}\n\nconst charAtlasCache: ICharAtlasCacheEntry[] = [];\n\n/**\n * Acquires a char atlas, either generating a new one or returning an existing\n * one that is in use by another terminal.\n */\nexport function acquireCharAtlas(\n options: ITerminalOptions,\n rendererId: number,\n colors: IColorSet,\n scaledCharWidth: number,\n scaledCharHeight: number\n): BaseCharAtlas {\n const newConfig = generateConfig(scaledCharWidth, scaledCharHeight, options, colors);\n\n // Check to see if the renderer already owns this config\n for (let i = 0; i < charAtlasCache.length; i++) {\n const entry = charAtlasCache[i];\n const ownedByIndex = entry.ownedBy.indexOf(rendererId);\n if (ownedByIndex >= 0) {\n if (configEquals(entry.config, newConfig)) {\n return entry.atlas;\n }\n // The configs differ, release the renderer from the entry\n if (entry.ownedBy.length === 1) {\n entry.atlas.dispose();\n charAtlasCache.splice(i, 1);\n } else {\n entry.ownedBy.splice(ownedByIndex, 1);\n }\n break;\n }\n }\n\n // Try match a char atlas from the cache\n for (let i = 0; i < charAtlasCache.length; i++) {\n const entry = charAtlasCache[i];\n if (configEquals(entry.config, newConfig)) {\n // Add the renderer to the cache entry and return\n entry.ownedBy.push(rendererId);\n return entry.atlas;\n }\n }\n\n const newEntry: ICharAtlasCacheEntry = {\n atlas: new DynamicCharAtlas(\n document,\n newConfig\n ),\n config: newConfig,\n ownedBy: [rendererId]\n };\n charAtlasCache.push(newEntry);\n return newEntry.atlas;\n}\n\n/**\n * Removes a terminal reference from the cache, allowing its memory to be freed.\n */\nexport function removeTerminalFromCache(rendererId: number): void {\n for (let i = 0; i < charAtlasCache.length; i++) {\n const index = charAtlasCache[i].ownedBy.indexOf(rendererId);\n if (index !== -1) {\n if (charAtlasCache[i].ownedBy.length === 1) {\n // Remove the cache entry if it's the only renderer\n charAtlasCache[i].atlas.dispose();\n charAtlasCache.splice(i, 1);\n } else {\n // Remove the reference from the cache entry\n charAtlasCache[i].ownedBy.splice(index, 1);\n }\n break;\n }\n }\n}\n","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ICharAtlasConfig } from 'browser/renderer/atlas/Types';\nimport { DEFAULT_COLOR } from 'common/buffer/Constants';\nimport { IColorSet, IPartialColorSet } from 'browser/Types';\nimport { ITerminalOptions } from 'common/services/Services';\n\nexport function generateConfig(scaledCharWidth: number, scaledCharHeight: number, options: ITerminalOptions, colors: IColorSet): ICharAtlasConfig {\n // null out some fields that don't matter\n const clonedColors: IPartialColorSet = {\n foreground: colors.foreground,\n background: colors.background,\n cursor: undefined,\n cursorAccent: undefined,\n selection: undefined,\n ansi: colors.ansi.slice()\n };\n return {\n devicePixelRatio: window.devicePixelRatio,\n scaledCharWidth,\n scaledCharHeight,\n fontFamily: options.fontFamily,\n fontSize: options.fontSize,\n fontWeight: options.fontWeight,\n fontWeightBold: options.fontWeightBold,\n allowTransparency: options.allowTransparency,\n colors: clonedColors\n };\n}\n\nexport function configEquals(a: ICharAtlasConfig, b: ICharAtlasConfig): boolean {\n for (let i = 0; i < a.colors.ansi.length; i++) {\n if (a.colors.ansi[i].rgba !== b.colors.ansi[i].rgba) {\n return false;\n }\n }\n return a.devicePixelRatio === b.devicePixelRatio &&\n a.fontFamily === b.fontFamily &&\n a.fontSize === b.fontSize &&\n a.fontWeight === b.fontWeight &&\n a.fontWeightBold === b.fontWeightBold &&\n a.allowTransparency === b.allowTransparency &&\n a.scaledCharWidth === b.scaledCharWidth &&\n a.scaledCharHeight === b.scaledCharHeight &&\n a.colors.foreground === b.colors.foreground &&\n a.colors.background === b.colors.background;\n}\n\nexport function is256Color(colorCode: number): boolean {\n return colorCode < DEFAULT_COLOR;\n}\n","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { isFirefox, isLegacyEdge } from 'common/Platform';\n\nexport const INVERTED_DEFAULT_COLOR = 257;\nexport const DIM_OPACITY = 0.5;\n// The text baseline is set conditionally by browser. Using 'ideographic' for Firefox or Legacy Edge would\n// result in truncated text (Issue 3353). Using 'bottom' for Chrome would result in slightly\n// unaligned Powerline fonts (PR 3356#issuecomment-850928179).\nexport const TEXT_BASELINE: CanvasTextBaseline = isFirefox || isLegacyEdge ? 'bottom' : 'ideographic';\n\nexport const CHAR_ATLAS_CELL_SPACING = 1;\n","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { DIM_OPACITY, INVERTED_DEFAULT_COLOR, TEXT_BASELINE } from 'browser/renderer/atlas/Constants';\nimport { IGlyphIdentifier, ICharAtlasConfig } from 'browser/renderer/atlas/Types';\nimport { BaseCharAtlas } from 'browser/renderer/atlas/BaseCharAtlas';\nimport { DEFAULT_ANSI_COLORS } from 'browser/ColorManager';\nimport { LRUMap } from 'browser/renderer/atlas/LRUMap';\nimport { isFirefox, isSafari } from 'common/Platform';\nimport { IColor } from 'common/Types';\nimport { throwIfFalsy } from 'browser/renderer/RendererUtils';\nimport { color } from 'common/Color';\n\n// In practice we're probably never going to exhaust a texture this large. For debugging purposes,\n// however, it can be useful to set this to a really tiny value, to verify that LRU eviction works.\nconst TEXTURE_WIDTH = 1024;\nconst TEXTURE_HEIGHT = 1024;\n\nconst TRANSPARENT_COLOR = {\n css: 'rgba(0, 0, 0, 0)',\n rgba: 0\n};\n\n// Drawing to the cache is expensive: If we have to draw more than this number of glyphs to the\n// cache in a single frame, give up on trying to cache anything else, and try to finish the current\n// frame ASAP.\n//\n// This helps to limit the amount of damage a program can do when it would otherwise thrash the\n// cache.\nconst FRAME_CACHE_DRAW_LIMIT = 100;\n\n/**\n * The number of milliseconds to wait before generating the ImageBitmap, this is to debounce/batch\n * the operation as window.createImageBitmap is asynchronous.\n */\nconst GLYPH_BITMAP_COMMIT_DELAY = 100;\n\ninterface IGlyphCacheValue {\n index: number;\n isEmpty: boolean;\n inBitmap: boolean;\n}\n\nexport function getGlyphCacheKey(glyph: IGlyphIdentifier): number {\n // Note that this only returns a valid key when code < 256\n // Layout:\n // 0b00000000000000000000000000000001: italic (1)\n // 0b00000000000000000000000000000010: dim (1)\n // 0b00000000000000000000000000000100: bold (1)\n // 0b00000000000000000000111111111000: fg (9)\n // 0b00000000000111111111000000000000: bg (9)\n // 0b00011111111000000000000000000000: code (8)\n // 0b11100000000000000000000000000000: unused (3)\n return glyph.code << 21 | glyph.bg << 12 | glyph.fg << 3 | (glyph.bold ? 0 : 4) + (glyph.dim ? 0 : 2) + (glyph.italic ? 0 : 1);\n}\n\nexport class DynamicCharAtlas extends BaseCharAtlas {\n // An ordered map that we're using to keep track of where each glyph is in the atlas texture.\n // It's ordered so that we can determine when to remove the old entries.\n private _cacheMap: LRUMap<IGlyphCacheValue>;\n\n // The texture that the atlas is drawn to\n private _cacheCanvas: HTMLCanvasElement;\n private _cacheCtx: CanvasRenderingContext2D;\n\n // A temporary context that glyphs are drawn to before being transfered to the atlas.\n private _tmpCtx: CanvasRenderingContext2D;\n\n // The number of characters stored in the atlas by width/height\n private _width: number;\n private _height: number;\n\n private _drawToCacheCount: number = 0;\n\n // An array of glyph keys that are waiting on the bitmap to be generated.\n private _glyphsWaitingOnBitmap: IGlyphCacheValue[] = [];\n\n // The timeout that is used to batch bitmap generation so it's not requested for every new glyph.\n private _bitmapCommitTimeout: number | null = null;\n\n // The bitmap to draw from, this is much faster on other browsers than others.\n private _bitmap: ImageBitmap | null = null;\n\n constructor(document: Document, private _config: ICharAtlasConfig) {\n super();\n this._cacheCanvas = document.createElement('canvas');\n this._cacheCanvas.width = TEXTURE_WIDTH;\n this._cacheCanvas.height = TEXTURE_HEIGHT;\n // The canvas needs alpha because we use clearColor to convert the background color to alpha.\n // It might also contain some characters with transparent backgrounds if allowTransparency is\n // set.\n this._cacheCtx = throwIfFalsy(this._cacheCanvas.getContext('2d', { alpha: true }));\n\n const tmpCanvas = document.createElement('canvas');\n tmpCanvas.width = this._config.scaledCharWidth;\n tmpCanvas.height = this._config.scaledCharHeight;\n this._tmpCtx = throwIfFalsy(tmpCanvas.getContext('2d', { alpha: this._config.allowTransparency }));\n\n this._width = Math.floor(TEXTURE_WIDTH / this._config.scaledCharWidth);\n this._height = Math.floor(TEXTURE_HEIGHT / this._config.scaledCharHeight);\n const capacity = this._width * this._height;\n this._cacheMap = new LRUMap(capacity);\n this._cacheMap.prealloc(capacity);\n\n // This is useful for debugging\n // document.body.appendChild(this._cacheCanvas);\n }\n\n public dispose(): void {\n if (this._bitmapCommitTimeout !== null) {\n window.clearTimeout(this._bitmapCommitTimeout);\n this._bitmapCommitTimeout = null;\n }\n }\n\n public beginFrame(): void {\n this._drawToCacheCount = 0;\n }\n\n public clear(): void {\n if (this._cacheMap.size > 0) {\n const capacity = this._width * this._height;\n this._cacheMap = new LRUMap(capacity);\n this._cacheMap.prealloc(capacity);\n }\n this._cacheCtx.clearRect(0, 0, TEXTURE_WIDTH, TEXTURE_HEIGHT);\n this._tmpCtx.clearRect(0, 0, this._config.scaledCharWidth, this._config.scaledCharHeight);\n }\n\n public draw(\n ctx: CanvasRenderingContext2D,\n glyph: IGlyphIdentifier,\n x: number,\n y: number\n ): boolean {\n // Space is always an empty cell, special case this as it's so common\n if (glyph.code === 32) {\n return true;\n }\n\n // Exit early for uncachable glyphs\n if (!this._canCache(glyph)) {\n return false;\n }\n\n const glyphKey = getGlyphCacheKey(glyph);\n const cacheValue = this._cacheMap.get(glyphKey);\n if (cacheValue !== null && cacheValue !== undefined) {\n this._drawFromCache(ctx, cacheValue, x, y);\n return true;\n }\n if (this._drawToCacheCount < FRAME_CACHE_DRAW_LIMIT) {\n let index;\n if (this._cacheMap.size < this._cacheMap.capacity) {\n index = this._cacheMap.size;\n } else {\n // we're out of space, so our call to set will delete this item\n index = this._cacheMap.peek()!.index;\n }\n const cacheValue = this._drawToCache(glyph, index);\n this._cacheMap.set(glyphKey, cacheValue);\n this._drawFromCache(ctx, cacheValue, x, y);\n return true;\n }\n return false;\n }\n\n private _canCache(glyph: IGlyphIdentifier): boolean {\n // Only cache ascii and extended characters for now, to be safe. In the future, we could do\n // something more complicated to determine the expected width of a character.\n //\n // If we switch the renderer over to webgl at some point, we may be able to use blending modes\n // to draw overlapping glyphs from the atlas:\n // https://github.com/servo/webrender/issues/464#issuecomment-255632875\n // https://webglfundamentals.org/webgl/lessons/webgl-text-texture.html\n return glyph.code < 256;\n }\n\n private _toCoordinateX(index: number): number {\n return (index % this._width) * this._config.scaledCharWidth;\n }\n\n private _toCoordinateY(index: number): number {\n return Math.floor(index / this._width) * this._config.scaledCharHeight;\n }\n\n private _drawFromCache(\n ctx: CanvasRenderingContext2D,\n cacheValue: IGlyphCacheValue,\n x: number,\n y: number\n ): void {\n // We don't actually need to do anything if this is whitespace.\n if (cacheValue.isEmpty) {\n return;\n }\n const cacheX = this._toCoordinateX(cacheValue.index);\n const cacheY = this._toCoordinateY(cacheValue.index);\n ctx.drawImage(\n cacheValue.inBitmap ? this._bitmap! : this._cacheCanvas,\n cacheX,\n cacheY,\n this._config.scaledCharWidth,\n this._config.scaledCharHeight,\n x,\n y,\n this._config.scaledCharWidth,\n this._config.scaledCharHeight\n );\n }\n\n private _getColorFromAnsiIndex(idx: number): IColor {\n if (idx < this._config.colors.ansi.length) {\n return this._config.colors.ansi[idx];\n }\n return DEFAULT_ANSI_COLORS[idx];\n }\n\n private _getBackgroundColor(glyph: IGlyphIdentifier): IColor {\n if (this._config.allowTransparency) {\n // The background color might have some transparency, so we need to render it as fully\n // transparent in the atlas. Otherwise we'd end up drawing the transparent background twice\n // around the anti-aliased edges of the glyph, and it would look too dark.\n return TRANSPARENT_COLOR;\n }\n if (glyph.bg === INVERTED_DEFAULT_COLOR) {\n return this._config.colors.foreground;\n }\n if (glyph.bg < 256) {\n return this._getColorFromAnsiIndex(glyph.bg);\n }\n return this._config.colors.background;\n }\n\n private _getForegroundColor(glyph: IGlyphIdentifier): IColor {\n if (glyph.fg === INVERTED_DEFAULT_COLOR) {\n return color.opaque(this._config.colors.background);\n }\n if (glyph.fg < 256) {\n // 256 color support\n return this._getColorFromAnsiIndex(glyph.fg);\n }\n return this._config.colors.foreground;\n }\n\n // TODO: We do this (or something similar) in multiple places. We should split this off\n // into a shared function.\n private _drawToCache(glyph: IGlyphIdentifier, index: number): IGlyphCacheValue {\n this._drawToCacheCount++;\n\n this._tmpCtx.save();\n\n // draw the background\n const backgroundColor = this._getBackgroundColor(glyph);\n // Use a 'copy' composite operation to clear any existing glyph out of _tmpCtxWithAlpha, regardless of\n // transparency in backgroundColor\n this._tmpCtx.globalCompositeOperation = 'copy';\n this._tmpCtx.fillStyle = backgroundColor.css;\n this._tmpCtx.fillRect(0, 0, this._config.scaledCharWidth, this._config.scaledCharHeight);\n this._tmpCtx.globalCompositeOperation = 'source-over';\n\n // draw the foreground/glyph\n const fontWeight = glyph.bold ? this._config.fontWeightBold : this._config.fontWeight;\n const fontStyle = glyph.italic ? 'italic' : '';\n this._tmpCtx.font =\n `${fontStyle} ${fontWeight} ${this._config.fontSize * this._config.devicePixelRatio}px ${this._config.fontFamily}`;\n this._tmpCtx.textBaseline = TEXT_BASELINE;\n\n this._tmpCtx.fillStyle = this._getForegroundColor(glyph).css;\n\n // Apply alpha to dim the character\n if (glyph.dim) {\n this._tmpCtx.globalAlpha = DIM_OPACITY;\n }\n // Draw the character\n this._tmpCtx.fillText(glyph.chars, 0, this._config.scaledCharHeight);\n\n // clear the background from the character to avoid issues with drawing over the previous\n // character if it extends past it's bounds\n let imageData = this._tmpCtx.getImageData(\n 0, 0, this._config.scaledCharWidth, this._config.scaledCharHeight\n );\n let isEmpty = false;\n if (!this._config.allowTransparency) {\n isEmpty = clearColor(imageData, backgroundColor);\n }\n\n // If this charcater is underscore and empty, shift it up until it is visible, try for a maximum\n // of 5 pixels.\n if (isEmpty && glyph.chars === '_' && !this._config.allowTransparency) {\n for (let offset = 1; offset <= 5; offset++) {\n // Draw the character\n this._tmpCtx.fillText(glyph.chars, 0, this._config.scaledCharHeight - offset);\n\n // clear the background from the character to avoid issues with drawing over the previous\n // character if it extends past it's bounds\n imageData = this._tmpCtx.getImageData(\n 0, 0, this._config.scaledCharWidth, this._config.scaledCharHeight\n );\n isEmpty = clearColor(imageData, backgroundColor);\n if (!isEmpty) {\n break;\n }\n }\n }\n\n this._tmpCtx.restore();\n\n // copy the data from imageData to _cacheCanvas\n const x = this._toCoordinateX(index);\n const y = this._toCoordinateY(index);\n // putImageData doesn't do any blending, so it will overwrite any existing cache entry for us\n this._cacheCtx.putImageData(imageData, x, y);\n\n // Add the glyph and queue it to the bitmap (if the browser supports it)\n const cacheValue = {\n index,\n isEmpty,\n inBitmap: false\n };\n this._addGlyphToBitmap(cacheValue);\n\n return cacheValue;\n }\n\n private _addGlyphToBitmap(cacheValue: IGlyphCacheValue): void {\n // Support is patchy for createImageBitmap at the moment, pass a canvas back\n // if support is lacking as drawImage works there too. Firefox is also\n // included here as ImageBitmap appears both buggy and has horrible\n // performance (tested on v55).\n if (!('createImageBitmap' in window) || isFirefox || isSafari) {\n return;\n }\n\n // Add the glyph to the queue\n this._glyphsWaitingOnBitmap.push(cacheValue);\n\n // Check if bitmap generation timeout already exists\n if (this._bitmapCommitTimeout !== null) {\n return;\n }\n\n this._bitmapCommitTimeout = window.setTimeout(() => this._generateBitmap(), GLYPH_BITMAP_COMMIT_DELAY);\n }\n\n private _generateBitmap(): void {\n const glyphsMovingToBitmap = this._glyphsWaitingOnBitmap;\n this._glyphsWaitingOnBitmap = [];\n window.createImageBitmap(this._cacheCanvas).then(bitmap => {\n // Set bitmap\n this._bitmap = bitmap;\n\n // Mark all new glyphs as in bitmap, excluding glyphs that came in after\n // the bitmap was requested\n for (let i = 0; i < glyphsMovingToBitmap.length; i++) {\n const value = glyphsMovingToBitmap[i];\n // It doesn't matter if the value was already evicted, it will be\n // released from memory after this block if so.\n value.inBitmap = true;\n }\n });\n this._bitmapCommitTimeout = null;\n }\n}\n\n// This is used for debugging the renderer, just swap out `new DynamicCharAtlas` with\n// `new NoneCharAtlas`.\nexport class NoneCharAtlas extends BaseCharAtlas {\n constructor(document: Document, config: ICharAtlasConfig) {\n super();\n }\n\n public draw(\n ctx: CanvasRenderingContext2D,\n glyph: IGlyphIdentifier,\n x: number,\n y: number\n ): boolean {\n return false;\n }\n}\n\n/**\n * Makes a partiicular rgb color in an ImageData completely transparent.\n * @returns True if the result is \"empty\", meaning all pixels are fully transparent.\n */\nfunction clearColor(imageData: ImageData, color: IColor): boolean {\n let isEmpty = true;\n const r = color.rgba >>> 24;\n const g = color.rgba >>> 16 & 0xFF;\n const b = color.rgba >>> 8 & 0xFF;\n for (let offset = 0; offset < imageData.data.length; offset += 4) {\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 } else {\n isEmpty = false;\n }\n }\n return isEmpty;\n}\n","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\ninterface ILinkedListNode<T> {\n prev: ILinkedListNode<T> | null;\n next: ILinkedListNode<T> | null;\n key: number | null;\n value: T | null;\n}\n\nexport class LRUMap<T> {\n private _map: { [key: number]: ILinkedListNode<T> } = {};\n private _head: ILinkedListNode<T> | null = null;\n private _tail: ILinkedListNode<T> | null = null;\n private _nodePool: ILinkedListNode<T>[] = [];\n public size: number = 0;\n\n constructor(public capacity: number) { }\n\n private _unlinkNode(node: ILinkedListNode<T>): void {\n const prev = node.prev;\n const next = node.next;\n if (node === this._head) {\n this._head = next;\n }\n if (node === this._tail) {\n this._tail = prev;\n }\n if (prev !== null) {\n prev.next = next;\n }\n if (next !== null) {\n next.prev = prev;\n }\n }\n\n private _appendNode(node: ILinkedListNode<T>): void {\n const tail = this._tail;\n if (tail !== null) {\n tail.next = node;\n }\n node.prev = tail;\n node.next = null;\n this._tail = node;\n if (this._head === null) {\n this._head = node;\n }\n }\n\n /**\n * Preallocate a bunch of linked-list nodes. Allocating these nodes ahead of time means that\n * they're more likely to live next to each other in memory, which seems to improve performance.\n *\n * Each empty object only consumes about 60 bytes of memory, so this is pretty cheap, even for\n * large maps.\n */\n public prealloc(count: number): void {\n const nodePool = this._nodePool;\n for (let i = 0; i < count; i++) {\n nodePool.push({\n prev: null,\n next: null,\n key: null,\n value: null\n });\n }\n }\n\n public get(key: number): T | null {\n // This is unsafe: We're assuming our keyspace doesn't overlap with Object.prototype. However,\n // it's faster than calling hasOwnProperty, and in our case, it would never overlap.\n const node = this._map[key];\n if (node !== undefined) {\n this._unlinkNode(node);\n this._appendNode(node);\n return node.value;\n }\n return null;\n }\n\n /**\n * Gets a value from a key without marking it as the most recently used item.\n */\n public peekValue(key: number): T | null {\n const node = this._map[key];\n if (node !== undefined) {\n return node.value;\n }\n return null;\n }\n\n public peek(): T | null {\n const head = this._head;\n return head === null ? null : head.value;\n }\n\n public set(key: number, value: T): void {\n // This is unsafe: See note above.\n let node = this._map[key];\n if (node !== undefined) {\n // already exists, we just need to mutate it and move it to the end of the list\n node = this._map[key];\n this._unlinkNode(node);\n node.value = value;\n } else if (this.size >= this.capacity) {\n // we're out of space: recycle the head node, move it to the tail\n node = this._head!;\n this._unlinkNode(node);\n delete this._map[node.key!];\n node.key = key;\n node.value = value;\n this._map[key] = node;\n } else {\n // make a new element\n const nodePool = this._nodePool;\n if (nodePool.length > 0) {\n // use a preallocated node if we can\n node = nodePool.pop()!;\n node.key = key;\n node.value = value;\n } else {\n node = {\n prev: null,\n next: null,\n key,\n value\n };\n }\n this._map[key] = node;\n this.size++;\n }\n this._appendNode(node);\n }\n}\n","/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IRenderer, IRenderDimensions, IRequestRedrawEvent } from 'browser/renderer/Types';\nimport { BOLD_CLASS, ITALIC_CLASS, CURSOR_CLASS, CURSOR_STYLE_BLOCK_CLASS, CURSOR_BLINK_CLASS, CURSOR_STYLE_BAR_CLASS, CURSOR_STYLE_UNDERLINE_CLASS, DomRendererRowFactory } from 'browser/renderer/dom/DomRendererRowFactory';\nimport { INVERTED_DEFAULT_COLOR } from 'browser/renderer/atlas/Constants';\nimport { Disposable } from 'common/Lifecycle';\nimport { IColorSet, ILinkifierEvent, ILinkifier, ILinkifier2 } from 'browser/Types';\nimport { ICharSizeService } from 'browser/services/Services';\nimport { IOptionsService, IBufferService, IInstantiationService, IDecorationService } from 'common/services/Services';\nimport { EventEmitter, IEvent } from 'common/EventEmitter';\nimport { color } from 'common/Color';\nimport { removeElementFromParent } from 'browser/Dom';\n\nconst TERMINAL_CLASS_PREFIX = 'xterm-dom-renderer-owner-';\nconst ROW_CONTAINER_CLASS = 'xterm-rows';\nconst FG_CLASS_PREFIX = 'xterm-fg-';\nconst BG_CLASS_PREFIX = 'xterm-bg-';\nconst FOCUS_CLASS = 'xterm-focus';\nconst SELECTION_CLASS = 'xterm-selection';\n\nlet nextTerminalId = 1;\n\n/**\n * A fallback renderer for when canvas is slow. This is not meant to be\n * particularly fast or feature complete, more just stable and usable for when\n * canvas is not an option.\n */\nexport class DomRenderer extends Disposable implements IRenderer {\n private _rowFactory: DomRendererRowFactory;\n private _terminalClass: number = nextTerminalId++;\n\n private _themeStyleElement!: HTMLStyleElement;\n private _dimensionsStyleElement!: HTMLStyleElement;\n private _rowContainer: HTMLElement;\n private _rowElements: HTMLElement[] = [];\n private _selectionContainer: HTMLElement;\n\n public dimensions: IRenderDimensions;\n\n public get onRequestRedraw(): IEvent<IRequestRedrawEvent> { return new EventEmitter<IRequestRedrawEvent>().event; }\n\n constructor(\n private _colors: IColorSet,\n private readonly _element: HTMLElement,\n private readonly _screenElement: HTMLElement,\n private readonly _viewportElement: HTMLElement,\n private readonly _linkifier: ILinkifier,\n private readonly _linkifier2: ILinkifier2,\n @IInstantiationService instantiationService: IInstantiationService,\n @ICharSizeService private readonly _charSizeService: ICharSizeService,\n @IOptionsService private readonly _optionsService: IOptionsService,\n @IBufferService private readonly _bufferService: IBufferService\n ) {\n super();\n this._rowContainer = document.createElement('div');\n this._rowContainer.classList.add(ROW_CONTAINER_CLASS);\n this._rowContainer.style.lineHeight = 'normal';\n this._rowContainer.setAttribute('aria-hidden', 'true');\n this._refreshRowElements(this._bufferService.cols, this._bufferService.rows);\n this._selectionContainer = document.createElement('div');\n this._selectionContainer.classList.add(SELECTION_CLASS);\n this._selectionContainer.setAttribute('aria-hidden', 'true');\n\n this.dimensions = {\n scaledCharWidth: 0,\n scaledCharHeight: 0,\n scaledCellWidth: 0,\n scaledCellHeight: 0,\n scaledCharLeft: 0,\n scaledCharTop: 0,\n scaledCanvasWidth: 0,\n scaledCanvasHeight: 0,\n canvasWidth: 0,\n canvasHeight: 0,\n actualCellWidth: 0,\n actualCellHeight: 0\n };\n this._updateDimensions();\n this._injectCss();\n\n this._rowFactory = instantiationService.createInstance(DomRendererRowFactory, document, this._colors);\n\n this._element.classList.add(TERMINAL_CLASS_PREFIX + this._terminalClass);\n this._screenElement.appendChild(this._rowContainer);\n this._screenElement.appendChild(this._selectionContainer);\n\n this.register(this._linkifier.onShowLinkUnderline(e => this._onLinkHover(e)));\n this.register(this._linkifier.onHideLinkUnderline(e => this._onLinkLeave(e)));\n\n this.register(this._linkifier2.onShowLinkUnderline(e => this._onLinkHover(e)));\n this.register(this._linkifier2.onHideLinkUnderline(e => this._onLinkLeave(e)));\n }\n\n public dispose(): void {\n this._element.classList.remove(TERMINAL_CLASS_PREFIX + this._terminalClass);\n\n // Outside influences such as React unmounts may manipulate the DOM before our disposal.\n // https://github.com/xtermjs/xterm.js/issues/2960\n removeElementFromParent(this._rowContainer, this._selectionContainer, this._themeStyleElement, this._dimensionsStyleElement);\n\n super.dispose();\n }\n\n private _updateDimensions(): void {\n this.dimensions.scaledCharWidth = this._charSizeService.width * window.devicePixelRatio;\n this.dimensions.scaledCharHeight = Math.ceil(this._charSizeService.height * window.devicePixelRatio);\n this.dimensions.scaledCellWidth = this.dimensions.scaledCharWidth + Math.round(this._optionsService.rawOptions.letterSpacing);\n this.dimensions.scaledCellHeight = Math.floor(this.dimensions.scaledCharHeight * this._optionsService.rawOptions.lineHeight);\n this.dimensions.scaledCharLeft = 0;\n this.dimensions.scaledCharTop = 0;\n this.dimensions.scaledCanvasWidth = this.dimensions.scaledCellWidth * this._bufferService.cols;\n this.dimensions.scaledCanvasHeight = this.dimensions.scaledCellHeight * this._bufferService.rows;\n this.dimensions.canvasWidth = Math.round(this.dimensions.scaledCanvasWidth / window.devicePixelRatio);\n this.dimensions.canvasHeight = Math.round(this.dimensions.scaledCanvasHeight / window.devicePixelRatio);\n this.dimensions.actualCellWidth = this.dimensions.canvasWidth / this._bufferService.cols;\n this.dimensions.actualCellHeight = this.dimensions.canvasHeight / this._bufferService.rows;\n\n for (const element of this._rowElements) {\n element.style.width = `${this.dimensions.canvasWidth}px`;\n element.style.height = `${this.dimensions.actualCellHeight}px`;\n element.style.lineHeight = `${this.dimensions.actualCellHeight}px`;\n // Make sure rows don't overflow onto following row\n element.style.overflow = 'hidden';\n }\n\n if (!this._dimensionsStyleElement) {\n this._dimensionsStyleElement = document.createElement('style');\n this._screenElement.appendChild(this._dimensionsStyleElement);\n }\n\n const styles =\n `${this._terminalSelector} .${ROW_CONTAINER_CLASS} span {` +\n ` display: inline-block;` +\n ` height: 100%;` +\n ` vertical-align: top;` +\n ` width: ${this.dimensions.actualCellWidth}px` +\n `}`;\n\n this._dimensionsStyleElement.textContent = styles;\n\n this._selectionContainer.style.height = this._viewportElement.style.height;\n this._screenElement.style.width = `${this.dimensions.canvasWidth}px`;\n this._screenElement.style.height = `${this.dimensions.canvasHeight}px`;\n }\n\n public setColors(colors: IColorSet): void {\n this._colors = colors;\n this._injectCss();\n }\n\n private _injectCss(): void {\n if (!this._themeStyleElement) {\n this._themeStyleElement = document.createElement('style');\n this._screenElement.appendChild(this._themeStyleElement);\n }\n\n // Base CSS\n let styles =\n `${this._terminalSelector} .${ROW_CONTAINER_CLASS} {` +\n ` color: ${this._colors.foreground.css};` +\n ` font-family: ${this._optionsService.rawOptions.fontFamily};` +\n ` font-size: ${this._optionsService.rawOptions.fontSize}px;` +\n `}`;\n // Text styles\n styles +=\n `${this._terminalSelector} span:not(.${BOLD_CLASS}) {` +\n ` font-weight: ${this._optionsService.rawOptions.fontWeight};` +\n `}` +\n `${this._terminalSelector} span.${BOLD_CLASS} {` +\n ` font-weight: ${this._optionsService.rawOptions.fontWeightBold};` +\n `}` +\n `${this._terminalSelector} span.${ITALIC_CLASS} {` +\n ` font-style: italic;` +\n `}`;\n // Blink animation\n styles +=\n `@keyframes blink_box_shadow` + `_` + this._terminalClass + ` {` +\n ` 50% {` +\n ` box-shadow: none;` +\n ` }` +\n `}`;\n styles +=\n `@keyframes blink_block` + `_` + this._terminalClass + ` {` +\n ` 0% {` +\n ` background-color: ${this._colors.cursor.css};` +\n ` color: ${this._colors.cursorAccent.css};` +\n ` }` +\n ` 50% {` +\n ` background-color: ${this._colors.cursorAccent.css};` +\n ` color: ${this._colors.cursor.css};` +\n ` }` +\n `}`;\n // Cursor\n styles +=\n `${this._terminalSelector} .${ROW_CONTAINER_CLASS}:not(.${FOCUS_CLASS}) .${CURSOR_CLASS}.${CURSOR_STYLE_BLOCK_CLASS} {` +\n ` outline: 1px solid ${this._colors.cursor.css};` +\n ` outline-offset: -1px;` +\n `}` +\n `${this._terminalSelector} .${ROW_CONTAINER_CLASS}.${FOCUS_CLASS} .${CURSOR_CLASS}.${CURSOR_BLINK_CLASS}:not(.${CURSOR_STYLE_BLOCK_CLASS}) {` +\n ` animation: blink_box_shadow` + `_` + this._terminalClass + ` 1s step-end infinite;` +\n `}` +\n `${this._terminalSelector} .${ROW_CONTAINER_CLASS}.${FOCUS_CLASS} .${CURSOR_CLASS}.${CURSOR_BLINK_CLASS}.${CURSOR_STYLE_BLOCK_CLASS} {` +\n ` animation: blink_block` + `_` + this._terminalClass + ` 1s step-end infinite;` +\n `}` +\n `${this._terminalSelector} .${ROW_CONTAINER_CLASS}.${FOCUS_CLASS} .${CURSOR_CLASS}.${CURSOR_STYLE_BLOCK_CLASS} {` +\n ` background-color: ${this._colors.cursor.css};` +\n ` color: ${this._colors.cursorAccent.css};` +\n `}` +\n `${this._terminalSelector} .${ROW_CONTAINER_CLASS} .${CURSOR_CLASS}.${CURSOR_STYLE_BAR_CLASS} {` +\n ` box-shadow: ${this._optionsService.rawOptions.cursorWidth}px 0 0 ${this._colors.cursor.css} inset;` +\n `}` +\n `${this._terminalSelector} .${ROW_CONTAINER_CLASS} .${CURSOR_CLASS}.${CURSOR_STYLE_UNDERLINE_CLASS} {` +\n ` box-shadow: 0 -1px 0 ${this._colors.cursor.css} inset;` +\n `}`;\n // Selection\n styles +=\n `${this._terminalSelector} .${SELECTION_CLASS} {` +\n ` position: absolute;` +\n ` top: 0;` +\n ` left: 0;` +\n ` z-index: 1;` +\n ` pointer-events: none;` +\n `}` +\n `${this._terminalSelector} .${SELECTION_CLASS} div {` +\n ` position: absolute;` +\n ` background-color: ${this._colors.selectionOpaque.css};` +\n `}`;\n // Colors\n this._colors.ansi.forEach((c, i) => {\n styles +=\n `${this._terminalSelector} .${FG_CLASS_PREFIX}${i} { color: ${c.css}; }` +\n `${this._terminalSelector} .${BG_CLASS_PREFIX}${i} { background-color: ${c.css}; }`;\n });\n styles +=\n `${this._terminalSelector} .${FG_CLASS_PREFIX}${INVERTED_DEFAULT_COLOR} { color: ${color.opaque(this._colors.background).css}; }` +\n `${this._terminalSelector} .${BG_CLASS_PREFIX}${INVERTED_DEFAULT_COLOR} { background-color: ${this._colors.foreground.css}; }`;\n\n this._themeStyleElement.textContent = styles;\n }\n\n public onDevicePixelRatioChange(): void {\n this._updateDimensions();\n }\n\n private _refreshRowElements(cols: number, rows: number): void {\n // Add missing elements\n for (let i = this._rowElements.length; i <= rows; i++) {\n const row = document.createElement('div');\n this._rowContainer.appendChild(row);\n this._rowElements.push(row);\n }\n // Remove excess elements\n while (this._rowElements.length > rows) {\n this._rowContainer.removeChild(this._rowElements.pop()!);\n }\n }\n\n public onResize(cols: number, rows: number): void {\n this._refreshRowElements(cols, rows);\n this._updateDimensions();\n }\n\n public onCharSizeChanged(): void {\n this._updateDimensions();\n }\n\n public onBlur(): void {\n this._rowContainer.classList.remove(FOCUS_CLASS);\n }\n\n public onFocus(): void {\n this._rowContainer.classList.add(FOCUS_CLASS);\n }\n\n public onSelectionChanged(start: [number, number] | undefined, end: [number, number] | undefined, columnSelectMode: boolean): void {\n // Remove all selections\n while (this._selectionContainer.children.length) {\n this._selectionContainer.removeChild(this._selectionContainer.children[0]);\n }\n\n this._rowFactory.onSelectionChanged(start, end, columnSelectMode);\n this.renderRows(0, this._bufferService.rows - 1);\n\n // Selection does not exist\n if (!start || !end) {\n return;\n }\n\n // Translate from buffer position to viewport position\n const viewportStartRow = start[1] - this._bufferService.buffer.ydisp;\n const viewportEndRow = end[1] - this._bufferService.buffer.ydisp;\n const viewportCappedStartRow = Math.max(viewportStartRow, 0);\n const viewportCappedEndRow = Math.min(viewportEndRow, this._bufferService.rows - 1);\n\n // No need to draw the selection\n if (viewportCappedStartRow >= this._bufferService.rows || viewportCappedEndRow < 0) {\n return;\n }\n\n // Create the selections\n const documentFragment = document.createDocumentFragment();\n\n if (columnSelectMode) {\n const isXFlipped = start[0] > end[0];\n documentFragment.appendChild(\n this._createSelectionElement(viewportCappedStartRow, isXFlipped ? end[0] : start[0], isXFlipped ? start[0] : end[0], viewportCappedEndRow - viewportCappedStartRow + 1)\n );\n } else {\n // Draw first row\n const startCol = viewportStartRow === viewportCappedStartRow ? start[0] : 0;\n const endCol = viewportCappedStartRow === viewportEndRow ? end[0] : this._bufferService.cols;\n documentFragment.appendChild(this._createSelectionElement(viewportCappedStartRow, startCol, endCol));\n // Draw middle rows\n const middleRowsCount = viewportCappedEndRow - viewportCappedStartRow - 1;\n documentFragment.appendChild(this._createSelectionElement(viewportCappedStartRow + 1, 0, this._bufferService.cols, middleRowsCount));\n // Draw final row\n if (viewportCappedStartRow !== viewportCappedEndRow) {\n // Only draw viewportEndRow if it's not the same as viewporttartRow\n const endCol = viewportEndRow === viewportCappedEndRow ? end[0] : this._bufferService.cols;\n documentFragment.appendChild(this._createSelectionElement(viewportCappedEndRow, 0, endCol));\n }\n }\n this._selectionContainer.appendChild(documentFragment);\n }\n\n /**\n * Creates a selection element at the specified position.\n * @param row The row of the selection.\n * @param colStart The start column.\n * @param colEnd The end columns.\n */\n private _createSelectionElement(row: number, colStart: number, colEnd: number, rowCount: number = 1): HTMLElement {\n const element = document.createElement('div');\n element.style.height = `${rowCount * this.dimensions.actualCellHeight}px`;\n element.style.top = `${row * this.dimensions.actualCellHeight}px`;\n element.style.left = `${colStart * this.dimensions.actualCellWidth}px`;\n element.style.width = `${this.dimensions.actualCellWidth * (colEnd - colStart)}px`;\n return element;\n }\n\n public onCursorMove(): void {\n // No-op, the cursor is drawn when rows are drawn\n }\n\n public onOptionsChanged(): void {\n // Force a refresh\n this._updateDimensions();\n this._injectCss();\n }\n\n public clear(): void {\n for (const e of this._rowElements) {\n e.innerText = '';\n }\n }\n\n public renderRows(start: number, end: number): void {\n const cursorAbsoluteY = this._bufferService.buffer.ybase + this._bufferService.buffer.y;\n const cursorX = Math.min(this._bufferService.buffer.x, this._bufferService.cols - 1);\n const cursorBlink = this._optionsService.rawOptions.cursorBlink;\n\n for (let y = start; y <= end; y++) {\n const rowElement = this._rowElements[y];\n rowElement.innerText = '';\n const row = y + this._bufferService.buffer.ydisp;\n const lineData = this._bufferService.buffer.lines.get(row);\n const cursorStyle = this._optionsService.rawOptions.cursorStyle;\n rowElement.appendChild(this._rowFactory.createRow(lineData!, row, row === cursorAbsoluteY, cursorStyle, cursorX, cursorBlink, this.dimensions.actualCellWidth, this._bufferService.cols));\n }\n }\n\n private get _terminalSelector(): string {\n return `.${TERMINAL_CLASS_PREFIX}${this._terminalClass}`;\n }\n\n private _onLinkHover(e: ILinkifierEvent): void {\n this._setCellUnderline(e.x1, e.x2, e.y1, e.y2, e.cols, true);\n }\n\n private _onLinkLeave(e: ILinkifierEvent): void {\n this._setCellUnderline(e.x1, e.x2, e.y1, e.y2, e.cols, false);\n }\n\n private _setCellUnderline(x: number, x2: number, y: number, y2: number, cols: number, enabled: boolean): void {\n while (x !== x2 || y !== y2) {\n const row = this._rowElements[y];\n if (!row) {\n return;\n }\n const span = row.children[x] as HTMLElement;\n if (span) {\n span.style.textDecoration = enabled ? 'underline' : 'none';\n }\n if (++x >= cols) {\n x = 0;\n y++;\n }\n }\n }\n}\n","/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IBufferLine, ICellData, IColor } from 'common/Types';\nimport { INVERTED_DEFAULT_COLOR } from 'browser/renderer/atlas/Constants';\nimport { NULL_CELL_CODE, WHITESPACE_CELL_CHAR, Attributes } from 'common/buffer/Constants';\nimport { CellData } from 'common/buffer/CellData';\nimport { IBufferService, ICoreService, IDecorationService, IOptionsService } from 'common/services/Services';\nimport { color, rgba } from 'common/Color';\nimport { IColorSet } from 'browser/Types';\nimport { ICharacterJoinerService, ISelectionService } from 'browser/services/Services';\nimport { JoinedCellData } from 'browser/services/CharacterJoinerService';\nimport { excludeFromContrastRatioDemands } from 'browser/renderer/RendererUtils';\n\nexport const BOLD_CLASS = 'xterm-bold';\nexport const DIM_CLASS = 'xterm-dim';\nexport const ITALIC_CLASS = 'xterm-italic';\nexport const UNDERLINE_CLASS = 'xterm-underline';\nexport const STRIKETHROUGH_CLASS = 'xterm-strikethrough';\nexport const CURSOR_CLASS = 'xterm-cursor';\nexport const CURSOR_BLINK_CLASS = 'xterm-cursor-blink';\nexport const CURSOR_STYLE_BLOCK_CLASS = 'xterm-cursor-block';\nexport const CURSOR_STYLE_BAR_CLASS = 'xterm-cursor-bar';\nexport const CURSOR_STYLE_UNDERLINE_CLASS = 'xterm-cursor-underline';\n\nexport class DomRendererRowFactory {\n private _workCell: CellData = new CellData();\n\n private _selectionStart: [number, number] | undefined;\n private _selectionEnd: [number, number] | undefined;\n private _columnSelectMode: boolean = false;\n\n constructor(\n private readonly _document: Document,\n private _colors: IColorSet,\n @ICharacterJoinerService private readonly _characterJoinerService: ICharacterJoinerService,\n @IOptionsService private readonly _optionsService: IOptionsService,\n @ICoreService private readonly _coreService: ICoreService,\n @IDecorationService private readonly _decorationService: IDecorationService\n ) {\n }\n\n public setColors(colors: IColorSet): void {\n this._colors = colors;\n }\n\n public onSelectionChanged(start: [number, number] | undefined, end: [number, number] | undefined, columnSelectMode: boolean): void {\n this._selectionStart = start;\n this._selectionEnd = end;\n this._columnSelectMode = columnSelectMode;\n }\n\n public createRow(lineData: IBufferLine, row: number, isCursorRow: boolean, cursorStyle: string | undefined, cursorX: number, cursorBlink: boolean, cellWidth: number, cols: number): DocumentFragment {\n const fragment = this._document.createDocumentFragment();\n\n const joinedRanges = this._characterJoinerService.getJoinedCharacters(row);\n // Find the line length first, this prevents the need to output a bunch of\n // empty cells at the end. This cannot easily be integrated into the main\n // loop below because of the colCount feature (which can be removed after we\n // properly support reflow and disallow data to go beyond the right-side of\n // the viewport).\n let lineLength = 0;\n for (let x = Math.min(lineData.length, cols) - 1; x >= 0; x--) {\n if (lineData.loadCell(x, this._workCell).getCode() !== NULL_CELL_CODE || (isCursorRow && x === cursorX)) {\n lineLength = x + 1;\n break;\n }\n }\n\n for (let x = 0; x < lineLength; x++) {\n lineData.loadCell(x, this._workCell);\n let width = this._workCell.getWidth();\n\n // The character to the left is a wide character, drawing is owned by the char at x-1\n if (width === 0) {\n continue;\n }\n\n // If true, indicates that the current character(s) to draw were joined.\n let isJoined = false;\n let lastCharX = x;\n\n // Process any joined character ranges as needed. Because of how the\n // ranges are produced, we know that they are valid for the characters\n // and attributes of our input.\n let cell = this._workCell;\n if (joinedRanges.length > 0 && x === joinedRanges[0][0]) {\n isJoined = true;\n const range = joinedRanges.shift()!;\n\n // We already know the exact start and end column of the joined range,\n // so we get the string and width representing it directly\n cell = new JoinedCellData(\n this._workCell,\n lineData.translateToString(true, range[0], range[1]),\n range[1] - range[0]\n );\n\n // Skip over the cells occupied by this range in the loop\n lastCharX = range[1] - 1;\n\n // Recalculate width\n width = cell.getWidth();\n }\n\n const charElement = this._document.createElement('span');\n if (width > 1) {\n charElement.style.width = `${cellWidth * width}px`;\n }\n\n if (isJoined) {\n // Ligatures in the DOM renderer must use display inline, as they may not show with\n // inline-block if they are outside the bounds of the element\n charElement.style.display = 'inline';\n\n // The DOM renderer colors the background of the cursor but for ligatures all cells are\n // joined. The workaround here is to show a cursor around the whole ligature so it shows up,\n // the cursor looks the same when on any character of the ligature though\n if (cursorX >= x && cursorX <= lastCharX) {\n cursorX = x;\n }\n }\n\n if (!this._coreService.isCursorHidden && isCursorRow && x === cursorX) {\n charElement.classList.add(CURSOR_CLASS);\n\n if (cursorBlink) {\n charElement.classList.add(CURSOR_BLINK_CLASS);\n }\n\n switch (cursorStyle) {\n case 'bar':\n charElement.classList.add(CURSOR_STYLE_BAR_CLASS);\n break;\n case 'underline':\n charElement.classList.add(CURSOR_STYLE_UNDERLINE_CLASS);\n break;\n default:\n charElement.classList.add(CURSOR_STYLE_BLOCK_CLASS);\n break;\n }\n }\n\n if (cell.isBold()) {\n charElement.classList.add(BOLD_CLASS);\n }\n\n if (cell.isItalic()) {\n charElement.classList.add(ITALIC_CLASS);\n }\n\n if (cell.isDim()) {\n charElement.classList.add(DIM_CLASS);\n }\n\n if (cell.isUnderline()) {\n charElement.classList.add(UNDERLINE_CLASS);\n }\n\n if (cell.isInvisible()) {\n charElement.textContent = WHITESPACE_CELL_CHAR;\n } else {\n charElement.textContent = cell.getChars() || WHITESPACE_CELL_CHAR;\n }\n\n if (cell.isStrikethrough()) {\n charElement.classList.add(STRIKETHROUGH_CLASS);\n }\n\n let fg = cell.getFgColor();\n let fgColorMode = cell.getFgColorMode();\n let bg = cell.getBgColor();\n let bgColorMode = cell.getBgColorMode();\n const isInverse = !!cell.isInverse();\n if (isInverse) {\n const temp = fg;\n fg = bg;\n bg = temp;\n const temp2 = fgColorMode;\n fgColorMode = bgColorMode;\n bgColorMode = temp2;\n }\n\n // Apply any decoration foreground/background overrides, this must happen after inverse has\n // been applied\n let bgOverride: IColor | undefined;\n let fgOverride: IColor | undefined;\n let isTop = false;\n for (const d of this._decorationService.getDecorationsAtCell(x, row)) {\n if (d.options.layer !== 'top' && isTop) {\n continue;\n }\n if (d.backgroundColorRGB) {\n bgColorMode = Attributes.CM_RGB;\n bg = d.backgroundColorRGB.rgba >> 8 & 0xFFFFFF;\n bgOverride = d.backgroundColorRGB;\n }\n if (d.foregroundColorRGB) {\n fgColorMode = Attributes.CM_RGB;\n fg = d.foregroundColorRGB.rgba >> 8 & 0xFFFFFF;\n fgOverride = d.foregroundColorRGB;\n }\n isTop = d.options.layer === 'top';\n }\n\n // Apply selection foreground if applicable\n const isInSelection = this._isCellInSelection(x, row);\n if (!isTop) {\n if (this._colors.selectionForeground && isInSelection) {\n fgColorMode = Attributes.CM_RGB;\n fg = this._colors.selectionForeground.rgba >> 8 & 0xFFFFFF;\n fgOverride = this._colors.selectionForeground;\n }\n }\n\n // If in the selection, force the element to be above the selection to improve contrast and\n // support opaque selections\n if (isInSelection) {\n bgOverride = this._colors.selectionOpaque;\n isTop = true;\n }\n\n // If it's a top decoration, render above the selection\n if (isTop) {\n charElement.classList.add(`xterm-decoration-top`);\n }\n\n // Background\n let resolvedBg: IColor;\n switch (bgColorMode) {\n case Attributes.CM_P16:\n case Attributes.CM_P256:\n resolvedBg = this._colors.ansi[bg];\n charElement.classList.add(`xterm-bg-${bg}`);\n break;\n case Attributes.CM_RGB:\n resolvedBg = rgba.toColor(bg >> 16, bg >> 8 & 0xFF, bg & 0xFF);\n this._addStyle(charElement, `background-color:#${padStart((bg >>> 0).toString(16), '0', 6)}`);\n break;\n case Attributes.CM_DEFAULT:\n default:\n if (isInverse) {\n resolvedBg = this._colors.foreground;\n charElement.classList.add(`xterm-bg-${INVERTED_DEFAULT_COLOR}`);\n } else {\n resolvedBg = this._colors.background;\n }\n }\n\n // Foreground\n switch (fgColorMode) {\n case Attributes.CM_P16:\n case Attributes.CM_P256:\n if (cell.isBold() && fg < 8 && this._optionsService.rawOptions.drawBoldTextInBrightColors) {\n fg += 8;\n }\n if (!this._applyMinimumContrast(charElement, resolvedBg, this._colors.ansi[fg], cell, bgOverride, undefined)) {\n charElement.classList.add(`xterm-fg-${fg}`);\n }\n break;\n case Attributes.CM_RGB:\n const color = rgba.toColor(\n (fg >> 16) & 0xFF,\n (fg >> 8) & 0xFF,\n (fg ) & 0xFF\n );\n if (!this._applyMinimumContrast(charElement, resolvedBg, color, cell, bgOverride, fgOverride)) {\n this._addStyle(charElement, `color:#${padStart(fg.toString(16), '0', 6)}`);\n }\n break;\n case Attributes.CM_DEFAULT:\n default:\n if (!this._applyMinimumContrast(charElement, resolvedBg, this._colors.foreground, cell, bgOverride, undefined)) {\n if (isInverse) {\n charElement.classList.add(`xterm-fg-${INVERTED_DEFAULT_COLOR}`);\n }\n }\n }\n\n fragment.appendChild(charElement);\n\n x = lastCharX;\n }\n return fragment;\n }\n\n private _applyMinimumContrast(element: HTMLElement, bg: IColor, fg: IColor, cell: ICellData, bgOverride: IColor | undefined, fgOverride: IColor | undefined): boolean {\n if (this._optionsService.rawOptions.minimumContrastRatio === 1 || excludeFromContrastRatioDemands(cell.getCode())) {\n return false;\n }\n\n // Try get from cache first, only use the cache when there are no decoration overrides\n let adjustedColor: IColor | undefined | null = undefined;\n if (!bgOverride && !fgOverride) {\n adjustedColor = this._colors.contrastCache.getColor(bg.rgba, fg.rgba);\n }\n\n // Calculate and store in cache\n if (adjustedColor === undefined) {\n adjustedColor = color.ensureContrastRatio(bgOverride || bg, fgOverride || fg, this._optionsService.rawOptions.minimumContrastRatio);\n this._colors.contrastCache.setColor((bgOverride || bg).rgba, (fgOverride || fg).rgba, adjustedColor ?? null);\n }\n\n if (adjustedColor) {\n this._addStyle(element, `color:${adjustedColor.css}`);\n return true;\n }\n\n return false;\n }\n\n private _addStyle(element: HTMLElement, style: string): void {\n element.setAttribute('style', `${element.getAttribute('style') || ''}${style};`);\n }\n\n private _isCellInSelection(x: number, y: number): boolean {\n const start = this._selectionStart;\n const end = this._selectionEnd;\n if (!start || !end) {\n return false;\n }\n if (this._columnSelectMode) {\n if (start[0] <= end[0]) {\n return x >= start[0] && y >= start[1] &&\n x < end[0] && y <= end[1];\n }\n return x < start[0] && y >= start[1] &&\n x >= end[0] && y <= end[1];\n }\n return (y > start[1] && y < end[1]) ||\n (start[1] === end[1] && y === start[1] && x >= start[0] && x < end[0]) ||\n (start[1] < end[1] && y === end[1] && x < end[0]) ||\n (start[1] < end[1] && y === start[1] && x >= start[0]);\n }\n}\n\nfunction padStart(text: string, padChar: string, length: number): string {\n while (text.length < length) {\n text = padChar + text;\n }\n return text;\n}\n","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IBufferService } from 'common/services/Services';\n\n/**\n * Represents a selection within the buffer. This model only cares about column\n * and row coordinates, not wide characters.\n */\nexport class SelectionModel {\n /**\n * Whether select all is currently active.\n */\n public isSelectAllActive: boolean = false;\n\n /**\n * The minimal length of the selection from the start position. When double\n * clicking on a word, the word will be selected which makes the selection\n * start at the start of the word and makes this variable the length.\n */\n public selectionStartLength: number = 0;\n\n /**\n * The [x, y] position the selection starts at.\n */\n public selectionStart: [number, number] | undefined;\n\n /**\n * The [x, y] position the selection ends at.\n */\n public selectionEnd: [number, number] | undefined;\n\n constructor(\n private _bufferService: IBufferService\n ) {\n }\n\n /**\n * Clears the current selection.\n */\n public clearSelection(): void {\n this.selectionStart = undefined;\n this.selectionEnd = undefined;\n this.isSelectAllActive = false;\n this.selectionStartLength = 0;\n }\n\n /**\n * The final selection start, taking into consideration select all.\n */\n public get finalSelectionStart(): [number, number] | undefined {\n if (this.isSelectAllActive) {\n return [0, 0];\n }\n\n if (!this.selectionEnd || !this.selectionStart) {\n return this.selectionStart;\n }\n\n return this.areSelectionValuesReversed() ? this.selectionEnd : this.selectionStart;\n }\n\n /**\n * The final selection end, taking into consideration select all, double click\n * word selection and triple click line selection.\n */\n public get finalSelectionEnd(): [number, number] | undefined {\n if (this.isSelectAllActive) {\n return [this._bufferService.cols, this._bufferService.buffer.ybase + this._bufferService.rows - 1];\n }\n\n if (!this.selectionStart) {\n return undefined;\n }\n\n // Use the selection start + length if the end doesn't exist or they're reversed\n if (!this.selectionEnd || this.areSelectionValuesReversed()) {\n const startPlusLength = this.selectionStart[0] + this.selectionStartLength;\n if (startPlusLength > this._bufferService.cols) {\n // Ensure the trailing EOL isn't included when the selection ends on the right edge\n if (startPlusLength % this._bufferService.cols === 0) {\n return [this._bufferService.cols, this.selectionStart[1] + Math.floor(startPlusLength / this._bufferService.cols) - 1];\n }\n return [startPlusLength % this._bufferService.cols, this.selectionStart[1] + Math.floor(startPlusLength / this._bufferService.cols)];\n }\n return [startPlusLength, this.selectionStart[1]];\n }\n\n // Ensure the the word/line is selected after a double/triple click\n if (this.selectionStartLength) {\n // Select the larger of the two when start and end are on the same line\n if (this.selectionEnd[1] === this.selectionStart[1]) {\n // Keep the whole wrapped word/line selected if the content wraps multiple lines\n const startPlusLength = this.selectionStart[0] + this.selectionStartLength;\n if (startPlusLength > this._bufferService.cols) {\n return [startPlusLength % this._bufferService.cols, this.selectionStart[1] + Math.floor(startPlusLength / this._bufferService.cols)];\n }\n return [Math.max(startPlusLength, this.selectionEnd[0]), this.selectionEnd[1]];\n }\n }\n return this.selectionEnd;\n }\n\n /**\n * Returns whether the selection start and end are reversed.\n */\n public areSelectionValuesReversed(): boolean {\n const start = this.selectionStart;\n const end = this.selectionEnd;\n if (!start || !end) {\n return false;\n }\n return start[1] > end[1] || (start[1] === end[1] && start[0] > end[0]);\n }\n\n /**\n * Handle the buffer being trimmed, adjust the selection position.\n * @param amount The amount the buffer is being trimmed.\n * @return Whether a refresh is necessary.\n */\n public onTrim(amount: number): boolean {\n // Adjust the selection position based on the trimmed amount.\n if (this.selectionStart) {\n this.selectionStart[1] -= amount;\n }\n if (this.selectionEnd) {\n this.selectionEnd[1] -= amount;\n }\n\n // The selection has moved off the buffer, clear it.\n if (this.selectionEnd && this.selectionEnd[1] < 0) {\n this.clearSelection();\n return true;\n }\n\n // If the selection start is trimmed, ensure the start column is 0.\n if (this.selectionStart && this.selectionStart[1] < 0) {\n this.selectionStart[1] = 0;\n }\n return false;\n }\n}\n","/**\n * Copyright (c) 2016 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IOptionsService } from 'common/services/Services';\nimport { IEvent, EventEmitter } from 'common/EventEmitter';\nimport { ICharSizeService } from 'browser/services/Services';\n\nexport class CharSizeService implements ICharSizeService {\n public serviceBrand: undefined;\n\n public width: number = 0;\n public height: number = 0;\n private _measureStrategy: IMeasureStrategy;\n\n public get hasValidSize(): boolean { return this.width > 0 && this.height > 0; }\n\n private _onCharSizeChange = new EventEmitter<void>();\n public get onCharSizeChange(): IEvent<void> { return this._onCharSizeChange.event; }\n\n constructor(\n document: Document,\n parentElement: HTMLElement,\n @IOptionsService private readonly _optionsService: IOptionsService\n ) {\n this._measureStrategy = new DomMeasureStrategy(document, parentElement, this._optionsService);\n }\n\n public measure(): void {\n const result = this._measureStrategy.measure();\n if (result.width !== this.width || result.height !== this.height) {\n this.width = result.width;\n this.height = result.height;\n this._onCharSizeChange.fire();\n }\n }\n}\n\ninterface IMeasureStrategy {\n measure(): IReadonlyMeasureResult;\n}\n\ninterface IReadonlyMeasureResult {\n readonly width: number;\n readonly height: number;\n}\n\ninterface IMeasureResult {\n width: number;\n height: number;\n}\n\n// TODO: For supporting browsers we should also provide a CanvasCharDimensionsProvider that uses ctx.measureText\nclass DomMeasureStrategy implements IMeasureStrategy {\n private _result: IMeasureResult = { width: 0, height: 0 };\n private _measureElement: HTMLElement;\n\n constructor(\n private _document: Document,\n private _parentElement: HTMLElement,\n private _optionsService: IOptionsService\n ) {\n this._measureElement = this._document.createElement('span');\n this._measureElement.classList.add('xterm-char-measure-element');\n this._measureElement.textContent = 'W';\n this._measureElement.setAttribute('aria-hidden', 'true');\n this._parentElement.appendChild(this._measureElement);\n }\n\n public measure(): IReadonlyMeasureResult {\n this._measureElement.style.fontFamily = this._optionsService.rawOptions.fontFamily;\n this._measureElement.style.fontSize = `${this._optionsService.rawOptions.fontSize}px`;\n\n // Note that this triggers a synchronous layout\n const geometry = this._measureElement.getBoundingClientRect();\n\n // If values are 0 then the element is likely currently display:none, in which case we should\n // retain the previous value.\n if (geometry.width !== 0 && geometry.height !== 0) {\n this._result.width = geometry.width;\n this._result.height = Math.ceil(geometry.height);\n }\n\n return this._result;\n }\n}\n","/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IBufferLine, ICellData, CharData } from 'common/Types';\nimport { ICharacterJoiner } from 'browser/Types';\nimport { AttributeData } from 'common/buffer/AttributeData';\nimport { WHITESPACE_CELL_CHAR, Content } from 'common/buffer/Constants';\nimport { CellData } from 'common/buffer/CellData';\nimport { IBufferService } from 'common/services/Services';\nimport { ICharacterJoinerService } from 'browser/services/Services';\n\nexport class JoinedCellData extends AttributeData implements ICellData {\n private _width: number;\n // .content carries no meaning for joined CellData, simply nullify it\n // thus we have to overload all other .content accessors\n public content: number = 0;\n public fg: number;\n public bg: number;\n public combinedData: string = '';\n\n constructor(firstCell: ICellData, chars: string, width: number) {\n super();\n this.fg = firstCell.fg;\n this.bg = firstCell.bg;\n this.combinedData = chars;\n this._width = width;\n }\n\n public isCombined(): number {\n // always mark joined cell data as combined\n return Content.IS_COMBINED_MASK;\n }\n\n public getWidth(): number {\n return this._width;\n }\n\n public getChars(): string {\n return this.combinedData;\n }\n\n public getCode(): number {\n // code always gets the highest possible fake codepoint (read as -1)\n // this is needed as code is used by caches as identifier\n return 0x1FFFFF;\n }\n\n public setFromCharData(value: CharData): void {\n throw new Error('not implemented');\n }\n\n public getAsCharData(): CharData {\n return [this.fg, this.getChars(), this.getWidth(), this.getCode()];\n }\n}\n\nexport class CharacterJoinerService implements ICharacterJoinerService {\n public serviceBrand: undefined;\n\n private _characterJoiners: ICharacterJoiner[] = [];\n private _nextCharacterJoinerId: number = 0;\n private _workCell: CellData = new CellData();\n\n constructor(\n @IBufferService private _bufferService: IBufferService\n ) { }\n\n public register(handler: (text: string) => [number, number][]): number {\n const joiner: ICharacterJoiner = {\n id: this._nextCharacterJoinerId++,\n handler\n };\n\n this._characterJoiners.push(joiner);\n return joiner.id;\n }\n\n public deregister(joinerId: number): boolean {\n for (let i = 0; i < this._characterJoiners.length; i++) {\n if (this._characterJoiners[i].id === joinerId) {\n this._characterJoiners.splice(i, 1);\n return true;\n }\n }\n\n return false;\n }\n\n public getJoinedCharacters(row: number): [number, number][] {\n if (this._characterJoiners.length === 0) {\n return [];\n }\n\n const line = this._bufferService.buffer.lines.get(row);\n if (!line || line.length === 0) {\n return [];\n }\n\n const ranges: [number, number][] = [];\n const lineStr = line.translateToString(true);\n\n // Because some cells can be represented by multiple javascript characters,\n // we track the cell and the string indexes separately. This allows us to\n // translate the string ranges we get from the joiners back into cell ranges\n // for use when rendering\n let rangeStartColumn = 0;\n let currentStringIndex = 0;\n let rangeStartStringIndex = 0;\n let rangeAttrFG = line.getFg(0);\n let rangeAttrBG = line.getBg(0);\n\n for (let x = 0; x < line.getTrimmedLength(); x++) {\n line.loadCell(x, this._workCell);\n\n if (this._workCell.getWidth() === 0) {\n // If this character is of width 0, skip it.\n continue;\n }\n\n // End of range\n if (this._workCell.fg !== rangeAttrFG || this._workCell.bg !== rangeAttrBG) {\n // If we ended up with a sequence of more than one character,\n // look for ranges to join.\n if (x - rangeStartColumn > 1) {\n const joinedRanges = this._getJoinedRanges(\n lineStr,\n rangeStartStringIndex,\n currentStringIndex,\n line,\n rangeStartColumn\n );\n for (let i = 0; i < joinedRanges.length; i++) {\n ranges.push(joinedRanges[i]);\n }\n }\n\n // Reset our markers for a new range.\n rangeStartColumn = x;\n rangeStartStringIndex = currentStringIndex;\n rangeAttrFG = this._workCell.fg;\n rangeAttrBG = this._workCell.bg;\n }\n\n currentStringIndex += this._workCell.getChars().length || WHITESPACE_CELL_CHAR.length;\n }\n\n // Process any trailing ranges.\n if (this._bufferService.cols - rangeStartColumn > 1) {\n const joinedRanges = this._getJoinedRanges(\n lineStr,\n rangeStartStringIndex,\n currentStringIndex,\n line,\n rangeStartColumn\n );\n for (let i = 0; i < joinedRanges.length; i++) {\n ranges.push(joinedRanges[i]);\n }\n }\n\n return ranges;\n }\n\n /**\n * Given a segment of a line of text, find all ranges of text that should be\n * joined in a single rendering unit. Ranges are internally converted to\n * column ranges, rather than string ranges.\n * @param line String representation of the full line of text\n * @param startIndex Start position of the range to search in the string (inclusive)\n * @param endIndex End position of the range to search in the string (exclusive)\n */\n private _getJoinedRanges(line: string, startIndex: number, endIndex: number, lineData: IBufferLine, startCol: number): [number, number][] {\n const text = line.substring(startIndex, endIndex);\n // At this point we already know that there is at least one joiner so\n // we can just pull its value and assign it directly rather than\n // merging it into an empty array, which incurs unnecessary writes.\n let allJoinedRanges: [number, number][] = [];\n try {\n allJoinedRanges = this._characterJoiners[0].handler(text);\n } catch (error) {\n console.error(error);\n }\n for (let i = 1; i < this._characterJoiners.length; i++) {\n // We merge any overlapping ranges across the different joiners\n try {\n const joinerRanges = this._characterJoiners[i].handler(text);\n for (let j = 0; j < joinerRanges.length; j++) {\n CharacterJoinerService._mergeRanges(allJoinedRanges, joinerRanges[j]);\n }\n } catch (error) {\n console.error(error);\n }\n }\n this._stringRangesToCellRanges(allJoinedRanges, lineData, startCol);\n return allJoinedRanges;\n }\n\n /**\n * Modifies the provided ranges in-place to adjust for variations between\n * string length and cell width so that the range represents a cell range,\n * rather than the string range the joiner provides.\n * @param ranges String ranges containing start (inclusive) and end (exclusive) index\n * @param line Cell data for the relevant line in the terminal\n * @param startCol Offset within the line to start from\n */\n private _stringRangesToCellRanges(ranges: [number, number][], line: IBufferLine, startCol: number): void {\n let currentRangeIndex = 0;\n let currentRangeStarted = false;\n let currentStringIndex = 0;\n let currentRange = ranges[currentRangeIndex];\n\n // If we got through all of the ranges, stop searching\n if (!currentRange) {\n return;\n }\n\n for (let x = startCol; x < this._bufferService.cols; x++) {\n const width = line.getWidth(x);\n const length = line.getString(x).length || WHITESPACE_CELL_CHAR.length;\n\n // We skip zero-width characters when creating the string to join the text\n // so we do the same here\n if (width === 0) {\n continue;\n }\n\n // Adjust the start of the range\n if (!currentRangeStarted && currentRange[0] <= currentStringIndex) {\n currentRange[0] = x;\n currentRangeStarted = true;\n }\n\n // Adjust the end of the range\n if (currentRange[1] <= currentStringIndex) {\n currentRange[1] = x;\n\n // We're finished with this range, so we move to the next one\n currentRange = ranges[++currentRangeIndex];\n\n // If there are no more ranges left, stop searching\n if (!currentRange) {\n break;\n }\n\n // Ranges can be on adjacent characters. Because the end index of the\n // ranges are exclusive, this means that the index for the start of a\n // range can be the same as the end index of the previous range. To\n // account for the start of the next range, we check here just in case.\n if (currentRange[0] <= currentStringIndex) {\n currentRange[0] = x;\n currentRangeStarted = true;\n } else {\n currentRangeStarted = false;\n }\n }\n\n // Adjust the string index based on the character length to line up with\n // the column adjustment\n currentStringIndex += length;\n }\n\n // If there is still a range left at the end, it must extend all the way to\n // the end of the line.\n if (currentRange) {\n currentRange[1] = this._bufferService.cols;\n }\n }\n\n /**\n * Merges the range defined by the provided start and end into the list of\n * existing ranges. The merge is done in place on the existing range for\n * performance and is also returned.\n * @param ranges Existing range list\n * @param newRange Tuple of two numbers representing the new range to merge in.\n * @returns The ranges input with the new range merged in place\n */\n private static _mergeRanges(ranges: [number, number][], newRange: [number, number]): [number, number][] {\n let inRange = false;\n for (let i = 0; i < ranges.length; i++) {\n const range = ranges[i];\n if (!inRange) {\n if (newRange[1] <= range[0]) {\n // Case 1: New range is before the search range\n ranges.splice(i, 0, newRange);\n return ranges;\n }\n\n if (newRange[1] <= range[1]) {\n // Case 2: New range is either wholly contained within the\n // search range or overlaps with the front of it\n range[0] = Math.min(newRange[0], range[0]);\n return ranges;\n }\n\n if (newRange[0] < range[1]) {\n // Case 3: New range either wholly contains the search range\n // or overlaps with the end of it\n range[0] = Math.min(newRange[0], range[0]);\n inRange = true;\n }\n\n // Case 4: New range starts after the search range\n continue;\n } else {\n if (newRange[1] <= range[0]) {\n // Case 5: New range extends from previous range but doesn't\n // reach the current one\n ranges[i - 1][1] = newRange[1];\n return ranges;\n }\n\n if (newRange[1] <= range[1]) {\n // Case 6: New range extends from prvious range into the\n // current range\n ranges[i - 1][1] = Math.max(newRange[1], range[1]);\n ranges.splice(i, 1);\n return ranges;\n }\n\n // Case 7: New range extends from previous range past the\n // end of the current range\n ranges.splice(i, 1);\n i--;\n }\n }\n\n if (inRange) {\n // Case 8: New range extends past the last existing range\n ranges[ranges.length - 1][1] = newRange[1];\n } else {\n // Case 9: New range starts after the last existing range\n ranges.push(newRange);\n }\n\n return ranges;\n }\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ICoreBrowserService } from './Services';\n\nexport class CoreBrowserService implements ICoreBrowserService {\n public serviceBrand: undefined;\n\n constructor(\n private _textarea: HTMLTextAreaElement\n ) {\n }\n\n public get isFocused(): boolean {\n const docOrShadowRoot = this._textarea.getRootNode ? this._textarea.getRootNode() as Document | ShadowRoot : document;\n return docOrShadowRoot.activeElement === this._textarea && document.hasFocus();\n }\n}\n","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ICharSizeService, IRenderService, IMouseService } from './Services';\nimport { getCoords, getRawByteCoords } from 'browser/input/Mouse';\n\nexport class MouseService implements IMouseService {\n public serviceBrand: undefined;\n\n constructor(\n @IRenderService private readonly _renderService: IRenderService,\n @ICharSizeService private readonly _charSizeService: ICharSizeService\n ) {\n }\n\n public getCoords(event: {clientX: number, clientY: number}, element: HTMLElement, colCount: number, rowCount: number, isSelection?: boolean): [number, number] | undefined {\n return getCoords(\n window,\n event,\n element,\n colCount,\n rowCount,\n this._charSizeService.hasValidSize,\n this._renderService.dimensions.actualCellWidth,\n this._renderService.dimensions.actualCellHeight,\n isSelection\n );\n }\n\n public getRawByteCoords(event: MouseEvent, element: HTMLElement, colCount: number, rowCount: number): { x: number, y: number } | undefined {\n const coords = this.getCoords(event, element, colCount, rowCount);\n return getRawByteCoords(coords);\n }\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IRenderer, IRenderDimensions } from 'browser/renderer/Types';\nimport { RenderDebouncer } from 'browser/RenderDebouncer';\nimport { EventEmitter, IEvent } from 'common/EventEmitter';\nimport { Disposable } from 'common/Lifecycle';\nimport { ScreenDprMonitor } from 'browser/ScreenDprMonitor';\nimport { addDisposableDomListener } from 'browser/Lifecycle';\nimport { IColorSet, IRenderDebouncer, IRenderDebouncerWithCallback } from 'browser/Types';\nimport { IOptionsService, IBufferService, IDecorationService } from 'common/services/Services';\nimport { ICharSizeService, IRenderService } from 'browser/services/Services';\n\ninterface ISelectionState {\n start: [number, number] | undefined;\n end: [number, number] | undefined;\n columnSelectMode: boolean;\n}\n\nexport class RenderService extends Disposable implements IRenderService {\n public serviceBrand: undefined;\n\n private _renderDebouncer: IRenderDebouncerWithCallback;\n private _screenDprMonitor: ScreenDprMonitor;\n\n private _isPaused: boolean = false;\n private _needsFullRefresh: boolean = false;\n private _isNextRenderRedrawOnly: boolean = true;\n private _needsSelectionRefresh: boolean = false;\n private _canvasWidth: number = 0;\n private _canvasHeight: number = 0;\n private _selectionState: ISelectionState = {\n start: undefined,\n end: undefined,\n columnSelectMode: false\n };\n\n private _onDimensionsChange = new EventEmitter<IRenderDimensions>();\n public get onDimensionsChange(): IEvent<IRenderDimensions> { return this._onDimensionsChange.event; }\n private _onRenderedViewportChange = new EventEmitter<{ start: number, end: number }>();\n public get onRenderedViewportChange(): IEvent<{ start: number, end: number }> { return this._onRenderedViewportChange.event; }\n private _onRender = new EventEmitter<{ start: number, end: number }>();\n public get onRender(): IEvent<{ start: number, end: number }> { return this._onRender.event; }\n private _onRefreshRequest = new EventEmitter<{ start: number, end: number }>();\n public get onRefreshRequest(): IEvent<{ start: number, end: number }> { return this._onRefreshRequest.event; }\n\n public get dimensions(): IRenderDimensions { return this._renderer.dimensions; }\n\n constructor(\n private _renderer: IRenderer,\n private _rowCount: number,\n screenElement: HTMLElement,\n @IOptionsService optionsService: IOptionsService,\n @ICharSizeService private readonly _charSizeService: ICharSizeService,\n @IDecorationService decorationService: IDecorationService,\n @IBufferService bufferService: IBufferService\n ) {\n super();\n\n this.register({ dispose: () => this._renderer.dispose() });\n\n this._renderDebouncer = new RenderDebouncer((start, end) => this._renderRows(start, end));\n this.register(this._renderDebouncer);\n\n this._screenDprMonitor = new ScreenDprMonitor();\n this._screenDprMonitor.setListener(() => this.onDevicePixelRatioChange());\n this.register(this._screenDprMonitor);\n\n this.register(bufferService.onResize(() => this._fullRefresh()));\n this.register(bufferService.buffers.onBufferActivate(() => this._renderer?.clear()));\n this.register(optionsService.onOptionChange(() => this._handleOptionsChanged()));\n this.register(this._charSizeService.onCharSizeChange(() => this.onCharSizeChanged()));\n\n // Do a full refresh whenever any decoration is added or removed. This may not actually result\n // in changes but since decorations should be used sparingly or added/removed all in the same\n // frame this should have minimal performance impact.\n this.register(decorationService.onDecorationRegistered(() => this._fullRefresh()));\n this.register(decorationService.onDecorationRemoved(() => this._fullRefresh()));\n\n // No need to register this as renderer is explicitly disposed in RenderService.dispose\n this._renderer.onRequestRedraw(e => this.refreshRows(e.start, e.end, true));\n\n // dprchange should handle this case, we need this as well for browsers that don't support the\n // matchMedia query.\n this.register(addDisposableDomListener(window, 'resize', () => this.onDevicePixelRatioChange()));\n\n // Detect whether IntersectionObserver is detected and enable renderer pause\n // and resume based on terminal visibility if so\n if ('IntersectionObserver' in window) {\n const observer = new IntersectionObserver(e => this._onIntersectionChange(e[e.length - 1]), { threshold: 0 });\n observer.observe(screenElement);\n this.register({ dispose: () => observer.disconnect() });\n }\n }\n\n private _onIntersectionChange(entry: IntersectionObserverEntry): void {\n this._isPaused = entry.isIntersecting === undefined ? (entry.intersectionRatio === 0) : !entry.isIntersecting;\n\n // Terminal was hidden on open\n if (!this._isPaused && !this._charSizeService.hasValidSize) {\n this._charSizeService.measure();\n }\n\n if (!this._isPaused && this._needsFullRefresh) {\n this.refreshRows(0, this._rowCount - 1);\n this._needsFullRefresh = false;\n }\n }\n\n public refreshRows(start: number, end: number, isRedrawOnly: boolean = false): void {\n if (this._isPaused) {\n this._needsFullRefresh = true;\n return;\n }\n if (!isRedrawOnly) {\n this._isNextRenderRedrawOnly = false;\n }\n this._renderDebouncer.refresh(start, end, this._rowCount);\n }\n\n private _renderRows(start: number, end: number): void {\n this._renderer.renderRows(start, end);\n\n // Update selection if needed\n if (this._needsSelectionRefresh) {\n this._renderer.onSelectionChanged(this._selectionState.start, this._selectionState.end, this._selectionState.columnSelectMode);\n this._needsSelectionRefresh = false;\n }\n\n // Fire render event only if it was not a redraw\n if (!this._isNextRenderRedrawOnly) {\n this._onRenderedViewportChange.fire({ start, end });\n }\n this._onRender.fire({ start, end });\n this._isNextRenderRedrawOnly = true;\n }\n\n public resize(cols: number, rows: number): void {\n this._rowCount = rows;\n this._fireOnCanvasResize();\n }\n\n private _handleOptionsChanged(): void {\n this._renderer.onOptionsChanged();\n this.refreshRows(0, this._rowCount - 1);\n this._fireOnCanvasResize();\n }\n\n private _fireOnCanvasResize(): void {\n // Don't fire the event if the dimensions haven't changed\n if (this._renderer.dimensions.canvasWidth === this._canvasWidth && this._renderer.dimensions.canvasHeight === this._canvasHeight) {\n return;\n }\n this._onDimensionsChange.fire(this._renderer.dimensions);\n }\n\n public dispose(): void {\n super.dispose();\n }\n\n public setRenderer(renderer: IRenderer): void {\n // TODO: RenderService should be the only one to dispose the renderer\n this._renderer.dispose();\n this._renderer = renderer;\n this._renderer.onRequestRedraw(e => this.refreshRows(e.start, e.end, true));\n\n // Force a refresh\n this._needsSelectionRefresh = true;\n this._fullRefresh();\n }\n\n public addRefreshCallback(callback: FrameRequestCallback): number {\n return this._renderDebouncer.addRefreshCallback(callback);\n }\n\n private _fullRefresh(): void {\n if (this._isPaused) {\n this._needsFullRefresh = true;\n } else {\n this.refreshRows(0, this._rowCount - 1);\n }\n }\n\n public clearTextureAtlas(): void {\n this._renderer?.clearTextureAtlas?.();\n this._fullRefresh();\n }\n\n public setColors(colors: IColorSet): void {\n this._renderer.setColors(colors);\n this._fullRefresh();\n }\n\n public onDevicePixelRatioChange(): void {\n // Force char size measurement as DomMeasureStrategy(getBoundingClientRect) is not stable\n // when devicePixelRatio changes\n this._charSizeService.measure();\n\n this._renderer.onDevicePixelRatioChange();\n this.refreshRows(0, this._rowCount - 1);\n }\n\n public onResize(cols: number, rows: number): void {\n this._renderer.onResize(cols, rows);\n this._fullRefresh();\n }\n\n // TODO: Is this useful when we have onResize?\n public onCharSizeChanged(): void {\n this._renderer.onCharSizeChanged();\n }\n\n public onBlur(): void {\n this._renderer.onBlur();\n }\n\n public onFocus(): void {\n this._renderer.onFocus();\n }\n\n public onSelectionChanged(start: [number, number] | undefined, end: [number, number] | undefined, columnSelectMode: boolean): void {\n this._selectionState.start = start;\n this._selectionState.end = end;\n this._selectionState.columnSelectMode = columnSelectMode;\n this._renderer.onSelectionChanged(start, end, columnSelectMode);\n }\n\n public onCursorMove(): void {\n this._renderer.onCursorMove();\n }\n\n public clear(): void {\n this._renderer.clear();\n }\n}\n","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ISelectionRedrawRequestEvent, ISelectionRequestScrollLinesEvent } from 'browser/selection/Types';\nimport { IBuffer } from 'common/buffer/Types';\nimport { IBufferLine, IDisposable } from 'common/Types';\nimport * as Browser from 'common/Platform';\nimport { SelectionModel } from 'browser/selection/SelectionModel';\nimport { CellData } from 'common/buffer/CellData';\nimport { EventEmitter, IEvent } from 'common/EventEmitter';\nimport { IMouseService, ISelectionService, IRenderService } from 'browser/services/Services';\nimport { IBufferRange, ILinkifier2 } from 'browser/Types';\nimport { IBufferService, IOptionsService, ICoreService } from 'common/services/Services';\nimport { getCoordsRelativeToElement } from 'browser/input/Mouse';\nimport { moveToCellSequence } from 'browser/input/MoveToCell';\nimport { Disposable } from 'common/Lifecycle';\nimport { getRangeLength } from 'common/buffer/BufferRange';\n\n/**\n * The number of pixels the mouse needs to be above or below the viewport in\n * order to scroll at the maximum speed.\n */\nconst DRAG_SCROLL_MAX_THRESHOLD = 50;\n\n/**\n * The maximum scrolling speed\n */\nconst DRAG_SCROLL_MAX_SPEED = 15;\n\n/**\n * The number of milliseconds between drag scroll updates.\n */\nconst DRAG_SCROLL_INTERVAL = 50;\n\n/**\n * The maximum amount of time that can have elapsed for an alt click to move the\n * cursor.\n */\nconst ALT_CLICK_MOVE_CURSOR_TIME = 500;\n\nconst NON_BREAKING_SPACE_CHAR = String.fromCharCode(160);\nconst ALL_NON_BREAKING_SPACE_REGEX = new RegExp(NON_BREAKING_SPACE_CHAR, 'g');\n\n/**\n * Represents a position of a word on a line.\n */\ninterface IWordPosition {\n start: number;\n length: number;\n}\n\n/**\n * A selection mode, this drives how the selection behaves on mouse move.\n */\nexport const enum SelectionMode {\n NORMAL,\n WORD,\n LINE,\n COLUMN\n}\n\n/**\n * A class that manages the selection of the terminal. With help from\n * SelectionModel, SelectionService handles with all logic associated with\n * dealing with the selection, including handling mouse interaction, wide\n * characters and fetching the actual text within the selection. Rendering is\n * not handled by the SelectionService but the onRedrawRequest event is fired\n * when the selection is ready to be redrawn (on an animation frame).\n */\nexport class SelectionService extends Disposable implements ISelectionService {\n public serviceBrand: undefined;\n\n protected _model: SelectionModel;\n\n /**\n * The amount to scroll every drag scroll update (depends on how far the mouse\n * drag is above or below the terminal).\n */\n private _dragScrollAmount: number = 0;\n\n /**\n * The current selection mode.\n */\n protected _activeSelectionMode: SelectionMode;\n\n /**\n * A setInterval timer that is active while the mouse is down whose callback\n * scrolls the viewport when necessary.\n */\n private _dragScrollIntervalTimer: number | undefined;\n\n /**\n * The animation frame ID used for refreshing the selection.\n */\n private _refreshAnimationFrame: number | undefined;\n\n /**\n * Whether selection is enabled.\n */\n private _enabled = true;\n\n private _mouseMoveListener: EventListener;\n private _mouseUpListener: EventListener;\n private _trimListener: IDisposable;\n private _workCell: CellData = new CellData();\n\n private _mouseDownTimeStamp: number = 0;\n private _oldHasSelection: boolean = false;\n private _oldSelectionStart: [number, number] | undefined = undefined;\n private _oldSelectionEnd: [number, number] | undefined = undefined;\n\n private _onLinuxMouseSelection = this.register(new EventEmitter<string>());\n public get onLinuxMouseSelection(): IEvent<string> { return this._onLinuxMouseSelection.event; }\n private _onRedrawRequest = this.register(new EventEmitter<ISelectionRedrawRequestEvent>());\n public get onRequestRedraw(): IEvent<ISelectionRedrawRequestEvent> { return this._onRedrawRequest.event; }\n private _onSelectionChange = this.register(new EventEmitter<void>());\n public get onSelectionChange(): IEvent<void> { return this._onSelectionChange.event; }\n private _onRequestScrollLines = this.register(new EventEmitter<ISelectionRequestScrollLinesEvent>());\n public get onRequestScrollLines(): IEvent<ISelectionRequestScrollLinesEvent> { return this._onRequestScrollLines.event; }\n\n constructor(\n private readonly _element: HTMLElement,\n private readonly _screenElement: HTMLElement,\n private readonly _linkifier: ILinkifier2,\n @IBufferService private readonly _bufferService: IBufferService,\n @ICoreService private readonly _coreService: ICoreService,\n @IMouseService private readonly _mouseService: IMouseService,\n @IOptionsService private readonly _optionsService: IOptionsService,\n @IRenderService private readonly _renderService: IRenderService\n ) {\n super();\n\n // Init listeners\n this._mouseMoveListener = event => this._onMouseMove(event as MouseEvent);\n this._mouseUpListener = event => this._onMouseUp(event as MouseEvent);\n this._coreService.onUserInput(() => {\n if (this.hasSelection) {\n this.clearSelection();\n }\n });\n this._trimListener = this._bufferService.buffer.lines.onTrim(amount => this._onTrim(amount));\n this.register(this._bufferService.buffers.onBufferActivate(e => this._onBufferActivate(e)));\n\n this.enable();\n\n this._model = new SelectionModel(this._bufferService);\n this._activeSelectionMode = SelectionMode.NORMAL;\n }\n\n public dispose(): void {\n this._removeMouseDownListeners();\n }\n\n public reset(): void {\n this.clearSelection();\n }\n\n /**\n * Disables the selection manager. This is useful for when terminal mouse\n * are enabled.\n */\n public disable(): void {\n this.clearSelection();\n this._enabled = false;\n }\n\n /**\n * Enable the selection manager.\n */\n public enable(): void {\n this._enabled = true;\n }\n\n public get selectionStart(): [number, number] | undefined { return this._model.finalSelectionStart; }\n public get selectionEnd(): [number, number] | undefined { return this._model.finalSelectionEnd; }\n\n /**\n * Gets whether there is an active text selection.\n */\n public get hasSelection(): boolean {\n const start = this._model.finalSelectionStart;\n const end = this._model.finalSelectionEnd;\n if (!start || !end) {\n return false;\n }\n return start[0] !== end[0] || start[1] !== end[1];\n }\n\n /**\n * Gets the text currently selected.\n */\n public get selectionText(): string {\n const start = this._model.finalSelectionStart;\n const end = this._model.finalSelectionEnd;\n if (!start || !end) {\n return '';\n }\n\n const buffer = this._bufferService.buffer;\n const result: string[] = [];\n\n if (this._activeSelectionMode === SelectionMode.COLUMN) {\n // Ignore zero width selections\n if (start[0] === end[0]) {\n return '';\n }\n\n // For column selection it's not enough to rely on final selection's swapping of reversed\n // values, it also needs the x coordinates to swap independently of the y coordinate is needed\n const startCol = start[0] < end[0] ? start[0] : end[0];\n const endCol = start[0] < end[0] ? end[0] : start[0];\n for (let i = start[1]; i <= end[1]; i++) {\n const lineText = buffer.translateBufferLineToString(i, true, startCol, endCol);\n result.push(lineText);\n }\n } else {\n // Get first row\n const startRowEndCol = start[1] === end[1] ? end[0] : undefined;\n result.push(buffer.translateBufferLineToString(start[1], true, start[0], startRowEndCol));\n\n // Get middle rows\n for (let i = start[1] + 1; i <= end[1] - 1; i++) {\n const bufferLine = buffer.lines.get(i);\n const lineText = buffer.translateBufferLineToString(i, true);\n if (bufferLine?.isWrapped) {\n result[result.length - 1] += lineText;\n } else {\n result.push(lineText);\n }\n }\n\n // Get final row\n if (start[1] !== end[1]) {\n const bufferLine = buffer.lines.get(end[1]);\n const lineText = buffer.translateBufferLineToString(end[1], true, 0, end[0]);\n if (bufferLine && bufferLine!.isWrapped) {\n result[result.length - 1] += lineText;\n } else {\n result.push(lineText);\n }\n }\n }\n\n // Format string by replacing non-breaking space chars with regular spaces\n // and joining the array into a multi-line string.\n const formattedResult = result.map(line => {\n return line.replace(ALL_NON_BREAKING_SPACE_REGEX, ' ');\n }).join(Browser.isWindows ? '\\r\\n' : '\\n');\n\n return formattedResult;\n }\n\n /**\n * Clears the current terminal selection.\n */\n public clearSelection(): void {\n this._model.clearSelection();\n this._removeMouseDownListeners();\n this.refresh();\n this._onSelectionChange.fire();\n }\n\n /**\n * Queues a refresh, redrawing the selection on the next opportunity.\n * @param isLinuxMouseSelection Whether the selection should be registered as a new\n * selection on Linux.\n */\n public refresh(isLinuxMouseSelection?: boolean): void {\n // Queue the refresh for the renderer\n if (!this._refreshAnimationFrame) {\n this._refreshAnimationFrame = window.requestAnimationFrame(() => this._refresh());\n }\n\n // If the platform is Linux and the refresh call comes from a mouse event,\n // we need to update the selection for middle click to paste selection.\n if (Browser.isLinux && isLinuxMouseSelection) {\n const selectionText = this.selectionText;\n if (selectionText.length) {\n this._onLinuxMouseSelection.fire(this.selectionText);\n }\n }\n }\n\n /**\n * Fires the refresh event, causing consumers to pick it up and redraw the\n * selection state.\n */\n private _refresh(): void {\n this._refreshAnimationFrame = undefined;\n this._onRedrawRequest.fire({\n start: this._model.finalSelectionStart,\n end: this._model.finalSelectionEnd,\n columnSelectMode: this._activeSelectionMode === SelectionMode.COLUMN\n });\n }\n\n /**\n * Checks if the current click was inside the current selection\n * @param event The mouse event\n */\n private _isClickInSelection(event: MouseEvent): boolean {\n const coords = this._getMouseBufferCoords(event);\n const start = this._model.finalSelectionStart;\n const end = this._model.finalSelectionEnd;\n\n if (!start || !end || !coords) {\n return false;\n }\n\n return this._areCoordsInSelection(coords, start, end);\n }\n\n public isCellInSelection(x: number, y: number): boolean {\n const start = this._model.finalSelectionStart;\n const end = this._model.finalSelectionEnd;\n if (!start || !end) {\n return false;\n }\n return this._areCoordsInSelection([x, y], start, end);\n }\n\n protected _areCoordsInSelection(coords: [number, number], start: [number, number], end: [number, number]): boolean {\n return (coords[1] > start[1] && coords[1] < end[1]) ||\n (start[1] === end[1] && coords[1] === start[1] && coords[0] >= start[0] && coords[0] < end[0]) ||\n (start[1] < end[1] && coords[1] === end[1] && coords[0] < end[0]) ||\n (start[1] < end[1] && coords[1] === start[1] && coords[0] >= start[0]);\n }\n\n /**\n * Selects word at the current mouse event coordinates.\n * @param event The mouse event.\n */\n private _selectWordAtCursor(event: MouseEvent, allowWhitespaceOnlySelection: boolean): boolean {\n // Check if there is a link under the cursor first and select that if so\n const range = this._linkifier.currentLink?.link?.range;\n if (range) {\n this._model.selectionStart = [range.start.x - 1, range.start.y - 1];\n this._model.selectionStartLength = getRangeLength(range, this._bufferService.cols);\n this._model.selectionEnd = undefined;\n return true;\n }\n\n const coords = this._getMouseBufferCoords(event);\n if (coords) {\n this._selectWordAt(coords, allowWhitespaceOnlySelection);\n this._model.selectionEnd = undefined;\n return true;\n }\n return false;\n }\n\n /**\n * Selects all text within the terminal.\n */\n public selectAll(): void {\n this._model.isSelectAllActive = true;\n this.refresh();\n this._onSelectionChange.fire();\n }\n\n public selectLines(start: number, end: number): void {\n this._model.clearSelection();\n start = Math.max(start, 0);\n end = Math.min(end, this._bufferService.buffer.lines.length - 1);\n this._model.selectionStart = [0, start];\n this._model.selectionEnd = [this._bufferService.cols, end];\n this.refresh();\n this._onSelectionChange.fire();\n }\n\n /**\n * Handle the buffer being trimmed, adjust the selection position.\n * @param amount The amount the buffer is being trimmed.\n */\n private _onTrim(amount: number): void {\n const needsRefresh = this._model.onTrim(amount);\n if (needsRefresh) {\n this.refresh();\n }\n }\n\n /**\n * Gets the 0-based [x, y] buffer coordinates of the current mouse event.\n * @param event The mouse event.\n */\n private _getMouseBufferCoords(event: MouseEvent): [number, number] | undefined {\n const coords = this._mouseService.getCoords(event, this._screenElement, this._bufferService.cols, this._bufferService.rows, true);\n if (!coords) {\n return undefined;\n }\n\n // Convert to 0-based\n coords[0]--;\n coords[1]--;\n\n // Convert viewport coords to buffer coords\n coords[1] += this._bufferService.buffer.ydisp;\n return coords;\n }\n\n /**\n * Gets the amount the viewport should be scrolled based on how far out of the\n * terminal the mouse is.\n * @param event The mouse event.\n */\n private _getMouseEventScrollAmount(event: MouseEvent): number {\n let offset = getCoordsRelativeToElement(window, event, this._screenElement)[1];\n const terminalHeight = this._renderService.dimensions.canvasHeight;\n if (offset >= 0 && offset <= terminalHeight) {\n return 0;\n }\n if (offset > terminalHeight) {\n offset -= terminalHeight;\n }\n\n offset = Math.min(Math.max(offset, -DRAG_SCROLL_MAX_THRESHOLD), DRAG_SCROLL_MAX_THRESHOLD);\n offset /= DRAG_SCROLL_MAX_THRESHOLD;\n return (offset / Math.abs(offset)) + Math.round(offset * (DRAG_SCROLL_MAX_SPEED - 1));\n }\n\n /**\n * Returns whether the selection manager should force selection, regardless of\n * whether the terminal is in mouse events mode.\n * @param event The mouse event.\n */\n public shouldForceSelection(event: MouseEvent): boolean {\n if (Browser.isMac) {\n return event.altKey && this._optionsService.rawOptions.macOptionClickForcesSelection;\n }\n\n return event.shiftKey;\n }\n\n /**\n * Handles te mousedown event, setting up for a new selection.\n * @param event The mousedown event.\n */\n public onMouseDown(event: MouseEvent): void {\n this._mouseDownTimeStamp = event.timeStamp;\n // If we have selection, we want the context menu on right click even if the\n // terminal is in mouse mode.\n if (event.button === 2 && this.hasSelection) {\n return;\n }\n\n // Only action the primary button\n if (event.button !== 0) {\n return;\n }\n\n // Allow selection when using a specific modifier key, even when disabled\n if (!this._enabled) {\n if (!this.shouldForceSelection(event)) {\n return;\n }\n\n // Don't send the mouse down event to the current process, we want to select\n event.stopPropagation();\n }\n\n // Tell the browser not to start a regular selection\n event.preventDefault();\n\n // Reset drag scroll state\n this._dragScrollAmount = 0;\n\n if (this._enabled && event.shiftKey) {\n this._onIncrementalClick(event);\n } else {\n if (event.detail === 1) {\n this._onSingleClick(event);\n } else if (event.detail === 2) {\n this._onDoubleClick(event);\n } else if (event.detail === 3) {\n this._onTripleClick(event);\n }\n }\n\n this._addMouseDownListeners();\n this.refresh(true);\n }\n\n /**\n * Adds listeners when mousedown is triggered.\n */\n private _addMouseDownListeners(): void {\n // Listen on the document so that dragging outside of viewport works\n if (this._screenElement.ownerDocument) {\n this._screenElement.ownerDocument.addEventListener('mousemove', this._mouseMoveListener);\n this._screenElement.ownerDocument.addEventListener('mouseup', this._mouseUpListener);\n }\n this._dragScrollIntervalTimer = window.setInterval(() => this._dragScroll(), DRAG_SCROLL_INTERVAL);\n }\n\n /**\n * Removes the listeners that are registered when mousedown is triggered.\n */\n private _removeMouseDownListeners(): void {\n if (this._screenElement.ownerDocument) {\n this._screenElement.ownerDocument.removeEventListener('mousemove', this._mouseMoveListener);\n this._screenElement.ownerDocument.removeEventListener('mouseup', this._mouseUpListener);\n }\n clearInterval(this._dragScrollIntervalTimer);\n this._dragScrollIntervalTimer = undefined;\n }\n\n /**\n * Performs an incremental click, setting the selection end position to the mouse\n * position.\n * @param event The mouse event.\n */\n private _onIncrementalClick(event: MouseEvent): void {\n if (this._model.selectionStart) {\n this._model.selectionEnd = this._getMouseBufferCoords(event);\n }\n }\n\n /**\n * Performs a single click, resetting relevant state and setting the selection\n * start position.\n * @param event The mouse event.\n */\n private _onSingleClick(event: MouseEvent): void {\n this._model.selectionStartLength = 0;\n this._model.isSelectAllActive = false;\n this._activeSelectionMode = this.shouldColumnSelect(event) ? SelectionMode.COLUMN : SelectionMode.NORMAL;\n\n // Initialize the new selection\n this._model.selectionStart = this._getMouseBufferCoords(event);\n if (!this._model.selectionStart) {\n return;\n }\n this._model.selectionEnd = undefined;\n\n // Ensure the line exists\n const line = this._bufferService.buffer.lines.get(this._model.selectionStart[1]);\n if (!line) {\n return;\n }\n\n // Return early if the click event is not in the buffer (eg. in scroll bar)\n if (line.length === this._model.selectionStart[0]) {\n return;\n }\n\n // If the mouse is over the second half of a wide character, adjust the\n // selection to cover the whole character\n if (line.hasWidth(this._model.selectionStart[0]) === 0) {\n this._model.selectionStart[0]++;\n }\n }\n\n /**\n * Performs a double click, selecting the current word.\n * @param event The mouse event.\n */\n private _onDoubleClick(event: MouseEvent): void {\n if (this._selectWordAtCursor(event, true)) {\n this._activeSelectionMode = SelectionMode.WORD;\n }\n }\n\n /**\n * Performs a triple click, selecting the current line and activating line\n * select mode.\n * @param event The mouse event.\n */\n private _onTripleClick(event: MouseEvent): void {\n const coords = this._getMouseBufferCoords(event);\n if (coords) {\n this._activeSelectionMode = SelectionMode.LINE;\n this._selectLineAt(coords[1]);\n }\n }\n\n /**\n * Returns whether the selection manager should operate in column select mode\n * @param event the mouse or keyboard event\n */\n public shouldColumnSelect(event: KeyboardEvent | MouseEvent): boolean {\n return event.altKey && !(Browser.isMac && this._optionsService.rawOptions.macOptionClickForcesSelection);\n }\n\n /**\n * Handles the mousemove event when the mouse button is down, recording the\n * end of the selection and refreshing the selection.\n * @param event The mousemove event.\n */\n private _onMouseMove(event: MouseEvent): void {\n // If the mousemove listener is active it means that a selection is\n // currently being made, we should stop propagation to prevent mouse events\n // to be sent to the pty.\n event.stopImmediatePropagation();\n\n // Do nothing if there is no selection start, this can happen if the first\n // click in the terminal is an incremental click\n if (!this._model.selectionStart) {\n return;\n }\n\n // Record the previous position so we know whether to redraw the selection\n // at the end.\n const previousSelectionEnd = this._model.selectionEnd ? [this._model.selectionEnd[0], this._model.selectionEnd[1]] : null;\n\n // Set the initial selection end based on the mouse coordinates\n this._model.selectionEnd = this._getMouseBufferCoords(event);\n if (!this._model.selectionEnd) {\n this.refresh(true);\n return;\n }\n\n // Select the entire line if line select mode is active.\n if (this._activeSelectionMode === SelectionMode.LINE) {\n if (this._model.selectionEnd[1] < this._model.selectionStart[1]) {\n this._model.selectionEnd[0] = 0;\n } else {\n this._model.selectionEnd[0] = this._bufferService.cols;\n }\n } else if (this._activeSelectionMode === SelectionMode.WORD) {\n this._selectToWordAt(this._model.selectionEnd);\n }\n\n // Determine the amount of scrolling that will happen.\n this._dragScrollAmount = this._getMouseEventScrollAmount(event);\n\n // If the cursor was above or below the viewport, make sure it's at the\n // start or end of the viewport respectively. This should only happen when\n // NOT in column select mode.\n if (this._activeSelectionMode !== SelectionMode.COLUMN) {\n if (this._dragScrollAmount > 0) {\n this._model.selectionEnd[0] = this._bufferService.cols;\n } else if (this._dragScrollAmount < 0) {\n this._model.selectionEnd[0] = 0;\n }\n }\n\n // If the character is a wide character include the cell to the right in the\n // selection. Note that selections at the very end of the line will never\n // have a character.\n const buffer = this._bufferService.buffer;\n if (this._model.selectionEnd[1] < buffer.lines.length) {\n const line = buffer.lines.get(this._model.selectionEnd[1]);\n if (line && line.hasWidth(this._model.selectionEnd[0]) === 0) {\n this._model.selectionEnd[0]++;\n }\n }\n\n // Only draw here if the selection changes.\n if (!previousSelectionEnd ||\n previousSelectionEnd[0] !== this._model.selectionEnd[0] ||\n previousSelectionEnd[1] !== this._model.selectionEnd[1]) {\n this.refresh(true);\n }\n }\n\n /**\n * The callback that occurs every DRAG_SCROLL_INTERVAL ms that does the\n * scrolling of the viewport.\n */\n private _dragScroll(): void {\n if (!this._model.selectionEnd || !this._model.selectionStart) {\n return;\n }\n if (this._dragScrollAmount) {\n this._onRequestScrollLines.fire({ amount: this._dragScrollAmount, suppressScrollEvent: false });\n // Re-evaluate selection\n // If the cursor was above or below the viewport, make sure it's at the\n // start or end of the viewport respectively. This should only happen when\n // NOT in column select mode.\n const buffer = this._bufferService.buffer;\n if (this._dragScrollAmount > 0) {\n if (this._activeSelectionMode !== SelectionMode.COLUMN) {\n this._model.selectionEnd[0] = this._bufferService.cols;\n }\n this._model.selectionEnd[1] = Math.min(buffer.ydisp + this._bufferService.rows, buffer.lines.length - 1);\n } else {\n if (this._activeSelectionMode !== SelectionMode.COLUMN) {\n this._model.selectionEnd[0] = 0;\n }\n this._model.selectionEnd[1] = buffer.ydisp;\n }\n this.refresh();\n }\n }\n\n /**\n * Handles the mouseup event, removing the mousedown listeners.\n * @param event The mouseup event.\n */\n private _onMouseUp(event: MouseEvent): void {\n const timeElapsed = event.timeStamp - this._mouseDownTimeStamp;\n\n this._removeMouseDownListeners();\n\n if (this.selectionText.length <= 1 && timeElapsed < ALT_CLICK_MOVE_CURSOR_TIME && event.altKey && this._optionsService.getOption('altClickMovesCursor')) {\n if (this._bufferService.buffer.ybase === this._bufferService.buffer.ydisp) {\n const coordinates = this._mouseService.getCoords(\n event,\n this._element,\n this._bufferService.cols,\n this._bufferService.rows,\n false\n );\n if (coordinates && coordinates[0] !== undefined && coordinates[1] !== undefined) {\n const sequence = moveToCellSequence(coordinates[0] - 1, coordinates[1] - 1, this._bufferService, this._coreService.decPrivateModes.applicationCursorKeys);\n this._coreService.triggerDataEvent(sequence, true);\n }\n }\n } else {\n this._fireEventIfSelectionChanged();\n }\n }\n\n private _fireEventIfSelectionChanged(): void {\n const start = this._model.finalSelectionStart;\n const end = this._model.finalSelectionEnd;\n const hasSelection = !!start && !!end && (start[0] !== end[0] || start[1] !== end[1]);\n\n if (!hasSelection) {\n if (this._oldHasSelection) {\n this._fireOnSelectionChange(start, end, hasSelection);\n }\n return;\n }\n\n // Sanity check, these should not be undefined as there is a selection\n if (!start || !end) {\n return;\n }\n\n if (!this._oldSelectionStart || !this._oldSelectionEnd || (\n start[0] !== this._oldSelectionStart[0] || start[1] !== this._oldSelectionStart[1] ||\n end[0] !== this._oldSelectionEnd[0] || end[1] !== this._oldSelectionEnd[1])) {\n\n this._fireOnSelectionChange(start, end, hasSelection);\n }\n }\n\n private _fireOnSelectionChange(start: [number, number] | undefined, end: [number, number] | undefined, hasSelection: boolean): void {\n this._oldSelectionStart = start;\n this._oldSelectionEnd = end;\n this._oldHasSelection = hasSelection;\n this._onSelectionChange.fire();\n }\n\n private _onBufferActivate(e: {activeBuffer: IBuffer, inactiveBuffer: IBuffer}): void {\n this.clearSelection();\n // Only adjust the selection on trim, shiftElements is rarely used (only in\n // reverseIndex) and delete in a splice is only ever used when the same\n // number of elements was just added. Given this is could actually be\n // beneficial to leave the selection as is for these cases.\n this._trimListener.dispose();\n this._trimListener = e.activeBuffer.lines.onTrim(amount => this._onTrim(amount));\n }\n\n /**\n * Converts a viewport column to the character index on the buffer line, the\n * latter takes into account wide characters.\n * @param coords The coordinates to find the 2 index for.\n */\n private _convertViewportColToCharacterIndex(bufferLine: IBufferLine, coords: [number, number]): number {\n let charIndex = coords[0];\n for (let i = 0; coords[0] >= i; i++) {\n const length = bufferLine.loadCell(i, this._workCell).getChars().length;\n if (this._workCell.getWidth() === 0) {\n // Wide characters aren't included in the line string so decrement the\n // index so the index is back on the wide character.\n charIndex--;\n } else if (length > 1 && coords[0] !== i) {\n // Emojis take up multiple characters, so adjust accordingly. For these\n // we don't want ot include the character at the column as we're\n // returning the start index in the string, not the end index.\n charIndex += length - 1;\n }\n }\n return charIndex;\n }\n\n public setSelection(col: number, row: number, length: number): void {\n this._model.clearSelection();\n this._removeMouseDownListeners();\n this._model.selectionStart = [col, row];\n this._model.selectionStartLength = length;\n this.refresh();\n this._fireEventIfSelectionChanged();\n }\n\n public rightClickSelect(ev: MouseEvent): void {\n if (!this._isClickInSelection(ev)) {\n if (this._selectWordAtCursor(ev, false)) {\n this.refresh(true);\n }\n this._fireEventIfSelectionChanged();\n }\n }\n\n /**\n * Gets positional information for the word at the coordinated specified.\n * @param coords The coordinates to get the word at.\n */\n private _getWordAt(coords: [number, number], allowWhitespaceOnlySelection: boolean, followWrappedLinesAbove: boolean = true, followWrappedLinesBelow: boolean = true): IWordPosition | undefined {\n // Ensure coords are within viewport (eg. not within scroll bar)\n if (coords[0] >= this._bufferService.cols) {\n return undefined;\n }\n\n const buffer = this._bufferService.buffer;\n const bufferLine = buffer.lines.get(coords[1]);\n if (!bufferLine) {\n return undefined;\n }\n\n const line = buffer.translateBufferLineToString(coords[1], false);\n\n // Get actual index, taking into consideration wide characters\n let startIndex = this._convertViewportColToCharacterIndex(bufferLine, coords);\n let endIndex = startIndex;\n\n // Record offset to be used later\n const charOffset = coords[0] - startIndex;\n let leftWideCharCount = 0;\n let rightWideCharCount = 0;\n let leftLongCharOffset = 0;\n let rightLongCharOffset = 0;\n\n if (line.charAt(startIndex) === ' ') {\n // Expand until non-whitespace is hit\n while (startIndex > 0 && line.charAt(startIndex - 1) === ' ') {\n startIndex--;\n }\n while (endIndex < line.length && line.charAt(endIndex + 1) === ' ') {\n endIndex++;\n }\n } else {\n // Expand until whitespace is hit. This algorithm works by scanning left\n // and right from the starting position, keeping both the index format\n // (line) and the column format (bufferLine) in sync. When a wide\n // character is hit, it is recorded and the column index is adjusted.\n let startCol = coords[0];\n let endCol = coords[0];\n\n // Consider the initial position, skip it and increment the wide char\n // variable\n if (bufferLine.getWidth(startCol) === 0) {\n leftWideCharCount++;\n startCol--;\n }\n if (bufferLine.getWidth(endCol) === 2) {\n rightWideCharCount++;\n endCol++;\n }\n\n // Adjust the end index for characters whose length are > 1 (emojis)\n const length = bufferLine.getString(endCol).length;\n if (length > 1) {\n rightLongCharOffset += length - 1;\n endIndex += length - 1;\n }\n\n // Expand the string in both directions until a space is hit\n while (startCol > 0 && startIndex > 0 && !this._isCharWordSeparator(bufferLine.loadCell(startCol - 1, this._workCell))) {\n bufferLine.loadCell(startCol - 1, this._workCell);\n const length = this._workCell.getChars().length;\n if (this._workCell.getWidth() === 0) {\n // If the next character is a wide char, record it and skip the column\n leftWideCharCount++;\n startCol--;\n } else if (length > 1) {\n // If the next character's string is longer than 1 char (eg. emoji),\n // adjust the index\n leftLongCharOffset += length - 1;\n startIndex -= length - 1;\n }\n startIndex--;\n startCol--;\n }\n while (endCol < bufferLine.length && endIndex + 1 < line.length && !this._isCharWordSeparator(bufferLine.loadCell(endCol + 1, this._workCell))) {\n bufferLine.loadCell(endCol + 1, this._workCell);\n const length = this._workCell.getChars().length;\n if (this._workCell.getWidth() === 2) {\n // If the next character is a wide char, record it and skip the column\n rightWideCharCount++;\n endCol++;\n } else if (length > 1) {\n // If the next character's string is longer than 1 char (eg. emoji),\n // adjust the index\n rightLongCharOffset += length - 1;\n endIndex += length - 1;\n }\n endIndex++;\n endCol++;\n }\n }\n\n // Incremenet the end index so it is at the start of the next character\n endIndex++;\n\n // Calculate the start _column_, converting the the string indexes back to\n // column coordinates.\n let start =\n startIndex // The index of the selection's start char in the line string\n + charOffset // The difference between the initial char's column and index\n - leftWideCharCount // The number of wide chars left of the initial char\n + leftLongCharOffset; // The number of additional chars left of the initial char added by columns with strings longer than 1 (emojis)\n\n // Calculate the length in _columns_, converting the the string indexes back\n // to column coordinates.\n let length = Math.min(this._bufferService.cols, // Disallow lengths larger than the terminal cols\n endIndex // The index of the selection's end char in the line string\n - startIndex // The index of the selection's start char in the line string\n + leftWideCharCount // The number of wide chars left of the initial char\n + rightWideCharCount // The number of wide chars right of the initial char (inclusive)\n - leftLongCharOffset // The number of additional chars left of the initial char added by columns with strings longer than 1 (emojis)\n - rightLongCharOffset); // The number of additional chars right of the initial char (inclusive) added by columns with strings longer than 1 (emojis)\n\n if (!allowWhitespaceOnlySelection && line.slice(startIndex, endIndex).trim() === '') {\n return undefined;\n }\n\n // Recurse upwards if the line is wrapped and the word wraps to the above line\n if (followWrappedLinesAbove) {\n if (start === 0 && bufferLine.getCodePoint(0) !== 32 /* ' ' */) {\n const previousBufferLine = buffer.lines.get(coords[1] - 1);\n if (previousBufferLine && bufferLine.isWrapped && previousBufferLine.getCodePoint(this._bufferService.cols - 1) !== 32 /* ' ' */) {\n const previousLineWordPosition = this._getWordAt([this._bufferService.cols - 1, coords[1] - 1], false, true, false);\n if (previousLineWordPosition) {\n const offset = this._bufferService.cols - previousLineWordPosition.start;\n start -= offset;\n length += offset;\n }\n }\n }\n }\n\n // Recurse downwards if the line is wrapped and the word wraps to the next line\n if (followWrappedLinesBelow) {\n if (start + length === this._bufferService.cols && bufferLine.getCodePoint(this._bufferService.cols - 1) !== 32 /* ' ' */) {\n const nextBufferLine = buffer.lines.get(coords[1] + 1);\n if (nextBufferLine?.isWrapped && nextBufferLine.getCodePoint(0) !== 32 /* ' ' */) {\n const nextLineWordPosition = this._getWordAt([0, coords[1] + 1], false, false, true);\n if (nextLineWordPosition) {\n length += nextLineWordPosition.length;\n }\n }\n }\n }\n\n return { start, length };\n }\n\n /**\n * Selects the word at the coordinates specified.\n * @param coords The coordinates to get the word at.\n * @param allowWhitespaceOnlySelection If whitespace should be selected\n */\n protected _selectWordAt(coords: [number, number], allowWhitespaceOnlySelection: boolean): void {\n const wordPosition = this._getWordAt(coords, allowWhitespaceOnlySelection);\n if (wordPosition) {\n // Adjust negative start value\n while (wordPosition.start < 0) {\n wordPosition.start += this._bufferService.cols;\n coords[1]--;\n }\n this._model.selectionStart = [wordPosition.start, coords[1]];\n this._model.selectionStartLength = wordPosition.length;\n }\n }\n\n /**\n * Sets the selection end to the word at the coordinated specified.\n * @param coords The coordinates to get the word at.\n */\n private _selectToWordAt(coords: [number, number]): void {\n const wordPosition = this._getWordAt(coords, true);\n if (wordPosition) {\n let endRow = coords[1];\n\n // Adjust negative start value\n while (wordPosition.start < 0) {\n wordPosition.start += this._bufferService.cols;\n endRow--;\n }\n\n // Adjust wrapped length value, this only needs to happen when values are reversed as in that\n // case we're interested in the start of the word, not the end\n if (!this._model.areSelectionValuesReversed()) {\n while (wordPosition.start + wordPosition.length > this._bufferService.cols) {\n wordPosition.length -= this._bufferService.cols;\n endRow++;\n }\n }\n\n this._model.selectionEnd = [this._model.areSelectionValuesReversed() ? wordPosition.start : wordPosition.start + wordPosition.length, endRow];\n }\n }\n\n /**\n * Gets whether the character is considered a word separator by the select\n * word logic.\n * @param char The character to check.\n */\n private _isCharWordSeparator(cell: CellData): boolean {\n // Zero width characters are never separators as they are always to the\n // right of wide characters\n if (cell.getWidth() === 0) {\n return false;\n }\n return this._optionsService.rawOptions.wordSeparator.indexOf(cell.getChars()) >= 0;\n }\n\n /**\n * Selects the line specified.\n * @param line The line index.\n */\n protected _selectLineAt(line: number): void {\n const wrappedRange = this._bufferService.buffer.getWrappedRangeForLine(line);\n const range: IBufferRange = {\n start: { x: 0, y: wrappedRange.first },\n end: { x: this._bufferService.cols - 1, y: wrappedRange.last }\n };\n this._model.selectionStart = [0, wrappedRange.first];\n this._model.selectionEnd = undefined;\n this._model.selectionStartLength = getRangeLength(range, this._bufferService.cols);\n }\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IEvent } from 'common/EventEmitter';\nimport { IRenderDimensions, IRenderer } from 'browser/renderer/Types';\nimport { IColorSet, IRenderDebouncer } from 'browser/Types';\nimport { ISelectionRedrawRequestEvent as ISelectionRequestRedrawEvent, ISelectionRequestScrollLinesEvent } from 'browser/selection/Types';\nimport { createDecorator } from 'common/services/ServiceRegistry';\nimport { IDisposable } from 'common/Types';\nimport { IDecorationOptions, IDecoration } from 'xterm';\nimport { IBufferService } from 'common/services/Services';\n\nexport const ICharSizeService = createDecorator<ICharSizeService>('CharSizeService');\nexport interface ICharSizeService {\n serviceBrand: undefined;\n\n readonly width: number;\n readonly height: number;\n readonly hasValidSize: boolean;\n\n readonly onCharSizeChange: IEvent<void>;\n\n measure(): void;\n}\n\nexport const ICoreBrowserService = createDecorator<ICoreBrowserService>('CoreBrowserService');\nexport interface ICoreBrowserService {\n serviceBrand: undefined;\n\n readonly isFocused: boolean;\n}\n\nexport const IMouseService = createDecorator<IMouseService>('MouseService');\nexport interface IMouseService {\n serviceBrand: undefined;\n\n getCoords(event: {clientX: number, clientY: number}, element: HTMLElement, colCount: number, rowCount: number, isSelection?: boolean): [number, number] | undefined;\n getRawByteCoords(event: MouseEvent, element: HTMLElement, colCount: number, rowCount: number): { x: number, y: number } | undefined;\n}\n\nexport const IRenderService = createDecorator<IRenderService>('RenderService');\nexport interface IRenderService extends IDisposable {\n serviceBrand: undefined;\n\n onDimensionsChange: IEvent<IRenderDimensions>;\n /**\n * Fires when buffer changes are rendered. This does not fire when only cursor\n * or selections are rendered.\n */\n onRenderedViewportChange: IEvent<{ start: number, end: number }>;\n /**\n * Fires on render\n */\n onRender: IEvent<{ start: number, end: number }>;\n onRefreshRequest: IEvent<{ start: number, end: number }>;\n\n dimensions: IRenderDimensions;\n\n addRefreshCallback(callback: FrameRequestCallback): number;\n\n refreshRows(start: number, end: number): void;\n clearTextureAtlas(): void;\n resize(cols: number, rows: number): void;\n setRenderer(renderer: IRenderer): void;\n setColors(colors: IColorSet): void;\n onDevicePixelRatioChange(): void;\n onResize(cols: number, rows: number): void;\n // TODO: Is this useful when we have onResize?\n onCharSizeChanged(): void;\n onBlur(): void;\n onFocus(): void;\n onSelectionChanged(start: [number, number] | undefined, end: [number, number] | undefined, columnSelectMode: boolean): void;\n onCursorMove(): void;\n clear(): void;\n}\n\nexport const ISelectionService = createDecorator<ISelectionService>('SelectionService');\nexport interface ISelectionService {\n serviceBrand: undefined;\n\n readonly selectionText: string;\n readonly hasSelection: boolean;\n readonly selectionStart: [number, number] | undefined;\n readonly selectionEnd: [number, number] | undefined;\n\n readonly onLinuxMouseSelection: IEvent<string>;\n readonly onRequestRedraw: IEvent<ISelectionRequestRedrawEvent>;\n readonly onRequestScrollLines: IEvent<ISelectionRequestScrollLinesEvent>;\n readonly onSelectionChange: IEvent<void>;\n\n disable(): void;\n enable(): void;\n reset(): void;\n setSelection(row: number, col: number, length: number): void;\n selectAll(): void;\n selectLines(start: number, end: number): void;\n clearSelection(): void;\n rightClickSelect(event: MouseEvent): void;\n shouldColumnSelect(event: KeyboardEvent | MouseEvent): boolean;\n shouldForceSelection(event: MouseEvent): boolean;\n refresh(isLinuxMouseSelection?: boolean): void;\n onMouseDown(event: MouseEvent): void;\n isCellInSelection(x: number, y: number): boolean;\n}\n\nexport const ISoundService = createDecorator<ISoundService>('SoundService');\nexport interface ISoundService {\n serviceBrand: undefined;\n\n playBellSound(): void;\n}\n\n\nexport const ICharacterJoinerService = createDecorator<ICharacterJoinerService>('CharacterJoinerService');\nexport interface ICharacterJoinerService {\n serviceBrand: undefined;\n\n register(handler: (text: string) => [number, number][]): number;\n deregister(joinerId: number): boolean;\n getJoinedCharacters(row: number): [number, number][];\n}\n","/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IOptionsService } from 'common/services/Services';\nimport { ISoundService } from 'browser/services/Services';\n\nexport class SoundService implements ISoundService {\n public serviceBrand: undefined;\n\n private static _audioContext: AudioContext;\n\n public static get audioContext(): AudioContext | null {\n if (!SoundService._audioContext) {\n const audioContextCtor: typeof AudioContext = (window as any).AudioContext || (window as any).webkitAudioContext;\n if (!audioContextCtor) {\n console.warn('Web Audio API is not supported by this browser. Consider upgrading to the latest version');\n return null;\n }\n SoundService._audioContext = new audioContextCtor();\n }\n return SoundService._audioContext;\n }\n\n constructor(\n @IOptionsService private _optionsService: IOptionsService\n ) {\n }\n\n public playBellSound(): void {\n const ctx = SoundService.audioContext;\n if (!ctx) {\n return;\n }\n const bellAudioSource = ctx.createBufferSource();\n ctx.decodeAudioData(this._base64ToArrayBuffer(this._removeMimeType(this._optionsService.rawOptions.bellSound)), (buffer) => {\n bellAudioSource.buffer = buffer;\n bellAudioSource.connect(ctx.destination);\n bellAudioSource.start(0);\n });\n }\n\n private _base64ToArrayBuffer(base64: string): ArrayBuffer {\n const binaryString = window.atob(base64);\n const len = binaryString.length;\n const bytes = new Uint8Array(len);\n\n for (let i = 0; i < len; i++) {\n bytes[i] = binaryString.charCodeAt(i);\n }\n\n return bytes.buffer;\n }\n\n private _removeMimeType(dataURI: string): string {\n // Split the input to get the mime-type and the data itself\n const splitUri = dataURI.split(',');\n\n // Return only the data\n return splitUri[1];\n }\n}\n","/**\n * Copyright (c) 2016 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ICircularList } from 'common/Types';\nimport { EventEmitter, IEvent } from 'common/EventEmitter';\n\nexport interface IInsertEvent {\n index: number;\n amount: number;\n}\n\nexport interface IDeleteEvent {\n index: number;\n amount: number;\n}\n\n/**\n * Represents a circular list; a list with a maximum size that wraps around when push is called,\n * overriding values at the start of the list.\n */\nexport class CircularList<T> implements ICircularList<T> {\n protected _array: (T | undefined)[];\n private _startIndex: number;\n private _length: number;\n\n public onDeleteEmitter = new EventEmitter<IDeleteEvent>();\n public get onDelete(): IEvent<IDeleteEvent> { return this.onDeleteEmitter.event; }\n public onInsertEmitter = new EventEmitter<IInsertEvent>();\n public get onInsert(): IEvent<IInsertEvent> { return this.onInsertEmitter.event; }\n public onTrimEmitter = new EventEmitter<number>();\n public get onTrim(): IEvent<number> { return this.onTrimEmitter.event; }\n\n constructor(\n private _maxLength: number\n ) {\n this._array = new Array<T>(this._maxLength);\n this._startIndex = 0;\n this._length = 0;\n }\n\n public get maxLength(): number {\n return this._maxLength;\n }\n\n public set maxLength(newMaxLength: number) {\n // There was no change in maxLength, return early.\n if (this._maxLength === newMaxLength) {\n return;\n }\n\n // Reconstruct array, starting at index 0. Only transfer values from the\n // indexes 0 to length.\n const newArray = new Array<T | undefined>(newMaxLength);\n for (let i = 0; i < Math.min(newMaxLength, this.length); i++) {\n newArray[i] = this._array[this._getCyclicIndex(i)];\n }\n this._array = newArray;\n this._maxLength = newMaxLength;\n this._startIndex = 0;\n }\n\n public get length(): number {\n return this._length;\n }\n\n public set length(newLength: number) {\n if (newLength > this._length) {\n for (let i = this._length; i < newLength; i++) {\n this._array[i] = undefined;\n }\n }\n this._length = newLength;\n }\n\n /**\n * Gets the value at an index.\n *\n * Note that for performance reasons there is no bounds checking here, the index reference is\n * circular so this should always return a value and never throw.\n * @param index The index of the value to get.\n * @return The value corresponding to the index.\n */\n public get(index: number): T | undefined {\n return this._array[this._getCyclicIndex(index)];\n }\n\n /**\n * Sets the value at an index.\n *\n * Note that for performance reasons there is no bounds checking here, the index reference is\n * circular so this should always return a value and never throw.\n * @param index The index to set.\n * @param value The value to set.\n */\n public set(index: number, value: T | undefined): void {\n this._array[this._getCyclicIndex(index)] = value;\n }\n\n /**\n * Pushes a new value onto the list, wrapping around to the start of the array, overriding index 0\n * if the maximum length is reached.\n * @param value The value to push onto the list.\n */\n public push(value: T): void {\n this._array[this._getCyclicIndex(this._length)] = value;\n if (this._length === this._maxLength) {\n this._startIndex = ++this._startIndex % this._maxLength;\n this.onTrimEmitter.fire(1);\n } else {\n this._length++;\n }\n }\n\n /**\n * Advance ringbuffer index and return current element for recycling.\n * Note: The buffer must be full for this method to work.\n * @throws When the buffer is not full.\n */\n public recycle(): T {\n if (this._length !== this._maxLength) {\n throw new Error('Can only recycle when the buffer is full');\n }\n this._startIndex = ++this._startIndex % this._maxLength;\n this.onTrimEmitter.fire(1);\n return this._array[this._getCyclicIndex(this._length - 1)]!;\n }\n\n /**\n * Ringbuffer is at max length.\n */\n public get isFull(): boolean {\n return this._length === this._maxLength;\n }\n\n /**\n * Removes and returns the last value on the list.\n * @return The popped value.\n */\n public pop(): T | undefined {\n return this._array[this._getCyclicIndex(this._length-- - 1)];\n }\n\n /**\n * Deletes and/or inserts items at a particular index (in that order). Unlike\n * Array.prototype.splice, this operation does not return the deleted items as a new array in\n * order to save creating a new array. Note that this operation may shift all values in the list\n * in the worst case.\n * @param start The index to delete and/or insert.\n * @param deleteCount The number of elements to delete.\n * @param items The items to insert.\n */\n public splice(start: number, deleteCount: number, ...items: T[]): void {\n // Delete items\n if (deleteCount) {\n for (let i = start; i < this._length - deleteCount; i++) {\n this._array[this._getCyclicIndex(i)] = this._array[this._getCyclicIndex(i + deleteCount)];\n }\n this._length -= deleteCount;\n this.onDeleteEmitter.fire({ index: start, amount: deleteCount });\n }\n\n // Add items\n for (let i = this._length - 1; i >= start; i--) {\n this._array[this._getCyclicIndex(i + items.length)] = this._array[this._getCyclicIndex(i)];\n }\n for (let i = 0; i < items.length; i++) {\n this._array[this._getCyclicIndex(start + i)] = items[i];\n }\n if (items.length) {\n this.onInsertEmitter.fire({ index: start, amount: items.length });\n }\n\n // Adjust length as needed\n if (this._length + items.length > this._maxLength) {\n const countToTrim = (this._length + items.length) - this._maxLength;\n this._startIndex += countToTrim;\n this._length = this._maxLength;\n this.onTrimEmitter.fire(countToTrim);\n } else {\n this._length += items.length;\n }\n }\n\n /**\n * Trims a number of items from the start of the list.\n * @param count The number of items to remove.\n */\n public trimStart(count: number): void {\n if (count > this._length) {\n count = this._length;\n }\n this._startIndex += count;\n this._length -= count;\n this.onTrimEmitter.fire(count);\n }\n\n public shiftElements(start: number, count: number, offset: number): void {\n if (count <= 0) {\n return;\n }\n if (start < 0 || start >= this._length) {\n throw new Error('start argument out of range');\n }\n if (start + offset < 0) {\n throw new Error('Cannot shift elements in list beyond index 0');\n }\n\n if (offset > 0) {\n for (let i = count - 1; i >= 0; i--) {\n this.set(start + i + offset, this.get(start + i));\n }\n const expandListBy = (start + count + offset) - this._length;\n if (expandListBy > 0) {\n this._length += expandListBy;\n while (this._length > this._maxLength) {\n this._length--;\n this._startIndex++;\n this.onTrimEmitter.fire(1);\n }\n }\n } else {\n for (let i = 0; i < count; i++) {\n this.set(start + i + offset, this.get(start + i));\n }\n }\n }\n\n /**\n * Gets the cyclic index for the specified regular index. The cyclic index can then be used on the\n * backing array to get the element associated with the regular index.\n * @param index The regular index.\n * @returns The cyclic index.\n */\n private _getCyclicIndex(index: number): number {\n return (this._startIndex + index) % this._maxLength;\n }\n}\n","/**\n * Copyright (c) 2016 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\n/*\n * A simple utility for cloning values\n */\nexport function clone<T>(val: T, depth: number = 5): T {\n if (typeof val !== 'object') {\n return val;\n }\n\n // If we're cloning an array, use an array as the base, otherwise use an object\n const clonedObject: any = Array.isArray(val) ? [] : {};\n\n for (const key in val) {\n // Recursively clone eack item unless we're at the maximum depth\n clonedObject[key] = depth <= 1 ? val[key] : (val[key] && clone(val[key], depth - 1));\n }\n\n return clonedObject as T;\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IColor, IColorRGB } from 'common/Types';\n\n/**\n * Helper functions where the source type is \"channels\" (individual color channels as numbers).\n */\nexport namespace channels {\n export function toCss(r: number, g: number, b: number, a?: number): string {\n if (a !== undefined) {\n return `#${toPaddedHex(r)}${toPaddedHex(g)}${toPaddedHex(b)}${toPaddedHex(a)}`;\n }\n return `#${toPaddedHex(r)}${toPaddedHex(g)}${toPaddedHex(b)}`;\n }\n\n export function toRgba(r: number, g: number, b: number, a: number = 0xFF): number {\n // Note: The aggregated number is RGBA32 (BE), thus needs to be converted to ABGR32\n // on LE systems, before it can be used for direct 32-bit buffer writes.\n // >>> 0 forces an unsigned int\n return (r << 24 | g << 16 | b << 8 | a) >>> 0;\n }\n}\n\n/**\n * Helper functions where the source type is `IColor`.\n */\nexport namespace color {\n export function blend(bg: IColor, fg: IColor): IColor {\n const a = (fg.rgba & 0xFF) / 255;\n if (a === 1) {\n return {\n css: fg.css,\n rgba: fg.rgba\n };\n }\n const fgR = (fg.rgba >> 24) & 0xFF;\n const fgG = (fg.rgba >> 16) & 0xFF;\n const fgB = (fg.rgba >> 8) & 0xFF;\n const bgR = (bg.rgba >> 24) & 0xFF;\n const bgG = (bg.rgba >> 16) & 0xFF;\n const bgB = (bg.rgba >> 8) & 0xFF;\n const r = bgR + Math.round((fgR - bgR) * a);\n const g = bgG + Math.round((fgG - bgG) * a);\n const b = bgB + Math.round((fgB - bgB) * a);\n const css = channels.toCss(r, g, b);\n const rgba = channels.toRgba(r, g, b);\n return { css, rgba };\n }\n\n export function isOpaque(color: IColor): boolean {\n return (color.rgba & 0xFF) === 0xFF;\n }\n\n export function ensureContrastRatio(bg: IColor, fg: IColor, ratio: number): IColor | undefined {\n const result = rgba.ensureContrastRatio(bg.rgba, fg.rgba, ratio);\n if (!result) {\n return undefined;\n }\n return rgba.toColor(\n (result >> 24 & 0xFF),\n (result >> 16 & 0xFF),\n (result >> 8 & 0xFF)\n );\n }\n\n export function opaque(color: IColor): IColor {\n const rgbaColor = (color.rgba | 0xFF) >>> 0;\n const [r, g, b] = rgba.toChannels(rgbaColor);\n return {\n css: channels.toCss(r, g, b),\n rgba: rgbaColor\n };\n }\n\n export function opacity(color: IColor, opacity: number): IColor {\n const a = Math.round(opacity * 0xFF);\n const [r, g, b] = rgba.toChannels(color.rgba);\n return {\n css: channels.toCss(r, g, b, a),\n rgba: channels.toRgba(r, g, b, a)\n };\n }\n\n export function toColorRGB(color: IColor): IColorRGB {\n return [(color.rgba >> 24) & 0xFF, (color.rgba >> 16) & 0xFF, (color.rgba >> 8) & 0xFF];\n }\n}\n\n/**\n * Helper functions where the source type is \"css\" (string: '#rgb', '#rgba', '#rrggbb', '#rrggbbaa').\n */\nexport namespace css {\n export function toColor(css: string): IColor {\n if (css.match(/#[0-9a-f]{3,8}/i)) {\n switch (css.length) {\n case 4: { // #rgb\n const r = parseInt(css.slice(1, 2).repeat(2), 16);\n const g = parseInt(css.slice(2, 3).repeat(2), 16);\n const b = parseInt(css.slice(3, 4).repeat(2), 16);\n return rgba.toColor(r, g, b);\n }\n case 5: { // #rgba\n const r = parseInt(css.slice(1, 2).repeat(2), 16);\n const g = parseInt(css.slice(2, 3).repeat(2), 16);\n const b = parseInt(css.slice(3, 4).repeat(2), 16);\n const a = parseInt(css.slice(4, 5).repeat(2), 16);\n return rgba.toColor(r, g, b, a);\n }\n case 7: // #rrggbb\n return {\n css,\n rgba: (parseInt(css.slice(1), 16) << 8 | 0xFF) >>> 0\n };\n case 9: // #rrggbbaa\n return {\n css,\n rgba: parseInt(css.slice(1), 16) >>> 0\n };\n }\n }\n const rgbaMatch = css.match(/rgba?\\(\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*(,\\s*(0|1|\\d?\\.(\\d+))\\s*)?\\)/);\n if (rgbaMatch) { // rgb() or rgba()\n const r = parseInt(rgbaMatch[1]);\n const g = parseInt(rgbaMatch[2]);\n const b = parseInt(rgbaMatch[3]);\n const a = Math.round((rgbaMatch[5] === undefined ? 1 : parseFloat(rgbaMatch[5])) * 0xFF);\n return rgba.toColor(r, g, b, a);\n }\n throw new Error('css.toColor: Unsupported css format');\n }\n}\n\n/**\n * Helper functions where the source type is \"rgb\" (number: 0xrrggbb).\n */\nexport namespace rgb {\n /**\n * Gets the relative luminance of an RGB color, this is useful in determining the contrast ratio\n * between two colors.\n * @param rgb The color to use.\n * @see https://www.w3.org/TR/WCAG20/#relativeluminancedef\n */\n export function relativeLuminance(rgb: number): number {\n return relativeLuminance2(\n (rgb >> 16) & 0xFF,\n (rgb >> 8 ) & 0xFF,\n (rgb ) & 0xFF);\n }\n\n /**\n * Gets the relative luminance of an RGB color, this is useful in determining the contrast ratio\n * between two colors.\n * @param r The red channel (0x00 to 0xFF).\n * @param g The green channel (0x00 to 0xFF).\n * @param b The blue channel (0x00 to 0xFF).\n * @see https://www.w3.org/TR/WCAG20/#relativeluminancedef\n */\n export function relativeLuminance2(r: number, g: number, b: number): number {\n const rs = r / 255;\n const gs = g / 255;\n const bs = b / 255;\n const rr = rs <= 0.03928 ? rs / 12.92 : Math.pow((rs + 0.055) / 1.055, 2.4);\n const rg = gs <= 0.03928 ? gs / 12.92 : Math.pow((gs + 0.055) / 1.055, 2.4);\n const rb = bs <= 0.03928 ? bs / 12.92 : Math.pow((bs + 0.055) / 1.055, 2.4);\n return rr * 0.2126 + rg * 0.7152 + rb * 0.0722;\n }\n}\n\n/**\n * Helper functions where the source type is \"rgba\" (number: 0xrrggbbaa).\n */\nexport namespace rgba {\n /**\n * Given a foreground color and a background color, either increase or reduce the luminance of the\n * foreground color until the specified contrast ratio is met. If pure white or black is hit\n * without the contrast ratio being met, go the other direction using the background color as the\n * foreground color and take either the first or second result depending on which has the higher\n * contrast ratio.\n *\n * `undefined` will be returned if the contrast ratio is already met.\n *\n * @param bgRgba The background color in rgba format.\n * @param fgRgba The foreground color in rgba format.\n * @param ratio The contrast ratio to achieve.\n */\n export function ensureContrastRatio(bgRgba: number, fgRgba: number, ratio: number): number | undefined {\n const bgL = rgb.relativeLuminance(bgRgba >> 8);\n const fgL = rgb.relativeLuminance(fgRgba >> 8);\n const cr = contrastRatio(bgL, fgL);\n if (cr < ratio) {\n if (fgL < bgL) {\n const resultA = reduceLuminance(bgRgba, fgRgba, ratio);\n const resultARatio = contrastRatio(bgL, rgb.relativeLuminance(resultA >> 8));\n if (resultARatio < ratio) {\n const resultB = increaseLuminance(bgRgba, bgRgba, ratio);\n const resultBRatio = contrastRatio(bgL, rgb.relativeLuminance(resultB >> 8));\n return resultARatio > resultBRatio ? resultA : resultB;\n }\n return resultA;\n }\n const resultA = increaseLuminance(bgRgba, fgRgba, ratio);\n const resultARatio = contrastRatio(bgL, rgb.relativeLuminance(resultA >> 8));\n if (resultARatio < ratio) {\n const resultB = reduceLuminance(bgRgba, bgRgba, ratio);\n const resultBRatio = contrastRatio(bgL, rgb.relativeLuminance(resultB >> 8));\n return resultARatio > resultBRatio ? resultA : resultB;\n }\n return resultA;\n }\n return undefined;\n }\n\n export function reduceLuminance(bgRgba: number, fgRgba: number, ratio: number): number {\n // This is a naive but fast approach to reducing luminance as converting to\n // HSL and back is expensive\n const bgR = (bgRgba >> 24) & 0xFF;\n const bgG = (bgRgba >> 16) & 0xFF;\n const bgB = (bgRgba >> 8) & 0xFF;\n let fgR = (fgRgba >> 24) & 0xFF;\n let fgG = (fgRgba >> 16) & 0xFF;\n let fgB = (fgRgba >> 8) & 0xFF;\n let cr = contrastRatio(rgb.relativeLuminance2(fgR, fgG, fgB), rgb.relativeLuminance2(bgR, bgG, bgB));\n while (cr < ratio && (fgR > 0 || fgG > 0 || fgB > 0)) {\n // Reduce by 10% until the ratio is hit\n fgR -= Math.max(0, Math.ceil(fgR * 0.1));\n fgG -= Math.max(0, Math.ceil(fgG * 0.1));\n fgB -= Math.max(0, Math.ceil(fgB * 0.1));\n cr = contrastRatio(rgb.relativeLuminance2(fgR, fgG, fgB), rgb.relativeLuminance2(bgR, bgG, bgB));\n }\n return (fgR << 24 | fgG << 16 | fgB << 8 | 0xFF) >>> 0;\n }\n\n export function increaseLuminance(bgRgba: number, fgRgba: number, ratio: number): number {\n // This is a naive but fast approach to increasing luminance as converting to\n // HSL and back is expensive\n const bgR = (bgRgba >> 24) & 0xFF;\n const bgG = (bgRgba >> 16) & 0xFF;\n const bgB = (bgRgba >> 8) & 0xFF;\n let fgR = (fgRgba >> 24) & 0xFF;\n let fgG = (fgRgba >> 16) & 0xFF;\n let fgB = (fgRgba >> 8) & 0xFF;\n let cr = contrastRatio(rgb.relativeLuminance2(fgR, fgG, fgB), rgb.relativeLuminance2(bgR, bgG, bgB));\n while (cr < ratio && (fgR < 0xFF || fgG < 0xFF || fgB < 0xFF)) {\n // Increase by 10% until the ratio is hit\n fgR = Math.min(0xFF, fgR + Math.ceil((255 - fgR) * 0.1));\n fgG = Math.min(0xFF, fgG + Math.ceil((255 - fgG) * 0.1));\n fgB = Math.min(0xFF, fgB + Math.ceil((255 - fgB) * 0.1));\n cr = contrastRatio(rgb.relativeLuminance2(fgR, fgG, fgB), rgb.relativeLuminance2(bgR, bgG, bgB));\n }\n return (fgR << 24 | fgG << 16 | fgB << 8 | 0xFF) >>> 0;\n }\n\n // FIXME: Move this to channels NS?\n export function toChannels(value: number): [number, number, number, number] {\n return [(value >> 24) & 0xFF, (value >> 16) & 0xFF, (value >> 8) & 0xFF, value & 0xFF];\n }\n\n export function toColor(r: number, g: number, b: number, a?: number): IColor {\n return {\n css: channels.toCss(r, g, b, a),\n rgba: channels.toRgba(r, g, b, a)\n };\n }\n}\n\nexport function toPaddedHex(c: number): string {\n const s = c.toString(16);\n return s.length < 2 ? '0' + s : s;\n}\n\n/**\n * Gets the contrast ratio between two relative luminance values.\n * @param l1 The first relative luminance.\n * @param l2 The first relative luminance.\n * @see https://www.w3.org/TR/WCAG20/#contrast-ratiodef\n */\nexport function contrastRatio(l1: number, l2: number): number {\n if (l1 < l2) {\n return (l2 + 0.05) / (l1 + 0.05);\n }\n return (l1 + 0.05) / (l2 + 0.05);\n}\n","/**\n * Copyright (c) 2014-2020 The xterm.js authors. All rights reserved.\n * Copyright (c) 2012-2013, Christopher Jeffrey (MIT License)\n * @license MIT\n *\n * Originally forked from (with the author's permission):\n * Fabrice Bellard's javascript vt100 for jslinux:\n * http://bellard.org/jslinux/\n * Copyright (c) 2011 Fabrice Bellard\n * The original design remains. The terminal itself\n * has been extended to include xterm CSI codes, among\n * other features.\n *\n * Terminal Emulation References:\n * http://vt100.net/\n * http://invisible-island.net/xterm/ctlseqs/ctlseqs.txt\n * http://invisible-island.net/xterm/ctlseqs/ctlseqs.html\n * http://invisible-island.net/vttest/\n * http://www.inwap.com/pdp10/ansicode.txt\n * http://linux.die.net/man/4/console_codes\n * http://linux.die.net/man/7/urxvt\n */\n\nimport { Disposable } from 'common/Lifecycle';\nimport { IInstantiationService, IOptionsService, IBufferService, ILogService, ICharsetService, ICoreService, ICoreMouseService, IUnicodeService, IDirtyRowService, LogLevelEnum, ITerminalOptions } from 'common/services/Services';\nimport { InstantiationService } from 'common/services/InstantiationService';\nimport { LogService } from 'common/services/LogService';\nimport { BufferService, MINIMUM_COLS, MINIMUM_ROWS } from 'common/services/BufferService';\nimport { OptionsService } from 'common/services/OptionsService';\nimport { IDisposable, IBufferLine, IAttributeData, ICoreTerminal, IKeyboardEvent, IScrollEvent, ScrollSource, ITerminalOptions as IPublicTerminalOptions } from 'common/Types';\nimport { CoreService } from 'common/services/CoreService';\nimport { EventEmitter, IEvent, forwardEvent } from 'common/EventEmitter';\nimport { CoreMouseService } from 'common/services/CoreMouseService';\nimport { DirtyRowService } from 'common/services/DirtyRowService';\nimport { UnicodeService } from 'common/services/UnicodeService';\nimport { CharsetService } from 'common/services/CharsetService';\nimport { updateWindowsModeWrappedState } from 'common/WindowsMode';\nimport { IFunctionIdentifier, IParams } from 'common/parser/Types';\nimport { IBufferSet } from 'common/buffer/Types';\nimport { InputHandler } from 'common/InputHandler';\nimport { WriteBuffer } from 'common/input/WriteBuffer';\n\n// Only trigger this warning a single time per session\nlet hasWriteSyncWarnHappened = false;\n\nexport abstract class CoreTerminal extends Disposable implements ICoreTerminal {\n protected readonly _instantiationService: IInstantiationService;\n protected readonly _bufferService: IBufferService;\n protected readonly _logService: ILogService;\n protected readonly _charsetService: ICharsetService;\n protected readonly _dirtyRowService: IDirtyRowService;\n\n public readonly coreMouseService: ICoreMouseService;\n public readonly coreService: ICoreService;\n public readonly unicodeService: IUnicodeService;\n public readonly optionsService: IOptionsService;\n\n protected _inputHandler: InputHandler;\n private _writeBuffer: WriteBuffer;\n private _windowsMode: IDisposable | undefined;\n\n private _onBinary = new EventEmitter<string>();\n public get onBinary(): IEvent<string> { return this._onBinary.event; }\n private _onData = new EventEmitter<string>();\n public get onData(): IEvent<string> { return this._onData.event; }\n protected _onLineFeed = new EventEmitter<void>();\n public get onLineFeed(): IEvent<void> { return this._onLineFeed.event; }\n private _onResize = new EventEmitter<{ cols: number, rows: number }>();\n public get onResize(): IEvent<{ cols: number, rows: number }> { return this._onResize.event; }\n protected _onScroll = new EventEmitter<IScrollEvent, void>();\n public get onWriteParsed(): IEvent<void> { return this._onWriteParsed.event; }\n protected _onWriteParsed = new EventEmitter<void>();\n /**\n * Internally we track the source of the scroll but this is meaningless outside the library so\n * it's filtered out.\n */\n protected _onScrollApi?: EventEmitter<number, void>;\n public get onScroll(): IEvent<number, void> {\n if (!this._onScrollApi) {\n this._onScrollApi = new EventEmitter<number, void>();\n this.register(this._onScroll.event(ev => {\n this._onScrollApi?.fire(ev.position);\n }));\n }\n return this._onScrollApi.event;\n }\n\n public get cols(): number { return this._bufferService.cols; }\n public get rows(): number { return this._bufferService.rows; }\n public get buffers(): IBufferSet { return this._bufferService.buffers; }\n public get options(): ITerminalOptions { return this.optionsService.options; }\n public set options(options: ITerminalOptions) {\n for (const key in options) {\n this.optionsService.options[key] = options[key];\n }\n }\n\n constructor(\n options: Partial<ITerminalOptions>\n ) {\n super();\n\n // Setup and initialize services\n this._instantiationService = new InstantiationService();\n this.optionsService = new OptionsService(options);\n this._instantiationService.setService(IOptionsService, this.optionsService);\n this._bufferService = this.register(this._instantiationService.createInstance(BufferService));\n this._instantiationService.setService(IBufferService, this._bufferService);\n this._logService = this._instantiationService.createInstance(LogService);\n this._instantiationService.setService(ILogService, this._logService);\n this.coreService = this.register(this._instantiationService.createInstance(CoreService, () => this.scrollToBottom()));\n this._instantiationService.setService(ICoreService, this.coreService);\n this.coreMouseService = this._instantiationService.createInstance(CoreMouseService);\n this._instantiationService.setService(ICoreMouseService, this.coreMouseService);\n this._dirtyRowService = this._instantiationService.createInstance(DirtyRowService);\n this._instantiationService.setService(IDirtyRowService, this._dirtyRowService);\n this.unicodeService = this._instantiationService.createInstance(UnicodeService);\n this._instantiationService.setService(IUnicodeService, this.unicodeService);\n this._charsetService = this._instantiationService.createInstance(CharsetService);\n this._instantiationService.setService(ICharsetService, this._charsetService);\n\n // Register input handler and handle/forward events\n this._inputHandler = new InputHandler(this._bufferService, this._charsetService, this.coreService, this._dirtyRowService, this._logService, this.optionsService, this.coreMouseService, this.unicodeService);\n this.register(forwardEvent(this._inputHandler.onLineFeed, this._onLineFeed));\n this.register(this._inputHandler);\n\n // Setup listeners\n this.register(forwardEvent(this._bufferService.onResize, this._onResize));\n this.register(forwardEvent(this.coreService.onData, this._onData));\n this.register(forwardEvent(this.coreService.onBinary, this._onBinary));\n this.register(this.optionsService.onOptionChange(key => this._updateOptions(key)));\n this.register(this._bufferService.onScroll(event => {\n this._onScroll.fire({ position: this._bufferService.buffer.ydisp, source: ScrollSource.TERMINAL });\n this._dirtyRowService.markRangeDirty(this._bufferService.buffer.scrollTop, this._bufferService.buffer.scrollBottom);\n }));\n this.register(this._inputHandler.onScroll(event => {\n this._onScroll.fire({ position: this._bufferService.buffer.ydisp, source: ScrollSource.TERMINAL });\n this._dirtyRowService.markRangeDirty(this._bufferService.buffer.scrollTop, this._bufferService.buffer.scrollBottom);\n }));\n\n // Setup WriteBuffer\n this._writeBuffer = new WriteBuffer((data, promiseResult) => this._inputHandler.parse(data, promiseResult));\n this.register(forwardEvent(this._writeBuffer.onWriteParsed, this._onWriteParsed));\n }\n\n public dispose(): void {\n if (this._isDisposed) {\n return;\n }\n super.dispose();\n this._windowsMode?.dispose();\n this._windowsMode = undefined;\n }\n\n public write(data: string | Uint8Array, callback?: () => void): void {\n this._writeBuffer.write(data, callback);\n }\n\n /**\n * Write data to terminal synchonously.\n *\n * This method is unreliable with async parser handlers, thus should not\n * be used anymore. If you need blocking semantics on data input consider\n * `write` with a callback instead.\n *\n * @deprecated Unreliable, will be removed soon.\n */\n public writeSync(data: string | Uint8Array, maxSubsequentCalls?: number): void {\n if (this._logService.logLevel <= LogLevelEnum.WARN && !hasWriteSyncWarnHappened) {\n this._logService.warn('writeSync is unreliable and will be removed soon.');\n hasWriteSyncWarnHappened = true;\n }\n this._writeBuffer.writeSync(data, maxSubsequentCalls);\n }\n\n public resize(x: number, y: number): void {\n if (isNaN(x) || isNaN(y)) {\n return;\n }\n\n x = Math.max(x, MINIMUM_COLS);\n y = Math.max(y, MINIMUM_ROWS);\n\n this._bufferService.resize(x, y);\n }\n\n /**\n * Scroll the terminal down 1 row, creating a blank line.\n * @param isWrapped Whether the new line is wrapped from the previous line.\n */\n public scroll(eraseAttr: IAttributeData, isWrapped: boolean = false): void {\n this._bufferService.scroll(eraseAttr, isWrapped);\n }\n\n /**\n * Scroll the display of the terminal\n * @param disp The number of lines to scroll down (negative scroll up).\n * @param suppressScrollEvent Don't emit the scroll event as scrollLines. This is used\n * to avoid unwanted events being handled by the viewport when the event was triggered from the\n * viewport originally.\n */\n public scrollLines(disp: number, suppressScrollEvent?: boolean, source?: ScrollSource): void {\n this._bufferService.scrollLines(disp, suppressScrollEvent, source);\n }\n\n /**\n * Scroll the display of the terminal by a number of pages.\n * @param pageCount The number of pages to scroll (negative scrolls up).\n */\n public scrollPages(pageCount: number): void {\n this._bufferService.scrollPages(pageCount);\n }\n\n /**\n * Scrolls the display of the terminal to the top.\n */\n public scrollToTop(): void {\n this._bufferService.scrollToTop();\n }\n\n /**\n * Scrolls the display of the terminal to the bottom.\n */\n public scrollToBottom(): void {\n this._bufferService.scrollToBottom();\n }\n\n public scrollToLine(line: number): void {\n this._bufferService.scrollToLine(line);\n }\n\n /** Add handler for ESC escape sequence. See xterm.d.ts for details. */\n public registerEscHandler(id: IFunctionIdentifier, callback: () => boolean | Promise<boolean>): IDisposable {\n return this._inputHandler.registerEscHandler(id, callback);\n }\n\n /** Add handler for DCS escape sequence. See xterm.d.ts for details. */\n public registerDcsHandler(id: IFunctionIdentifier, callback: (data: string, param: IParams) => boolean | Promise<boolean>): IDisposable {\n return this._inputHandler.registerDcsHandler(id, callback);\n }\n\n /** Add handler for CSI escape sequence. See xterm.d.ts for details. */\n public registerCsiHandler(id: IFunctionIdentifier, callback: (params: IParams) => boolean | Promise<boolean>): IDisposable {\n return this._inputHandler.registerCsiHandler(id, callback);\n }\n\n /** Add handler for OSC escape sequence. See xterm.d.ts for details. */\n public registerOscHandler(ident: number, callback: (data: string) => boolean | Promise<boolean>): IDisposable {\n return this._inputHandler.registerOscHandler(ident, callback);\n }\n\n protected _setup(): void {\n if (this.optionsService.rawOptions.windowsMode) {\n this._enableWindowsMode();\n }\n }\n\n public reset(): void {\n this._inputHandler.reset();\n this._bufferService.reset();\n this._charsetService.reset();\n this.coreService.reset();\n this.coreMouseService.reset();\n }\n\n protected _updateOptions(key: string): void {\n // TODO: These listeners should be owned by individual components\n switch (key) {\n case 'scrollback':\n this.buffers.resize(this.cols, this.rows);\n break;\n case 'windowsMode':\n if (this.optionsService.rawOptions.windowsMode) {\n this._enableWindowsMode();\n } else {\n this._windowsMode?.dispose();\n this._windowsMode = undefined;\n }\n break;\n }\n }\n\n protected _enableWindowsMode(): void {\n if (!this._windowsMode) {\n const disposables: IDisposable[] = [];\n disposables.push(this.onLineFeed(updateWindowsModeWrappedState.bind(null, this._bufferService)));\n disposables.push(this.registerCsiHandler({ final: 'H' }, () => {\n updateWindowsModeWrappedState(this._bufferService);\n return false;\n }));\n this._windowsMode = {\n dispose: () => {\n for (const d of disposables) {\n d.dispose();\n }\n }\n };\n }\n }\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IDisposable } from 'common/Types';\n\ninterface IListener<T, U = void> {\n (arg1: T, arg2: U): void;\n}\n\nexport interface IEvent<T, U = void> {\n (listener: (arg1: T, arg2: U) => any): IDisposable;\n}\n\nexport interface IEventEmitter<T, U = void> {\n event: IEvent<T, U>;\n fire(arg1: T, arg2: U): void;\n dispose(): void;\n}\n\nexport class EventEmitter<T, U = void> implements IEventEmitter<T, U> {\n private _listeners: IListener<T, U>[] = [];\n private _event?: IEvent<T, U>;\n private _disposed: boolean = false;\n\n public get event(): IEvent<T, U> {\n if (!this._event) {\n this._event = (listener: (arg1: T, arg2: U) => any) => {\n this._listeners.push(listener);\n const disposable = {\n dispose: () => {\n if (!this._disposed) {\n for (let i = 0; i < this._listeners.length; i++) {\n if (this._listeners[i] === listener) {\n this._listeners.splice(i, 1);\n return;\n }\n }\n }\n }\n };\n return disposable;\n };\n }\n return this._event;\n }\n\n public fire(arg1: T, arg2: U): void {\n const queue: IListener<T, U>[] = [];\n for (let i = 0; i < this._listeners.length; i++) {\n queue.push(this._listeners[i]);\n }\n for (let i = 0; i < queue.length; i++) {\n queue[i].call(undefined, arg1, arg2);\n }\n }\n\n public dispose(): void {\n if (this._listeners) {\n this._listeners.length = 0;\n }\n this._disposed = true;\n }\n}\n\nexport function forwardEvent<T>(from: IEvent<T>, to: IEventEmitter<T>): IDisposable {\n return from(e => to.fire(e));\n}\n","/**\n * Copyright (c) 2014 The xterm.js authors. All rights reserved.\n * Copyright (c) 2012-2013, Christopher Jeffrey (MIT License)\n * @license MIT\n */\n\nimport { IInputHandler, IAttributeData, IDisposable, IWindowOptions, IColorEvent, IParseStack, ColorIndex, ColorRequestType } from 'common/Types';\nimport { C0, C1 } from 'common/data/EscapeSequences';\nimport { CHARSETS, DEFAULT_CHARSET } from 'common/data/Charsets';\nimport { EscapeSequenceParser } from 'common/parser/EscapeSequenceParser';\nimport { Disposable } from 'common/Lifecycle';\nimport { concat } from 'common/TypedArrayUtils';\nimport { StringToUtf32, stringFromCodePoint, utf32ToString, Utf8ToUtf32 } from 'common/input/TextDecoder';\nimport { DEFAULT_ATTR_DATA } from 'common/buffer/BufferLine';\nimport { EventEmitter, IEvent } from 'common/EventEmitter';\nimport { IParsingState, IDcsHandler, IEscapeSequenceParser, IParams, IFunctionIdentifier } from 'common/parser/Types';\nimport { NULL_CELL_CODE, NULL_CELL_WIDTH, Attributes, FgFlags, BgFlags, Content, UnderlineStyle } from 'common/buffer/Constants';\nimport { CellData } from 'common/buffer/CellData';\nimport { AttributeData } from 'common/buffer/AttributeData';\nimport { ICoreService, IBufferService, IOptionsService, ILogService, IDirtyRowService, ICoreMouseService, ICharsetService, IUnicodeService, LogLevelEnum } from 'common/services/Services';\nimport { OscHandler } from 'common/parser/OscParser';\nimport { DcsHandler } from 'common/parser/DcsParser';\nimport { IBuffer } from 'common/buffer/Types';\nimport { parseColor } from 'common/input/XParseColor';\n\n/**\n * Map collect to glevel. Used in `selectCharset`.\n */\nconst GLEVEL: { [key: string]: number } = { '(': 0, ')': 1, '*': 2, '+': 3, '-': 1, '.': 2 };\n\n/**\n * VT commands done by the parser - FIXME: move this to the parser?\n */\n// @vt: #Y ESC CSI \"Control Sequence Introducer\" \"ESC [\" \"Start of a CSI sequence.\"\n// @vt: #Y ESC OSC \"Operating System Command\" \"ESC ]\" \"Start of an OSC sequence.\"\n// @vt: #Y ESC DCS \"Device Control String\" \"ESC P\" \"Start of a DCS sequence.\"\n// @vt: #Y ESC ST \"String Terminator\" \"ESC \\\" \"Terminator used for string type sequences.\"\n// @vt: #Y ESC PM \"Privacy Message\" \"ESC ^\" \"Start of a privacy message.\"\n// @vt: #Y ESC APC \"Application Program Command\" \"ESC _\" \"Start of an APC sequence.\"\n// @vt: #Y C1 CSI \"Control Sequence Introducer\" \"\\x9B\" \"Start of a CSI sequence.\"\n// @vt: #Y C1 OSC \"Operating System Command\" \"\\x9D\" \"Start of an OSC sequence.\"\n// @vt: #Y C1 DCS \"Device Control String\" \"\\x90\" \"Start of a DCS sequence.\"\n// @vt: #Y C1 ST \"String Terminator\" \"\\x9C\" \"Terminator used for string type sequences.\"\n// @vt: #Y C1 PM \"Privacy Message\" \"\\x9E\" \"Start of a privacy message.\"\n// @vt: #Y C1 APC \"Application Program Command\" \"\\x9F\" \"Start of an APC sequence.\"\n// @vt: #Y C0 NUL \"Null\" \"\\0, \\x00\" \"NUL is ignored.\"\n// @vt: #Y C0 ESC \"Escape\" \"\\e, \\x1B\" \"Start of a sequence. Cancels any other sequence.\"\n\n/**\n * Document common VT features here that are currently unsupported\n */\n// @vt: #N DCS SIXEL \"SIXEL Graphics\" \"DCS Ps ; Ps ; Ps ; q \tPt ST\" \"Draw SIXEL image starting at cursor position.\"\n// @vt: #N OSC 1 \"Set Icon Name\" \"OSC 1 ; Pt BEL\" \"Set icon name.\"\n\n/**\n * Max length of the UTF32 input buffer. Real memory consumption is 4 times higher.\n */\nconst MAX_PARSEBUFFER_LENGTH = 131072;\n\n/**\n * Limit length of title and icon name stacks.\n */\nconst STACK_LIMIT = 10;\n\n// map params to window option\nfunction paramToWindowOption(n: number, opts: IWindowOptions): boolean {\n if (n > 24) {\n return opts.setWinLines || false;\n }\n switch (n) {\n case 1: return !!opts.restoreWin;\n case 2: return !!opts.minimizeWin;\n case 3: return !!opts.setWinPosition;\n case 4: return !!opts.setWinSizePixels;\n case 5: return !!opts.raiseWin;\n case 6: return !!opts.lowerWin;\n case 7: return !!opts.refreshWin;\n case 8: return !!opts.setWinSizeChars;\n case 9: return !!opts.maximizeWin;\n case 10: return !!opts.fullscreenWin;\n case 11: return !!opts.getWinState;\n case 13: return !!opts.getWinPosition;\n case 14: return !!opts.getWinSizePixels;\n case 15: return !!opts.getScreenSizePixels;\n case 16: return !!opts.getCellSizePixels;\n case 18: return !!opts.getWinSizeChars;\n case 19: return !!opts.getScreenSizeChars;\n case 20: return !!opts.getIconTitle;\n case 21: return !!opts.getWinTitle;\n case 22: return !!opts.pushTitle;\n case 23: return !!opts.popTitle;\n case 24: return !!opts.setWinLines;\n }\n return false;\n}\n\nexport enum WindowsOptionsReportType {\n GET_WIN_SIZE_PIXELS = 0,\n GET_CELL_SIZE_PIXELS = 1\n}\n\n// create a warning log if an async handler takes longer than the limit (in ms)\nconst SLOW_ASYNC_LIMIT = 5000;\n\n/**\n * DCS subparser implementations\n */\n\n/**\n * DCS $ q Pt ST\n * DECRQSS (https://vt100.net/docs/vt510-rm/DECRQSS.html)\n * Request Status String (DECRQSS), VT420 and up.\n * Response: DECRPSS (https://vt100.net/docs/vt510-rm/DECRPSS.html)\n *\n * @vt: #P[See limited support below.] DCS DECRQSS \"Request Selection or Setting\" \"DCS $ q Pt ST\" \"Request several terminal settings.\"\n * Response is in the form `ESC P 1 $ r Pt ST` for valid requests, where `Pt` contains the corresponding CSI string,\n * `ESC P 0 ST` for invalid requests.\n *\n * Supported requests and responses:\n *\n * | Type | Request | Response (`Pt`) |\n * | -------------------------------- | ----------------- | ----------------------------------------------------- |\n * | Graphic Rendition (SGR) | `DCS $ q m ST` | always reporting `0m` (currently broken) |\n * | Top and Bottom Margins (DECSTBM) | `DCS $ q r ST` | `Ps ; Ps r` |\n * | Cursor Style (DECSCUSR) | `DCS $ q SP q ST` | `Ps SP q` |\n * | Protection Attribute (DECSCA) | `DCS $ q \" q ST` | always reporting `0 \" q` (DECSCA is unsupported) |\n * | Conformance Level (DECSCL) | `DCS $ q \" p ST` | always reporting `61 ; 1 \" p` (DECSCL is unsupported) |\n *\n *\n * TODO:\n * - fix SGR report\n * - either implement DECSCA or remove the report\n * - either check which conformance is better suited or remove the report completely\n * --> we are currently a mixture of all up to VT400 but dont follow anyone strictly\n */\nclass DECRQSS implements IDcsHandler {\n private _data: Uint32Array = new Uint32Array(0);\n\n constructor(\n private _bufferService: IBufferService,\n private _coreService: ICoreService,\n private _logService: ILogService,\n private _optionsService: IOptionsService\n ) { }\n\n public hook(params: IParams): void {\n this._data = new Uint32Array(0);\n }\n\n public put(data: Uint32Array, start: number, end: number): void {\n this._data = concat(this._data, data.subarray(start, end));\n }\n\n public unhook(success: boolean): boolean {\n if (!success) {\n this._data = new Uint32Array(0);\n return true;\n }\n const data = utf32ToString(this._data);\n this._data = new Uint32Array(0);\n switch (data) {\n // valid: DCS 1 $ r Pt ST (xterm)\n case '\"q': // DECSCA\n this._coreService.triggerDataEvent(`${C0.ESC}P1$r0\"q${C0.ESC}\\\\`);\n break;\n case '\"p': // DECSCL\n this._coreService.triggerDataEvent(`${C0.ESC}P1$r61;1\"p${C0.ESC}\\\\`);\n break;\n case 'r': // DECSTBM\n const pt = '' + (this._bufferService.buffer.scrollTop + 1) +\n ';' + (this._bufferService.buffer.scrollBottom + 1) + 'r';\n this._coreService.triggerDataEvent(`${C0.ESC}P1$r${pt}${C0.ESC}\\\\`);\n break;\n case 'm': // SGR\n // TODO: report real settings instead of 0m\n this._coreService.triggerDataEvent(`${C0.ESC}P1$r0m${C0.ESC}\\\\`);\n break;\n case ' q': // DECSCUSR\n const STYLES: { [key: string]: number } = { 'block': 2, 'underline': 4, 'bar': 6 };\n let style = STYLES[this._optionsService.rawOptions.cursorStyle];\n style -= this._optionsService.rawOptions.cursorBlink ? 1 : 0;\n this._coreService.triggerDataEvent(`${C0.ESC}P1$r${style} q${C0.ESC}\\\\`);\n break;\n default:\n // invalid: DCS 0 $ r Pt ST (xterm)\n this._logService.debug('Unknown DCS $q %s', data);\n this._coreService.triggerDataEvent(`${C0.ESC}P0$r${C0.ESC}\\\\`);\n }\n return true;\n }\n}\n\n/**\n * DCS Ps; Ps| Pt ST\n * DECUDK (https://vt100.net/docs/vt510-rm/DECUDK.html)\n * not supported\n *\n * @vt: #N DCS DECUDK \"User Defined Keys\" \"DCS Ps ; Ps | Pt ST\" \"Definitions for user-defined keys.\"\n */\n\n/**\n * DCS + q Pt ST (xterm)\n * Request Terminfo String\n * not implemented\n *\n * @vt: #N DCS XTGETTCAP \"Request Terminfo String\" \"DCS + q Pt ST\" \"Request Terminfo String.\"\n */\n\n/**\n * DCS + p Pt ST (xterm)\n * Set Terminfo Data\n * not supported\n *\n * @vt: #N DCS XTSETTCAP \"Set Terminfo Data\" \"DCS + p Pt ST\" \"Set Terminfo Data.\"\n */\n\n\n\n/**\n * The terminal's standard implementation of IInputHandler, this handles all\n * input from the Parser.\n *\n * Refer to http://invisible-island.net/xterm/ctlseqs/ctlseqs.html to understand\n * each function's header comment.\n */\nexport class InputHandler extends Disposable implements IInputHandler {\n private _parseBuffer: Uint32Array = new Uint32Array(4096);\n private _stringDecoder: StringToUtf32 = new StringToUtf32();\n private _utf8Decoder: Utf8ToUtf32 = new Utf8ToUtf32();\n private _workCell: CellData = new CellData();\n private _windowTitle = '';\n private _iconName = '';\n protected _windowTitleStack: string[] = [];\n protected _iconNameStack: string[] = [];\n\n private _curAttrData: IAttributeData = DEFAULT_ATTR_DATA.clone();\n private _eraseAttrDataInternal: IAttributeData = DEFAULT_ATTR_DATA.clone();\n\n private _activeBuffer: IBuffer;\n\n private _onRequestBell = new EventEmitter<void>();\n public get onRequestBell(): IEvent<void> { return this._onRequestBell.event; }\n private _onRequestRefreshRows = new EventEmitter<number, number>();\n public get onRequestRefreshRows(): IEvent<number, number> { return this._onRequestRefreshRows.event; }\n private _onRequestReset = new EventEmitter<void>();\n public get onRequestReset(): IEvent<void> { return this._onRequestReset.event; }\n private _onRequestSendFocus = new EventEmitter<void>();\n public get onRequestSendFocus(): IEvent<void> { return this._onRequestSendFocus.event; }\n private _onRequestSyncScrollBar = new EventEmitter<void>();\n public get onRequestSyncScrollBar(): IEvent<void> { return this._onRequestSyncScrollBar.event; }\n private _onRequestWindowsOptionsReport = new EventEmitter<WindowsOptionsReportType>();\n public get onRequestWindowsOptionsReport(): IEvent<WindowsOptionsReportType> { return this._onRequestWindowsOptionsReport.event; }\n\n private _onA11yChar = new EventEmitter<string>();\n public get onA11yChar(): IEvent<string> { return this._onA11yChar.event; }\n private _onA11yTab = new EventEmitter<number>();\n public get onA11yTab(): IEvent<number> { return this._onA11yTab.event; }\n private _onCursorMove = new EventEmitter<void>();\n public get onCursorMove(): IEvent<void> { return this._onCursorMove.event; }\n private _onLineFeed = new EventEmitter<void>();\n public get onLineFeed(): IEvent<void> { return this._onLineFeed.event; }\n private _onScroll = new EventEmitter<number>();\n public get onScroll(): IEvent<number> { return this._onScroll.event; }\n private _onTitleChange = new EventEmitter<string>();\n public get onTitleChange(): IEvent<string> { return this._onTitleChange.event; }\n private _onColor = new EventEmitter<IColorEvent>();\n public get onColor(): IEvent<IColorEvent> { return this._onColor.event; }\n\n private _parseStack: IParseStack = {\n paused: false,\n cursorStartX: 0,\n cursorStartY: 0,\n decodedLength: 0,\n position: 0\n };\n\n constructor(\n private readonly _bufferService: IBufferService,\n private readonly _charsetService: ICharsetService,\n private readonly _coreService: ICoreService,\n private readonly _dirtyRowService: IDirtyRowService,\n private readonly _logService: ILogService,\n private readonly _optionsService: IOptionsService,\n private readonly _coreMouseService: ICoreMouseService,\n private readonly _unicodeService: IUnicodeService,\n private readonly _parser: IEscapeSequenceParser = new EscapeSequenceParser()\n ) {\n super();\n this.register(this._parser);\n\n // Track properties used in performance critical code manually to avoid using slow getters\n this._activeBuffer = this._bufferService.buffer;\n this.register(this._bufferService.buffers.onBufferActivate(e => this._activeBuffer = e.activeBuffer));\n\n /**\n * custom fallback handlers\n */\n this._parser.setCsiHandlerFallback((ident, params) => {\n this._logService.debug('Unknown CSI code: ', { identifier: this._parser.identToString(ident), params: params.toArray() });\n });\n this._parser.setEscHandlerFallback(ident => {\n this._logService.debug('Unknown ESC code: ', { identifier: this._parser.identToString(ident) });\n });\n this._parser.setExecuteHandlerFallback(code => {\n this._logService.debug('Unknown EXECUTE code: ', { code });\n });\n this._parser.setOscHandlerFallback((identifier, action, data) => {\n this._logService.debug('Unknown OSC code: ', { identifier, action, data });\n });\n this._parser.setDcsHandlerFallback((ident, action, payload) => {\n if (action === 'HOOK') {\n payload = payload.toArray();\n }\n this._logService.debug('Unknown DCS code: ', { identifier: this._parser.identToString(ident), action, payload });\n });\n\n /**\n * print handler\n */\n this._parser.setPrintHandler((data, start, end) => this.print(data, start, end));\n\n /**\n * CSI handler\n */\n this._parser.registerCsiHandler({ final: '@' }, params => this.insertChars(params));\n this._parser.registerCsiHandler({ intermediates: ' ', final: '@' }, params => this.scrollLeft(params));\n this._parser.registerCsiHandler({ final: 'A' }, params => this.cursorUp(params));\n this._parser.registerCsiHandler({ intermediates: ' ', final: 'A' }, params => this.scrollRight(params));\n this._parser.registerCsiHandler({ final: 'B' }, params => this.cursorDown(params));\n this._parser.registerCsiHandler({ final: 'C' }, params => this.cursorForward(params));\n this._parser.registerCsiHandler({ final: 'D' }, params => this.cursorBackward(params));\n this._parser.registerCsiHandler({ final: 'E' }, params => this.cursorNextLine(params));\n this._parser.registerCsiHandler({ final: 'F' }, params => this.cursorPrecedingLine(params));\n this._parser.registerCsiHandler({ final: 'G' }, params => this.cursorCharAbsolute(params));\n this._parser.registerCsiHandler({ final: 'H' }, params => this.cursorPosition(params));\n this._parser.registerCsiHandler({ final: 'I' }, params => this.cursorForwardTab(params));\n this._parser.registerCsiHandler({ final: 'J' }, params => this.eraseInDisplay(params));\n this._parser.registerCsiHandler({ prefix: '?', final: 'J' }, params => this.eraseInDisplay(params));\n this._parser.registerCsiHandler({ final: 'K' }, params => this.eraseInLine(params));\n this._parser.registerCsiHandler({ prefix: '?', final: 'K' }, params => this.eraseInLine(params));\n this._parser.registerCsiHandler({ final: 'L' }, params => this.insertLines(params));\n this._parser.registerCsiHandler({ final: 'M' }, params => this.deleteLines(params));\n this._parser.registerCsiHandler({ final: 'P' }, params => this.deleteChars(params));\n this._parser.registerCsiHandler({ final: 'S' }, params => this.scrollUp(params));\n this._parser.registerCsiHandler({ final: 'T' }, params => this.scrollDown(params));\n this._parser.registerCsiHandler({ final: 'X' }, params => this.eraseChars(params));\n this._parser.registerCsiHandler({ final: 'Z' }, params => this.cursorBackwardTab(params));\n this._parser.registerCsiHandler({ final: '`' }, params => this.charPosAbsolute(params));\n this._parser.registerCsiHandler({ final: 'a' }, params => this.hPositionRelative(params));\n this._parser.registerCsiHandler({ final: 'b' }, params => this.repeatPrecedingCharacter(params));\n this._parser.registerCsiHandler({ final: 'c' }, params => this.sendDeviceAttributesPrimary(params));\n this._parser.registerCsiHandler({ prefix: '>', final: 'c' }, params => this.sendDeviceAttributesSecondary(params));\n this._parser.registerCsiHandler({ final: 'd' }, params => this.linePosAbsolute(params));\n this._parser.registerCsiHandler({ final: 'e' }, params => this.vPositionRelative(params));\n this._parser.registerCsiHandler({ final: 'f' }, params => this.hVPosition(params));\n this._parser.registerCsiHandler({ final: 'g' }, params => this.tabClear(params));\n this._parser.registerCsiHandler({ final: 'h' }, params => this.setMode(params));\n this._parser.registerCsiHandler({ prefix: '?', final: 'h' }, params => this.setModePrivate(params));\n this._parser.registerCsiHandler({ final: 'l' }, params => this.resetMode(params));\n this._parser.registerCsiHandler({ prefix: '?', final: 'l' }, params => this.resetModePrivate(params));\n this._parser.registerCsiHandler({ final: 'm' }, params => this.charAttributes(params));\n this._parser.registerCsiHandler({ final: 'n' }, params => this.deviceStatus(params));\n this._parser.registerCsiHandler({ prefix: '?', final: 'n' }, params => this.deviceStatusPrivate(params));\n this._parser.registerCsiHandler({ intermediates: '!', final: 'p' }, params => this.softReset(params));\n this._parser.registerCsiHandler({ intermediates: ' ', final: 'q' }, params => this.setCursorStyle(params));\n this._parser.registerCsiHandler({ final: 'r' }, params => this.setScrollRegion(params));\n this._parser.registerCsiHandler({ final: 's' }, params => this.saveCursor(params));\n this._parser.registerCsiHandler({ final: 't' }, params => this.windowOptions(params));\n this._parser.registerCsiHandler({ final: 'u' }, params => this.restoreCursor(params));\n this._parser.registerCsiHandler({ intermediates: '\\'', final: '}' }, params => this.insertColumns(params));\n this._parser.registerCsiHandler({ intermediates: '\\'', final: '~' }, params => this.deleteColumns(params));\n\n /**\n * execute handler\n */\n this._parser.setExecuteHandler(C0.BEL, () => this.bell());\n this._parser.setExecuteHandler(C0.LF, () => this.lineFeed());\n this._parser.setExecuteHandler(C0.VT, () => this.lineFeed());\n this._parser.setExecuteHandler(C0.FF, () => this.lineFeed());\n this._parser.setExecuteHandler(C0.CR, () => this.carriageReturn());\n this._parser.setExecuteHandler(C0.BS, () => this.backspace());\n this._parser.setExecuteHandler(C0.HT, () => this.tab());\n this._parser.setExecuteHandler(C0.SO, () => this.shiftOut());\n this._parser.setExecuteHandler(C0.SI, () => this.shiftIn());\n // FIXME: What do to with missing? Old code just added those to print.\n\n this._parser.setExecuteHandler(C1.IND, () => this.index());\n this._parser.setExecuteHandler(C1.NEL, () => this.nextLine());\n this._parser.setExecuteHandler(C1.HTS, () => this.tabSet());\n\n /**\n * OSC handler\n */\n // 0 - icon name + title\n this._parser.registerOscHandler(0, new OscHandler(data => { this.setTitle(data); this.setIconName(data); return true; }));\n // 1 - icon name\n this._parser.registerOscHandler(1, new OscHandler(data => this.setIconName(data)));\n // 2 - title\n this._parser.registerOscHandler(2, new OscHandler(data => this.setTitle(data)));\n // 3 - set property X in the form \"prop=value\"\n // 4 - Change Color Number\n this._parser.registerOscHandler(4, new OscHandler(data => this.setOrReportIndexedColor(data)));\n // 5 - Change Special Color Number\n // 6 - Enable/disable Special Color Number c\n // 7 - current directory? (not in xterm spec, see https://gitlab.com/gnachman/iterm2/issues/3939)\n // 10 - Change VT100 text foreground color to Pt.\n this._parser.registerOscHandler(10, new OscHandler(data => this.setOrReportFgColor(data)));\n // 11 - Change VT100 text background color to Pt.\n this._parser.registerOscHandler(11, new OscHandler(data => this.setOrReportBgColor(data)));\n // 12 - Change text cursor color to Pt.\n this._parser.registerOscHandler(12, new OscHandler(data => this.setOrReportCursorColor(data)));\n // 13 - Change mouse foreground color to Pt.\n // 14 - Change mouse background color to Pt.\n // 15 - Change Tektronix foreground color to Pt.\n // 16 - Change Tektronix background color to Pt.\n // 17 - Change highlight background color to Pt.\n // 18 - Change Tektronix cursor color to Pt.\n // 19 - Change highlight foreground color to Pt.\n // 46 - Change Log File to Pt.\n // 50 - Set Font to Pt.\n // 51 - reserved for Emacs shell.\n // 52 - Manipulate Selection Data.\n // 104 ; c - Reset Color Number c.\n this._parser.registerOscHandler(104, new OscHandler(data => this.restoreIndexedColor(data)));\n // 105 ; c - Reset Special Color Number c.\n // 106 ; c; f - Enable/disable Special Color Number c.\n // 110 - Reset VT100 text foreground color.\n this._parser.registerOscHandler(110, new OscHandler(data => this.restoreFgColor(data)));\n // 111 - Reset VT100 text background color.\n this._parser.registerOscHandler(111, new OscHandler(data => this.restoreBgColor(data)));\n // 112 - Reset text cursor color.\n this._parser.registerOscHandler(112, new OscHandler(data => this.restoreCursorColor(data)));\n // 113 - Reset mouse foreground color.\n // 114 - Reset mouse background color.\n // 115 - Reset Tektronix foreground color.\n // 116 - Reset Tektronix background color.\n // 117 - Reset highlight color.\n // 118 - Reset Tektronix cursor color.\n // 119 - Reset highlight foreground color.\n\n /**\n * ESC handlers\n */\n this._parser.registerEscHandler({ final: '7' }, () => this.saveCursor());\n this._parser.registerEscHandler({ final: '8' }, () => this.restoreCursor());\n this._parser.registerEscHandler({ final: 'D' }, () => this.index());\n this._parser.registerEscHandler({ final: 'E' }, () => this.nextLine());\n this._parser.registerEscHandler({ final: 'H' }, () => this.tabSet());\n this._parser.registerEscHandler({ final: 'M' }, () => this.reverseIndex());\n this._parser.registerEscHandler({ final: '=' }, () => this.keypadApplicationMode());\n this._parser.registerEscHandler({ final: '>' }, () => this.keypadNumericMode());\n this._parser.registerEscHandler({ final: 'c' }, () => this.fullReset());\n this._parser.registerEscHandler({ final: 'n' }, () => this.setgLevel(2));\n this._parser.registerEscHandler({ final: 'o' }, () => this.setgLevel(3));\n this._parser.registerEscHandler({ final: '|' }, () => this.setgLevel(3));\n this._parser.registerEscHandler({ final: '}' }, () => this.setgLevel(2));\n this._parser.registerEscHandler({ final: '~' }, () => this.setgLevel(1));\n this._parser.registerEscHandler({ intermediates: '%', final: '@' }, () => this.selectDefaultCharset());\n this._parser.registerEscHandler({ intermediates: '%', final: 'G' }, () => this.selectDefaultCharset());\n for (const flag in CHARSETS) {\n this._parser.registerEscHandler({ intermediates: '(', final: flag }, () => this.selectCharset('(' + flag));\n this._parser.registerEscHandler({ intermediates: ')', final: flag }, () => this.selectCharset(')' + flag));\n this._parser.registerEscHandler({ intermediates: '*', final: flag }, () => this.selectCharset('*' + flag));\n this._parser.registerEscHandler({ intermediates: '+', final: flag }, () => this.selectCharset('+' + flag));\n this._parser.registerEscHandler({ intermediates: '-', final: flag }, () => this.selectCharset('-' + flag));\n this._parser.registerEscHandler({ intermediates: '.', final: flag }, () => this.selectCharset('.' + flag));\n this._parser.registerEscHandler({ intermediates: '/', final: flag }, () => this.selectCharset('/' + flag)); // TODO: supported?\n }\n this._parser.registerEscHandler({ intermediates: '#', final: '8' }, () => this.screenAlignmentPattern());\n\n /**\n * error handler\n */\n this._parser.setErrorHandler((state: IParsingState) => {\n this._logService.error('Parsing error: ', state);\n return state;\n });\n\n /**\n * DCS handler\n */\n this._parser.registerDcsHandler({ intermediates: '$', final: 'q' }, new DECRQSS(this._bufferService, this._coreService, this._logService, this._optionsService));\n }\n\n public dispose(): void {\n super.dispose();\n }\n\n /**\n * Async parse support.\n */\n private _preserveStack(cursorStartX: number, cursorStartY: number, decodedLength: number, position: number): void {\n this._parseStack.paused = true;\n this._parseStack.cursorStartX = cursorStartX;\n this._parseStack.cursorStartY = cursorStartY;\n this._parseStack.decodedLength = decodedLength;\n this._parseStack.position = position;\n }\n\n private _logSlowResolvingAsync(p: Promise<boolean>): void {\n // log a limited warning about an async handler taking too long\n if (this._logService.logLevel <= LogLevelEnum.WARN) {\n Promise.race([p, new Promise((res, rej) => setTimeout(() => rej('#SLOW_TIMEOUT'), SLOW_ASYNC_LIMIT))])\n .catch(err => {\n if (err !== '#SLOW_TIMEOUT') {\n throw err;\n }\n console.warn(`async parser handler taking longer than ${SLOW_ASYNC_LIMIT} ms`);\n });\n }\n }\n\n /**\n * Parse call with async handler support.\n *\n * Whether the stack state got preserved for the next call, is indicated by the return value:\n * - undefined (void):\n * all handlers were sync, no stack save, continue normally with next chunk\n * - Promise\\<boolean\\>:\n * execution stopped at async handler, stack saved, continue with\n * same chunk and the promise resolve value as `promiseResult` until the method returns `undefined`\n *\n * Note: This method should only be called by `Terminal.write` to ensure correct execution order and\n * proper continuation of async parser handlers.\n */\n public parse(data: string | Uint8Array, promiseResult?: boolean): void | Promise<boolean> {\n let result: void | Promise<boolean>;\n let cursorStartX = this._activeBuffer.x;\n let cursorStartY = this._activeBuffer.y;\n let start = 0;\n const wasPaused = this._parseStack.paused;\n\n if (wasPaused) {\n // assumption: _parseBuffer never mutates between async calls\n if (result = this._parser.parse(this._parseBuffer, this._parseStack.decodedLength, promiseResult)) {\n this._logSlowResolvingAsync(result);\n return result;\n }\n cursorStartX = this._parseStack.cursorStartX;\n cursorStartY = this._parseStack.cursorStartY;\n this._parseStack.paused = false;\n if (data.length > MAX_PARSEBUFFER_LENGTH) {\n start = this._parseStack.position + MAX_PARSEBUFFER_LENGTH;\n }\n }\n\n // Log debug data, the log level gate is to prevent extra work in this hot path\n if (this._logService.logLevel <= LogLevelEnum.DEBUG) {\n this._logService.debug(`parsing data${typeof data === 'string' ? ` \"${data}\"` : ` \"${Array.prototype.map.call(data, e => String.fromCharCode(e)).join('')}\"`}`, typeof data === 'string'\n ? data.split('').map(e => e.charCodeAt(0))\n : data\n );\n }\n\n // resize input buffer if needed\n if (this._parseBuffer.length < data.length) {\n if (this._parseBuffer.length < MAX_PARSEBUFFER_LENGTH) {\n this._parseBuffer = new Uint32Array(Math.min(data.length, MAX_PARSEBUFFER_LENGTH));\n }\n }\n\n // Clear the dirty row service so we know which lines changed as a result of parsing\n // Important: do not clear between async calls, otherwise we lost pending update information.\n if (!wasPaused) {\n this._dirtyRowService.clearRange();\n }\n\n // process big data in smaller chunks\n if (data.length > MAX_PARSEBUFFER_LENGTH) {\n for (let i = start; i < data.length; i += MAX_PARSEBUFFER_LENGTH) {\n const end = i + MAX_PARSEBUFFER_LENGTH < data.length ? i + MAX_PARSEBUFFER_LENGTH : data.length;\n const len = (typeof data === 'string')\n ? this._stringDecoder.decode(data.substring(i, end), this._parseBuffer)\n : this._utf8Decoder.decode(data.subarray(i, end), this._parseBuffer);\n if (result = this._parser.parse(this._parseBuffer, len)) {\n this._preserveStack(cursorStartX, cursorStartY, len, i);\n this._logSlowResolvingAsync(result);\n return result;\n }\n }\n } else {\n if (!wasPaused) {\n const len = (typeof data === 'string')\n ? this._stringDecoder.decode(data, this._parseBuffer)\n : this._utf8Decoder.decode(data, this._parseBuffer);\n if (result = this._parser.parse(this._parseBuffer, len)) {\n this._preserveStack(cursorStartX, cursorStartY, len, 0);\n this._logSlowResolvingAsync(result);\n return result;\n }\n }\n }\n\n if (this._activeBuffer.x !== cursorStartX || this._activeBuffer.y !== cursorStartY) {\n this._onCursorMove.fire();\n }\n\n // Refresh any dirty rows accumulated as part of parsing\n this._onRequestRefreshRows.fire(this._dirtyRowService.start, this._dirtyRowService.end);\n }\n\n public print(data: Uint32Array, start: number, end: number): void {\n let code: number;\n let chWidth: number;\n const charset = this._charsetService.charset;\n const screenReaderMode = this._optionsService.rawOptions.screenReaderMode;\n const cols = this._bufferService.cols;\n const wraparoundMode = this._coreService.decPrivateModes.wraparound;\n const insertMode = this._coreService.modes.insertMode;\n const curAttr = this._curAttrData;\n let bufferRow = this._activeBuffer.lines.get(this._activeBuffer.ybase + this._activeBuffer.y)!;\n\n this._dirtyRowService.markDirty(this._activeBuffer.y);\n\n // handle wide chars: reset start_cell-1 if we would overwrite the second cell of a wide char\n if (this._activeBuffer.x && end - start > 0 && bufferRow.getWidth(this._activeBuffer.x - 1) === 2) {\n bufferRow.setCellFromCodePoint(this._activeBuffer.x - 1, 0, 1, curAttr.fg, curAttr.bg, curAttr.extended);\n }\n\n for (let pos = start; pos < end; ++pos) {\n code = data[pos];\n\n // calculate print space\n // expensive call, therefore we save width in line buffer\n chWidth = this._unicodeService.wcwidth(code);\n\n // get charset replacement character\n // charset is only defined for ASCII, therefore we only\n // search for an replacement char if code < 127\n if (code < 127 && charset) {\n const ch = charset[String.fromCharCode(code)];\n if (ch) {\n code = ch.charCodeAt(0);\n }\n }\n\n if (screenReaderMode) {\n this._onA11yChar.fire(stringFromCodePoint(code));\n }\n\n // insert combining char at last cursor position\n // this._activeBuffer.x should never be 0 for a combining char\n // since they always follow a cell consuming char\n // therefore we can test for this._activeBuffer.x to avoid overflow left\n if (!chWidth && this._activeBuffer.x) {\n if (!bufferRow.getWidth(this._activeBuffer.x - 1)) {\n // found empty cell after fullwidth, need to go 2 cells back\n // it is save to step 2 cells back here\n // since an empty cell is only set by fullwidth chars\n bufferRow.addCodepointToCell(this._activeBuffer.x - 2, code);\n } else {\n bufferRow.addCodepointToCell(this._activeBuffer.x - 1, code);\n }\n continue;\n }\n\n // goto next line if ch would overflow\n // NOTE: To avoid costly width checks here,\n // the terminal does not allow a cols < 2.\n if (this._activeBuffer.x + chWidth - 1 >= cols) {\n // autowrap - DECAWM\n // automatically wraps to the beginning of the next line\n if (wraparoundMode) {\n // clear left over cells to the right\n while (this._activeBuffer.x < cols) {\n bufferRow.setCellFromCodePoint(this._activeBuffer.x++, 0, 1, curAttr.fg, curAttr.bg, curAttr.extended);\n }\n this._activeBuffer.x = 0;\n this._activeBuffer.y++;\n if (this._activeBuffer.y === this._activeBuffer.scrollBottom + 1) {\n this._activeBuffer.y--;\n this._bufferService.scroll(this._eraseAttrData(), true);\n } else {\n if (this._activeBuffer.y >= this._bufferService.rows) {\n this._activeBuffer.y = this._bufferService.rows - 1;\n }\n // The line already exists (eg. the initial viewport), mark it as a\n // wrapped line\n this._activeBuffer.lines.get(this._activeBuffer.ybase + this._activeBuffer.y)!.isWrapped = true;\n }\n // row changed, get it again\n bufferRow = this._activeBuffer.lines.get(this._activeBuffer.ybase + this._activeBuffer.y)!;\n } else {\n this._activeBuffer.x = cols - 1;\n if (chWidth === 2) {\n // FIXME: check for xterm behavior\n // What to do here? We got a wide char that does not fit into last cell\n continue;\n }\n }\n }\n\n // insert mode: move characters to right\n if (insertMode) {\n // right shift cells according to the width\n bufferRow.insertCells(this._activeBuffer.x, chWidth, this._activeBuffer.getNullCell(curAttr), curAttr);\n // test last cell - since the last cell has only room for\n // a halfwidth char any fullwidth shifted there is lost\n // and will be set to empty cell\n if (bufferRow.getWidth(cols - 1) === 2) {\n bufferRow.setCellFromCodePoint(cols - 1, NULL_CELL_CODE, NULL_CELL_WIDTH, curAttr.fg, curAttr.bg, curAttr.extended);\n }\n }\n\n // write current char to buffer and advance cursor\n bufferRow.setCellFromCodePoint(this._activeBuffer.x++, code, chWidth, curAttr.fg, curAttr.bg, curAttr.extended);\n\n // fullwidth char - also set next cell to placeholder stub and advance cursor\n // for graphemes bigger than fullwidth we can simply loop to zero\n // we already made sure above, that this._activeBuffer.x + chWidth will not overflow right\n if (chWidth > 0) {\n while (--chWidth) {\n // other than a regular empty cell a cell following a wide char has no width\n bufferRow.setCellFromCodePoint(this._activeBuffer.x++, 0, 0, curAttr.fg, curAttr.bg, curAttr.extended);\n }\n }\n }\n // store last char in Parser.precedingCodepoint for REP to work correctly\n // This needs to check whether:\n // - fullwidth + surrogates: reset\n // - combining: only base char gets carried on (bug in xterm?)\n if (end - start > 0) {\n bufferRow.loadCell(this._activeBuffer.x - 1, this._workCell);\n if (this._workCell.getWidth() === 2 || this._workCell.getCode() > 0xFFFF) {\n this._parser.precedingCodepoint = 0;\n } else if (this._workCell.isCombined()) {\n this._parser.precedingCodepoint = this._workCell.getChars().charCodeAt(0);\n } else {\n this._parser.precedingCodepoint = this._workCell.content;\n }\n }\n\n // handle wide chars: reset cell to the right if it is second cell of a wide char\n if (this._activeBuffer.x < cols && end - start > 0 && bufferRow.getWidth(this._activeBuffer.x) === 0 && !bufferRow.hasContent(this._activeBuffer.x)) {\n bufferRow.setCellFromCodePoint(this._activeBuffer.x, 0, 1, curAttr.fg, curAttr.bg, curAttr.extended);\n }\n\n this._dirtyRowService.markDirty(this._activeBuffer.y);\n }\n\n /**\n * Forward registerCsiHandler from parser.\n */\n public registerCsiHandler(id: IFunctionIdentifier, callback: (params: IParams) => boolean | Promise<boolean>): IDisposable {\n if (id.final === 't' && !id.prefix && !id.intermediates) {\n // security: always check whether window option is allowed\n return this._parser.registerCsiHandler(id, params => {\n if (!paramToWindowOption(params.params[0], this._optionsService.rawOptions.windowOptions)) {\n return true;\n }\n return callback(params);\n });\n }\n return this._parser.registerCsiHandler(id, callback);\n }\n\n /**\n * Forward registerDcsHandler from parser.\n */\n public registerDcsHandler(id: IFunctionIdentifier, callback: (data: string, param: IParams) => boolean | Promise<boolean>): IDisposable {\n return this._parser.registerDcsHandler(id, new DcsHandler(callback));\n }\n\n /**\n * Forward registerEscHandler from parser.\n */\n public registerEscHandler(id: IFunctionIdentifier, callback: () => boolean | Promise<boolean>): IDisposable {\n return this._parser.registerEscHandler(id, callback);\n }\n\n /**\n * Forward registerOscHandler from parser.\n */\n public registerOscHandler(ident: number, callback: (data: string) => boolean | Promise<boolean>): IDisposable {\n return this._parser.registerOscHandler(ident, new OscHandler(callback));\n }\n\n /**\n * BEL\n * Bell (Ctrl-G).\n *\n * @vt: #Y C0 BEL \"Bell\" \"\\a, \\x07\" \"Ring the bell.\"\n * The behavior of the bell is further customizable with `ITerminalOptions.bellStyle`\n * and `ITerminalOptions.bellSound`.\n */\n public bell(): boolean {\n this._onRequestBell.fire();\n return true;\n }\n\n /**\n * LF\n * Line Feed or New Line (NL). (LF is Ctrl-J).\n *\n * @vt: #Y C0 LF \"Line Feed\" \"\\n, \\x0A\" \"Move the cursor one row down, scrolling if needed.\"\n * Scrolling is restricted to scroll margins and will only happen on the bottom line.\n *\n * @vt: #Y C0 VT \"Vertical Tabulation\" \"\\v, \\x0B\" \"Treated as LF.\"\n * @vt: #Y C0 FF \"Form Feed\" \"\\f, \\x0C\" \"Treated as LF.\"\n */\n public lineFeed(): boolean {\n this._dirtyRowService.markDirty(this._activeBuffer.y);\n if (this._optionsService.rawOptions.convertEol) {\n this._activeBuffer.x = 0;\n }\n this._activeBuffer.y++;\n if (this._activeBuffer.y === this._activeBuffer.scrollBottom + 1) {\n this._activeBuffer.y--;\n this._bufferService.scroll(this._eraseAttrData());\n } else if (this._activeBuffer.y >= this._bufferService.rows) {\n this._activeBuffer.y = this._bufferService.rows - 1;\n }\n // If the end of the line is hit, prevent this action from wrapping around to the next line.\n if (this._activeBuffer.x >= this._bufferService.cols) {\n this._activeBuffer.x--;\n }\n this._dirtyRowService.markDirty(this._activeBuffer.y);\n\n this._onLineFeed.fire();\n return true;\n }\n\n /**\n * CR\n * Carriage Return (Ctrl-M).\n *\n * @vt: #Y C0 CR \"Carriage Return\" \"\\r, \\x0D\" \"Move the cursor to the beginning of the row.\"\n */\n public carriageReturn(): boolean {\n this._activeBuffer.x = 0;\n return true;\n }\n\n /**\n * BS\n * Backspace (Ctrl-H).\n *\n * @vt: #Y C0 BS \"Backspace\" \"\\b, \\x08\" \"Move the cursor one position to the left.\"\n * By default it is not possible to move the cursor past the leftmost position.\n * If `reverse wrap-around` (`CSI ? 45 h`) is set, a previous soft line wrap (DECAWM)\n * can be undone with BS within the scroll margins. In that case the cursor will wrap back\n * to the end of the previous row. Note that it is not possible to peek back into the scrollbuffer\n * with the cursor, thus at the home position (top-leftmost cell) this has no effect.\n */\n public backspace(): boolean {\n // reverse wrap-around is disabled\n if (!this._coreService.decPrivateModes.reverseWraparound) {\n this._restrictCursor();\n if (this._activeBuffer.x > 0) {\n this._activeBuffer.x--;\n }\n return true;\n }\n\n // reverse wrap-around is enabled\n // other than for normal operation mode, reverse wrap-around allows the cursor\n // to be at x=cols to be able to address the last cell of a row by BS\n this._restrictCursor(this._bufferService.cols);\n\n if (this._activeBuffer.x > 0) {\n this._activeBuffer.x--;\n } else {\n /**\n * reverse wrap-around handling:\n * Our implementation deviates from xterm on purpose. Details:\n * - only previous soft NLs can be reversed (isWrapped=true)\n * - only works within scrollborders (top/bottom, left/right not yet supported)\n * - cannot peek into scrollbuffer\n * - any cursor movement sequence keeps working as expected\n */\n if (this._activeBuffer.x === 0\n && this._activeBuffer.y > this._activeBuffer.scrollTop\n && this._activeBuffer.y <= this._activeBuffer.scrollBottom\n && this._activeBuffer.lines.get(this._activeBuffer.ybase + this._activeBuffer.y)?.isWrapped) {\n this._activeBuffer.lines.get(this._activeBuffer.ybase + this._activeBuffer.y)!.isWrapped = false;\n this._activeBuffer.y--;\n this._activeBuffer.x = this._bufferService.cols - 1;\n // find last taken cell - last cell can have 3 different states:\n // - hasContent(true) + hasWidth(1): narrow char - we are done\n // - hasWidth(0): second part of wide char - we are done\n // - hasContent(false) + hasWidth(1): empty cell due to early wrapping wide char, go one cell further back\n const line = this._activeBuffer.lines.get(this._activeBuffer.ybase + this._activeBuffer.y)!;\n if (line.hasWidth(this._activeBuffer.x) && !line.hasContent(this._activeBuffer.x)) {\n this._activeBuffer.x--;\n // We do this only once, since width=1 + hasContent=false currently happens only once before\n // early wrapping of a wide char.\n // This needs to be fixed once we support graphemes taking more than 2 cells.\n }\n }\n }\n this._restrictCursor();\n return true;\n }\n\n /**\n * TAB\n * Horizontal Tab (HT) (Ctrl-I).\n *\n * @vt: #Y C0 HT \"Horizontal Tabulation\" \"\\t, \\x09\" \"Move the cursor to the next character tab stop.\"\n */\n public tab(): boolean {\n if (this._activeBuffer.x >= this._bufferService.cols) {\n return true;\n }\n const originalX = this._activeBuffer.x;\n this._activeBuffer.x = this._activeBuffer.nextStop();\n if (this._optionsService.rawOptions.screenReaderMode) {\n this._onA11yTab.fire(this._activeBuffer.x - originalX);\n }\n return true;\n }\n\n /**\n * SO\n * Shift Out (Ctrl-N) -> Switch to Alternate Character Set. This invokes the\n * G1 character set.\n *\n * @vt: #P[Only limited ISO-2022 charset support.] C0 SO \"Shift Out\" \"\\x0E\" \"Switch to an alternative character set.\"\n */\n public shiftOut(): boolean {\n this._charsetService.setgLevel(1);\n return true;\n }\n\n /**\n * SI\n * Shift In (Ctrl-O) -> Switch to Standard Character Set. This invokes the G0\n * character set (the default).\n *\n * @vt: #Y C0 SI \"Shift In\" \"\\x0F\" \"Return to regular character set after Shift Out.\"\n */\n public shiftIn(): boolean {\n this._charsetService.setgLevel(0);\n return true;\n }\n\n /**\n * Restrict cursor to viewport size / scroll margin (origin mode).\n */\n private _restrictCursor(maxCol: number = this._bufferService.cols - 1): void {\n this._activeBuffer.x = Math.min(maxCol, Math.max(0, this._activeBuffer.x));\n this._activeBuffer.y = this._coreService.decPrivateModes.origin\n ? Math.min(this._activeBuffer.scrollBottom, Math.max(this._activeBuffer.scrollTop, this._activeBuffer.y))\n : Math.min(this._bufferService.rows - 1, Math.max(0, this._activeBuffer.y));\n this._dirtyRowService.markDirty(this._activeBuffer.y);\n }\n\n /**\n * Set absolute cursor position.\n */\n private _setCursor(x: number, y: number): void {\n this._dirtyRowService.markDirty(this._activeBuffer.y);\n if (this._coreService.decPrivateModes.origin) {\n this._activeBuffer.x = x;\n this._activeBuffer.y = this._activeBuffer.scrollTop + y;\n } else {\n this._activeBuffer.x = x;\n this._activeBuffer.y = y;\n }\n this._restrictCursor();\n this._dirtyRowService.markDirty(this._activeBuffer.y);\n }\n\n /**\n * Set relative cursor position.\n */\n private _moveCursor(x: number, y: number): void {\n // for relative changes we have to make sure we are within 0 .. cols/rows - 1\n // before calculating the new position\n this._restrictCursor();\n this._setCursor(this._activeBuffer.x + x, this._activeBuffer.y + y);\n }\n\n /**\n * CSI Ps A\n * Cursor Up Ps Times (default = 1) (CUU).\n *\n * @vt: #Y CSI CUU \"Cursor Up\" \"CSI Ps A\" \"Move cursor `Ps` times up (default=1).\"\n * If the cursor would pass the top scroll margin, it will stop there.\n */\n public cursorUp(params: IParams): boolean {\n // stop at scrollTop\n const diffToTop = this._activeBuffer.y - this._activeBuffer.scrollTop;\n if (diffToTop >= 0) {\n this._moveCursor(0, -Math.min(diffToTop, params.params[0] || 1));\n } else {\n this._moveCursor(0, -(params.params[0] || 1));\n }\n return true;\n }\n\n /**\n * CSI Ps B\n * Cursor Down Ps Times (default = 1) (CUD).\n *\n * @vt: #Y CSI CUD \"Cursor Down\" \"CSI Ps B\" \"Move cursor `Ps` times down (default=1).\"\n * If the cursor would pass the bottom scroll margin, it will stop there.\n */\n public cursorDown(params: IParams): boolean {\n // stop at scrollBottom\n const diffToBottom = this._activeBuffer.scrollBottom - this._activeBuffer.y;\n if (diffToBottom >= 0) {\n this._moveCursor(0, Math.min(diffToBottom, params.params[0] || 1));\n } else {\n this._moveCursor(0, params.params[0] || 1);\n }\n return true;\n }\n\n /**\n * CSI Ps C\n * Cursor Forward Ps Times (default = 1) (CUF).\n *\n * @vt: #Y CSI CUF \"Cursor Forward\" \"CSI Ps C\" \"Move cursor `Ps` times forward (default=1).\"\n */\n public cursorForward(params: IParams): boolean {\n this._moveCursor(params.params[0] || 1, 0);\n return true;\n }\n\n /**\n * CSI Ps D\n * Cursor Backward Ps Times (default = 1) (CUB).\n *\n * @vt: #Y CSI CUB \"Cursor Backward\" \"CSI Ps D\" \"Move cursor `Ps` times backward (default=1).\"\n */\n public cursorBackward(params: IParams): boolean {\n this._moveCursor(-(params.params[0] || 1), 0);\n return true;\n }\n\n /**\n * CSI Ps E\n * Cursor Next Line Ps Times (default = 1) (CNL).\n * Other than cursorDown (CUD) also set the cursor to first column.\n *\n * @vt: #Y CSI CNL \"Cursor Next Line\" \"CSI Ps E\" \"Move cursor `Ps` times down (default=1) and to the first column.\"\n * Same as CUD, additionally places the cursor at the first column.\n */\n public cursorNextLine(params: IParams): boolean {\n this.cursorDown(params);\n this._activeBuffer.x = 0;\n return true;\n }\n\n /**\n * CSI Ps F\n * Cursor Previous Line Ps Times (default = 1) (CPL).\n * Other than cursorUp (CUU) also set the cursor to first column.\n *\n * @vt: #Y CSI CPL \"Cursor Backward\" \"CSI Ps F\" \"Move cursor `Ps` times up (default=1) and to the first column.\"\n * Same as CUU, additionally places the cursor at the first column.\n */\n public cursorPrecedingLine(params: IParams): boolean {\n this.cursorUp(params);\n this._activeBuffer.x = 0;\n return true;\n }\n\n /**\n * CSI Ps G\n * Cursor Character Absolute [column] (default = [row,1]) (CHA).\n *\n * @vt: #Y CSI CHA \"Cursor Horizontal Absolute\" \"CSI Ps G\" \"Move cursor to `Ps`-th column of the active row (default=1).\"\n */\n public cursorCharAbsolute(params: IParams): boolean {\n this._setCursor((params.params[0] || 1) - 1, this._activeBuffer.y);\n return true;\n }\n\n /**\n * CSI Ps ; Ps H\n * Cursor Position [row;column] (default = [1,1]) (CUP).\n *\n * @vt: #Y CSI CUP \"Cursor Position\" \"CSI Ps ; Ps H\" \"Set cursor to position [`Ps`, `Ps`] (default = [1, 1]).\"\n * If ORIGIN mode is set, places the cursor to the absolute position within the scroll margins.\n * If ORIGIN mode is not set, places the cursor to the absolute position within the viewport.\n * Note that the coordinates are 1-based, thus the top left position starts at `1 ; 1`.\n */\n public cursorPosition(params: IParams): boolean {\n this._setCursor(\n // col\n (params.length >= 2) ? (params.params[1] || 1) - 1 : 0,\n // row\n (params.params[0] || 1) - 1\n );\n return true;\n }\n\n /**\n * CSI Pm ` Character Position Absolute\n * [column] (default = [row,1]) (HPA).\n * Currently same functionality as CHA.\n *\n * @vt: #Y CSI HPA \"Horizontal Position Absolute\" \"CSI Ps ` \" \"Same as CHA.\"\n */\n public charPosAbsolute(params: IParams): boolean {\n this._setCursor((params.params[0] || 1) - 1, this._activeBuffer.y);\n return true;\n }\n\n /**\n * CSI Pm a Character Position Relative\n * [columns] (default = [row,col+1]) (HPR)\n *\n * @vt: #Y CSI HPR \"Horizontal Position Relative\" \"CSI Ps a\" \"Same as CUF.\"\n */\n public hPositionRelative(params: IParams): boolean {\n this._moveCursor(params.params[0] || 1, 0);\n return true;\n }\n\n /**\n * CSI Pm d Vertical Position Absolute (VPA)\n * [row] (default = [1,column])\n *\n * @vt: #Y CSI VPA \"Vertical Position Absolute\" \"CSI Ps d\" \"Move cursor to `Ps`-th row (default=1).\"\n */\n public linePosAbsolute(params: IParams): boolean {\n this._setCursor(this._activeBuffer.x, (params.params[0] || 1) - 1);\n return true;\n }\n\n /**\n * CSI Pm e Vertical Position Relative (VPR)\n * [rows] (default = [row+1,column])\n * reuse CSI Ps B ?\n *\n * @vt: #Y CSI VPR \"Vertical Position Relative\" \"CSI Ps e\" \"Move cursor `Ps` times down (default=1).\"\n */\n public vPositionRelative(params: IParams): boolean {\n this._moveCursor(0, params.params[0] || 1);\n return true;\n }\n\n /**\n * CSI Ps ; Ps f\n * Horizontal and Vertical Position [row;column] (default =\n * [1,1]) (HVP).\n * Same as CUP.\n *\n * @vt: #Y CSI HVP \"Horizontal and Vertical Position\" \"CSI Ps ; Ps f\" \"Same as CUP.\"\n */\n public hVPosition(params: IParams): boolean {\n this.cursorPosition(params);\n return true;\n }\n\n /**\n * CSI Ps g Tab Clear (TBC).\n * Ps = 0 -> Clear Current Column (default).\n * Ps = 3 -> Clear All.\n * Potentially:\n * Ps = 2 -> Clear Stops on Line.\n * http://vt100.net/annarbor/aaa-ug/section6.html\n *\n * @vt: #Y CSI TBC \"Tab Clear\" \"CSI Ps g\" \"Clear tab stops at current position (0) or all (3) (default=0).\"\n * Clearing tabstops off the active row (Ps = 2, VT100) is currently not supported.\n */\n public tabClear(params: IParams): boolean {\n const param = params.params[0];\n if (param === 0) {\n delete this._activeBuffer.tabs[this._activeBuffer.x];\n } else if (param === 3) {\n this._activeBuffer.tabs = {};\n }\n return true;\n }\n\n /**\n * CSI Ps I\n * Cursor Forward Tabulation Ps tab stops (default = 1) (CHT).\n *\n * @vt: #Y CSI CHT \"Cursor Horizontal Tabulation\" \"CSI Ps I\" \"Move cursor `Ps` times tabs forward (default=1).\"\n */\n public cursorForwardTab(params: IParams): boolean {\n if (this._activeBuffer.x >= this._bufferService.cols) {\n return true;\n }\n let param = params.params[0] || 1;\n while (param--) {\n this._activeBuffer.x = this._activeBuffer.nextStop();\n }\n return true;\n }\n\n /**\n * CSI Ps Z Cursor Backward Tabulation Ps tab stops (default = 1) (CBT).\n *\n * @vt: #Y CSI CBT \"Cursor Backward Tabulation\" \"CSI Ps Z\" \"Move cursor `Ps` tabs backward (default=1).\"\n */\n public cursorBackwardTab(params: IParams): boolean {\n if (this._activeBuffer.x >= this._bufferService.cols) {\n return true;\n }\n let param = params.params[0] || 1;\n\n while (param--) {\n this._activeBuffer.x = this._activeBuffer.prevStop();\n }\n return true;\n }\n\n\n /**\n * Helper method to erase cells in a terminal row.\n * The cell gets replaced with the eraseChar of the terminal.\n * @param y row index\n * @param start first cell index to be erased\n * @param end end - 1 is last erased cell\n * @param cleanWrap clear the isWrapped flag\n */\n private _eraseInBufferLine(y: number, start: number, end: number, clearWrap: boolean = false): void {\n const line = this._activeBuffer.lines.get(this._activeBuffer.ybase + y)!;\n line.replaceCells(\n start,\n end,\n this._activeBuffer.getNullCell(this._eraseAttrData()),\n this._eraseAttrData()\n );\n if (clearWrap) {\n line.isWrapped = false;\n }\n }\n\n /**\n * Helper method to reset cells in a terminal row.\n * The cell gets replaced with the eraseChar of the terminal and the isWrapped property is set to false.\n * @param y row index\n */\n private _resetBufferLine(y: number): void {\n const line = this._activeBuffer.lines.get(this._activeBuffer.ybase + y)!;\n line.fill(this._activeBuffer.getNullCell(this._eraseAttrData()));\n this._bufferService.buffer.clearMarkers(this._activeBuffer.ybase + y);\n line.isWrapped = false;\n }\n\n /**\n * CSI Ps J Erase in Display (ED).\n * Ps = 0 -> Erase Below (default).\n * Ps = 1 -> Erase Above.\n * Ps = 2 -> Erase All.\n * Ps = 3 -> Erase Saved Lines (xterm).\n * CSI ? Ps J\n * Erase in Display (DECSED).\n * Ps = 0 -> Selective Erase Below (default).\n * Ps = 1 -> Selective Erase Above.\n * Ps = 2 -> Selective Erase All.\n *\n * @vt: #Y CSI ED \"Erase In Display\" \"CSI Ps J\" \"Erase various parts of the viewport.\"\n * Supported param values:\n *\n * | Ps | Effect |\n * | -- | ------------------------------------------------------------ |\n * | 0 | Erase from the cursor through the end of the viewport. |\n * | 1 | Erase from the beginning of the viewport through the cursor. |\n * | 2 | Erase complete viewport. |\n * | 3 | Erase scrollback. |\n *\n * @vt: #P[Protection attributes are not supported.] CSI DECSED \"Selective Erase In Display\" \"CSI ? Ps J\" \"Currently the same as ED.\"\n */\n public eraseInDisplay(params: IParams): boolean {\n this._restrictCursor(this._bufferService.cols);\n let j;\n switch (params.params[0]) {\n case 0:\n j = this._activeBuffer.y;\n this._dirtyRowService.markDirty(j);\n this._eraseInBufferLine(j++, this._activeBuffer.x, this._bufferService.cols, this._activeBuffer.x === 0);\n for (; j < this._bufferService.rows; j++) {\n this._resetBufferLine(j);\n }\n this._dirtyRowService.markDirty(j);\n break;\n case 1:\n j = this._activeBuffer.y;\n this._dirtyRowService.markDirty(j);\n // Deleted front part of line and everything before. This line will no longer be wrapped.\n this._eraseInBufferLine(j, 0, this._activeBuffer.x + 1, true);\n if (this._activeBuffer.x + 1 >= this._bufferService.cols) {\n // Deleted entire previous line. This next line can no longer be wrapped.\n this._activeBuffer.lines.get(j + 1)!.isWrapped = false;\n }\n while (j--) {\n this._resetBufferLine(j);\n }\n this._dirtyRowService.markDirty(0);\n break;\n case 2:\n j = this._bufferService.rows;\n this._dirtyRowService.markDirty(j - 1);\n while (j--) {\n this._resetBufferLine(j);\n }\n this._dirtyRowService.markDirty(0);\n break;\n case 3:\n // Clear scrollback (everything not in viewport)\n const scrollBackSize = this._activeBuffer.lines.length - this._bufferService.rows;\n if (scrollBackSize > 0) {\n this._activeBuffer.lines.trimStart(scrollBackSize);\n this._activeBuffer.ybase = Math.max(this._activeBuffer.ybase - scrollBackSize, 0);\n this._activeBuffer.ydisp = Math.max(this._activeBuffer.ydisp - scrollBackSize, 0);\n // Force a scroll event to refresh viewport\n this._onScroll.fire(0);\n }\n break;\n }\n return true;\n }\n\n /**\n * CSI Ps K Erase in Line (EL).\n * Ps = 0 -> Erase to Right (default).\n * Ps = 1 -> Erase to Left.\n * Ps = 2 -> Erase All.\n * CSI ? Ps K\n * Erase in Line (DECSEL).\n * Ps = 0 -> Selective Erase to Right (default).\n * Ps = 1 -> Selective Erase to Left.\n * Ps = 2 -> Selective Erase All.\n *\n * @vt: #Y CSI EL \"Erase In Line\" \"CSI Ps K\" \"Erase various parts of the active row.\"\n * Supported param values:\n *\n * | Ps | Effect |\n * | -- | -------------------------------------------------------- |\n * | 0 | Erase from the cursor through the end of the row. |\n * | 1 | Erase from the beginning of the line through the cursor. |\n * | 2 | Erase complete line. |\n *\n * @vt: #P[Protection attributes are not supported.] CSI DECSEL \"Selective Erase In Line\" \"CSI ? Ps K\" \"Currently the same as EL.\"\n */\n public eraseInLine(params: IParams): boolean {\n this._restrictCursor(this._bufferService.cols);\n switch (params.params[0]) {\n case 0:\n this._eraseInBufferLine(this._activeBuffer.y, this._activeBuffer.x, this._bufferService.cols, this._activeBuffer.x === 0);\n break;\n case 1:\n this._eraseInBufferLine(this._activeBuffer.y, 0, this._activeBuffer.x + 1, false);\n break;\n case 2:\n this._eraseInBufferLine(this._activeBuffer.y, 0, this._bufferService.cols, true);\n break;\n }\n this._dirtyRowService.markDirty(this._activeBuffer.y);\n return true;\n }\n\n /**\n * CSI Ps L\n * Insert Ps Line(s) (default = 1) (IL).\n *\n * @vt: #Y CSI IL \"Insert Line\" \"CSI Ps L\" \"Insert `Ps` blank lines at active row (default=1).\"\n * For every inserted line at the scroll top one line at the scroll bottom gets removed.\n * The cursor is set to the first column.\n * IL has no effect if the cursor is outside the scroll margins.\n */\n public insertLines(params: IParams): boolean {\n this._restrictCursor();\n let param = params.params[0] || 1;\n\n if (this._activeBuffer.y > this._activeBuffer.scrollBottom || this._activeBuffer.y < this._activeBuffer.scrollTop) {\n return true;\n }\n\n const row: number = this._activeBuffer.ybase + this._activeBuffer.y;\n\n const scrollBottomRowsOffset = this._bufferService.rows - 1 - this._activeBuffer.scrollBottom;\n const scrollBottomAbsolute = this._bufferService.rows - 1 + this._activeBuffer.ybase - scrollBottomRowsOffset + 1;\n while (param--) {\n // test: echo -e '\\e[44m\\e[1L\\e[0m'\n // blankLine(true) - xterm/linux behavior\n this._activeBuffer.lines.splice(scrollBottomAbsolute - 1, 1);\n this._activeBuffer.lines.splice(row, 0, this._activeBuffer.getBlankLine(this._eraseAttrData()));\n }\n\n this._dirtyRowService.markRangeDirty(this._activeBuffer.y, this._activeBuffer.scrollBottom);\n this._activeBuffer.x = 0; // see https://vt100.net/docs/vt220-rm/chapter4.html - vt220 only?\n return true;\n }\n\n /**\n * CSI Ps M\n * Delete Ps Line(s) (default = 1) (DL).\n *\n * @vt: #Y CSI DL \"Delete Line\" \"CSI Ps M\" \"Delete `Ps` lines at active row (default=1).\"\n * For every deleted line at the scroll top one blank line at the scroll bottom gets appended.\n * The cursor is set to the first column.\n * DL has no effect if the cursor is outside the scroll margins.\n */\n public deleteLines(params: IParams): boolean {\n this._restrictCursor();\n let param = params.params[0] || 1;\n\n if (this._activeBuffer.y > this._activeBuffer.scrollBottom || this._activeBuffer.y < this._activeBuffer.scrollTop) {\n return true;\n }\n\n const row: number = this._activeBuffer.ybase + this._activeBuffer.y;\n\n let j: number;\n j = this._bufferService.rows - 1 - this._activeBuffer.scrollBottom;\n j = this._bufferService.rows - 1 + this._activeBuffer.ybase - j;\n while (param--) {\n // test: echo -e '\\e[44m\\e[1M\\e[0m'\n // blankLine(true) - xterm/linux behavior\n this._activeBuffer.lines.splice(row, 1);\n this._activeBuffer.lines.splice(j, 0, this._activeBuffer.getBlankLine(this._eraseAttrData()));\n }\n\n this._dirtyRowService.markRangeDirty(this._activeBuffer.y, this._activeBuffer.scrollBottom);\n this._activeBuffer.x = 0; // see https://vt100.net/docs/vt220-rm/chapter4.html - vt220 only?\n return true;\n }\n\n /**\n * CSI Ps @\n * Insert Ps (Blank) Character(s) (default = 1) (ICH).\n *\n * @vt: #Y CSI ICH \"Insert Characters\" \"CSI Ps @\" \"Insert `Ps` (blank) characters (default = 1).\"\n * The ICH sequence inserts `Ps` blank characters. The cursor remains at the beginning of the blank characters.\n * Text between the cursor and right margin moves to the right. Characters moved past the right margin are lost.\n *\n *\n * FIXME: check against xterm - should not work outside of scroll margins (see VT520 manual)\n */\n public insertChars(params: IParams): boolean {\n this._restrictCursor();\n const line = this._activeBuffer.lines.get(this._activeBuffer.ybase + this._activeBuffer.y);\n if (line) {\n line.insertCells(\n this._activeBuffer.x,\n params.params[0] || 1,\n this._activeBuffer.getNullCell(this._eraseAttrData()),\n this._eraseAttrData()\n );\n this._dirtyRowService.markDirty(this._activeBuffer.y);\n }\n return true;\n }\n\n /**\n * CSI Ps P\n * Delete Ps Character(s) (default = 1) (DCH).\n *\n * @vt: #Y CSI DCH \"Delete Character\" \"CSI Ps P\" \"Delete `Ps` characters (default=1).\"\n * As characters are deleted, the remaining characters between the cursor and right margin move to the left.\n * Character attributes move with the characters. The terminal adds blank characters at the right margin.\n *\n *\n * FIXME: check against xterm - should not work outside of scroll margins (see VT520 manual)\n */\n public deleteChars(params: IParams): boolean {\n this._restrictCursor();\n const line = this._activeBuffer.lines.get(this._activeBuffer.ybase + this._activeBuffer.y);\n if (line) {\n line.deleteCells(\n this._activeBuffer.x,\n params.params[0] || 1,\n this._activeBuffer.getNullCell(this._eraseAttrData()),\n this._eraseAttrData()\n );\n this._dirtyRowService.markDirty(this._activeBuffer.y);\n }\n return true;\n }\n\n /**\n * CSI Ps S Scroll up Ps lines (default = 1) (SU).\n *\n * @vt: #Y CSI SU \"Scroll Up\" \"CSI Ps S\" \"Scroll `Ps` lines up (default=1).\"\n *\n *\n * FIXME: scrolled out lines at top = 1 should add to scrollback (xterm)\n */\n public scrollUp(params: IParams): boolean {\n let param = params.params[0] || 1;\n\n while (param--) {\n this._activeBuffer.lines.splice(this._activeBuffer.ybase + this._activeBuffer.scrollTop, 1);\n this._activeBuffer.lines.splice(this._activeBuffer.ybase + this._activeBuffer.scrollBottom, 0, this._activeBuffer.getBlankLine(this._eraseAttrData()));\n }\n this._dirtyRowService.markRangeDirty(this._activeBuffer.scrollTop, this._activeBuffer.scrollBottom);\n return true;\n }\n\n /**\n * CSI Ps T Scroll down Ps lines (default = 1) (SD).\n *\n * @vt: #Y CSI SD \"Scroll Down\" \"CSI Ps T\" \"Scroll `Ps` lines down (default=1).\"\n */\n public scrollDown(params: IParams): boolean {\n let param = params.params[0] || 1;\n\n while (param--) {\n this._activeBuffer.lines.splice(this._activeBuffer.ybase + this._activeBuffer.scrollBottom, 1);\n this._activeBuffer.lines.splice(this._activeBuffer.ybase + this._activeBuffer.scrollTop, 0, this._activeBuffer.getBlankLine(DEFAULT_ATTR_DATA));\n }\n this._dirtyRowService.markRangeDirty(this._activeBuffer.scrollTop, this._activeBuffer.scrollBottom);\n return true;\n }\n\n /**\n * CSI Ps SP @ Scroll left Ps columns (default = 1) (SL) ECMA-48\n *\n * Notation: (Pn)\n * Representation: CSI Pn 02/00 04/00\n * Parameter default value: Pn = 1\n * SL causes the data in the presentation component to be moved by n character positions\n * if the line orientation is horizontal, or by n line positions if the line orientation\n * is vertical, such that the data appear to move to the left; where n equals the value of Pn.\n * The active presentation position is not affected by this control function.\n *\n * Supported:\n * - always left shift (no line orientation setting respected)\n *\n * @vt: #Y CSI SL \"Scroll Left\" \"CSI Ps SP @\" \"Scroll viewport `Ps` times to the left.\"\n * SL moves the content of all lines within the scroll margins `Ps` times to the left.\n * SL has no effect outside of the scroll margins.\n */\n public scrollLeft(params: IParams): boolean {\n if (this._activeBuffer.y > this._activeBuffer.scrollBottom || this._activeBuffer.y < this._activeBuffer.scrollTop) {\n return true;\n }\n const param = params.params[0] || 1;\n for (let y = this._activeBuffer.scrollTop; y <= this._activeBuffer.scrollBottom; ++y) {\n const line = this._activeBuffer.lines.get(this._activeBuffer.ybase + y)!;\n line.deleteCells(0, param, this._activeBuffer.getNullCell(this._eraseAttrData()), this._eraseAttrData());\n line.isWrapped = false;\n }\n this._dirtyRowService.markRangeDirty(this._activeBuffer.scrollTop, this._activeBuffer.scrollBottom);\n return true;\n }\n\n /**\n * CSI Ps SP A Scroll right Ps columns (default = 1) (SR) ECMA-48\n *\n * Notation: (Pn)\n * Representation: CSI Pn 02/00 04/01\n * Parameter default value: Pn = 1\n * SR causes the data in the presentation component to be moved by n character positions\n * if the line orientation is horizontal, or by n line positions if the line orientation\n * is vertical, such that the data appear to move to the right; where n equals the value of Pn.\n * The active presentation position is not affected by this control function.\n *\n * Supported:\n * - always right shift (no line orientation setting respected)\n *\n * @vt: #Y CSI SR \"Scroll Right\" \"CSI Ps SP A\" \"Scroll viewport `Ps` times to the right.\"\n * SL moves the content of all lines within the scroll margins `Ps` times to the right.\n * Content at the right margin is lost.\n * SL has no effect outside of the scroll margins.\n */\n public scrollRight(params: IParams): boolean {\n if (this._activeBuffer.y > this._activeBuffer.scrollBottom || this._activeBuffer.y < this._activeBuffer.scrollTop) {\n return true;\n }\n const param = params.params[0] || 1;\n for (let y = this._activeBuffer.scrollTop; y <= this._activeBuffer.scrollBottom; ++y) {\n const line = this._activeBuffer.lines.get(this._activeBuffer.ybase + y)!;\n line.insertCells(0, param, this._activeBuffer.getNullCell(this._eraseAttrData()), this._eraseAttrData());\n line.isWrapped = false;\n }\n this._dirtyRowService.markRangeDirty(this._activeBuffer.scrollTop, this._activeBuffer.scrollBottom);\n return true;\n }\n\n /**\n * CSI Pm ' }\n * Insert Ps Column(s) (default = 1) (DECIC), VT420 and up.\n *\n * @vt: #Y CSI DECIC \"Insert Columns\" \"CSI Ps ' }\" \"Insert `Ps` columns at cursor position.\"\n * DECIC inserts `Ps` times blank columns at the cursor position for all lines with the scroll margins,\n * moving content to the right. Content at the right margin is lost.\n * DECIC has no effect outside the scrolling margins.\n */\n public insertColumns(params: IParams): boolean {\n if (this._activeBuffer.y > this._activeBuffer.scrollBottom || this._activeBuffer.y < this._activeBuffer.scrollTop) {\n return true;\n }\n const param = params.params[0] || 1;\n for (let y = this._activeBuffer.scrollTop; y <= this._activeBuffer.scrollBottom; ++y) {\n const line = this._activeBuffer.lines.get(this._activeBuffer.ybase + y)!;\n line.insertCells(this._activeBuffer.x, param, this._activeBuffer.getNullCell(this._eraseAttrData()), this._eraseAttrData());\n line.isWrapped = false;\n }\n this._dirtyRowService.markRangeDirty(this._activeBuffer.scrollTop, this._activeBuffer.scrollBottom);\n return true;\n }\n\n /**\n * CSI Pm ' ~\n * Delete Ps Column(s) (default = 1) (DECDC), VT420 and up.\n *\n * @vt: #Y CSI DECDC \"Delete Columns\" \"CSI Ps ' ~\" \"Delete `Ps` columns at cursor position.\"\n * DECDC deletes `Ps` times columns at the cursor position for all lines with the scroll margins,\n * moving content to the left. Blank columns are added at the right margin.\n * DECDC has no effect outside the scrolling margins.\n */\n public deleteColumns(params: IParams): boolean {\n if (this._activeBuffer.y > this._activeBuffer.scrollBottom || this._activeBuffer.y < this._activeBuffer.scrollTop) {\n return true;\n }\n const param = params.params[0] || 1;\n for (let y = this._activeBuffer.scrollTop; y <= this._activeBuffer.scrollBottom; ++y) {\n const line = this._activeBuffer.lines.get(this._activeBuffer.ybase + y)!;\n line.deleteCells(this._activeBuffer.x, param, this._activeBuffer.getNullCell(this._eraseAttrData()), this._eraseAttrData());\n line.isWrapped = false;\n }\n this._dirtyRowService.markRangeDirty(this._activeBuffer.scrollTop, this._activeBuffer.scrollBottom);\n return true;\n }\n\n /**\n * CSI Ps X\n * Erase Ps Character(s) (default = 1) (ECH).\n *\n * @vt: #Y CSI ECH \"Erase Character\" \"CSI Ps X\" \"Erase `Ps` characters from current cursor position to the right (default=1).\"\n * ED erases `Ps` characters from current cursor position to the right.\n * ED works inside or outside the scrolling margins.\n */\n public eraseChars(params: IParams): boolean {\n this._restrictCursor();\n const line = this._activeBuffer.lines.get(this._activeBuffer.ybase + this._activeBuffer.y);\n if (line) {\n line.replaceCells(\n this._activeBuffer.x,\n this._activeBuffer.x + (params.params[0] || 1),\n this._activeBuffer.getNullCell(this._eraseAttrData()),\n this._eraseAttrData()\n );\n this._dirtyRowService.markDirty(this._activeBuffer.y);\n }\n return true;\n }\n\n /**\n * CSI Ps b Repeat the preceding graphic character Ps times (REP).\n * From ECMA 48 (@see http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-048.pdf)\n * Notation: (Pn)\n * Representation: CSI Pn 06/02\n * Parameter default value: Pn = 1\n * REP is used to indicate that the preceding character in the data stream,\n * if it is a graphic character (represented by one or more bit combinations) including SPACE,\n * is to be repeated n times, where n equals the value of Pn.\n * If the character preceding REP is a control function or part of a control function,\n * the effect of REP is not defined by this Standard.\n *\n * Since we propagate the terminal as xterm-256color we have to follow xterm's behavior:\n * - fullwidth + surrogate chars are ignored\n * - for combining chars only the base char gets repeated\n * - text attrs are applied normally\n * - wrap around is respected\n * - any valid sequence resets the carried forward char\n *\n * Note: To get reset on a valid sequence working correctly without much runtime penalty,\n * the preceding codepoint is stored on the parser in `this.print` and reset during `parser.parse`.\n *\n * @vt: #Y CSI REP \"Repeat Preceding Character\" \"CSI Ps b\" \"Repeat preceding character `Ps` times (default=1).\"\n * REP repeats the previous character `Ps` times advancing the cursor, also wrapping if DECAWM is set.\n * REP has no effect if the sequence does not follow a printable ASCII character\n * (NOOP for any other sequence in between or NON ASCII characters).\n */\n public repeatPrecedingCharacter(params: IParams): boolean {\n if (!this._parser.precedingCodepoint) {\n return true;\n }\n // call print to insert the chars and handle correct wrapping\n const length = params.params[0] || 1;\n const data = new Uint32Array(length);\n for (let i = 0; i < length; ++i) {\n data[i] = this._parser.precedingCodepoint;\n }\n this.print(data, 0, data.length);\n return true;\n }\n\n /**\n * CSI Ps c Send Device Attributes (Primary DA).\n * Ps = 0 or omitted -> request attributes from terminal. The\n * response depends on the decTerminalID resource setting.\n * -> CSI ? 1 ; 2 c (``VT100 with Advanced Video Option'')\n * -> CSI ? 1 ; 0 c (``VT101 with No Options'')\n * -> CSI ? 6 c (``VT102'')\n * -> CSI ? 6 0 ; 1 ; 2 ; 6 ; 8 ; 9 ; 1 5 ; c (``VT220'')\n * The VT100-style response parameters do not mean anything by\n * themselves. VT220 parameters do, telling the host what fea-\n * tures the terminal supports:\n * Ps = 1 -> 132-columns.\n * Ps = 2 -> Printer.\n * Ps = 6 -> Selective erase.\n * Ps = 8 -> User-defined keys.\n * Ps = 9 -> National replacement character sets.\n * Ps = 1 5 -> Technical characters.\n * Ps = 2 2 -> ANSI color, e.g., VT525.\n * Ps = 2 9 -> ANSI text locator (i.e., DEC Locator mode).\n *\n * @vt: #Y CSI DA1 \"Primary Device Attributes\" \"CSI c\" \"Send primary device attributes.\"\n *\n *\n * TODO: fix and cleanup response\n */\n public sendDeviceAttributesPrimary(params: IParams): boolean {\n if (params.params[0] > 0) {\n return true;\n }\n if (this._is('xterm') || this._is('rxvt-unicode') || this._is('screen')) {\n this._coreService.triggerDataEvent(C0.ESC + '[?1;2c');\n } else if (this._is('linux')) {\n this._coreService.triggerDataEvent(C0.ESC + '[?6c');\n }\n return true;\n }\n\n /**\n * CSI > Ps c\n * Send Device Attributes (Secondary DA).\n * Ps = 0 or omitted -> request the terminal's identification\n * code. The response depends on the decTerminalID resource set-\n * ting. It should apply only to VT220 and up, but xterm extends\n * this to VT100.\n * -> CSI > Pp ; Pv ; Pc c\n * where Pp denotes the terminal type\n * Pp = 0 -> ``VT100''.\n * Pp = 1 -> ``VT220''.\n * and Pv is the firmware version (for xterm, this was originally\n * the XFree86 patch number, starting with 95). In a DEC termi-\n * nal, Pc indicates the ROM cartridge registration number and is\n * always zero.\n * More information:\n * xterm/charproc.c - line 2012, for more information.\n * vim responds with ^[[?0c or ^[[?1c after the terminal's response (?)\n *\n * @vt: #Y CSI DA2 \"Secondary Device Attributes\" \"CSI > c\" \"Send primary device attributes.\"\n *\n *\n * TODO: fix and cleanup response\n */\n public sendDeviceAttributesSecondary(params: IParams): boolean {\n if (params.params[0] > 0) {\n return true;\n }\n // xterm and urxvt\n // seem to spit this\n // out around ~370 times (?).\n if (this._is('xterm')) {\n this._coreService.triggerDataEvent(C0.ESC + '[>0;276;0c');\n } else if (this._is('rxvt-unicode')) {\n this._coreService.triggerDataEvent(C0.ESC + '[>85;95;0c');\n } else if (this._is('linux')) {\n // not supported by linux console.\n // linux console echoes parameters.\n this._coreService.triggerDataEvent(params.params[0] + 'c');\n } else if (this._is('screen')) {\n this._coreService.triggerDataEvent(C0.ESC + '[>83;40003;0c');\n }\n return true;\n }\n\n /**\n * Evaluate if the current terminal is the given argument.\n * @param term The terminal name to evaluate\n */\n private _is(term: string): boolean {\n return (this._optionsService.rawOptions.termName + '').indexOf(term) === 0;\n }\n\n /**\n * CSI Pm h Set Mode (SM).\n * Ps = 2 -> Keyboard Action Mode (AM).\n * Ps = 4 -> Insert Mode (IRM).\n * Ps = 1 2 -> Send/receive (SRM).\n * Ps = 2 0 -> Automatic Newline (LNM).\n *\n * @vt: #P[Only IRM is supported.] CSI SM \"Set Mode\" \"CSI Pm h\" \"Set various terminal modes.\"\n * Supported param values by SM:\n *\n * | Param | Action | Support |\n * | ----- | -------------------------------------- | ------- |\n * | 2 | Keyboard Action Mode (KAM). Always on. | #N |\n * | 4 | Insert Mode (IRM). | #Y |\n * | 12 | Send/receive (SRM). Always off. | #N |\n * | 20 | Automatic Newline (LNM). Always off. | #N |\n */\n public setMode(params: IParams): boolean {\n for (let i = 0; i < params.length; i++) {\n switch (params.params[i]) {\n case 4:\n this._coreService.modes.insertMode = true;\n break;\n case 20:\n // this._t.convertEol = true;\n break;\n }\n }\n return true;\n }\n\n /**\n * CSI ? Pm h\n * DEC Private Mode Set (DECSET).\n * Ps = 1 -> Application Cursor Keys (DECCKM).\n * Ps = 2 -> Designate USASCII for character sets G0-G3\n * (DECANM), and set VT100 mode.\n * Ps = 3 -> 132 Column Mode (DECCOLM).\n * Ps = 4 -> Smooth (Slow) Scroll (DECSCLM).\n * Ps = 5 -> Reverse Video (DECSCNM).\n * Ps = 6 -> Origin Mode (DECOM).\n * Ps = 7 -> Wraparound Mode (DECAWM).\n * Ps = 8 -> Auto-repeat Keys (DECARM).\n * Ps = 9 -> Send Mouse X & Y on button press. See the sec-\n * tion Mouse Tracking.\n * Ps = 1 0 -> Show toolbar (rxvt).\n * Ps = 1 2 -> Start Blinking Cursor (att610).\n * Ps = 1 8 -> Print form feed (DECPFF).\n * Ps = 1 9 -> Set print extent to full screen (DECPEX).\n * Ps = 2 5 -> Show Cursor (DECTCEM).\n * Ps = 3 0 -> Show scrollbar (rxvt).\n * Ps = 3 5 -> Enable font-shifting functions (rxvt).\n * Ps = 3 8 -> Enter Tektronix Mode (DECTEK).\n * Ps = 4 0 -> Allow 80 -> 132 Mode.\n * Ps = 4 1 -> more(1) fix (see curses resource).\n * Ps = 4 2 -> Enable Nation Replacement Character sets (DECN-\n * RCM).\n * Ps = 4 4 -> Turn On Margin Bell.\n * Ps = 4 5 -> Reverse-wraparound Mode.\n * Ps = 4 6 -> Start Logging. This is normally disabled by a\n * compile-time option.\n * Ps = 4 7 -> Use Alternate Screen Buffer. (This may be dis-\n * abled by the titeInhibit resource).\n * Ps = 6 6 -> Application keypad (DECNKM).\n * Ps = 6 7 -> Backarrow key sends backspace (DECBKM).\n * Ps = 1 0 0 0 -> Send Mouse X & Y on button press and\n * release. See the section Mouse Tracking.\n * Ps = 1 0 0 1 -> Use Hilite Mouse Tracking.\n * Ps = 1 0 0 2 -> Use Cell Motion Mouse Tracking.\n * Ps = 1 0 0 3 -> Use All Motion Mouse Tracking.\n * Ps = 1 0 0 4 -> Send FocusIn/FocusOut events.\n * Ps = 1 0 0 5 -> Enable Extended Mouse Mode.\n * Ps = 1 0 1 0 -> Scroll to bottom on tty output (rxvt).\n * Ps = 1 0 1 1 -> Scroll to bottom on key press (rxvt).\n * Ps = 1 0 3 4 -> Interpret \"meta\" key, sets eighth bit.\n * (enables the eightBitInput resource).\n * Ps = 1 0 3 5 -> Enable special modifiers for Alt and Num-\n * Lock keys. (This enables the numLock resource).\n * Ps = 1 0 3 6 -> Send ESC when Meta modifies a key. (This\n * enables the metaSendsEscape resource).\n * Ps = 1 0 3 7 -> Send DEL from the editing-keypad Delete\n * key.\n * Ps = 1 0 3 9 -> Send ESC when Alt modifies a key. (This\n * enables the altSendsEscape resource).\n * Ps = 1 0 4 0 -> Keep selection even if not highlighted.\n * (This enables the keepSelection resource).\n * Ps = 1 0 4 1 -> Use the CLIPBOARD selection. (This enables\n * the selectToClipboard resource).\n * Ps = 1 0 4 2 -> Enable Urgency window manager hint when\n * Control-G is received. (This enables the bellIsUrgent\n * resource).\n * Ps = 1 0 4 3 -> Enable raising of the window when Control-G\n * is received. (enables the popOnBell resource).\n * Ps = 1 0 4 7 -> Use Alternate Screen Buffer. (This may be\n * disabled by the titeInhibit resource).\n * Ps = 1 0 4 8 -> Save cursor as in DECSC. (This may be dis-\n * abled by the titeInhibit resource).\n * Ps = 1 0 4 9 -> Save cursor as in DECSC and use Alternate\n * Screen Buffer, clearing it first. (This may be disabled by\n * the titeInhibit resource). This combines the effects of the 1\n * 0 4 7 and 1 0 4 8 modes. Use this with terminfo-based\n * applications rather than the 4 7 mode.\n * Ps = 1 0 5 0 -> Set terminfo/termcap function-key mode.\n * Ps = 1 0 5 1 -> Set Sun function-key mode.\n * Ps = 1 0 5 2 -> Set HP function-key mode.\n * Ps = 1 0 5 3 -> Set SCO function-key mode.\n * Ps = 1 0 6 0 -> Set legacy keyboard emulation (X11R6).\n * Ps = 1 0 6 1 -> Set VT220 keyboard emulation.\n * Ps = 2 0 0 4 -> Set bracketed paste mode.\n * Modes:\n * http: *vt100.net/docs/vt220-rm/chapter4.html\n *\n * @vt: #P[See below for supported modes.] CSI DECSET \"DEC Private Set Mode\" \"CSI ? Pm h\" \"Set various terminal attributes.\"\n * Supported param values by DECSET:\n *\n * | param | Action | Support |\n * | ----- | ------------------------------------------------------- | --------|\n * | 1 | Application Cursor Keys (DECCKM). | #Y |\n * | 2 | Designate US-ASCII for character sets G0-G3 (DECANM). | #Y |\n * | 3 | 132 Column Mode (DECCOLM). | #Y |\n * | 6 | Origin Mode (DECOM). | #Y |\n * | 7 | Auto-wrap Mode (DECAWM). | #Y |\n * | 8 | Auto-repeat Keys (DECARM). Always on. | #N |\n * | 9 | X10 xterm mouse protocol. | #Y |\n * | 12 | Start Blinking Cursor. | #Y |\n * | 25 | Show Cursor (DECTCEM). | #Y |\n * | 45 | Reverse wrap-around. | #Y |\n * | 47 | Use Alternate Screen Buffer. | #Y |\n * | 66 | Application keypad (DECNKM). | #Y |\n * | 1000 | X11 xterm mouse protocol. | #Y |\n * | 1002 | Use Cell Motion Mouse Tracking. | #Y |\n * | 1003 | Use All Motion Mouse Tracking. | #Y |\n * | 1004 | Send FocusIn/FocusOut events | #Y |\n * | 1005 | Enable UTF-8 Mouse Mode. | #N |\n * | 1006 | Enable SGR Mouse Mode. | #Y |\n * | 1015 | Enable urxvt Mouse Mode. | #N |\n * | 1047 | Use Alternate Screen Buffer. | #Y |\n * | 1048 | Save cursor as in DECSC. | #Y |\n * | 1049 | Save cursor and switch to alternate buffer clearing it. | #P[Does not clear the alternate buffer.] |\n * | 2004 | Set bracketed paste mode. | #Y |\n *\n *\n * FIXME: implement DECSCNM, 1049 should clear altbuffer\n */\n public setModePrivate(params: IParams): boolean {\n for (let i = 0; i < params.length; i++) {\n switch (params.params[i]) {\n case 1:\n this._coreService.decPrivateModes.applicationCursorKeys = true;\n break;\n case 2:\n this._charsetService.setgCharset(0, DEFAULT_CHARSET);\n this._charsetService.setgCharset(1, DEFAULT_CHARSET);\n this._charsetService.setgCharset(2, DEFAULT_CHARSET);\n this._charsetService.setgCharset(3, DEFAULT_CHARSET);\n // set VT100 mode here\n break;\n case 3:\n /**\n * DECCOLM - 132 column mode.\n * This is only active if 'SetWinLines' (24) is enabled\n * through `options.windowsOptions`.\n */\n if (this._optionsService.rawOptions.windowOptions.setWinLines) {\n this._bufferService.resize(132, this._bufferService.rows);\n this._onRequestReset.fire();\n }\n break;\n case 6:\n this._coreService.decPrivateModes.origin = true;\n this._setCursor(0, 0);\n break;\n case 7:\n this._coreService.decPrivateModes.wraparound = true;\n break;\n case 12:\n // this.cursorBlink = true;\n break;\n case 45:\n this._coreService.decPrivateModes.reverseWraparound = true;\n break;\n case 66:\n this._logService.debug('Serial port requested application keypad.');\n this._coreService.decPrivateModes.applicationKeypad = true;\n this._onRequestSyncScrollBar.fire();\n break;\n case 9: // X10 Mouse\n // no release, no motion, no wheel, no modifiers.\n this._coreMouseService.activeProtocol = 'X10';\n break;\n case 1000: // vt200 mouse\n // no motion.\n this._coreMouseService.activeProtocol = 'VT200';\n break;\n case 1002: // button event mouse\n this._coreMouseService.activeProtocol = 'DRAG';\n break;\n case 1003: // any event mouse\n // any event - sends motion events,\n // even if there is no button held down.\n this._coreMouseService.activeProtocol = 'ANY';\n break;\n case 1004: // send focusin/focusout events\n // focusin: ^[[I\n // focusout: ^[[O\n this._coreService.decPrivateModes.sendFocus = true;\n this._onRequestSendFocus.fire();\n break;\n case 1005: // utf8 ext mode mouse - removed in #2507\n this._logService.debug('DECSET 1005 not supported (see #2507)');\n break;\n case 1006: // sgr ext mode mouse\n this._coreMouseService.activeEncoding = 'SGR';\n break;\n case 1015: // urxvt ext mode mouse - removed in #2507\n this._logService.debug('DECSET 1015 not supported (see #2507)');\n break;\n case 25: // show cursor\n this._coreService.isCursorHidden = false;\n break;\n case 1048: // alt screen cursor\n this.saveCursor();\n break;\n case 1049: // alt screen buffer cursor\n this.saveCursor();\n // FALL-THROUGH\n case 47: // alt screen buffer\n case 1047: // alt screen buffer\n this._bufferService.buffers.activateAltBuffer(this._eraseAttrData());\n this._coreService.isCursorInitialized = true;\n this._onRequestRefreshRows.fire(0, this._bufferService.rows - 1);\n this._onRequestSyncScrollBar.fire();\n break;\n case 2004: // bracketed paste mode (https://cirw.in/blog/bracketed-paste)\n this._coreService.decPrivateModes.bracketedPasteMode = true;\n break;\n }\n }\n return true;\n }\n\n\n /**\n * CSI Pm l Reset Mode (RM).\n * Ps = 2 -> Keyboard Action Mode (AM).\n * Ps = 4 -> Replace Mode (IRM).\n * Ps = 1 2 -> Send/receive (SRM).\n * Ps = 2 0 -> Normal Linefeed (LNM).\n *\n * @vt: #P[Only IRM is supported.] CSI RM \"Reset Mode\" \"CSI Pm l\" \"Set various terminal attributes.\"\n * Supported param values by RM:\n *\n * | Param | Action | Support |\n * | ----- | -------------------------------------- | ------- |\n * | 2 | Keyboard Action Mode (KAM). Always on. | #N |\n * | 4 | Replace Mode (IRM). (default) | #Y |\n * | 12 | Send/receive (SRM). Always off. | #N |\n * | 20 | Normal Linefeed (LNM). Always off. | #N |\n *\n *\n * FIXME: why is LNM commented out?\n */\n public resetMode(params: IParams): boolean {\n for (let i = 0; i < params.length; i++) {\n switch (params.params[i]) {\n case 4:\n this._coreService.modes.insertMode = false;\n break;\n case 20:\n // this._t.convertEol = false;\n break;\n }\n }\n return true;\n }\n\n /**\n * CSI ? Pm l\n * DEC Private Mode Reset (DECRST).\n * Ps = 1 -> Normal Cursor Keys (DECCKM).\n * Ps = 2 -> Designate VT52 mode (DECANM).\n * Ps = 3 -> 80 Column Mode (DECCOLM).\n * Ps = 4 -> Jump (Fast) Scroll (DECSCLM).\n * Ps = 5 -> Normal Video (DECSCNM).\n * Ps = 6 -> Normal Cursor Mode (DECOM).\n * Ps = 7 -> No Wraparound Mode (DECAWM).\n * Ps = 8 -> No Auto-repeat Keys (DECARM).\n * Ps = 9 -> Don't send Mouse X & Y on button press.\n * Ps = 1 0 -> Hide toolbar (rxvt).\n * Ps = 1 2 -> Stop Blinking Cursor (att610).\n * Ps = 1 8 -> Don't print form feed (DECPFF).\n * Ps = 1 9 -> Limit print to scrolling region (DECPEX).\n * Ps = 2 5 -> Hide Cursor (DECTCEM).\n * Ps = 3 0 -> Don't show scrollbar (rxvt).\n * Ps = 3 5 -> Disable font-shifting functions (rxvt).\n * Ps = 4 0 -> Disallow 80 -> 132 Mode.\n * Ps = 4 1 -> No more(1) fix (see curses resource).\n * Ps = 4 2 -> Disable Nation Replacement Character sets (DEC-\n * NRCM).\n * Ps = 4 4 -> Turn Off Margin Bell.\n * Ps = 4 5 -> No Reverse-wraparound Mode.\n * Ps = 4 6 -> Stop Logging. (This is normally disabled by a\n * compile-time option).\n * Ps = 4 7 -> Use Normal Screen Buffer.\n * Ps = 6 6 -> Numeric keypad (DECNKM).\n * Ps = 6 7 -> Backarrow key sends delete (DECBKM).\n * Ps = 1 0 0 0 -> Don't send Mouse X & Y on button press and\n * release. See the section Mouse Tracking.\n * Ps = 1 0 0 1 -> Don't use Hilite Mouse Tracking.\n * Ps = 1 0 0 2 -> Don't use Cell Motion Mouse Tracking.\n * Ps = 1 0 0 3 -> Don't use All Motion Mouse Tracking.\n * Ps = 1 0 0 4 -> Don't send FocusIn/FocusOut events.\n * Ps = 1 0 0 5 -> Disable Extended Mouse Mode.\n * Ps = 1 0 1 0 -> Don't scroll to bottom on tty output\n * (rxvt).\n * Ps = 1 0 1 1 -> Don't scroll to bottom on key press (rxvt).\n * Ps = 1 0 3 4 -> Don't interpret \"meta\" key. (This disables\n * the eightBitInput resource).\n * Ps = 1 0 3 5 -> Disable special modifiers for Alt and Num-\n * Lock keys. (This disables the numLock resource).\n * Ps = 1 0 3 6 -> Don't send ESC when Meta modifies a key.\n * (This disables the metaSendsEscape resource).\n * Ps = 1 0 3 7 -> Send VT220 Remove from the editing-keypad\n * Delete key.\n * Ps = 1 0 3 9 -> Don't send ESC when Alt modifies a key.\n * (This disables the altSendsEscape resource).\n * Ps = 1 0 4 0 -> Do not keep selection when not highlighted.\n * (This disables the keepSelection resource).\n * Ps = 1 0 4 1 -> Use the PRIMARY selection. (This disables\n * the selectToClipboard resource).\n * Ps = 1 0 4 2 -> Disable Urgency window manager hint when\n * Control-G is received. (This disables the bellIsUrgent\n * resource).\n * Ps = 1 0 4 3 -> Disable raising of the window when Control-\n * G is received. (This disables the popOnBell resource).\n * Ps = 1 0 4 7 -> Use Normal Screen Buffer, clearing screen\n * first if in the Alternate Screen. (This may be disabled by\n * the titeInhibit resource).\n * Ps = 1 0 4 8 -> Restore cursor as in DECRC. (This may be\n * disabled by the titeInhibit resource).\n * Ps = 1 0 4 9 -> Use Normal Screen Buffer and restore cursor\n * as in DECRC. (This may be disabled by the titeInhibit\n * resource). This combines the effects of the 1 0 4 7 and 1 0\n * 4 8 modes. Use this with terminfo-based applications rather\n * than the 4 7 mode.\n * Ps = 1 0 5 0 -> Reset terminfo/termcap function-key mode.\n * Ps = 1 0 5 1 -> Reset Sun function-key mode.\n * Ps = 1 0 5 2 -> Reset HP function-key mode.\n * Ps = 1 0 5 3 -> Reset SCO function-key mode.\n * Ps = 1 0 6 0 -> Reset legacy keyboard emulation (X11R6).\n * Ps = 1 0 6 1 -> Reset keyboard emulation to Sun/PC style.\n * Ps = 2 0 0 4 -> Reset bracketed paste mode.\n *\n * @vt: #P[See below for supported modes.] CSI DECRST \"DEC Private Reset Mode\" \"CSI ? Pm l\" \"Reset various terminal attributes.\"\n * Supported param values by DECRST:\n *\n * | param | Action | Support |\n * | ----- | ------------------------------------------------------- | ------- |\n * | 1 | Normal Cursor Keys (DECCKM). | #Y |\n * | 2 | Designate VT52 mode (DECANM). | #N |\n * | 3 | 80 Column Mode (DECCOLM). | #B[Switches to old column width instead of 80.] |\n * | 6 | Normal Cursor Mode (DECOM). | #Y |\n * | 7 | No Wraparound Mode (DECAWM). | #Y |\n * | 8 | No Auto-repeat Keys (DECARM). | #N |\n * | 9 | Don't send Mouse X & Y on button press. | #Y |\n * | 12 | Stop Blinking Cursor. | #Y |\n * | 25 | Hide Cursor (DECTCEM). | #Y |\n * | 45 | No reverse wrap-around. | #Y |\n * | 47 | Use Normal Screen Buffer. | #Y |\n * | 66 | Numeric keypad (DECNKM). | #Y |\n * | 1000 | Don't send Mouse reports. | #Y |\n * | 1002 | Don't use Cell Motion Mouse Tracking. | #Y |\n * | 1003 | Don't use All Motion Mouse Tracking. | #Y |\n * | 1004 | Don't send FocusIn/FocusOut events. | #Y |\n * | 1005 | Disable UTF-8 Mouse Mode. | #N |\n * | 1006 | Disable SGR Mouse Mode. | #Y |\n * | 1015 | Disable urxvt Mouse Mode. | #N |\n * | 1047 | Use Normal Screen Buffer (clearing screen if in alt). | #Y |\n * | 1048 | Restore cursor as in DECRC. | #Y |\n * | 1049 | Use Normal Screen Buffer and restore cursor. | #Y |\n * | 2004 | Reset bracketed paste mode. | #Y |\n *\n *\n * FIXME: DECCOLM is currently broken (already fixed in window options PR)\n */\n public resetModePrivate(params: IParams): boolean {\n for (let i = 0; i < params.length; i++) {\n switch (params.params[i]) {\n case 1:\n this._coreService.decPrivateModes.applicationCursorKeys = false;\n break;\n case 3:\n /**\n * DECCOLM - 80 column mode.\n * This is only active if 'SetWinLines' (24) is enabled\n * through `options.windowsOptions`.\n */\n if (this._optionsService.rawOptions.windowOptions.setWinLines) {\n this._bufferService.resize(80, this._bufferService.rows);\n this._onRequestReset.fire();\n }\n break;\n case 6:\n this._coreService.decPrivateModes.origin = false;\n this._setCursor(0, 0);\n break;\n case 7:\n this._coreService.decPrivateModes.wraparound = false;\n break;\n case 12:\n // this.cursorBlink = false;\n break;\n case 45:\n this._coreService.decPrivateModes.reverseWraparound = false;\n break;\n case 66:\n this._logService.debug('Switching back to normal keypad.');\n this._coreService.decPrivateModes.applicationKeypad = false;\n this._onRequestSyncScrollBar.fire();\n break;\n case 9: // X10 Mouse\n case 1000: // vt200 mouse\n case 1002: // button event mouse\n case 1003: // any event mouse\n this._coreMouseService.activeProtocol = 'NONE';\n break;\n case 1004: // send focusin/focusout events\n this._coreService.decPrivateModes.sendFocus = false;\n break;\n case 1005: // utf8 ext mode mouse - removed in #2507\n this._logService.debug('DECRST 1005 not supported (see #2507)');\n break;\n case 1006: // sgr ext mode mouse\n this._coreMouseService.activeEncoding = 'DEFAULT';\n break;\n case 1015: // urxvt ext mode mouse - removed in #2507\n this._logService.debug('DECRST 1015 not supported (see #2507)');\n break;\n case 25: // hide cursor\n this._coreService.isCursorHidden = true;\n break;\n case 1048: // alt screen cursor\n this.restoreCursor();\n break;\n case 1049: // alt screen buffer cursor\n // FALL-THROUGH\n case 47: // normal screen buffer\n case 1047: // normal screen buffer - clearing it first\n // Ensure the selection manager has the correct buffer\n this._bufferService.buffers.activateNormalBuffer();\n if (params.params[i] === 1049) {\n this.restoreCursor();\n }\n this._coreService.isCursorInitialized = true;\n this._onRequestRefreshRows.fire(0, this._bufferService.rows - 1);\n this._onRequestSyncScrollBar.fire();\n break;\n case 2004: // bracketed paste mode (https://cirw.in/blog/bracketed-paste)\n this._coreService.decPrivateModes.bracketedPasteMode = false;\n break;\n }\n }\n return true;\n }\n\n /**\n * Helper to write color information packed with color mode.\n */\n private _updateAttrColor(color: number, mode: number, c1: number, c2: number, c3: number): number {\n if (mode === 2) {\n color |= Attributes.CM_RGB;\n color &= ~Attributes.RGB_MASK;\n color |= AttributeData.fromColorRGB([c1, c2, c3]);\n } else if (mode === 5) {\n color &= ~(Attributes.CM_MASK | Attributes.PCOLOR_MASK);\n color |= Attributes.CM_P256 | (c1 & 0xff);\n }\n return color;\n }\n\n /**\n * Helper to extract and apply color params/subparams.\n * Returns advance for params index.\n */\n private _extractColor(params: IParams, pos: number, attr: IAttributeData): number {\n // normalize params\n // meaning: [target, CM, ign, val, val, val]\n // RGB : [ 38/48, 2, ign, r, g, b]\n // P256 : [ 38/48, 5, ign, v, ign, ign]\n const accu = [0, 0, -1, 0, 0, 0];\n\n // alignment placeholder for non color space sequences\n let cSpace = 0;\n\n // return advance we took in params\n let advance = 0;\n\n do {\n accu[advance + cSpace] = params.params[pos + advance];\n if (params.hasSubParams(pos + advance)) {\n const subparams = params.getSubParams(pos + advance)!;\n let i = 0;\n do {\n if (accu[1] === 5) {\n cSpace = 1;\n }\n accu[advance + i + 1 + cSpace] = subparams[i];\n } while (++i < subparams.length && i + advance + 1 + cSpace < accu.length);\n break;\n }\n // exit early if can decide color mode with semicolons\n if ((accu[1] === 5 && advance + cSpace >= 2)\n || (accu[1] === 2 && advance + cSpace >= 5)) {\n break;\n }\n // offset colorSpace slot for semicolon mode\n if (accu[1]) {\n cSpace = 1;\n }\n } while (++advance + pos < params.length && advance + cSpace < accu.length);\n\n // set default values to 0\n for (let i = 2; i < accu.length; ++i) {\n if (accu[i] === -1) {\n accu[i] = 0;\n }\n }\n\n // apply colors\n switch (accu[0]) {\n case 38:\n attr.fg = this._updateAttrColor(attr.fg, accu[1], accu[3], accu[4], accu[5]);\n break;\n case 48:\n attr.bg = this._updateAttrColor(attr.bg, accu[1], accu[3], accu[4], accu[5]);\n break;\n case 58:\n attr.extended = attr.extended.clone();\n attr.extended.underlineColor = this._updateAttrColor(attr.extended.underlineColor, accu[1], accu[3], accu[4], accu[5]);\n }\n\n return advance;\n }\n\n /**\n * SGR 4 subparams:\n * 4:0 - equal to SGR 24 (turn off all underline)\n * 4:1 - equal to SGR 4 (single underline)\n * 4:2 - equal to SGR 21 (double underline)\n * 4:3 - curly underline\n * 4:4 - dotted underline\n * 4:5 - dashed underline\n */\n private _processUnderline(style: number, attr: IAttributeData): void {\n // treat extended attrs as immutable, thus always clone from old one\n // this is needed since the buffer only holds references to it\n attr.extended = attr.extended.clone();\n\n // default to 1 == single underline\n if (!~style || style > 5) {\n style = 1;\n }\n attr.extended.underlineStyle = style;\n attr.fg |= FgFlags.UNDERLINE;\n\n // 0 deactivates underline\n if (style === 0) {\n attr.fg &= ~FgFlags.UNDERLINE;\n }\n\n // update HAS_EXTENDED in BG\n attr.updateExtended();\n }\n\n /**\n * CSI Pm m Character Attributes (SGR).\n *\n * @vt: #P[See below for supported attributes.] CSI SGR \"Select Graphic Rendition\" \"CSI Pm m\" \"Set/Reset various text attributes.\"\n * SGR selects one or more character attributes at the same time. Multiple params (up to 32)\n * are applied in order from left to right. The changed attributes are applied to all new\n * characters received. If you move characters in the viewport by scrolling or any other means,\n * then the attributes move with the characters.\n *\n * Supported param values by SGR:\n *\n * | Param | Meaning | Support |\n * | --------- | -------------------------------------------------------- | ------- |\n * | 0 | Normal (default). Resets any other preceding SGR. | #Y |\n * | 1 | Bold. (also see `options.drawBoldTextInBrightColors`) | #Y |\n * | 2 | Faint, decreased intensity. | #Y |\n * | 3 | Italic. | #Y |\n * | 4 | Underlined (see below for style support). | #Y |\n * | 5 | Slowly blinking. | #N |\n * | 6 | Rapidly blinking. | #N |\n * | 7 | Inverse. Flips foreground and background color. | #Y |\n * | 8 | Invisible (hidden). | #Y |\n * | 9 | Crossed-out characters (strikethrough). | #Y |\n * | 21 | Doubly underlined. | #P[Currently outputs a single underline.] |\n * | 22 | Normal (neither bold nor faint). | #Y |\n * | 23 | No italic. | #Y |\n * | 24 | Not underlined. | #Y |\n * | 25 | Steady (not blinking). | #Y |\n * | 27 | Positive (not inverse). | #Y |\n * | 28 | Visible (not hidden). | #Y |\n * | 29 | Not Crossed-out (strikethrough). | #Y |\n * | 30 | Foreground color: Black. | #Y |\n * | 31 | Foreground color: Red. | #Y |\n * | 32 | Foreground color: Green. | #Y |\n * | 33 | Foreground color: Yellow. | #Y |\n * | 34 | Foreground color: Blue. | #Y |\n * | 35 | Foreground color: Magenta. | #Y |\n * | 36 | Foreground color: Cyan. | #Y |\n * | 37 | Foreground color: White. | #Y |\n * | 38 | Foreground color: Extended color. | #P[Support for RGB and indexed colors, see below.] |\n * | 39 | Foreground color: Default (original). | #Y |\n * | 40 | Background color: Black. | #Y |\n * | 41 | Background color: Red. | #Y |\n * | 42 | Background color: Green. | #Y |\n * | 43 | Background color: Yellow. | #Y |\n * | 44 | Background color: Blue. | #Y |\n * | 45 | Background color: Magenta. | #Y |\n * | 46 | Background color: Cyan. | #Y |\n * | 47 | Background color: White. | #Y |\n * | 48 | Background color: Extended color. | #P[Support for RGB and indexed colors, see below.] |\n * | 49 | Background color: Default (original). | #Y |\n * | 90 - 97 | Bright foreground color (analogous to 30 - 37). | #Y |\n * | 100 - 107 | Bright background color (analogous to 40 - 47). | #Y |\n *\n * Underline supports subparams to denote the style in the form `4 : x`:\n *\n * | x | Meaning | Support |\n * | ------ | ------------------------------------------------------------- | ------- |\n * | 0 | No underline. Same as `SGR 24 m`. | #Y |\n * | 1 | Single underline. Same as `SGR 4 m`. | #Y |\n * | 2 | Double underline. | #P[Currently outputs a single underline.] |\n * | 3 | Curly underline. | #P[Currently outputs a single underline.] |\n * | 4 | Dotted underline. | #P[Currently outputs a single underline.] |\n * | 5 | Dashed underline. | #P[Currently outputs a single underline.] |\n * | other | Single underline. Same as `SGR 4 m`. | #Y |\n *\n * Extended colors are supported for foreground (Ps=38) and background (Ps=48) as follows:\n *\n * | Ps + 1 | Meaning | Support |\n * | ------ | ------------------------------------------------------------- | ------- |\n * | 0 | Implementation defined. | #N |\n * | 1 | Transparent. | #N |\n * | 2 | RGB color as `Ps ; 2 ; R ; G ; B` or `Ps : 2 : : R : G : B`. | #Y |\n * | 3 | CMY color. | #N |\n * | 4 | CMYK color. | #N |\n * | 5 | Indexed (256 colors) as `Ps ; 5 ; INDEX` or `Ps : 5 : INDEX`. | #Y |\n *\n *\n * FIXME: blinking is implemented in attrs, but not working in renderers?\n * FIXME: remove dead branch for p=100\n */\n public charAttributes(params: IParams): boolean {\n // Optimize a single SGR0.\n if (params.length === 1 && params.params[0] === 0) {\n this._curAttrData.fg = DEFAULT_ATTR_DATA.fg;\n this._curAttrData.bg = DEFAULT_ATTR_DATA.bg;\n return true;\n }\n\n const l = params.length;\n let p;\n const attr = this._curAttrData;\n\n for (let i = 0; i < l; i++) {\n p = params.params[i];\n if (p >= 30 && p <= 37) {\n // fg color 8\n attr.fg &= ~(Attributes.CM_MASK | Attributes.PCOLOR_MASK);\n attr.fg |= Attributes.CM_P16 | (p - 30);\n } else if (p >= 40 && p <= 47) {\n // bg color 8\n attr.bg &= ~(Attributes.CM_MASK | Attributes.PCOLOR_MASK);\n attr.bg |= Attributes.CM_P16 | (p - 40);\n } else if (p >= 90 && p <= 97) {\n // fg color 16\n attr.fg &= ~(Attributes.CM_MASK | Attributes.PCOLOR_MASK);\n attr.fg |= Attributes.CM_P16 | (p - 90) | 8;\n } else if (p >= 100 && p <= 107) {\n // bg color 16\n attr.bg &= ~(Attributes.CM_MASK | Attributes.PCOLOR_MASK);\n attr.bg |= Attributes.CM_P16 | (p - 100) | 8;\n } else if (p === 0) {\n // default\n attr.fg = DEFAULT_ATTR_DATA.fg;\n attr.bg = DEFAULT_ATTR_DATA.bg;\n } else if (p === 1) {\n // bold text\n attr.fg |= FgFlags.BOLD;\n } else if (p === 3) {\n // italic text\n attr.bg |= BgFlags.ITALIC;\n } else if (p === 4) {\n // underlined text\n attr.fg |= FgFlags.UNDERLINE;\n this._processUnderline(params.hasSubParams(i) ? params.getSubParams(i)![0] : UnderlineStyle.SINGLE, attr);\n } else if (p === 5) {\n // blink\n attr.fg |= FgFlags.BLINK;\n } else if (p === 7) {\n // inverse and positive\n // test with: echo -e '\\e[31m\\e[42mhello\\e[7mworld\\e[27mhi\\e[m'\n attr.fg |= FgFlags.INVERSE;\n } else if (p === 8) {\n // invisible\n attr.fg |= FgFlags.INVISIBLE;\n } else if (p === 9) {\n // strikethrough\n attr.fg |= FgFlags.STRIKETHROUGH;\n } else if (p === 2) {\n // dimmed text\n attr.bg |= BgFlags.DIM;\n } else if (p === 21) {\n // double underline\n this._processUnderline(UnderlineStyle.DOUBLE, attr);\n } else if (p === 22) {\n // not bold nor faint\n attr.fg &= ~FgFlags.BOLD;\n attr.bg &= ~BgFlags.DIM;\n } else if (p === 23) {\n // not italic\n attr.bg &= ~BgFlags.ITALIC;\n } else if (p === 24) {\n // not underlined\n attr.fg &= ~FgFlags.UNDERLINE;\n } else if (p === 25) {\n // not blink\n attr.fg &= ~FgFlags.BLINK;\n } else if (p === 27) {\n // not inverse\n attr.fg &= ~FgFlags.INVERSE;\n } else if (p === 28) {\n // not invisible\n attr.fg &= ~FgFlags.INVISIBLE;\n } else if (p === 29) {\n // not strikethrough\n attr.fg &= ~FgFlags.STRIKETHROUGH;\n } else if (p === 39) {\n // reset fg\n attr.fg &= ~(Attributes.CM_MASK | Attributes.RGB_MASK);\n attr.fg |= DEFAULT_ATTR_DATA.fg & (Attributes.PCOLOR_MASK | Attributes.RGB_MASK);\n } else if (p === 49) {\n // reset bg\n attr.bg &= ~(Attributes.CM_MASK | Attributes.RGB_MASK);\n attr.bg |= DEFAULT_ATTR_DATA.bg & (Attributes.PCOLOR_MASK | Attributes.RGB_MASK);\n } else if (p === 38 || p === 48 || p === 58) {\n // fg color 256 and RGB\n i += this._extractColor(params, i, attr);\n } else if (p === 59) {\n attr.extended = attr.extended.clone();\n attr.extended.underlineColor = -1;\n attr.updateExtended();\n } else if (p === 100) { // FIXME: dead branch, p=100 already handled above!\n // reset fg/bg\n attr.fg &= ~(Attributes.CM_MASK | Attributes.RGB_MASK);\n attr.fg |= DEFAULT_ATTR_DATA.fg & (Attributes.PCOLOR_MASK | Attributes.RGB_MASK);\n attr.bg &= ~(Attributes.CM_MASK | Attributes.RGB_MASK);\n attr.bg |= DEFAULT_ATTR_DATA.bg & (Attributes.PCOLOR_MASK | Attributes.RGB_MASK);\n } else {\n this._logService.debug('Unknown SGR attribute: %d.', p);\n }\n }\n return true;\n }\n\n /**\n * CSI Ps n Device Status Report (DSR).\n * Ps = 5 -> Status Report. Result (``OK'') is\n * CSI 0 n\n * Ps = 6 -> Report Cursor Position (CPR) [row;column].\n * Result is\n * CSI r ; c R\n * CSI ? Ps n\n * Device Status Report (DSR, DEC-specific).\n * Ps = 6 -> Report Cursor Position (CPR) [row;column] as CSI\n * ? r ; c R (assumes page is zero).\n * Ps = 1 5 -> Report Printer status as CSI ? 1 0 n (ready).\n * or CSI ? 1 1 n (not ready).\n * Ps = 2 5 -> Report UDK status as CSI ? 2 0 n (unlocked)\n * or CSI ? 2 1 n (locked).\n * Ps = 2 6 -> Report Keyboard status as\n * CSI ? 2 7 ; 1 ; 0 ; 0 n (North American).\n * The last two parameters apply to VT400 & up, and denote key-\n * board ready and LK01 respectively.\n * Ps = 5 3 -> Report Locator status as\n * CSI ? 5 3 n Locator available, if compiled-in, or\n * CSI ? 5 0 n No Locator, if not.\n *\n * @vt: #Y CSI DSR \"Device Status Report\" \"CSI Ps n\" \"Request cursor position (CPR) with `Ps` = 6.\"\n */\n public deviceStatus(params: IParams): boolean {\n switch (params.params[0]) {\n case 5:\n // status report\n this._coreService.triggerDataEvent(`${C0.ESC}[0n`);\n break;\n case 6:\n // cursor position\n const y = this._activeBuffer.y + 1;\n const x = this._activeBuffer.x + 1;\n this._coreService.triggerDataEvent(`${C0.ESC}[${y};${x}R`);\n break;\n }\n return true;\n }\n\n // @vt: #P[Only CPR is supported.] CSI DECDSR \"DEC Device Status Report\" \"CSI ? Ps n\" \"Only CPR is supported (same as DSR).\"\n public deviceStatusPrivate(params: IParams): boolean {\n // modern xterm doesnt seem to\n // respond to any of these except ?6, 6, and 5\n switch (params.params[0]) {\n case 6:\n // cursor position\n const y = this._activeBuffer.y + 1;\n const x = this._activeBuffer.x + 1;\n this._coreService.triggerDataEvent(`${C0.ESC}[?${y};${x}R`);\n break;\n case 15:\n // no printer\n // this.handler(C0.ESC + '[?11n');\n break;\n case 25:\n // dont support user defined keys\n // this.handler(C0.ESC + '[?21n');\n break;\n case 26:\n // north american keyboard\n // this.handler(C0.ESC + '[?27;1;0;0n');\n break;\n case 53:\n // no dec locator/mouse\n // this.handler(C0.ESC + '[?50n');\n break;\n }\n return true;\n }\n\n /**\n * CSI ! p Soft terminal reset (DECSTR).\n * http://vt100.net/docs/vt220-rm/table4-10.html\n *\n * @vt: #Y CSI DECSTR \"Soft Terminal Reset\" \"CSI ! p\" \"Reset several terminal attributes to initial state.\"\n * There are two terminal reset sequences - RIS and DECSTR. While RIS performs almost a full terminal bootstrap,\n * DECSTR only resets certain attributes. For most needs DECSTR should be sufficient.\n *\n * The following terminal attributes are reset to default values:\n * - IRM is reset (dafault = false)\n * - scroll margins are reset (default = viewport size)\n * - erase attributes are reset to default\n * - charsets are reset\n * - DECSC data is reset to initial values\n * - DECOM is reset to absolute mode\n *\n *\n * FIXME: there are several more attributes missing (see VT520 manual)\n */\n public softReset(params: IParams): boolean {\n this._coreService.isCursorHidden = false;\n this._onRequestSyncScrollBar.fire();\n this._activeBuffer.scrollTop = 0;\n this._activeBuffer.scrollBottom = this._bufferService.rows - 1;\n this._curAttrData = DEFAULT_ATTR_DATA.clone();\n this._coreService.reset();\n this._charsetService.reset();\n\n // reset DECSC data\n this._activeBuffer.savedX = 0;\n this._activeBuffer.savedY = this._activeBuffer.ybase;\n this._activeBuffer.savedCurAttrData.fg = this._curAttrData.fg;\n this._activeBuffer.savedCurAttrData.bg = this._curAttrData.bg;\n this._activeBuffer.savedCharset = this._charsetService.charset;\n\n // reset DECOM\n this._coreService.decPrivateModes.origin = false;\n return true;\n }\n\n /**\n * CSI Ps SP q Set cursor style (DECSCUSR, VT520).\n * Ps = 0 -> blinking block.\n * Ps = 1 -> blinking block (default).\n * Ps = 2 -> steady block.\n * Ps = 3 -> blinking underline.\n * Ps = 4 -> steady underline.\n * Ps = 5 -> blinking bar (xterm).\n * Ps = 6 -> steady bar (xterm).\n *\n * @vt: #Y CSI DECSCUSR \"Set Cursor Style\" \"CSI Ps SP q\" \"Set cursor style.\"\n * Supported cursor styles:\n * - empty, 0 or 1: steady block\n * - 2: blink block\n * - 3: steady underline\n * - 4: blink underline\n * - 5: steady bar\n * - 6: blink bar\n */\n public setCursorStyle(params: IParams): boolean {\n const param = params.params[0] || 1;\n switch (param) {\n case 1:\n case 2:\n this._optionsService.options.cursorStyle = 'block';\n break;\n case 3:\n case 4:\n this._optionsService.options.cursorStyle = 'underline';\n break;\n case 5:\n case 6:\n this._optionsService.options.cursorStyle = 'bar';\n break;\n }\n const isBlinking = param % 2 === 1;\n this._optionsService.options.cursorBlink = isBlinking;\n return true;\n }\n\n /**\n * CSI Ps ; Ps r\n * Set Scrolling Region [top;bottom] (default = full size of win-\n * dow) (DECSTBM).\n *\n * @vt: #Y CSI DECSTBM \"Set Top and Bottom Margin\" \"CSI Ps ; Ps r\" \"Set top and bottom margins of the viewport [top;bottom] (default = viewport size).\"\n */\n public setScrollRegion(params: IParams): boolean {\n const top = params.params[0] || 1;\n let bottom: number;\n\n if (params.length < 2 || (bottom = params.params[1]) > this._bufferService.rows || bottom === 0) {\n bottom = this._bufferService.rows;\n }\n\n if (bottom > top) {\n this._activeBuffer.scrollTop = top - 1;\n this._activeBuffer.scrollBottom = bottom - 1;\n this._setCursor(0, 0);\n }\n return true;\n }\n\n /**\n * CSI Ps ; Ps ; Ps t - Various window manipulations and reports (xterm)\n *\n * Note: Only those listed below are supported. All others are left to integrators and\n * need special treatment based on the embedding environment.\n *\n * Ps = 1 4 supported\n * Report xterm text area size in pixels.\n * Result is CSI 4 ; height ; width t\n * Ps = 14 ; 2 not implemented\n * Ps = 16 supported\n * Report xterm character cell size in pixels.\n * Result is CSI 6 ; height ; width t\n * Ps = 18 supported\n * Report the size of the text area in characters.\n * Result is CSI 8 ; height ; width t\n * Ps = 20 supported\n * Report xterm window's icon label.\n * Result is OSC L label ST\n * Ps = 21 supported\n * Report xterm window's title.\n * Result is OSC l label ST\n * Ps = 22 ; 0 -> Save xterm icon and window title on stack. supported\n * Ps = 22 ; 1 -> Save xterm icon title on stack. supported\n * Ps = 22 ; 2 -> Save xterm window title on stack. supported\n * Ps = 23 ; 0 -> Restore xterm icon and window title from stack. supported\n * Ps = 23 ; 1 -> Restore xterm icon title from stack. supported\n * Ps = 23 ; 2 -> Restore xterm window title from stack. supported\n * Ps >= 24 not implemented\n */\n public windowOptions(params: IParams): boolean {\n if (!paramToWindowOption(params.params[0], this._optionsService.rawOptions.windowOptions)) {\n return true;\n }\n const second = (params.length > 1) ? params.params[1] : 0;\n switch (params.params[0]) {\n case 14: // GetWinSizePixels, returns CSI 4 ; height ; width t\n if (second !== 2) {\n this._onRequestWindowsOptionsReport.fire(WindowsOptionsReportType.GET_WIN_SIZE_PIXELS);\n }\n break;\n case 16: // GetCellSizePixels, returns CSI 6 ; height ; width t\n this._onRequestWindowsOptionsReport.fire(WindowsOptionsReportType.GET_CELL_SIZE_PIXELS);\n break;\n case 18: // GetWinSizeChars, returns CSI 8 ; height ; width t\n if (this._bufferService) {\n this._coreService.triggerDataEvent(`${C0.ESC}[8;${this._bufferService.rows};${this._bufferService.cols}t`);\n }\n break;\n case 22: // PushTitle\n if (second === 0 || second === 2) {\n this._windowTitleStack.push(this._windowTitle);\n if (this._windowTitleStack.length > STACK_LIMIT) {\n this._windowTitleStack.shift();\n }\n }\n if (second === 0 || second === 1) {\n this._iconNameStack.push(this._iconName);\n if (this._iconNameStack.length > STACK_LIMIT) {\n this._iconNameStack.shift();\n }\n }\n break;\n case 23: // PopTitle\n if (second === 0 || second === 2) {\n if (this._windowTitleStack.length) {\n this.setTitle(this._windowTitleStack.pop()!);\n }\n }\n if (second === 0 || second === 1) {\n if (this._iconNameStack.length) {\n this.setIconName(this._iconNameStack.pop()!);\n }\n }\n break;\n }\n return true;\n }\n\n\n /**\n * CSI s\n * ESC 7\n * Save cursor (ANSI.SYS).\n *\n * @vt: #P[TODO...] CSI SCOSC \"Save Cursor\" \"CSI s\" \"Save cursor position, charmap and text attributes.\"\n * @vt: #Y ESC SC \"Save Cursor\" \"ESC 7\" \"Save cursor position, charmap and text attributes.\"\n */\n public saveCursor(params?: IParams): boolean {\n this._activeBuffer.savedX = this._activeBuffer.x;\n this._activeBuffer.savedY = this._activeBuffer.ybase + this._activeBuffer.y;\n this._activeBuffer.savedCurAttrData.fg = this._curAttrData.fg;\n this._activeBuffer.savedCurAttrData.bg = this._curAttrData.bg;\n this._activeBuffer.savedCharset = this._charsetService.charset;\n return true;\n }\n\n\n /**\n * CSI u\n * ESC 8\n * Restore cursor (ANSI.SYS).\n *\n * @vt: #P[TODO...] CSI SCORC \"Restore Cursor\" \"CSI u\" \"Restore cursor position, charmap and text attributes.\"\n * @vt: #Y ESC RC \"Restore Cursor\" \"ESC 8\" \"Restore cursor position, charmap and text attributes.\"\n */\n public restoreCursor(params?: IParams): boolean {\n this._activeBuffer.x = this._activeBuffer.savedX || 0;\n this._activeBuffer.y = Math.max(this._activeBuffer.savedY - this._activeBuffer.ybase, 0);\n this._curAttrData.fg = this._activeBuffer.savedCurAttrData.fg;\n this._curAttrData.bg = this._activeBuffer.savedCurAttrData.bg;\n this._charsetService.charset = (this as any)._savedCharset;\n if (this._activeBuffer.savedCharset) {\n this._charsetService.charset = this._activeBuffer.savedCharset;\n }\n this._restrictCursor();\n return true;\n }\n\n\n /**\n * OSC 2; <data> ST (set window title)\n * Proxy to set window title.\n *\n * @vt: #P[Icon name is not exposed.] OSC 0 \"Set Windows Title and Icon Name\" \"OSC 0 ; Pt BEL\" \"Set window title and icon name.\"\n * Icon name is not supported. For Window Title see below.\n *\n * @vt: #Y OSC 2 \"Set Windows Title\" \"OSC 2 ; Pt BEL\" \"Set window title.\"\n * xterm.js does not manipulate the title directly, instead exposes changes via the event `Terminal.onTitleChange`.\n */\n public setTitle(data: string): boolean {\n this._windowTitle = data;\n this._onTitleChange.fire(data);\n return true;\n }\n\n /**\n * OSC 1; <data> ST\n * Note: Icon name is not exposed.\n */\n public setIconName(data: string): boolean {\n this._iconName = data;\n return true;\n }\n\n /**\n * OSC 4; <num> ; <text> ST (set ANSI color <num> to <text>)\n *\n * @vt: #Y OSC 4 \"Set ANSI color\" \"OSC 4 ; c ; spec BEL\" \"Change color number `c` to the color specified by `spec`.\"\n * `c` is the color index between 0 and 255. The color format of `spec` is derived from `XParseColor` (see OSC 10 for supported formats).\n * There may be multipe `c ; spec` pairs present in the same instruction.\n * If `spec` contains `?` the terminal returns a sequence with the currently set color.\n */\n public setOrReportIndexedColor(data: string): boolean {\n const event: IColorEvent = [];\n const slots = data.split(';');\n while (slots.length > 1) {\n const idx = slots.shift() as string;\n const spec = slots.shift() as string;\n if (/^\\d+$/.exec(idx)) {\n const index = parseInt(idx);\n if (0 <= index && index < 256) {\n if (spec === '?') {\n event.push({ type: ColorRequestType.REPORT, index });\n } else {\n const color = parseColor(spec);\n if (color) {\n event.push({ type: ColorRequestType.SET, index, color });\n }\n }\n }\n }\n }\n if (event.length) {\n this._onColor.fire(event);\n }\n return true;\n }\n\n // special colors - OSC 10 | 11 | 12\n private _specialColors = [ColorIndex.FOREGROUND, ColorIndex.BACKGROUND, ColorIndex.CURSOR];\n\n /**\n * Apply colors requests for special colors in OSC 10 | 11 | 12.\n * Since these commands are stacking from multiple parameters,\n * we handle them in a loop with an entry offset to `_specialColors`.\n */\n private _setOrReportSpecialColor(data: string, offset: number): boolean {\n const slots = data.split(';');\n for (let i = 0; i < slots.length; ++i, ++offset) {\n if (offset >= this._specialColors.length) break;\n if (slots[i] === '?') {\n this._onColor.fire([{ type: ColorRequestType.REPORT, index: this._specialColors[offset] }]);\n } else {\n const color = parseColor(slots[i]);\n if (color) {\n this._onColor.fire([{ type: ColorRequestType.SET, index: this._specialColors[offset], color }]);\n }\n }\n }\n return true;\n }\n\n /**\n * OSC 10 ; <xcolor name>|<?> ST - set or query default foreground color\n *\n * @vt: #Y OSC 10 \"Set or query default foreground color\" \"OSC 10 ; Pt BEL\" \"Set or query default foreground color.\"\n * To set the color, the following color specification formats are supported:\n * - `rgb:<red>/<green>/<blue>` for `<red>, <green>, <blue>` in `h | hh | hhh | hhhh`, where\n * `h` is a single hexadecimal digit (case insignificant). The different widths scale\n * from 4 bit (`h`) to 16 bit (`hhhh`) and get converted to 8 bit (`hh`).\n * - `#RGB` - 4 bits per channel, expanded to `#R0G0B0`\n * - `#RRGGBB` - 8 bits per channel\n * - `#RRRGGGBBB` - 12 bits per channel, truncated to `#RRGGBB`\n * - `#RRRRGGGGBBBB` - 16 bits per channel, truncated to `#RRGGBB`\n *\n * **Note:** X11 named colors are currently unsupported.\n *\n * If `Pt` contains `?` instead of a color specification, the terminal\n * returns a sequence with the current default foreground color\n * (use that sequence to restore the color after changes).\n *\n * **Note:** Other than xterm, xterm.js does not support OSC 12 - 19.\n * Therefore stacking multiple `Pt` separated by `;` only works for the first two entries.\n */\n public setOrReportFgColor(data: string): boolean {\n return this._setOrReportSpecialColor(data, 0);\n }\n\n /**\n * OSC 11 ; <xcolor name>|<?> ST - set or query default background color\n *\n * @vt: #Y OSC 11 \"Set or query default background color\" \"OSC 11 ; Pt BEL\" \"Same as OSC 10, but for default background.\"\n */\n public setOrReportBgColor(data: string): boolean {\n return this._setOrReportSpecialColor(data, 1);\n }\n\n /**\n * OSC 12 ; <xcolor name>|<?> ST - set or query default cursor color\n *\n * @vt: #Y OSC 12 \"Set or query default cursor color\" \"OSC 12 ; Pt BEL\" \"Same as OSC 10, but for default cursor color.\"\n */\n public setOrReportCursorColor(data: string): boolean {\n return this._setOrReportSpecialColor(data, 2);\n }\n\n /**\n * OSC 104 ; <num> ST - restore ANSI color <num>\n *\n * @vt: #Y OSC 104 \"Reset ANSI color\" \"OSC 104 ; c BEL\" \"Reset color number `c` to themed color.\"\n * `c` is the color index between 0 and 255. This function restores the default color for `c` as\n * specified by the loaded theme. Any number of `c` parameters may be given.\n * If no parameters are given, the entire indexed color table will be reset.\n */\n public restoreIndexedColor(data: string): boolean {\n if (!data) {\n this._onColor.fire([{ type: ColorRequestType.RESTORE }]);\n return true;\n }\n const event: IColorEvent = [];\n const slots = data.split(';');\n for (let i = 0; i < slots.length; ++i) {\n if (/^\\d+$/.exec(slots[i])) {\n const index = parseInt(slots[i]);\n if (0 <= index && index < 256) {\n event.push({ type: ColorRequestType.RESTORE, index });\n }\n }\n }\n if (event.length) {\n this._onColor.fire(event);\n }\n return true;\n }\n\n /**\n * OSC 110 ST - restore default foreground color\n *\n * @vt: #Y OSC 110 \"Restore default foreground color\" \"OSC 110 BEL\" \"Restore default foreground to themed color.\"\n */\n public restoreFgColor(data: string): boolean {\n this._onColor.fire([{ type: ColorRequestType.RESTORE, index: ColorIndex.FOREGROUND }]);\n return true;\n }\n\n /**\n * OSC 111 ST - restore default background color\n *\n * @vt: #Y OSC 111 \"Restore default background color\" \"OSC 111 BEL\" \"Restore default background to themed color.\"\n */\n public restoreBgColor(data: string): boolean {\n this._onColor.fire([{ type: ColorRequestType.RESTORE, index: ColorIndex.BACKGROUND }]);\n return true;\n }\n\n /**\n * OSC 112 ST - restore default cursor color\n *\n * @vt: #Y OSC 112 \"Restore default cursor color\" \"OSC 112 BEL\" \"Restore default cursor to themed color.\"\n */\n public restoreCursorColor(data: string): boolean {\n this._onColor.fire([{ type: ColorRequestType.RESTORE, index: ColorIndex.CURSOR }]);\n return true;\n }\n\n /**\n * ESC E\n * C1.NEL\n * DEC mnemonic: NEL (https://vt100.net/docs/vt510-rm/NEL)\n * Moves cursor to first position on next line.\n *\n * @vt: #Y C1 NEL \"Next Line\" \"\\x85\" \"Move the cursor to the beginning of the next row.\"\n * @vt: #Y ESC NEL \"Next Line\" \"ESC E\" \"Move the cursor to the beginning of the next row.\"\n */\n public nextLine(): boolean {\n this._activeBuffer.x = 0;\n this.index();\n return true;\n }\n\n /**\n * ESC =\n * DEC mnemonic: DECKPAM (https://vt100.net/docs/vt510-rm/DECKPAM.html)\n * Enables the numeric keypad to send application sequences to the host.\n */\n public keypadApplicationMode(): boolean {\n this._logService.debug('Serial port requested application keypad.');\n this._coreService.decPrivateModes.applicationKeypad = true;\n this._onRequestSyncScrollBar.fire();\n return true;\n }\n\n /**\n * ESC >\n * DEC mnemonic: DECKPNM (https://vt100.net/docs/vt510-rm/DECKPNM.html)\n * Enables the keypad to send numeric characters to the host.\n */\n public keypadNumericMode(): boolean {\n this._logService.debug('Switching back to normal keypad.');\n this._coreService.decPrivateModes.applicationKeypad = false;\n this._onRequestSyncScrollBar.fire();\n return true;\n }\n\n /**\n * ESC % @\n * ESC % G\n * Select default character set. UTF-8 is not supported (string are unicode anyways)\n * therefore ESC % G does the same.\n */\n public selectDefaultCharset(): boolean {\n this._charsetService.setgLevel(0);\n this._charsetService.setgCharset(0, DEFAULT_CHARSET); // US (default)\n return true;\n }\n\n /**\n * ESC ( C\n * Designate G0 Character Set, VT100, ISO 2022.\n * ESC ) C\n * Designate G1 Character Set (ISO 2022, VT100).\n * ESC * C\n * Designate G2 Character Set (ISO 2022, VT220).\n * ESC + C\n * Designate G3 Character Set (ISO 2022, VT220).\n * ESC - C\n * Designate G1 Character Set (VT300).\n * ESC . C\n * Designate G2 Character Set (VT300).\n * ESC / C\n * Designate G3 Character Set (VT300). C = A -> ISO Latin-1 Supplemental. - Supported?\n */\n public selectCharset(collectAndFlag: string): boolean {\n if (collectAndFlag.length !== 2) {\n this.selectDefaultCharset();\n return true;\n }\n if (collectAndFlag[0] === '/') {\n return true; // TODO: Is this supported?\n }\n this._charsetService.setgCharset(GLEVEL[collectAndFlag[0]], CHARSETS[collectAndFlag[1]] || DEFAULT_CHARSET);\n return true;\n }\n\n /**\n * ESC D\n * C1.IND\n * DEC mnemonic: IND (https://vt100.net/docs/vt510-rm/IND.html)\n * Moves the cursor down one line in the same column.\n *\n * @vt: #Y C1 IND \"Index\" \"\\x84\" \"Move the cursor one line down scrolling if needed.\"\n * @vt: #Y ESC IND \"Index\" \"ESC D\" \"Move the cursor one line down scrolling if needed.\"\n */\n public index(): boolean {\n this._restrictCursor();\n this._activeBuffer.y++;\n if (this._activeBuffer.y === this._activeBuffer.scrollBottom + 1) {\n this._activeBuffer.y--;\n this._bufferService.scroll(this._eraseAttrData());\n } else if (this._activeBuffer.y >= this._bufferService.rows) {\n this._activeBuffer.y = this._bufferService.rows - 1;\n }\n this._restrictCursor();\n return true;\n }\n\n /**\n * ESC H\n * C1.HTS\n * DEC mnemonic: HTS (https://vt100.net/docs/vt510-rm/HTS.html)\n * Sets a horizontal tab stop at the column position indicated by\n * the value of the active column when the terminal receives an HTS.\n *\n * @vt: #Y C1 HTS \"Horizontal Tabulation Set\" \"\\x88\" \"Places a tab stop at the current cursor position.\"\n * @vt: #Y ESC HTS \"Horizontal Tabulation Set\" \"ESC H\" \"Places a tab stop at the current cursor position.\"\n */\n public tabSet(): boolean {\n this._activeBuffer.tabs[this._activeBuffer.x] = true;\n return true;\n }\n\n /**\n * ESC M\n * C1.RI\n * DEC mnemonic: HTS\n * Moves the cursor up one line in the same column. If the cursor is at the top margin,\n * the page scrolls down.\n *\n * @vt: #Y ESC IR \"Reverse Index\" \"ESC M\" \"Move the cursor one line up scrolling if needed.\"\n */\n public reverseIndex(): boolean {\n this._restrictCursor();\n if (this._activeBuffer.y === this._activeBuffer.scrollTop) {\n // possibly move the code below to term.reverseScroll();\n // test: echo -ne '\\e[1;1H\\e[44m\\eM\\e[0m'\n // blankLine(true) is xterm/linux behavior\n const scrollRegionHeight = this._activeBuffer.scrollBottom - this._activeBuffer.scrollTop;\n this._activeBuffer.lines.shiftElements(this._activeBuffer.ybase + this._activeBuffer.y, scrollRegionHeight, 1);\n this._activeBuffer.lines.set(this._activeBuffer.ybase + this._activeBuffer.y, this._activeBuffer.getBlankLine(this._eraseAttrData()));\n this._dirtyRowService.markRangeDirty(this._activeBuffer.scrollTop, this._activeBuffer.scrollBottom);\n } else {\n this._activeBuffer.y--;\n this._restrictCursor(); // quickfix to not run out of bounds\n }\n return true;\n }\n\n /**\n * ESC c\n * DEC mnemonic: RIS (https://vt100.net/docs/vt510-rm/RIS.html)\n * Reset to initial state.\n */\n public fullReset(): boolean {\n this._parser.reset();\n this._onRequestReset.fire();\n return true;\n }\n\n public reset(): void {\n this._curAttrData = DEFAULT_ATTR_DATA.clone();\n this._eraseAttrDataInternal = DEFAULT_ATTR_DATA.clone();\n }\n\n /**\n * back_color_erase feature for xterm.\n */\n private _eraseAttrData(): IAttributeData {\n this._eraseAttrDataInternal.bg &= ~(Attributes.CM_MASK | 0xFFFFFF);\n this._eraseAttrDataInternal.bg |= this._curAttrData.bg & ~0xFC000000;\n return this._eraseAttrDataInternal;\n }\n\n /**\n * ESC n\n * ESC o\n * ESC |\n * ESC }\n * ESC ~\n * DEC mnemonic: LS (https://vt100.net/docs/vt510-rm/LS.html)\n * When you use a locking shift, the character set remains in GL or GR until\n * you use another locking shift. (partly supported)\n */\n public setgLevel(level: number): boolean {\n this._charsetService.setgLevel(level);\n return true;\n }\n\n /**\n * ESC # 8\n * DEC mnemonic: DECALN (https://vt100.net/docs/vt510-rm/DECALN.html)\n * This control function fills the complete screen area with\n * a test pattern (E) used for adjusting screen alignment.\n *\n * @vt: #Y ESC DECALN \"Screen Alignment Pattern\" \"ESC # 8\" \"Fill viewport with a test pattern (E).\"\n */\n public screenAlignmentPattern(): boolean {\n // prepare cell data\n const cell = new CellData();\n cell.content = 1 << Content.WIDTH_SHIFT | 'E'.charCodeAt(0);\n cell.fg = this._curAttrData.fg;\n cell.bg = this._curAttrData.bg;\n\n\n this._setCursor(0, 0);\n for (let yOffset = 0; yOffset < this._bufferService.rows; ++yOffset) {\n const row = this._activeBuffer.ybase + this._activeBuffer.y + yOffset;\n const line = this._activeBuffer.lines.get(row);\n if (line) {\n line.fill(cell);\n line.isWrapped = false;\n }\n }\n this._dirtyRowService.markAllDirty();\n this._setCursor(0, 0);\n return true;\n }\n}\n","/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IDisposable } from 'common/Types';\n\n/**\n * A base class that can be extended to provide convenience methods for managing the lifecycle of an\n * object and its components.\n */\nexport abstract class Disposable implements IDisposable {\n protected _disposables: IDisposable[] = [];\n protected _isDisposed: boolean = false;\n\n constructor() {\n }\n\n /**\n * Disposes the object, triggering the `dispose` method on all registered IDisposables.\n */\n public dispose(): void {\n this._isDisposed = true;\n for (const d of this._disposables) {\n d.dispose();\n }\n this._disposables.length = 0;\n }\n\n /**\n * Registers a disposable object.\n * @param d The disposable to register.\n * @returns The disposable.\n */\n public register<T extends IDisposable>(d: T): T {\n this._disposables.push(d);\n return d;\n }\n\n /**\n * Unregisters a disposable object if it has been registered, if not do\n * nothing.\n * @param d The disposable to unregister.\n */\n public unregister<T extends IDisposable>(d: T): void {\n const index = this._disposables.indexOf(d);\n if (index !== -1) {\n this._disposables.splice(index, 1);\n }\n }\n}\n\n/**\n * Dispose of all disposables in an array and set its length to 0.\n */\nexport function disposeArray(disposables: IDisposable[]): void {\n for (const d of disposables) {\n d.dispose();\n }\n disposables.length = 0;\n}\n\n/**\n * Creates a disposable that will dispose of an array of disposables when disposed.\n */\nexport function getDisposeArrayDisposable(array: IDisposable[]): IDisposable {\n return { dispose: () => disposeArray(array) };\n}\n","/**\n * Copyright (c) 2016 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\ninterface INavigator {\n userAgent: string;\n language: string;\n platform: string;\n}\n\n// We're declaring a navigator global here as we expect it in all runtimes (node and browser), but\n// we want this module to live in common.\ndeclare const navigator: INavigator;\n\nconst isNode = (typeof navigator === 'undefined') ? true : false;\nconst userAgent = (isNode) ? 'node' : navigator.userAgent;\nconst platform = (isNode) ? 'node' : navigator.platform;\n\nexport const isFirefox = userAgent.includes('Firefox');\nexport const isLegacyEdge = userAgent.includes('Edge');\nexport const isSafari = /^((?!chrome|android).)*safari/i.test(userAgent);\n\n// Find the users platform. We use this to interpret the meta key\n// and ISO third level shifts.\n// http://stackoverflow.com/q/19877924/577598\nexport const isMac = ['Macintosh', 'MacIntel', 'MacPPC', 'Mac68K'].includes(platform);\nexport const isIpad = platform === 'iPad';\nexport const isIphone = platform === 'iPhone';\nexport const isWindows = ['Windows', 'Win16', 'Win32', 'WinCE'].includes(platform);\nexport const isLinux = platform.indexOf('Linux') >= 0;\n","/**\n * Copyright (c) 2022 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\n/**\n * A generic list that is maintained in sorted order and allows values with duplicate keys. This\n * list is based on binary search and as such locating a key will take O(log n) amortized, this\n * includes the by key iterator.\n */\nexport class SortedList<T> {\n private readonly _array: T[] = [];\n\n constructor(\n private readonly _getKey: (value: T) => number\n ) {\n }\n\n public clear(): void {\n this._array.length = 0;\n }\n\n public insert(value: T): void {\n if (this._array.length === 0) {\n this._array.push(value);\n return;\n }\n const i = this._search(this._getKey(value), 0, this._array.length - 1);\n this._array.splice(i, 0, value);\n }\n\n public delete(value: T): boolean {\n if (this._array.length === 0) {\n return false;\n }\n const key = this._getKey(value);\n let i = this._search(key, 0, this._array.length - 1);\n if (this._getKey(this._array[i]) !== key) {\n return false;\n }\n do {\n if (this._array[i] === value) {\n this._array.splice(i, 1);\n return true;\n }\n } while (++i < this._array.length && this._getKey(this._array[i]) === key);\n return false;\n }\n\n public *getKeyIterator(key: number): IterableIterator<T> {\n if (this._array.length === 0) {\n return;\n }\n let i = this._search(key, 0, this._array.length - 1);\n if (i < 0 || i >= this._array.length) {\n return;\n }\n if (this._getKey(this._array[i]) !== key) {\n return;\n }\n do {\n yield this._array[i];\n } while (++i < this._array.length && this._getKey(this._array[i]) === key);\n }\n\n public values(): IterableIterator<T> {\n return this._array.values();\n }\n\n private _search(key: number, min: number, max: number): number {\n if (max < min) {\n return min;\n }\n let mid = Math.floor((min + max) / 2);\n if (this._getKey(this._array[mid]) > key) {\n return this._search(key, min, mid - 1);\n }\n if (this._getKey(this._array[mid]) < key) {\n return this._search(key, mid + 1, max);\n }\n // Value found! Since keys can be duplicates, move the result index back to the lowest index\n // that matches the key.\n while (mid > 0 && this._getKey(this._array[mid - 1]) === key) {\n mid--;\n }\n return mid;\n }\n}\n","/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nexport type TypedArray = Uint8Array | Uint16Array | Uint32Array | Uint8ClampedArray | Int8Array | Int16Array | Int32Array | Float32Array | Float64Array;\n\n\n/**\n * polyfill for TypedArray.fill\n * This is needed to support .fill in all safari versions and IE 11.\n */\nexport function fill<T extends TypedArray>(array: T, value: number, start?: number, end?: number): T {\n // all modern engines that support .fill\n if (array.fill) {\n return array.fill(value, start, end) as T;\n }\n return fillFallback(array, value, start, end);\n}\n\nexport function fillFallback<T extends TypedArray>(array: T, value: number, start: number = 0, end: number = array.length): T {\n // safari and IE 11\n // since IE 11 does not support Array.prototype.fill either\n // we cannot use the suggested polyfill from MDN\n // instead we simply fall back to looping\n if (start >= array.length) {\n return array;\n }\n start = (array.length + start) % array.length;\n if (end >= array.length) {\n end = array.length;\n } else {\n end = (array.length + end) % array.length;\n }\n for (let i = start; i < end; ++i) {\n array[i] = value;\n }\n return array;\n}\n\n/**\n * Concat two typed arrays `a` and `b`.\n * Returns a new typed array.\n */\nexport function concat<T extends TypedArray>(a: T, b: T): T {\n const result = new (a.constructor as any)(a.length + b.length);\n result.set(a);\n result.set(b, a.length);\n return result;\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { CHAR_DATA_CODE_INDEX, NULL_CELL_CODE, WHITESPACE_CELL_CODE } from 'common/buffer/Constants';\nimport { IBufferService } from 'common/services/Services';\n\nexport function updateWindowsModeWrappedState(bufferService: IBufferService): void {\n // Winpty does not support wraparound mode which means that lines will never\n // be marked as wrapped. This causes issues for things like copying a line\n // retaining the wrapped new line characters or if consumers are listening\n // in on the data stream.\n //\n // The workaround for this is to listen to every incoming line feed and mark\n // the line as wrapped if the last character in the previous line is not a\n // space. This is certainly not without its problems, but generally on\n // Windows when text reaches the end of the terminal it's likely going to be\n // wrapped.\n const line = bufferService.buffer.lines.get(bufferService.buffer.ybase + bufferService.buffer.y - 1);\n const lastChar = line?.get(bufferService.cols - 1);\n\n const nextLine = bufferService.buffer.lines.get(bufferService.buffer.ybase + bufferService.buffer.y);\n if (nextLine && lastChar) {\n nextLine.isWrapped = (lastChar[CHAR_DATA_CODE_INDEX] !== NULL_CELL_CODE && lastChar[CHAR_DATA_CODE_INDEX] !== WHITESPACE_CELL_CODE);\n }\n}\n","/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IAttributeData, IColorRGB, IExtendedAttrs } from 'common/Types';\nimport { Attributes, FgFlags, BgFlags, UnderlineStyle } from 'common/buffer/Constants';\n\nexport class AttributeData implements IAttributeData {\n public static toColorRGB(value: number): IColorRGB {\n return [\n value >>> Attributes.RED_SHIFT & 255,\n value >>> Attributes.GREEN_SHIFT & 255,\n value & 255\n ];\n }\n\n public static fromColorRGB(value: IColorRGB): number {\n return (value[0] & 255) << Attributes.RED_SHIFT | (value[1] & 255) << Attributes.GREEN_SHIFT | value[2] & 255;\n }\n\n public clone(): IAttributeData {\n const newObj = new AttributeData();\n newObj.fg = this.fg;\n newObj.bg = this.bg;\n newObj.extended = this.extended.clone();\n return newObj;\n }\n\n // data\n public fg = 0;\n public bg = 0;\n public extended = new ExtendedAttrs();\n\n // flags\n public isInverse(): number { return this.fg & FgFlags.INVERSE; }\n public isBold(): number { return this.fg & FgFlags.BOLD; }\n public isUnderline(): number { return this.fg & FgFlags.UNDERLINE; }\n public isBlink(): number { return this.fg & FgFlags.BLINK; }\n public isInvisible(): number { return this.fg & FgFlags.INVISIBLE; }\n public isItalic(): number { return this.bg & BgFlags.ITALIC; }\n public isDim(): number { return this.bg & BgFlags.DIM; }\n public isStrikethrough(): number { return this.fg & FgFlags.STRIKETHROUGH; }\n\n // color modes\n public getFgColorMode(): number { return this.fg & Attributes.CM_MASK; }\n public getBgColorMode(): number { return this.bg & Attributes.CM_MASK; }\n public isFgRGB(): boolean { return (this.fg & Attributes.CM_MASK) === Attributes.CM_RGB; }\n public isBgRGB(): boolean { return (this.bg & Attributes.CM_MASK) === Attributes.CM_RGB; }\n public isFgPalette(): boolean { return (this.fg & Attributes.CM_MASK) === Attributes.CM_P16 || (this.fg & Attributes.CM_MASK) === Attributes.CM_P256; }\n public isBgPalette(): boolean { return (this.bg & Attributes.CM_MASK) === Attributes.CM_P16 || (this.bg & Attributes.CM_MASK) === Attributes.CM_P256; }\n public isFgDefault(): boolean { return (this.fg & Attributes.CM_MASK) === 0; }\n public isBgDefault(): boolean { return (this.bg & Attributes.CM_MASK) === 0; }\n public isAttributeDefault(): boolean { return this.fg === 0 && this.bg === 0; }\n\n // colors\n public getFgColor(): number {\n switch (this.fg & Attributes.CM_MASK) {\n case Attributes.CM_P16:\n case Attributes.CM_P256: return this.fg & Attributes.PCOLOR_MASK;\n case Attributes.CM_RGB: return this.fg & Attributes.RGB_MASK;\n default: return -1; // CM_DEFAULT defaults to -1\n }\n }\n public getBgColor(): number {\n switch (this.bg & Attributes.CM_MASK) {\n case Attributes.CM_P16:\n case Attributes.CM_P256: return this.bg & Attributes.PCOLOR_MASK;\n case Attributes.CM_RGB: return this.bg & Attributes.RGB_MASK;\n default: return -1; // CM_DEFAULT defaults to -1\n }\n }\n\n // extended attrs\n public hasExtendedAttrs(): number {\n return this.bg & BgFlags.HAS_EXTENDED;\n }\n public updateExtended(): void {\n if (this.extended.isEmpty()) {\n this.bg &= ~BgFlags.HAS_EXTENDED;\n } else {\n this.bg |= BgFlags.HAS_EXTENDED;\n }\n }\n public getUnderlineColor(): number {\n if ((this.bg & BgFlags.HAS_EXTENDED) && ~this.extended.underlineColor) {\n switch (this.extended.underlineColor & Attributes.CM_MASK) {\n case Attributes.CM_P16:\n case Attributes.CM_P256: return this.extended.underlineColor & Attributes.PCOLOR_MASK;\n case Attributes.CM_RGB: return this.extended.underlineColor & Attributes.RGB_MASK;\n default: return this.getFgColor();\n }\n }\n return this.getFgColor();\n }\n public getUnderlineColorMode(): number {\n return (this.bg & BgFlags.HAS_EXTENDED) && ~this.extended.underlineColor\n ? this.extended.underlineColor & Attributes.CM_MASK\n : this.getFgColorMode();\n }\n public isUnderlineColorRGB(): boolean {\n return (this.bg & BgFlags.HAS_EXTENDED) && ~this.extended.underlineColor\n ? (this.extended.underlineColor & Attributes.CM_MASK) === Attributes.CM_RGB\n : this.isFgRGB();\n }\n public isUnderlineColorPalette(): boolean {\n return (this.bg & BgFlags.HAS_EXTENDED) && ~this.extended.underlineColor\n ? (this.extended.underlineColor & Attributes.CM_MASK) === Attributes.CM_P16\n || (this.extended.underlineColor & Attributes.CM_MASK) === Attributes.CM_P256\n : this.isFgPalette();\n }\n public isUnderlineColorDefault(): boolean {\n return (this.bg & BgFlags.HAS_EXTENDED) && ~this.extended.underlineColor\n ? (this.extended.underlineColor & Attributes.CM_MASK) === 0\n : this.isFgDefault();\n }\n public getUnderlineStyle(): UnderlineStyle {\n return this.fg & FgFlags.UNDERLINE\n ? (this.bg & BgFlags.HAS_EXTENDED ? this.extended.underlineStyle : UnderlineStyle.SINGLE)\n : UnderlineStyle.NONE;\n }\n}\n\n\n/**\n * Extended attributes for a cell.\n * Holds information about different underline styles and color.\n */\nexport class ExtendedAttrs implements IExtendedAttrs {\n constructor(\n // underline style, NONE is empty\n public underlineStyle: UnderlineStyle = UnderlineStyle.NONE,\n // underline color, -1 is empty (same as FG)\n public underlineColor: number = -1\n ) {}\n\n public clone(): IExtendedAttrs {\n return new ExtendedAttrs(this.underlineStyle, this.underlineColor);\n }\n\n /**\n * Convenient method to indicate whether the object holds no additional information,\n * that needs to be persistant in the buffer.\n */\n public isEmpty(): boolean {\n return this.underlineStyle === UnderlineStyle.NONE;\n }\n}\n","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { CircularList, IInsertEvent } from 'common/CircularList';\nimport { IBuffer, BufferIndex, IBufferStringIterator, IBufferStringIteratorResult } from 'common/buffer/Types';\nimport { IBufferLine, ICellData, IAttributeData, ICharset } from 'common/Types';\nimport { BufferLine, DEFAULT_ATTR_DATA } from 'common/buffer/BufferLine';\nimport { CellData } from 'common/buffer/CellData';\nimport { NULL_CELL_CHAR, NULL_CELL_WIDTH, NULL_CELL_CODE, WHITESPACE_CELL_CHAR, WHITESPACE_CELL_WIDTH, WHITESPACE_CELL_CODE, CHAR_DATA_WIDTH_INDEX, CHAR_DATA_CHAR_INDEX } from 'common/buffer/Constants';\nimport { reflowLargerApplyNewLayout, reflowLargerCreateNewLayout, reflowLargerGetLinesToRemove, reflowSmallerGetNewLineLengths, getWrappedLineTrimmedLength } from 'common/buffer/BufferReflow';\nimport { Marker } from 'common/buffer/Marker';\nimport { IOptionsService, IBufferService } from 'common/services/Services';\nimport { DEFAULT_CHARSET } from 'common/data/Charsets';\nimport { ExtendedAttrs } from 'common/buffer/AttributeData';\n\nexport const MAX_BUFFER_SIZE = 4294967295; // 2^32 - 1\n\n/**\n * This class represents a terminal buffer (an internal state of the terminal), where the\n * following information is stored (in high-level):\n * - text content of this particular buffer\n * - cursor position\n * - scroll position\n */\nexport class Buffer implements IBuffer {\n public lines: CircularList<IBufferLine>;\n public ydisp: number = 0;\n public ybase: number = 0;\n public y: number = 0;\n public x: number = 0;\n public scrollBottom: number;\n public scrollTop: number;\n // TODO: Type me\n public tabs: any;\n public savedY: number = 0;\n public savedX: number = 0;\n public savedCurAttrData = DEFAULT_ATTR_DATA.clone();\n public savedCharset: ICharset | undefined = DEFAULT_CHARSET;\n public markers: Marker[] = [];\n private _nullCell: ICellData = CellData.fromCharData([0, NULL_CELL_CHAR, NULL_CELL_WIDTH, NULL_CELL_CODE]);\n private _whitespaceCell: ICellData = CellData.fromCharData([0, WHITESPACE_CELL_CHAR, WHITESPACE_CELL_WIDTH, WHITESPACE_CELL_CODE]);\n private _cols: number;\n private _rows: number;\n private _isClearing: boolean = false;\n\n constructor(\n private _hasScrollback: boolean,\n private _optionsService: IOptionsService,\n private _bufferService: IBufferService\n ) {\n this._cols = this._bufferService.cols;\n this._rows = this._bufferService.rows;\n this.lines = new CircularList<IBufferLine>(this._getCorrectBufferLength(this._rows));\n this.scrollTop = 0;\n this.scrollBottom = this._rows - 1;\n this.setupTabStops();\n }\n\n public getNullCell(attr?: IAttributeData): ICellData {\n if (attr) {\n this._nullCell.fg = attr.fg;\n this._nullCell.bg = attr.bg;\n this._nullCell.extended = attr.extended;\n } else {\n this._nullCell.fg = 0;\n this._nullCell.bg = 0;\n this._nullCell.extended = new ExtendedAttrs();\n }\n return this._nullCell;\n }\n\n public getWhitespaceCell(attr?: IAttributeData): ICellData {\n if (attr) {\n this._whitespaceCell.fg = attr.fg;\n this._whitespaceCell.bg = attr.bg;\n this._whitespaceCell.extended = attr.extended;\n } else {\n this._whitespaceCell.fg = 0;\n this._whitespaceCell.bg = 0;\n this._whitespaceCell.extended = new ExtendedAttrs();\n }\n return this._whitespaceCell;\n }\n\n public getBlankLine(attr: IAttributeData, isWrapped?: boolean): IBufferLine {\n return new BufferLine(this._bufferService.cols, this.getNullCell(attr), isWrapped);\n }\n\n public get hasScrollback(): boolean {\n return this._hasScrollback && this.lines.maxLength > this._rows;\n }\n\n public get isCursorInViewport(): boolean {\n const absoluteY = this.ybase + this.y;\n const relativeY = absoluteY - this.ydisp;\n return (relativeY >= 0 && relativeY < this._rows);\n }\n\n /**\n * Gets the correct buffer length based on the rows provided, the terminal's\n * scrollback and whether this buffer is flagged to have scrollback or not.\n * @param rows The terminal rows to use in the calculation.\n */\n private _getCorrectBufferLength(rows: number): number {\n if (!this._hasScrollback) {\n return rows;\n }\n\n const correctBufferLength = rows + this._optionsService.rawOptions.scrollback;\n\n return correctBufferLength > MAX_BUFFER_SIZE ? MAX_BUFFER_SIZE : correctBufferLength;\n }\n\n /**\n * Fills the buffer's viewport with blank lines.\n */\n public fillViewportRows(fillAttr?: IAttributeData): void {\n if (this.lines.length === 0) {\n if (fillAttr === undefined) {\n fillAttr = DEFAULT_ATTR_DATA;\n }\n let i = this._rows;\n while (i--) {\n this.lines.push(this.getBlankLine(fillAttr));\n }\n }\n }\n\n /**\n * Clears the buffer to it's initial state, discarding all previous data.\n */\n public clear(): void {\n this.ydisp = 0;\n this.ybase = 0;\n this.y = 0;\n this.x = 0;\n this.lines = new CircularList<IBufferLine>(this._getCorrectBufferLength(this._rows));\n this.scrollTop = 0;\n this.scrollBottom = this._rows - 1;\n this.setupTabStops();\n }\n\n /**\n * Resizes the buffer, adjusting its data accordingly.\n * @param newCols The new number of columns.\n * @param newRows The new number of rows.\n */\n public resize(newCols: number, newRows: number): void {\n // store reference to null cell with default attrs\n const nullCell = this.getNullCell(DEFAULT_ATTR_DATA);\n\n // Increase max length if needed before adjustments to allow space to fill\n // as required.\n const newMaxLength = this._getCorrectBufferLength(newRows);\n if (newMaxLength > this.lines.maxLength) {\n this.lines.maxLength = newMaxLength;\n }\n\n // The following adjustments should only happen if the buffer has been\n // initialized/filled.\n if (this.lines.length > 0) {\n // Deal with columns increasing (reducing needs to happen after reflow)\n if (this._cols < newCols) {\n for (let i = 0; i < this.lines.length; i++) {\n this.lines.get(i)!.resize(newCols, nullCell);\n }\n }\n\n // Resize rows in both directions as needed\n let addToY = 0;\n if (this._rows < newRows) {\n for (let y = this._rows; y < newRows; y++) {\n if (this.lines.length < newRows + this.ybase) {\n if (this._optionsService.rawOptions.windowsMode) {\n // Just add the new missing rows on Windows as conpty reprints the screen with it's\n // view of the world. Once a line enters scrollback for conpty it remains there\n this.lines.push(new BufferLine(newCols, nullCell));\n } else {\n if (this.ybase > 0 && this.lines.length <= this.ybase + this.y + addToY + 1) {\n // There is room above the buffer and there are no empty elements below the line,\n // scroll up\n this.ybase--;\n addToY++;\n if (this.ydisp > 0) {\n // Viewport is at the top of the buffer, must increase downwards\n this.ydisp--;\n }\n } else {\n // Add a blank line if there is no buffer left at the top to scroll to, or if there\n // are blank lines after the cursor\n this.lines.push(new BufferLine(newCols, nullCell));\n }\n }\n }\n }\n } else { // (this._rows >= newRows)\n for (let y = this._rows; y > newRows; y--) {\n if (this.lines.length > newRows + this.ybase) {\n if (this.lines.length > this.ybase + this.y + 1) {\n // The line is a blank line below the cursor, remove it\n this.lines.pop();\n } else {\n // The line is the cursor, scroll down\n this.ybase++;\n this.ydisp++;\n }\n }\n }\n }\n\n // Reduce max length if needed after adjustments, this is done after as it\n // would otherwise cut data from the bottom of the buffer.\n if (newMaxLength < this.lines.maxLength) {\n // Trim from the top of the buffer and adjust ybase and ydisp.\n const amountToTrim = this.lines.length - newMaxLength;\n if (amountToTrim > 0) {\n this.lines.trimStart(amountToTrim);\n this.ybase = Math.max(this.ybase - amountToTrim, 0);\n this.ydisp = Math.max(this.ydisp - amountToTrim, 0);\n this.savedY = Math.max(this.savedY - amountToTrim, 0);\n }\n this.lines.maxLength = newMaxLength;\n }\n\n // Make sure that the cursor stays on screen\n this.x = Math.min(this.x, newCols - 1);\n this.y = Math.min(this.y, newRows - 1);\n if (addToY) {\n this.y += addToY;\n }\n this.savedX = Math.min(this.savedX, newCols - 1);\n\n this.scrollTop = 0;\n }\n\n this.scrollBottom = newRows - 1;\n\n if (this._isReflowEnabled) {\n this._reflow(newCols, newRows);\n\n // Trim the end of the line off if cols shrunk\n if (this._cols > newCols) {\n for (let i = 0; i < this.lines.length; i++) {\n this.lines.get(i)!.resize(newCols, nullCell);\n }\n }\n }\n\n this._cols = newCols;\n this._rows = newRows;\n }\n\n private get _isReflowEnabled(): boolean {\n return this._hasScrollback && !this._optionsService.rawOptions.windowsMode;\n }\n\n private _reflow(newCols: number, newRows: number): void {\n if (this._cols === newCols) {\n return;\n }\n\n // Iterate through rows, ignore the last one as it cannot be wrapped\n if (newCols > this._cols) {\n this._reflowLarger(newCols, newRows);\n } else {\n this._reflowSmaller(newCols, newRows);\n }\n }\n\n private _reflowLarger(newCols: number, newRows: number): void {\n const toRemove: number[] = reflowLargerGetLinesToRemove(this.lines, this._cols, newCols, this.ybase + this.y, this.getNullCell(DEFAULT_ATTR_DATA));\n if (toRemove.length > 0) {\n const newLayoutResult = reflowLargerCreateNewLayout(this.lines, toRemove);\n reflowLargerApplyNewLayout(this.lines, newLayoutResult.layout);\n this._reflowLargerAdjustViewport(newCols, newRows, newLayoutResult.countRemoved);\n }\n }\n\n private _reflowLargerAdjustViewport(newCols: number, newRows: number, countRemoved: number): void {\n const nullCell = this.getNullCell(DEFAULT_ATTR_DATA);\n // Adjust viewport based on number of items removed\n let viewportAdjustments = countRemoved;\n while (viewportAdjustments-- > 0) {\n if (this.ybase === 0) {\n if (this.y > 0) {\n this.y--;\n }\n if (this.lines.length < newRows) {\n // Add an extra row at the bottom of the viewport\n this.lines.push(new BufferLine(newCols, nullCell));\n }\n } else {\n if (this.ydisp === this.ybase) {\n this.ydisp--;\n }\n this.ybase--;\n }\n }\n this.savedY = Math.max(this.savedY - countRemoved, 0);\n }\n\n private _reflowSmaller(newCols: number, newRows: number): void {\n const nullCell = this.getNullCell(DEFAULT_ATTR_DATA);\n // Gather all BufferLines that need to be inserted into the Buffer here so that they can be\n // batched up and only committed once\n const toInsert = [];\n let countToInsert = 0;\n // Go backwards as many lines may be trimmed and this will avoid considering them\n for (let y = this.lines.length - 1; y >= 0; y--) {\n // Check whether this line is a problem\n let nextLine = this.lines.get(y) as BufferLine;\n if (!nextLine || !nextLine.isWrapped && nextLine.getTrimmedLength() <= newCols) {\n continue;\n }\n\n // Gather wrapped lines and adjust y to be the starting line\n const wrappedLines: BufferLine[] = [nextLine];\n while (nextLine.isWrapped && y > 0) {\n nextLine = this.lines.get(--y) as BufferLine;\n wrappedLines.unshift(nextLine);\n }\n\n // If these lines contain the cursor don't touch them, the program will handle fixing up\n // wrapped lines with the cursor\n const absoluteY = this.ybase + this.y;\n if (absoluteY >= y && absoluteY < y + wrappedLines.length) {\n continue;\n }\n\n const lastLineLength = wrappedLines[wrappedLines.length - 1].getTrimmedLength();\n const destLineLengths = reflowSmallerGetNewLineLengths(wrappedLines, this._cols, newCols);\n const linesToAdd = destLineLengths.length - wrappedLines.length;\n let trimmedLines: number;\n if (this.ybase === 0 && this.y !== this.lines.length - 1) {\n // If the top section of the buffer is not yet filled\n trimmedLines = Math.max(0, this.y - this.lines.maxLength + linesToAdd);\n } else {\n trimmedLines = Math.max(0, this.lines.length - this.lines.maxLength + linesToAdd);\n }\n\n // Add the new lines\n const newLines: BufferLine[] = [];\n for (let i = 0; i < linesToAdd; i++) {\n const newLine = this.getBlankLine(DEFAULT_ATTR_DATA, true) as BufferLine;\n newLines.push(newLine);\n }\n if (newLines.length > 0) {\n toInsert.push({\n // countToInsert here gets the actual index, taking into account other inserted items.\n // using this we can iterate through the list forwards\n start: y + wrappedLines.length + countToInsert,\n newLines\n });\n countToInsert += newLines.length;\n }\n wrappedLines.push(...newLines);\n\n // Copy buffer data to new locations, this needs to happen backwards to do in-place\n let destLineIndex = destLineLengths.length - 1; // Math.floor(cellsNeeded / newCols);\n let destCol = destLineLengths[destLineIndex]; // cellsNeeded % newCols;\n if (destCol === 0) {\n destLineIndex--;\n destCol = destLineLengths[destLineIndex];\n }\n let srcLineIndex = wrappedLines.length - linesToAdd - 1;\n let srcCol = lastLineLength;\n while (srcLineIndex >= 0) {\n const cellsToCopy = Math.min(srcCol, destCol);\n if (wrappedLines[destLineIndex] === undefined) {\n // Sanity check that the line exists, this has been known to fail for an unknown reason\n // which would stop the reflow from happening if an exception would throw.\n break;\n }\n wrappedLines[destLineIndex].copyCellsFrom(wrappedLines[srcLineIndex], srcCol - cellsToCopy, destCol - cellsToCopy, cellsToCopy, true);\n destCol -= cellsToCopy;\n if (destCol === 0) {\n destLineIndex--;\n destCol = destLineLengths[destLineIndex];\n }\n srcCol -= cellsToCopy;\n if (srcCol === 0) {\n srcLineIndex--;\n const wrappedLinesIndex = Math.max(srcLineIndex, 0);\n srcCol = getWrappedLineTrimmedLength(wrappedLines, wrappedLinesIndex, this._cols);\n }\n }\n\n // Null out the end of the line ends if a wide character wrapped to the following line\n for (let i = 0; i < wrappedLines.length; i++) {\n if (destLineLengths[i] < newCols) {\n wrappedLines[i].setCell(destLineLengths[i], nullCell);\n }\n }\n\n // Adjust viewport as needed\n let viewportAdjustments = linesToAdd - trimmedLines;\n while (viewportAdjustments-- > 0) {\n if (this.ybase === 0) {\n if (this.y < newRows - 1) {\n this.y++;\n this.lines.pop();\n } else {\n this.ybase++;\n this.ydisp++;\n }\n } else {\n // Ensure ybase does not exceed its maximum value\n if (this.ybase < Math.min(this.lines.maxLength, this.lines.length + countToInsert) - newRows) {\n if (this.ybase === this.ydisp) {\n this.ydisp++;\n }\n this.ybase++;\n }\n }\n }\n this.savedY = Math.min(this.savedY + linesToAdd, this.ybase + newRows - 1);\n }\n\n // Rearrange lines in the buffer if there are any insertions, this is done at the end rather\n // than earlier so that it's a single O(n) pass through the buffer, instead of O(n^2) from many\n // costly calls to CircularList.splice.\n if (toInsert.length > 0) {\n // Record buffer insert events and then play them back backwards so that the indexes are\n // correct\n const insertEvents: IInsertEvent[] = [];\n\n // Record original lines so they don't get overridden when we rearrange the list\n const originalLines: BufferLine[] = [];\n for (let i = 0; i < this.lines.length; i++) {\n originalLines.push(this.lines.get(i) as BufferLine);\n }\n const originalLinesLength = this.lines.length;\n\n let originalLineIndex = originalLinesLength - 1;\n let nextToInsertIndex = 0;\n let nextToInsert = toInsert[nextToInsertIndex];\n this.lines.length = Math.min(this.lines.maxLength, this.lines.length + countToInsert);\n let countInsertedSoFar = 0;\n for (let i = Math.min(this.lines.maxLength - 1, originalLinesLength + countToInsert - 1); i >= 0; i--) {\n if (nextToInsert && nextToInsert.start > originalLineIndex + countInsertedSoFar) {\n // Insert extra lines here, adjusting i as needed\n for (let nextI = nextToInsert.newLines.length - 1; nextI >= 0; nextI--) {\n this.lines.set(i--, nextToInsert.newLines[nextI]);\n }\n i++;\n\n // Create insert events for later\n insertEvents.push({\n index: originalLineIndex + 1,\n amount: nextToInsert.newLines.length\n });\n\n countInsertedSoFar += nextToInsert.newLines.length;\n nextToInsert = toInsert[++nextToInsertIndex];\n } else {\n this.lines.set(i, originalLines[originalLineIndex--]);\n }\n }\n\n // Update markers\n let insertCountEmitted = 0;\n for (let i = insertEvents.length - 1; i >= 0; i--) {\n insertEvents[i].index += insertCountEmitted;\n this.lines.onInsertEmitter.fire(insertEvents[i]);\n insertCountEmitted += insertEvents[i].amount;\n }\n const amountToTrim = Math.max(0, originalLinesLength + countToInsert - this.lines.maxLength);\n if (amountToTrim > 0) {\n this.lines.onTrimEmitter.fire(amountToTrim);\n }\n }\n }\n\n // private _reflowSmallerGetLinesNeeded()\n\n /**\n * Translates a string index back to a BufferIndex.\n * To get the correct buffer position the string must start at `startCol` 0\n * (default in translateBufferLineToString).\n * The method also works on wrapped line strings given rows were not trimmed.\n * The method operates on the CharData string length, there are no\n * additional content or boundary checks. Therefore the string and the buffer\n * should not be altered in between.\n * TODO: respect trim flag after fixing #1685\n * @param lineIndex line index the string was retrieved from\n * @param stringIndex index within the string\n * @param startCol column offset the string was retrieved from\n */\n public stringIndexToBufferIndex(lineIndex: number, stringIndex: number, trimRight: boolean = false): BufferIndex {\n while (stringIndex) {\n const line = this.lines.get(lineIndex);\n if (!line) {\n return [-1, -1];\n }\n const length = (trimRight) ? line.getTrimmedLength() : line.length;\n for (let i = 0; i < length; ++i) {\n if (line.get(i)[CHAR_DATA_WIDTH_INDEX]) {\n // empty cells report a string length of 0, but get replaced\n // with a whitespace in translateToString, thus replace with 1\n stringIndex -= line.get(i)[CHAR_DATA_CHAR_INDEX].length || 1;\n }\n if (stringIndex < 0) {\n return [lineIndex, i];\n }\n }\n lineIndex++;\n }\n return [lineIndex, 0];\n }\n\n /**\n * Translates a buffer line to a string, with optional start and end columns.\n * Wide characters will count as two columns in the resulting string. This\n * function is useful for getting the actual text underneath the raw selection\n * position.\n * @param line The line being translated.\n * @param trimRight Whether to trim whitespace to the right.\n * @param startCol The column to start at.\n * @param endCol The column to end at.\n */\n public translateBufferLineToString(lineIndex: number, trimRight: boolean, startCol: number = 0, endCol?: number): string {\n const line = this.lines.get(lineIndex);\n if (!line) {\n return '';\n }\n return line.translateToString(trimRight, startCol, endCol);\n }\n\n public getWrappedRangeForLine(y: number): { first: number, last: number } {\n let first = y;\n let last = y;\n // Scan upwards for wrapped lines\n while (first > 0 && this.lines.get(first)!.isWrapped) {\n first--;\n }\n // Scan downwards for wrapped lines\n while (last + 1 < this.lines.length && this.lines.get(last + 1)!.isWrapped) {\n last++;\n }\n return { first, last };\n }\n\n /**\n * Setup the tab stops.\n * @param i The index to start setting up tab stops from.\n */\n public setupTabStops(i?: number): void {\n if (i !== null && i !== undefined) {\n if (!this.tabs[i]) {\n i = this.prevStop(i);\n }\n } else {\n this.tabs = {};\n i = 0;\n }\n\n for (; i < this._cols; i += this._optionsService.rawOptions.tabStopWidth) {\n this.tabs[i] = true;\n }\n }\n\n /**\n * Move the cursor to the previous tab stop from the given position (default is current).\n * @param x The position to move the cursor to the previous tab stop.\n */\n public prevStop(x?: number): number {\n if (x === null || x === undefined) {\n x = this.x;\n }\n while (!this.tabs[--x] && x > 0);\n return x >= this._cols ? this._cols - 1 : x < 0 ? 0 : x;\n }\n\n /**\n * Move the cursor one tab stop forward from the given position (default is current).\n * @param x The position to move the cursor one tab stop forward.\n */\n public nextStop(x?: number): number {\n if (x === null || x === undefined) {\n x = this.x;\n }\n while (!this.tabs[++x] && x < this._cols);\n return x >= this._cols ? this._cols - 1 : x < 0 ? 0 : x;\n }\n\n /**\n * Clears markers on single line.\n * @param y The line to clear.\n */\n public clearMarkers(y: number): void {\n this._isClearing = true;\n for (let i = 0; i < this.markers.length; i++) {\n if (this.markers[i].line === y) {\n this.markers[i].dispose();\n this.markers.splice(i--, 1);\n }\n }\n this._isClearing = false;\n }\n\n /**\n * Clears markers on all lines\n */\n public clearAllMarkers(): void {\n this._isClearing = true;\n for (let i = 0; i < this.markers.length; i++) {\n this.markers[i].dispose();\n this.markers.splice(i--, 1);\n }\n this._isClearing = false;\n }\n\n public addMarker(y: number): Marker {\n const marker = new Marker(y);\n this.markers.push(marker);\n marker.register(this.lines.onTrim(amount => {\n marker.line -= amount;\n // The marker should be disposed when the line is trimmed from the buffer\n if (marker.line < 0) {\n marker.dispose();\n }\n }));\n marker.register(this.lines.onInsert(event => {\n if (marker.line >= event.index) {\n marker.line += event.amount;\n }\n }));\n marker.register(this.lines.onDelete(event => {\n // Delete the marker if it's within the range\n if (marker.line >= event.index && marker.line < event.index + event.amount) {\n marker.dispose();\n }\n\n // Shift the marker if it's after the deleted range\n if (marker.line > event.index) {\n marker.line -= event.amount;\n }\n }));\n marker.register(marker.onDispose(() => this._removeMarker(marker)));\n return marker;\n }\n\n private _removeMarker(marker: Marker): void {\n if (!this._isClearing) {\n this.markers.splice(this.markers.indexOf(marker), 1);\n }\n }\n\n public iterator(trimRight: boolean, startIndex?: number, endIndex?: number, startOverscan?: number, endOverscan?: number): IBufferStringIterator {\n return new BufferStringIterator(this, trimRight, startIndex, endIndex, startOverscan, endOverscan);\n }\n}\n\n/**\n * Iterator to get unwrapped content strings from the buffer.\n * The iterator returns at least the string data between the borders\n * `startIndex` and `endIndex` (exclusive) and will expand the lines\n * by `startOverscan` to the top and by `endOverscan` to the bottom,\n * if no new line was found in between.\n * It will never read/return string data beyond `startIndex - startOverscan`\n * or `endIndex + endOverscan`. Therefore the first and last line might be truncated.\n * It is possible to always get the full string for the first and last line as well\n * by setting the overscan values to the actual buffer length. This not recommended\n * since it might return the whole buffer within a single string in a worst case scenario.\n */\nexport class BufferStringIterator implements IBufferStringIterator {\n private _current: number;\n\n constructor(\n private _buffer: IBuffer,\n private _trimRight: boolean,\n private _startIndex: number = 0,\n private _endIndex: number = _buffer.lines.length,\n private _startOverscan: number = 0,\n private _endOverscan: number = 0\n ) {\n if (this._startIndex < 0) {\n this._startIndex = 0;\n }\n if (this._endIndex > this._buffer.lines.length) {\n this._endIndex = this._buffer.lines.length;\n }\n this._current = this._startIndex;\n }\n\n public hasNext(): boolean {\n return this._current < this._endIndex;\n }\n\n public next(): IBufferStringIteratorResult {\n const range = this._buffer.getWrappedRangeForLine(this._current);\n // limit search window to overscan value at both borders\n if (range.first < this._startIndex - this._startOverscan) {\n range.first = this._startIndex - this._startOverscan;\n }\n if (range.last > this._endIndex + this._endOverscan) {\n range.last = this._endIndex + this._endOverscan;\n }\n // limit to current buffer length\n range.first = Math.max(range.first, 0);\n range.last = Math.min(range.last, this._buffer.lines.length);\n let content = '';\n for (let i = range.first; i <= range.last; ++i) {\n content += this._buffer.translateBufferLineToString(i, this._trimRight);\n }\n this._current = range.last + 1;\n return { range, content };\n }\n}\n","/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { CharData, IBufferLine, ICellData, IAttributeData, IExtendedAttrs } from 'common/Types';\nimport { stringFromCodePoint } from 'common/input/TextDecoder';\nimport { CHAR_DATA_CHAR_INDEX, CHAR_DATA_WIDTH_INDEX, CHAR_DATA_ATTR_INDEX, NULL_CELL_CHAR, NULL_CELL_WIDTH, NULL_CELL_CODE, WHITESPACE_CELL_CHAR, Content, BgFlags } from 'common/buffer/Constants';\nimport { CellData } from 'common/buffer/CellData';\nimport { AttributeData, ExtendedAttrs } from 'common/buffer/AttributeData';\n\n/**\n * buffer memory layout:\n *\n * | uint32_t | uint32_t | uint32_t |\n * | `content` | `FG` | `BG` |\n * | wcwidth(2) comb(1) codepoint(21) | flags(8) R(8) G(8) B(8) | flags(8) R(8) G(8) B(8) |\n */\n\n\n/** typed array slots taken by one cell */\nconst CELL_SIZE = 3;\n\n/**\n * Cell member indices.\n *\n * Direct access:\n * `content = data[column * CELL_SIZE + Cell.CONTENT];`\n * `fg = data[column * CELL_SIZE + Cell.FG];`\n * `bg = data[column * CELL_SIZE + Cell.BG];`\n */\nconst enum Cell {\n CONTENT = 0,\n FG = 1, // currently simply holds all known attrs\n BG = 2 // currently unused\n}\n\nexport const DEFAULT_ATTR_DATA = Object.freeze(new AttributeData());\n\n/**\n * Typed array based bufferline implementation.\n *\n * There are 2 ways to insert data into the cell buffer:\n * - `setCellFromCodepoint` + `addCodepointToCell`\n * Use these for data that is already UTF32.\n * Used during normal input in `InputHandler` for faster buffer access.\n * - `setCell`\n * This method takes a CellData object and stores the data in the buffer.\n * Use `CellData.fromCharData` to create the CellData object (e.g. from JS string).\n *\n * To retrieve data from the buffer use either one of the primitive methods\n * (if only one particular value is needed) or `loadCell`. For `loadCell` in a loop\n * memory allocs / GC pressure can be greatly reduced by reusing the CellData object.\n */\nexport class BufferLine implements IBufferLine {\n protected _data: Uint32Array;\n protected _combined: {[index: number]: string} = {};\n protected _extendedAttrs: {[index: number]: ExtendedAttrs} = {};\n public length: number;\n\n constructor(cols: number, fillCellData?: ICellData, public isWrapped: boolean = false) {\n this._data = new Uint32Array(cols * CELL_SIZE);\n const cell = fillCellData || CellData.fromCharData([0, NULL_CELL_CHAR, NULL_CELL_WIDTH, NULL_CELL_CODE]);\n for (let i = 0; i < cols; ++i) {\n this.setCell(i, cell);\n }\n this.length = cols;\n }\n\n /**\n * Get cell data CharData.\n * @deprecated\n */\n public get(index: number): CharData {\n const content = this._data[index * CELL_SIZE + Cell.CONTENT];\n const cp = content & Content.CODEPOINT_MASK;\n return [\n this._data[index * CELL_SIZE + Cell.FG],\n (content & Content.IS_COMBINED_MASK)\n ? this._combined[index]\n : (cp) ? stringFromCodePoint(cp) : '',\n content >> Content.WIDTH_SHIFT,\n (content & Content.IS_COMBINED_MASK)\n ? this._combined[index].charCodeAt(this._combined[index].length - 1)\n : cp\n ];\n }\n\n /**\n * Set cell data from CharData.\n * @deprecated\n */\n public set(index: number, value: CharData): void {\n this._data[index * CELL_SIZE + Cell.FG] = value[CHAR_DATA_ATTR_INDEX];\n if (value[CHAR_DATA_CHAR_INDEX].length > 1) {\n this._combined[index] = value[1];\n this._data[index * CELL_SIZE + Cell.CONTENT] = index | Content.IS_COMBINED_MASK | (value[CHAR_DATA_WIDTH_INDEX] << Content.WIDTH_SHIFT);\n } else {\n this._data[index * CELL_SIZE + Cell.CONTENT] = value[CHAR_DATA_CHAR_INDEX].charCodeAt(0) | (value[CHAR_DATA_WIDTH_INDEX] << Content.WIDTH_SHIFT);\n }\n }\n\n /**\n * primitive getters\n * use these when only one value is needed, otherwise use `loadCell`\n */\n public getWidth(index: number): number {\n return this._data[index * CELL_SIZE + Cell.CONTENT] >> Content.WIDTH_SHIFT;\n }\n\n /** Test whether content has width. */\n public hasWidth(index: number): number {\n return this._data[index * CELL_SIZE + Cell.CONTENT] & Content.WIDTH_MASK;\n }\n\n /** Get FG cell component. */\n public getFg(index: number): number {\n return this._data[index * CELL_SIZE + Cell.FG];\n }\n\n /** Get BG cell component. */\n public getBg(index: number): number {\n return this._data[index * CELL_SIZE + Cell.BG];\n }\n\n /**\n * Test whether contains any chars.\n * Basically an empty has no content, but other cells might differ in FG/BG\n * from real empty cells.\n * */\n public hasContent(index: number): number {\n return this._data[index * CELL_SIZE + Cell.CONTENT] & Content.HAS_CONTENT_MASK;\n }\n\n /**\n * Get codepoint of the cell.\n * To be in line with `code` in CharData this either returns\n * a single UTF32 codepoint or the last codepoint of a combined string.\n */\n public getCodePoint(index: number): number {\n const content = this._data[index * CELL_SIZE + Cell.CONTENT];\n if (content & Content.IS_COMBINED_MASK) {\n return this._combined[index].charCodeAt(this._combined[index].length - 1);\n }\n return content & Content.CODEPOINT_MASK;\n }\n\n /** Test whether the cell contains a combined string. */\n public isCombined(index: number): number {\n return this._data[index * CELL_SIZE + Cell.CONTENT] & Content.IS_COMBINED_MASK;\n }\n\n /** Returns the string content of the cell. */\n public getString(index: number): string {\n const content = this._data[index * CELL_SIZE + Cell.CONTENT];\n if (content & Content.IS_COMBINED_MASK) {\n return this._combined[index];\n }\n if (content & Content.CODEPOINT_MASK) {\n return stringFromCodePoint(content & Content.CODEPOINT_MASK);\n }\n // return empty string for empty cells\n return '';\n }\n\n /**\n * Load data at `index` into `cell`. This is used to access cells in a way that's more friendly\n * to GC as it significantly reduced the amount of new objects/references needed.\n */\n public loadCell(index: number, cell: ICellData): ICellData {\n const startIndex = index * CELL_SIZE;\n cell.content = this._data[startIndex + Cell.CONTENT];\n cell.fg = this._data[startIndex + Cell.FG];\n cell.bg = this._data[startIndex + Cell.BG];\n if (cell.content & Content.IS_COMBINED_MASK) {\n cell.combinedData = this._combined[index];\n }\n if (cell.bg & BgFlags.HAS_EXTENDED) {\n cell.extended = this._extendedAttrs[index];\n }\n return cell;\n }\n\n /**\n * Set data at `index` to `cell`.\n */\n public setCell(index: number, cell: ICellData): void {\n if (cell.content & Content.IS_COMBINED_MASK) {\n this._combined[index] = cell.combinedData;\n }\n if (cell.bg & BgFlags.HAS_EXTENDED) {\n this._extendedAttrs[index] = cell.extended;\n }\n this._data[index * CELL_SIZE + Cell.CONTENT] = cell.content;\n this._data[index * CELL_SIZE + Cell.FG] = cell.fg;\n this._data[index * CELL_SIZE + Cell.BG] = cell.bg;\n }\n\n /**\n * Set cell data from input handler.\n * Since the input handler see the incoming chars as UTF32 codepoints,\n * it gets an optimized access method.\n */\n public setCellFromCodePoint(index: number, codePoint: number, width: number, fg: number, bg: number, eAttrs: IExtendedAttrs): void {\n if (bg & BgFlags.HAS_EXTENDED) {\n this._extendedAttrs[index] = eAttrs;\n }\n this._data[index * CELL_SIZE + Cell.CONTENT] = codePoint | (width << Content.WIDTH_SHIFT);\n this._data[index * CELL_SIZE + Cell.FG] = fg;\n this._data[index * CELL_SIZE + Cell.BG] = bg;\n }\n\n /**\n * Add a codepoint to a cell from input handler.\n * During input stage combining chars with a width of 0 follow and stack\n * onto a leading char. Since we already set the attrs\n * by the previous `setDataFromCodePoint` call, we can omit it here.\n */\n public addCodepointToCell(index: number, codePoint: number): void {\n let content = this._data[index * CELL_SIZE + Cell.CONTENT];\n if (content & Content.IS_COMBINED_MASK) {\n // we already have a combined string, simply add\n this._combined[index] += stringFromCodePoint(codePoint);\n } else {\n if (content & Content.CODEPOINT_MASK) {\n // normal case for combining chars:\n // - move current leading char + new one into combined string\n // - set combined flag\n this._combined[index] = stringFromCodePoint(content & Content.CODEPOINT_MASK) + stringFromCodePoint(codePoint);\n content &= ~Content.CODEPOINT_MASK; // set codepoint in buffer to 0\n content |= Content.IS_COMBINED_MASK;\n } else {\n // should not happen - we actually have no data in the cell yet\n // simply set the data in the cell buffer with a width of 1\n content = codePoint | (1 << Content.WIDTH_SHIFT);\n }\n this._data[index * CELL_SIZE + Cell.CONTENT] = content;\n }\n }\n\n public insertCells(pos: number, n: number, fillCellData: ICellData, eraseAttr?: IAttributeData): void {\n pos %= this.length;\n\n // handle fullwidth at pos: reset cell one to the left if pos is second cell of a wide char\n if (pos && this.getWidth(pos - 1) === 2) {\n this.setCellFromCodePoint(pos - 1, 0, 1, eraseAttr?.fg || 0, eraseAttr?.bg || 0, eraseAttr?.extended || new ExtendedAttrs());\n }\n\n if (n < this.length - pos) {\n const cell = new CellData();\n for (let i = this.length - pos - n - 1; i >= 0; --i) {\n this.setCell(pos + n + i, this.loadCell(pos + i, cell));\n }\n for (let i = 0; i < n; ++i) {\n this.setCell(pos + i, fillCellData);\n }\n } else {\n for (let i = pos; i < this.length; ++i) {\n this.setCell(i, fillCellData);\n }\n }\n\n // handle fullwidth at line end: reset last cell if it is first cell of a wide char\n if (this.getWidth(this.length - 1) === 2) {\n this.setCellFromCodePoint(this.length - 1, 0, 1, eraseAttr?.fg || 0, eraseAttr?.bg || 0, eraseAttr?.extended || new ExtendedAttrs());\n }\n }\n\n public deleteCells(pos: number, n: number, fillCellData: ICellData, eraseAttr?: IAttributeData): void {\n pos %= this.length;\n if (n < this.length - pos) {\n const cell = new CellData();\n for (let i = 0; i < this.length - pos - n; ++i) {\n this.setCell(pos + i, this.loadCell(pos + n + i, cell));\n }\n for (let i = this.length - n; i < this.length; ++i) {\n this.setCell(i, fillCellData);\n }\n } else {\n for (let i = pos; i < this.length; ++i) {\n this.setCell(i, fillCellData);\n }\n }\n\n // handle fullwidth at pos:\n // - reset pos-1 if wide char\n // - reset pos if width==0 (previous second cell of a wide char)\n if (pos && this.getWidth(pos - 1) === 2) {\n this.setCellFromCodePoint(pos - 1, 0, 1, eraseAttr?.fg || 0, eraseAttr?.bg || 0, eraseAttr?.extended || new ExtendedAttrs());\n }\n if (this.getWidth(pos) === 0 && !this.hasContent(pos)) {\n this.setCellFromCodePoint(pos, 0, 1, eraseAttr?.fg || 0, eraseAttr?.bg || 0, eraseAttr?.extended || new ExtendedAttrs());\n }\n }\n\n public replaceCells(start: number, end: number, fillCellData: ICellData, eraseAttr?: IAttributeData): void {\n // handle fullwidth at start: reset cell one to the left if start is second cell of a wide char\n if (start && this.getWidth(start - 1) === 2) {\n this.setCellFromCodePoint(start - 1, 0, 1, eraseAttr?.fg || 0, eraseAttr?.bg || 0, eraseAttr?.extended || new ExtendedAttrs());\n }\n // handle fullwidth at last cell + 1: reset to empty cell if it is second part of a wide char\n if (end < this.length && this.getWidth(end - 1) === 2) {\n this.setCellFromCodePoint(end, 0, 1, eraseAttr?.fg || 0, eraseAttr?.bg || 0, eraseAttr?.extended || new ExtendedAttrs());\n }\n\n while (start < end && start < this.length) {\n this.setCell(start++, fillCellData);\n }\n }\n\n public resize(cols: number, fillCellData: ICellData): void {\n if (cols === this.length) {\n return;\n }\n if (cols > this.length) {\n const data = new Uint32Array(cols * CELL_SIZE);\n if (this.length) {\n if (cols * CELL_SIZE < this._data.length) {\n data.set(this._data.subarray(0, cols * CELL_SIZE));\n } else {\n data.set(this._data);\n }\n }\n this._data = data;\n for (let i = this.length; i < cols; ++i) {\n this.setCell(i, fillCellData);\n }\n } else {\n if (cols) {\n const data = new Uint32Array(cols * CELL_SIZE);\n data.set(this._data.subarray(0, cols * CELL_SIZE));\n this._data = data;\n // Remove any cut off combined data, FIXME: repeat this for extended attrs\n const keys = Object.keys(this._combined);\n for (let i = 0; i < keys.length; i++) {\n const key = parseInt(keys[i], 10);\n if (key >= cols) {\n delete this._combined[key];\n }\n }\n } else {\n this._data = new Uint32Array(0);\n this._combined = {};\n }\n }\n this.length = cols;\n }\n\n /** fill a line with fillCharData */\n public fill(fillCellData: ICellData): void {\n this._combined = {};\n this._extendedAttrs = {};\n for (let i = 0; i < this.length; ++i) {\n this.setCell(i, fillCellData);\n }\n }\n\n /** alter to a full copy of line */\n public copyFrom(line: BufferLine): void {\n if (this.length !== line.length) {\n this._data = new Uint32Array(line._data);\n } else {\n // use high speed copy if lengths are equal\n this._data.set(line._data);\n }\n this.length = line.length;\n this._combined = {};\n for (const el in line._combined) {\n this._combined[el] = line._combined[el];\n }\n this._extendedAttrs = {};\n for (const el in line._extendedAttrs) {\n this._extendedAttrs[el] = line._extendedAttrs[el];\n }\n this.isWrapped = line.isWrapped;\n }\n\n /** create a new clone */\n public clone(): IBufferLine {\n const newLine = new BufferLine(0);\n newLine._data = new Uint32Array(this._data);\n newLine.length = this.length;\n for (const el in this._combined) {\n newLine._combined[el] = this._combined[el];\n }\n for (const el in this._extendedAttrs) {\n newLine._extendedAttrs[el] = this._extendedAttrs[el];\n }\n newLine.isWrapped = this.isWrapped;\n return newLine;\n }\n\n public getTrimmedLength(): number {\n for (let i = this.length - 1; i >= 0; --i) {\n if ((this._data[i * CELL_SIZE + Cell.CONTENT] & Content.HAS_CONTENT_MASK)) {\n return i + (this._data[i * CELL_SIZE + Cell.CONTENT] >> Content.WIDTH_SHIFT);\n }\n }\n return 0;\n }\n\n public copyCellsFrom(src: BufferLine, srcCol: number, destCol: number, length: number, applyInReverse: boolean): void {\n const srcData = src._data;\n if (applyInReverse) {\n for (let cell = length - 1; cell >= 0; cell--) {\n for (let i = 0; i < CELL_SIZE; i++) {\n this._data[(destCol + cell) * CELL_SIZE + i] = srcData[(srcCol + cell) * CELL_SIZE + i];\n }\n }\n } else {\n for (let cell = 0; cell < length; cell++) {\n for (let i = 0; i < CELL_SIZE; i++) {\n this._data[(destCol + cell) * CELL_SIZE + i] = srcData[(srcCol + cell) * CELL_SIZE + i];\n }\n }\n }\n\n // Move any combined data over as needed, FIXME: repeat for extended attrs\n const srcCombinedKeys = Object.keys(src._combined);\n for (let i = 0; i < srcCombinedKeys.length; i++) {\n const key = parseInt(srcCombinedKeys[i], 10);\n if (key >= srcCol) {\n this._combined[key - srcCol + destCol] = src._combined[key];\n }\n }\n }\n\n public translateToString(trimRight: boolean = false, startCol: number = 0, endCol: number = this.length): string {\n if (trimRight) {\n endCol = Math.min(endCol, this.getTrimmedLength());\n }\n let result = '';\n while (startCol < endCol) {\n const content = this._data[startCol * CELL_SIZE + Cell.CONTENT];\n const cp = content & Content.CODEPOINT_MASK;\n result += (content & Content.IS_COMBINED_MASK) ? this._combined[startCol] : (cp) ? stringFromCodePoint(cp) : WHITESPACE_CELL_CHAR;\n startCol += (content >> Content.WIDTH_SHIFT) || 1; // always advance by 1\n }\n return result;\n }\n}\n","/**\n * Copyright (c) 2021 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IBufferRange } from 'xterm';\n\nexport function getRangeLength(range: IBufferRange, bufferCols: number): number {\n if (range.start.y > range.end.y) {\n throw new Error(`Buffer range end (${range.end.x}, ${range.end.y}) cannot be before start (${range.start.x}, ${range.start.y})`);\n }\n return bufferCols * (range.end.y - range.start.y) + (range.end.x - range.start.x + 1);\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { BufferLine } from 'common/buffer/BufferLine';\nimport { CircularList } from 'common/CircularList';\nimport { IBufferLine, ICellData } from 'common/Types';\n\nexport interface INewLayoutResult {\n layout: number[];\n countRemoved: number;\n}\n\n/**\n * Evaluates and returns indexes to be removed after a reflow larger occurs. Lines will be removed\n * when a wrapped line unwraps.\n * @param lines The buffer lines.\n * @param newCols The columns after resize.\n */\nexport function reflowLargerGetLinesToRemove(lines: CircularList<IBufferLine>, oldCols: number, newCols: number, bufferAbsoluteY: number, nullCell: ICellData): number[] {\n // Gather all BufferLines that need to be removed from the Buffer here so that they can be\n // batched up and only committed once\n const toRemove: number[] = [];\n\n for (let y = 0; y < lines.length - 1; y++) {\n // Check if this row is wrapped\n let i = y;\n let nextLine = lines.get(++i) as BufferLine;\n if (!nextLine.isWrapped) {\n continue;\n }\n\n // Check how many lines it's wrapped for\n const wrappedLines: BufferLine[] = [lines.get(y) as BufferLine];\n while (i < lines.length && nextLine.isWrapped) {\n wrappedLines.push(nextLine);\n nextLine = lines.get(++i) as BufferLine;\n }\n\n // If these lines contain the cursor don't touch them, the program will handle fixing up wrapped\n // lines with the cursor\n if (bufferAbsoluteY >= y && bufferAbsoluteY < i) {\n y += wrappedLines.length - 1;\n continue;\n }\n\n // Copy buffer data to new locations\n let destLineIndex = 0;\n let destCol = getWrappedLineTrimmedLength(wrappedLines, destLineIndex, oldCols);\n let srcLineIndex = 1;\n let srcCol = 0;\n while (srcLineIndex < wrappedLines.length) {\n const srcTrimmedTineLength = getWrappedLineTrimmedLength(wrappedLines, srcLineIndex, oldCols);\n const srcRemainingCells = srcTrimmedTineLength - srcCol;\n const destRemainingCells = newCols - destCol;\n const cellsToCopy = Math.min(srcRemainingCells, destRemainingCells);\n\n wrappedLines[destLineIndex].copyCellsFrom(wrappedLines[srcLineIndex], srcCol, destCol, cellsToCopy, false);\n\n destCol += cellsToCopy;\n if (destCol === newCols) {\n destLineIndex++;\n destCol = 0;\n }\n srcCol += cellsToCopy;\n if (srcCol === srcTrimmedTineLength) {\n srcLineIndex++;\n srcCol = 0;\n }\n\n // Make sure the last cell isn't wide, if it is copy it to the current dest\n if (destCol === 0 && destLineIndex !== 0) {\n if (wrappedLines[destLineIndex - 1].getWidth(newCols - 1) === 2) {\n wrappedLines[destLineIndex].copyCellsFrom(wrappedLines[destLineIndex - 1], newCols - 1, destCol++, 1, false);\n // Null out the end of the last row\n wrappedLines[destLineIndex - 1].setCell(newCols - 1, nullCell);\n }\n }\n }\n\n // Clear out remaining cells or fragments could remain;\n wrappedLines[destLineIndex].replaceCells(destCol, newCols, nullCell);\n\n // Work backwards and remove any rows at the end that only contain null cells\n let countToRemove = 0;\n for (let i = wrappedLines.length - 1; i > 0; i--) {\n if (i > destLineIndex || wrappedLines[i].getTrimmedLength() === 0) {\n countToRemove++;\n } else {\n break;\n }\n }\n\n if (countToRemove > 0) {\n toRemove.push(y + wrappedLines.length - countToRemove); // index\n toRemove.push(countToRemove);\n }\n\n y += wrappedLines.length - 1;\n }\n return toRemove;\n}\n\n/**\n * Creates and return the new layout for lines given an array of indexes to be removed.\n * @param lines The buffer lines.\n * @param toRemove The indexes to remove.\n */\nexport function reflowLargerCreateNewLayout(lines: CircularList<IBufferLine>, toRemove: number[]): INewLayoutResult {\n const layout: number[] = [];\n // First iterate through the list and get the actual indexes to use for rows\n let nextToRemoveIndex = 0;\n let nextToRemoveStart = toRemove[nextToRemoveIndex];\n let countRemovedSoFar = 0;\n for (let i = 0; i < lines.length; i++) {\n if (nextToRemoveStart === i) {\n const countToRemove = toRemove[++nextToRemoveIndex];\n\n // Tell markers that there was a deletion\n lines.onDeleteEmitter.fire({\n index: i - countRemovedSoFar,\n amount: countToRemove\n });\n\n i += countToRemove - 1;\n countRemovedSoFar += countToRemove;\n nextToRemoveStart = toRemove[++nextToRemoveIndex];\n } else {\n layout.push(i);\n }\n }\n return {\n layout,\n countRemoved: countRemovedSoFar\n };\n}\n\n/**\n * Applies a new layout to the buffer. This essentially does the same as many splice calls but it's\n * done all at once in a single iteration through the list since splice is very expensive.\n * @param lines The buffer lines.\n * @param newLayout The new layout to apply.\n */\nexport function reflowLargerApplyNewLayout(lines: CircularList<IBufferLine>, newLayout: number[]): void {\n // Record original lines so they don't get overridden when we rearrange the list\n const newLayoutLines: BufferLine[] = [];\n for (let i = 0; i < newLayout.length; i++) {\n newLayoutLines.push(lines.get(newLayout[i]) as BufferLine);\n }\n\n // Rearrange the list\n for (let i = 0; i < newLayoutLines.length; i++) {\n lines.set(i, newLayoutLines[i]);\n }\n lines.length = newLayout.length;\n}\n\n/**\n * Gets the new line lengths for a given wrapped line. The purpose of this function it to pre-\n * compute the wrapping points since wide characters may need to be wrapped onto the following line.\n * This function will return an array of numbers of where each line wraps to, the resulting array\n * will only contain the values `newCols` (when the line does not end with a wide character) and\n * `newCols - 1` (when the line does end with a wide character), except for the last value which\n * will contain the remaining items to fill the line.\n *\n * Calling this with a `newCols` value of `1` will lock up.\n *\n * @param wrappedLines The wrapped lines to evaluate.\n * @param oldCols The columns before resize.\n * @param newCols The columns after resize.\n */\nexport function reflowSmallerGetNewLineLengths(wrappedLines: BufferLine[], oldCols: number, newCols: number): number[] {\n const newLineLengths: number[] = [];\n const cellsNeeded = wrappedLines.map((l, i) => getWrappedLineTrimmedLength(wrappedLines, i, oldCols)).reduce((p, c) => p + c);\n\n // Use srcCol and srcLine to find the new wrapping point, use that to get the cellsAvailable and\n // linesNeeded\n let srcCol = 0;\n let srcLine = 0;\n let cellsAvailable = 0;\n while (cellsAvailable < cellsNeeded) {\n if (cellsNeeded - cellsAvailable < newCols) {\n // Add the final line and exit the loop\n newLineLengths.push(cellsNeeded - cellsAvailable);\n break;\n }\n srcCol += newCols;\n const oldTrimmedLength = getWrappedLineTrimmedLength(wrappedLines, srcLine, oldCols);\n if (srcCol > oldTrimmedLength) {\n srcCol -= oldTrimmedLength;\n srcLine++;\n }\n const endsWithWide = wrappedLines[srcLine].getWidth(srcCol - 1) === 2;\n if (endsWithWide) {\n srcCol--;\n }\n const lineLength = endsWithWide ? newCols - 1 : newCols;\n newLineLengths.push(lineLength);\n cellsAvailable += lineLength;\n }\n\n return newLineLengths;\n}\n\nexport function getWrappedLineTrimmedLength(lines: BufferLine[], i: number, cols: number): number {\n // If this is the last row in the wrapped line, get the actual trimmed length\n if (i === lines.length - 1) {\n return lines[i].getTrimmedLength();\n }\n // Detect whether the following line starts with a wide character and the end of the current line\n // is null, if so then we can be pretty sure the null character should be excluded from the line\n // length]\n const endsInNull = !(lines[i].hasContent(cols - 1)) && lines[i].getWidth(cols - 1) === 1;\n const followingLineStartsWithWide = lines[i + 1].getWidth(0) === 2;\n if (endsInNull && followingLineStartsWithWide) {\n return cols - 1;\n }\n return cols;\n}\n","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IBuffer, IBufferSet } from 'common/buffer/Types';\nimport { IAttributeData } from 'common/Types';\nimport { Buffer } from 'common/buffer/Buffer';\nimport { EventEmitter, IEvent } from 'common/EventEmitter';\nimport { IOptionsService, IBufferService } from 'common/services/Services';\nimport { Disposable } from 'common/Lifecycle';\n\n/**\n * The BufferSet represents the set of two buffers used by xterm terminals (normal and alt) and\n * provides also utilities for working with them.\n */\nexport class BufferSet extends Disposable implements IBufferSet {\n private _normal!: Buffer;\n private _alt!: Buffer;\n private _activeBuffer!: Buffer;\n\n private _onBufferActivate = this.register(new EventEmitter<{activeBuffer: IBuffer, inactiveBuffer: IBuffer}>());\n public get onBufferActivate(): IEvent<{activeBuffer: IBuffer, inactiveBuffer: IBuffer}> { return this._onBufferActivate.event; }\n\n /**\n * Create a new BufferSet for the given terminal.\n * @param _terminal - The terminal the BufferSet will belong to\n */\n constructor(\n private readonly _optionsService: IOptionsService,\n private readonly _bufferService: IBufferService\n ) {\n super();\n this.reset();\n }\n\n public reset(): void {\n this._normal = new Buffer(true, this._optionsService, this._bufferService);\n this._normal.fillViewportRows();\n\n // The alt buffer should never have scrollback.\n // See http://invisible-island.net/xterm/ctlseqs/ctlseqs.html#h2-The-Alternate-Screen-Buffer\n this._alt = new Buffer(false, this._optionsService, this._bufferService);\n this._activeBuffer = this._normal;\n this._onBufferActivate.fire({\n activeBuffer: this._normal,\n inactiveBuffer: this._alt\n });\n\n this.setupTabStops();\n }\n\n /**\n * Returns the alt Buffer of the BufferSet\n */\n public get alt(): Buffer {\n return this._alt;\n }\n\n /**\n * Returns the normal Buffer of the BufferSet\n */\n public get active(): Buffer {\n return this._activeBuffer;\n }\n\n /**\n * Returns the currently active Buffer of the BufferSet\n */\n public get normal(): Buffer {\n return this._normal;\n }\n\n /**\n * Sets the normal Buffer of the BufferSet as its currently active Buffer\n */\n public activateNormalBuffer(): void {\n if (this._activeBuffer === this._normal) {\n return;\n }\n this._normal.x = this._alt.x;\n this._normal.y = this._alt.y;\n // The alt buffer should always be cleared when we switch to the normal\n // buffer. This frees up memory since the alt buffer should always be new\n // when activated.\n this._alt.clear();\n this._activeBuffer = this._normal;\n this._onBufferActivate.fire({\n activeBuffer: this._normal,\n inactiveBuffer: this._alt\n });\n }\n\n /**\n * Sets the alt Buffer of the BufferSet as its currently active Buffer\n */\n public activateAltBuffer(fillAttr?: IAttributeData): void {\n if (this._activeBuffer === this._alt) {\n return;\n }\n // Since the alt buffer is always cleared when the normal buffer is\n // activated, we want to fill it when switching to it.\n this._alt.fillViewportRows(fillAttr);\n this._alt.x = this._normal.x;\n this._alt.y = this._normal.y;\n this._activeBuffer = this._alt;\n this._onBufferActivate.fire({\n activeBuffer: this._alt,\n inactiveBuffer: this._normal\n });\n }\n\n /**\n * Resizes both normal and alt buffers, adjusting their data accordingly.\n * @param newCols The new number of columns.\n * @param newRows The new number of rows.\n */\n public resize(newCols: number, newRows: number): void {\n this._normal.resize(newCols, newRows);\n this._alt.resize(newCols, newRows);\n }\n\n /**\n * Setup the tab stops.\n * @param i The index to start setting up tab stops from.\n */\n public setupTabStops(i?: number): void {\n this._normal.setupTabStops(i);\n this._alt.setupTabStops(i);\n }\n}\n","/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { CharData, ICellData, IExtendedAttrs } from 'common/Types';\nimport { stringFromCodePoint } from 'common/input/TextDecoder';\nimport { CHAR_DATA_CHAR_INDEX, CHAR_DATA_WIDTH_INDEX, CHAR_DATA_ATTR_INDEX, Content } from 'common/buffer/Constants';\nimport { AttributeData, ExtendedAttrs } from 'common/buffer/AttributeData';\n\n/**\n * CellData - represents a single Cell in the terminal buffer.\n */\nexport class CellData extends AttributeData implements ICellData {\n /** Helper to create CellData from CharData. */\n public static fromCharData(value: CharData): CellData {\n const obj = new CellData();\n obj.setFromCharData(value);\n return obj;\n }\n /** Primitives from terminal buffer. */\n public content = 0;\n public fg = 0;\n public bg = 0;\n public extended: IExtendedAttrs = new ExtendedAttrs();\n public combinedData = '';\n /** Whether cell contains a combined string. */\n public isCombined(): number {\n return this.content & Content.IS_COMBINED_MASK;\n }\n /** Width of the cell. */\n public getWidth(): number {\n return this.content >> Content.WIDTH_SHIFT;\n }\n /** JS string of the content. */\n public getChars(): string {\n if (this.content & Content.IS_COMBINED_MASK) {\n return this.combinedData;\n }\n if (this.content & Content.CODEPOINT_MASK) {\n return stringFromCodePoint(this.content & Content.CODEPOINT_MASK);\n }\n return '';\n }\n /**\n * Codepoint of cell\n * Note this returns the UTF32 codepoint of single chars,\n * if content is a combined string it returns the codepoint\n * of the last char in string to be in line with code in CharData.\n * */\n public getCode(): number {\n return (this.isCombined())\n ? this.combinedData.charCodeAt(this.combinedData.length - 1)\n : this.content & Content.CODEPOINT_MASK;\n }\n /** Set data from CharData */\n public setFromCharData(value: CharData): void {\n this.fg = value[CHAR_DATA_ATTR_INDEX];\n this.bg = 0;\n let combined = false;\n // surrogates and combined strings need special treatment\n if (value[CHAR_DATA_CHAR_INDEX].length > 2) {\n combined = true;\n }\n else if (value[CHAR_DATA_CHAR_INDEX].length === 2) {\n const code = value[CHAR_DATA_CHAR_INDEX].charCodeAt(0);\n // if the 2-char string is a surrogate create single codepoint\n // everything else is combined\n if (0xD800 <= code && code <= 0xDBFF) {\n const second = value[CHAR_DATA_CHAR_INDEX].charCodeAt(1);\n if (0xDC00 <= second && second <= 0xDFFF) {\n this.content = ((code - 0xD800) * 0x400 + second - 0xDC00 + 0x10000) | (value[CHAR_DATA_WIDTH_INDEX] << Content.WIDTH_SHIFT);\n }\n else {\n combined = true;\n }\n }\n else {\n combined = true;\n }\n }\n else {\n this.content = value[CHAR_DATA_CHAR_INDEX].charCodeAt(0) | (value[CHAR_DATA_WIDTH_INDEX] << Content.WIDTH_SHIFT);\n }\n if (combined) {\n this.combinedData = value[CHAR_DATA_CHAR_INDEX];\n this.content = Content.IS_COMBINED_MASK | (value[CHAR_DATA_WIDTH_INDEX] << Content.WIDTH_SHIFT);\n }\n }\n /** Get data as CharData. */\n public getAsCharData(): CharData {\n return [this.fg, this.getChars(), this.getWidth(), this.getCode()];\n }\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nexport const DEFAULT_COLOR = 256;\nexport const DEFAULT_ATTR = (0 << 18) | (DEFAULT_COLOR << 9) | (256 << 0);\n\nexport const CHAR_DATA_ATTR_INDEX = 0;\nexport const CHAR_DATA_CHAR_INDEX = 1;\nexport const CHAR_DATA_WIDTH_INDEX = 2;\nexport const CHAR_DATA_CODE_INDEX = 3;\n\n/**\n * Null cell - a real empty cell (containing nothing).\n * Note that code should always be 0 for a null cell as\n * several test condition of the buffer line rely on this.\n */\nexport const NULL_CELL_CHAR = '';\nexport const NULL_CELL_WIDTH = 1;\nexport const NULL_CELL_CODE = 0;\n\n/**\n * Whitespace cell.\n * This is meant as a replacement for empty cells when needed\n * during rendering lines to preserve correct aligment.\n */\nexport const WHITESPACE_CELL_CHAR = ' ';\nexport const WHITESPACE_CELL_WIDTH = 1;\nexport const WHITESPACE_CELL_CODE = 32;\n\n/**\n * Bitmasks for accessing data in `content`.\n */\nexport const enum Content {\n /**\n * bit 1..21 codepoint, max allowed in UTF32 is 0x10FFFF (21 bits taken)\n * read: `codepoint = content & Content.codepointMask;`\n * write: `content |= codepoint & Content.codepointMask;`\n * shortcut if precondition `codepoint <= 0x10FFFF` is met:\n * `content |= codepoint;`\n */\n CODEPOINT_MASK = 0x1FFFFF,\n\n /**\n * bit 22 flag indication whether a cell contains combined content\n * read: `isCombined = content & Content.isCombined;`\n * set: `content |= Content.isCombined;`\n * clear: `content &= ~Content.isCombined;`\n */\n IS_COMBINED_MASK = 0x200000, // 1 << 21\n\n /**\n * bit 1..22 mask to check whether a cell contains any string data\n * we need to check for codepoint and isCombined bits to see\n * whether a cell contains anything\n * read: `isEmpty = !(content & Content.hasContent)`\n */\n HAS_CONTENT_MASK = 0x3FFFFF,\n\n /**\n * bit 23..24 wcwidth value of cell, takes 2 bits (ranges from 0..2)\n * read: `width = (content & Content.widthMask) >> Content.widthShift;`\n * `hasWidth = content & Content.widthMask;`\n * as long as wcwidth is highest value in `content`:\n * `width = content >> Content.widthShift;`\n * write: `content |= (width << Content.widthShift) & Content.widthMask;`\n * shortcut if precondition `0 <= width <= 3` is met:\n * `content |= width << Content.widthShift;`\n */\n WIDTH_MASK = 0xC00000, // 3 << 22\n WIDTH_SHIFT = 22\n}\n\nexport const enum Attributes {\n /**\n * bit 1..8 blue in RGB, color in P256 and P16\n */\n BLUE_MASK = 0xFF,\n BLUE_SHIFT = 0,\n PCOLOR_MASK = 0xFF,\n PCOLOR_SHIFT = 0,\n\n /**\n * bit 9..16 green in RGB\n */\n GREEN_MASK = 0xFF00,\n GREEN_SHIFT = 8,\n\n /**\n * bit 17..24 red in RGB\n */\n RED_MASK = 0xFF0000,\n RED_SHIFT = 16,\n\n /**\n * bit 25..26 color mode: DEFAULT (0) | P16 (1) | P256 (2) | RGB (3)\n */\n CM_MASK = 0x3000000,\n CM_DEFAULT = 0,\n CM_P16 = 0x1000000,\n CM_P256 = 0x2000000,\n CM_RGB = 0x3000000,\n\n /**\n * bit 1..24 RGB room\n */\n RGB_MASK = 0xFFFFFF\n}\n\nexport const enum FgFlags {\n /**\n * bit 27..32\n */\n INVERSE = 0x4000000,\n BOLD = 0x8000000,\n UNDERLINE = 0x10000000,\n BLINK = 0x20000000,\n INVISIBLE = 0x40000000,\n STRIKETHROUGH = 0x80000000,\n}\n\nexport const enum BgFlags {\n /**\n * bit 27..32 (upper 3 unused)\n */\n ITALIC = 0x4000000,\n DIM = 0x8000000,\n HAS_EXTENDED = 0x10000000\n}\n\nexport const enum UnderlineStyle {\n NONE = 0,\n SINGLE = 1,\n DOUBLE = 2,\n CURLY = 3,\n DOTTED = 4,\n DASHED = 5\n}\n","/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { EventEmitter, IEvent } from 'common/EventEmitter';\nimport { Disposable } from 'common/Lifecycle';\nimport { IMarker } from 'common/Types';\n\nexport class Marker extends Disposable implements IMarker {\n private static _nextId = 1;\n\n private _id: number = Marker._nextId++;\n public isDisposed: boolean = false;\n\n public get id(): number { return this._id; }\n\n private _onDispose = new EventEmitter<void>();\n public get onDispose(): IEvent<void> { return this._onDispose.event; }\n\n constructor(\n public line: number\n ) {\n super();\n }\n\n public dispose(): void {\n if (this.isDisposed) {\n return;\n }\n this.isDisposed = true;\n this.line = -1;\n // Emit before super.dispose such that dispose listeners get a change to react\n this._onDispose.fire();\n super.dispose();\n }\n}\n","/**\n * Copyright (c) 2016 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ICharset } from 'common/Types';\n\n/**\n * The character sets supported by the terminal. These enable several languages\n * to be represented within the terminal with only 8-bit encoding. See ISO 2022\n * for a discussion on character sets. Only VT100 character sets are supported.\n */\nexport const CHARSETS: { [key: string]: ICharset | undefined } = {};\n\n/**\n * The default character set, US.\n */\nexport const DEFAULT_CHARSET: ICharset | undefined = CHARSETS['B'];\n\n/**\n * DEC Special Character and Line Drawing Set.\n * Reference: http://vt100.net/docs/vt102-ug/table5-13.html\n * A lot of curses apps use this if they see TERM=xterm.\n * testing: echo -e '\\e(0a\\e(B'\n * The xterm output sometimes seems to conflict with the\n * reference above. xterm seems in line with the reference\n * when running vttest however.\n * The table below now uses xterm's output from vttest.\n */\nCHARSETS['0'] = {\n '`': '\\u25c6', // '◆'\n 'a': '\\u2592', // '▒'\n 'b': '\\u2409', // '␉' (HT)\n 'c': '\\u240c', // '␌' (FF)\n 'd': '\\u240d', // '␍' (CR)\n 'e': '\\u240a', // '␊' (LF)\n 'f': '\\u00b0', // '°'\n 'g': '\\u00b1', // '±'\n 'h': '\\u2424', // '' (NL)\n 'i': '\\u240b', // '␋' (VT)\n 'j': '\\u2518', // '┘'\n 'k': '\\u2510', // '┐'\n 'l': '\\u250c', // '┌'\n 'm': '\\u2514', // '└'\n 'n': '\\u253c', // '┼'\n 'o': '\\u23ba', // '⎺'\n 'p': '\\u23bb', // '⎻'\n 'q': '\\u2500', // '─'\n 'r': '\\u23bc', // '⎼'\n 's': '\\u23bd', // '⎽'\n 't': '\\u251c', // '├'\n 'u': '\\u2524', // '┤'\n 'v': '\\u2534', // '┴'\n 'w': '\\u252c', // '┬'\n 'x': '\\u2502', // '│'\n 'y': '\\u2264', // '≤'\n 'z': '\\u2265', // '≥'\n '{': '\\u03c0', // 'π'\n '|': '\\u2260', // '≠'\n '}': '\\u00a3', // '£'\n '~': '\\u00b7' // '·'\n};\n\n/**\n * British character set\n * ESC (A\n * Reference: http://vt100.net/docs/vt220-rm/table2-5.html\n */\nCHARSETS['A'] = {\n '#': '£'\n};\n\n/**\n * United States character set\n * ESC (B\n */\nCHARSETS['B'] = undefined;\n\n/**\n * Dutch character set\n * ESC (4\n * Reference: http://vt100.net/docs/vt220-rm/table2-6.html\n */\nCHARSETS['4'] = {\n '#': '£',\n '@': '¾',\n '[': 'ij',\n '\\\\': '½',\n ']': '|',\n '{': '¨',\n '|': 'f',\n '}': '¼',\n '~': '´'\n};\n\n/**\n * Finnish character set\n * ESC (C or ESC (5\n * Reference: http://vt100.net/docs/vt220-rm/table2-7.html\n */\nCHARSETS['C'] =\nCHARSETS['5'] = {\n '[': 'Ä',\n '\\\\': 'Ö',\n ']': 'Å',\n '^': 'Ü',\n '`': 'é',\n '{': 'ä',\n '|': 'ö',\n '}': 'å',\n '~': 'ü'\n};\n\n/**\n * French character set\n * ESC (R\n * Reference: http://vt100.net/docs/vt220-rm/table2-8.html\n */\nCHARSETS['R'] = {\n '#': '£',\n '@': 'à',\n '[': '°',\n '\\\\': 'ç',\n ']': '§',\n '{': 'é',\n '|': 'ù',\n '}': 'è',\n '~': '¨'\n};\n\n/**\n * French Canadian character set\n * ESC (Q\n * Reference: http://vt100.net/docs/vt220-rm/table2-9.html\n */\nCHARSETS['Q'] = {\n '@': 'à',\n '[': 'â',\n '\\\\': 'ç',\n ']': 'ê',\n '^': 'î',\n '`': 'ô',\n '{': 'é',\n '|': 'ù',\n '}': 'è',\n '~': 'û'\n};\n\n/**\n * German character set\n * ESC (K\n * Reference: http://vt100.net/docs/vt220-rm/table2-10.html\n */\nCHARSETS['K'] = {\n '@': '§',\n '[': 'Ä',\n '\\\\': 'Ö',\n ']': 'Ü',\n '{': 'ä',\n '|': 'ö',\n '}': 'ü',\n '~': 'ß'\n};\n\n/**\n * Italian character set\n * ESC (Y\n * Reference: http://vt100.net/docs/vt220-rm/table2-11.html\n */\nCHARSETS['Y'] = {\n '#': '£',\n '@': '§',\n '[': '°',\n '\\\\': 'ç',\n ']': 'é',\n '`': 'ù',\n '{': 'à',\n '|': 'ò',\n '}': 'è',\n '~': 'ì'\n};\n\n/**\n * Norwegian/Danish character set\n * ESC (E or ESC (6\n * Reference: http://vt100.net/docs/vt220-rm/table2-12.html\n */\nCHARSETS['E'] =\nCHARSETS['6'] = {\n '@': 'Ä',\n '[': 'Æ',\n '\\\\': 'Ø',\n ']': 'Å',\n '^': 'Ü',\n '`': 'ä',\n '{': 'æ',\n '|': 'ø',\n '}': 'å',\n '~': 'ü'\n};\n\n/**\n * Spanish character set\n * ESC (Z\n * Reference: http://vt100.net/docs/vt220-rm/table2-13.html\n */\nCHARSETS['Z'] = {\n '#': '£',\n '@': '§',\n '[': '¡',\n '\\\\': 'Ñ',\n ']': '¿',\n '{': '°',\n '|': 'ñ',\n '}': 'ç'\n};\n\n/**\n * Swedish character set\n * ESC (H or ESC (7\n * Reference: http://vt100.net/docs/vt220-rm/table2-14.html\n */\nCHARSETS['H'] =\nCHARSETS['7'] = {\n '@': 'É',\n '[': 'Ä',\n '\\\\': 'Ö',\n ']': 'Å',\n '^': 'Ü',\n '`': 'é',\n '{': 'ä',\n '|': 'ö',\n '}': 'å',\n '~': 'ü'\n};\n\n/**\n * Swiss character set\n * ESC (=\n * Reference: http://vt100.net/docs/vt220-rm/table2-15.html\n */\nCHARSETS['='] = {\n '#': 'ù',\n '@': 'à',\n '[': 'é',\n '\\\\': 'ç',\n ']': 'ê',\n '^': 'î',\n // eslint-disable-next-line @typescript-eslint/naming-convention\n '_': 'è',\n '`': 'ô',\n '{': 'ä',\n '|': 'ö',\n '}': 'ü',\n '~': 'û'\n};\n","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\n/**\n * C0 control codes\n * See = https://en.wikipedia.org/wiki/C0_and_C1_control_codes\n */\nexport namespace C0 {\n /** Null (Caret = ^@, C = \\0) */\n export const NUL = '\\x00';\n /** Start of Heading (Caret = ^A) */\n export const SOH = '\\x01';\n /** Start of Text (Caret = ^B) */\n export const STX = '\\x02';\n /** End of Text (Caret = ^C) */\n export const ETX = '\\x03';\n /** End of Transmission (Caret = ^D) */\n export const EOT = '\\x04';\n /** Enquiry (Caret = ^E) */\n export const ENQ = '\\x05';\n /** Acknowledge (Caret = ^F) */\n export const ACK = '\\x06';\n /** Bell (Caret = ^G, C = \\a) */\n export const BEL = '\\x07';\n /** Backspace (Caret = ^H, C = \\b) */\n export const BS = '\\x08';\n /** Character Tabulation, Horizontal Tabulation (Caret = ^I, C = \\t) */\n export const HT = '\\x09';\n /** Line Feed (Caret = ^J, C = \\n) */\n export const LF = '\\x0a';\n /** Line Tabulation, Vertical Tabulation (Caret = ^K, C = \\v) */\n export const VT = '\\x0b';\n /** Form Feed (Caret = ^L, C = \\f) */\n export const FF = '\\x0c';\n /** Carriage Return (Caret = ^M, C = \\r) */\n export const CR = '\\x0d';\n /** Shift Out (Caret = ^N) */\n export const SO = '\\x0e';\n /** Shift In (Caret = ^O) */\n export const SI = '\\x0f';\n /** Data Link Escape (Caret = ^P) */\n export const DLE = '\\x10';\n /** Device Control One (XON) (Caret = ^Q) */\n export const DC1 = '\\x11';\n /** Device Control Two (Caret = ^R) */\n export const DC2 = '\\x12';\n /** Device Control Three (XOFF) (Caret = ^S) */\n export const DC3 = '\\x13';\n /** Device Control Four (Caret = ^T) */\n export const DC4 = '\\x14';\n /** Negative Acknowledge (Caret = ^U) */\n export const NAK = '\\x15';\n /** Synchronous Idle (Caret = ^V) */\n export const SYN = '\\x16';\n /** End of Transmission Block (Caret = ^W) */\n export const ETB = '\\x17';\n /** Cancel (Caret = ^X) */\n export const CAN = '\\x18';\n /** End of Medium (Caret = ^Y) */\n export const EM = '\\x19';\n /** Substitute (Caret = ^Z) */\n export const SUB = '\\x1a';\n /** Escape (Caret = ^[, C = \\e) */\n export const ESC = '\\x1b';\n /** File Separator (Caret = ^\\) */\n export const FS = '\\x1c';\n /** Group Separator (Caret = ^]) */\n export const GS = '\\x1d';\n /** Record Separator (Caret = ^^) */\n export const RS = '\\x1e';\n /** Unit Separator (Caret = ^_) */\n export const US = '\\x1f';\n /** Space */\n export const SP = '\\x20';\n /** Delete (Caret = ^?) */\n export const DEL = '\\x7f';\n}\n\n/**\n * C1 control codes\n * See = https://en.wikipedia.org/wiki/C0_and_C1_control_codes\n */\nexport namespace C1 {\n /** padding character */\n export const PAD = '\\x80';\n /** High Octet Preset */\n export const HOP = '\\x81';\n /** Break Permitted Here */\n export const BPH = '\\x82';\n /** No Break Here */\n export const NBH = '\\x83';\n /** Index */\n export const IND = '\\x84';\n /** Next Line */\n export const NEL = '\\x85';\n /** Start of Selected Area */\n export const SSA = '\\x86';\n /** End of Selected Area */\n export const ESA = '\\x87';\n /** Horizontal Tabulation Set */\n export const HTS = '\\x88';\n /** Horizontal Tabulation With Justification */\n export const HTJ = '\\x89';\n /** Vertical Tabulation Set */\n export const VTS = '\\x8a';\n /** Partial Line Down */\n export const PLD = '\\x8b';\n /** Partial Line Up */\n export const PLU = '\\x8c';\n /** Reverse Index */\n export const RI = '\\x8d';\n /** Single-Shift 2 */\n export const SS2 = '\\x8e';\n /** Single-Shift 3 */\n export const SS3 = '\\x8f';\n /** Device Control String */\n export const DCS = '\\x90';\n /** Private Use 1 */\n export const PU1 = '\\x91';\n /** Private Use 2 */\n export const PU2 = '\\x92';\n /** Set Transmit State */\n export const STS = '\\x93';\n /** Destructive backspace, intended to eliminate ambiguity about meaning of BS. */\n export const CCH = '\\x94';\n /** Message Waiting */\n export const MW = '\\x95';\n /** Start of Protected Area */\n export const SPA = '\\x96';\n /** End of Protected Area */\n export const EPA = '\\x97';\n /** Start of String */\n export const SOS = '\\x98';\n /** Single Graphic Character Introducer */\n export const SGCI = '\\x99';\n /** Single Character Introducer */\n export const SCI = '\\x9a';\n /** Control Sequence Introducer */\n export const CSI = '\\x9b';\n /** String Terminator */\n export const ST = '\\x9c';\n /** Operating System Command */\n export const OSC = '\\x9d';\n /** Privacy Message */\n export const PM = '\\x9e';\n /** Application Program Command */\n export const APC = '\\x9f';\n}\nexport namespace C1_ESCAPED {\n export const ST = `${C0.ESC}\\\\`;\n}\n","/**\n * Copyright (c) 2014 The xterm.js authors. All rights reserved.\n * Copyright (c) 2012-2013, Christopher Jeffrey (MIT License)\n * @license MIT\n */\n\nimport { IKeyboardEvent, IKeyboardResult, KeyboardResultType } from 'common/Types';\nimport { C0 } from 'common/data/EscapeSequences';\n\n// reg + shift key mappings for digits and special chars\nconst KEYCODE_KEY_MAPPINGS: { [key: number]: [string, string]} = {\n // digits 0-9\n 48: ['0', ')'],\n 49: ['1', '!'],\n 50: ['2', '@'],\n 51: ['3', '#'],\n 52: ['4', '$'],\n 53: ['5', '%'],\n 54: ['6', '^'],\n 55: ['7', '&'],\n 56: ['8', '*'],\n 57: ['9', '('],\n\n // special chars\n 186: [';', ':'],\n 187: ['=', '+'],\n 188: [',', '<'],\n 189: ['-', '_'],\n 190: ['.', '>'],\n 191: ['/', '?'],\n 192: ['`', '~'],\n 219: ['[', '{'],\n 220: ['\\\\', '|'],\n 221: [']', '}'],\n 222: ['\\'', '\"']\n};\n\nexport function evaluateKeyboardEvent(\n ev: IKeyboardEvent,\n applicationCursorMode: boolean,\n isMac: boolean,\n macOptionIsMeta: boolean\n): IKeyboardResult {\n const result: IKeyboardResult = {\n type: KeyboardResultType.SEND_KEY,\n // Whether to cancel event propagation (NOTE: this may not be needed since the event is\n // canceled at the end of keyDown\n cancel: false,\n // The new key even to emit\n key: undefined\n };\n const modifiers = (ev.shiftKey ? 1 : 0) | (ev.altKey ? 2 : 0) | (ev.ctrlKey ? 4 : 0) | (ev.metaKey ? 8 : 0);\n switch (ev.keyCode) {\n case 0:\n if (ev.key === 'UIKeyInputUpArrow') {\n if (applicationCursorMode) {\n result.key = C0.ESC + 'OA';\n } else {\n result.key = C0.ESC + '[A';\n }\n }\n else if (ev.key === 'UIKeyInputLeftArrow') {\n if (applicationCursorMode) {\n result.key = C0.ESC + 'OD';\n } else {\n result.key = C0.ESC + '[D';\n }\n }\n else if (ev.key === 'UIKeyInputRightArrow') {\n if (applicationCursorMode) {\n result.key = C0.ESC + 'OC';\n } else {\n result.key = C0.ESC + '[C';\n }\n }\n else if (ev.key === 'UIKeyInputDownArrow') {\n if (applicationCursorMode) {\n result.key = C0.ESC + 'OB';\n } else {\n result.key = C0.ESC + '[B';\n }\n }\n break;\n case 8:\n // backspace\n if (ev.shiftKey) {\n result.key = C0.BS; // ^H\n break;\n } else if (ev.altKey) {\n result.key = C0.ESC + C0.DEL; // \\e ^?\n break;\n }\n result.key = C0.DEL; // ^?\n break;\n case 9:\n // tab\n if (ev.shiftKey) {\n result.key = C0.ESC + '[Z';\n break;\n }\n result.key = C0.HT;\n result.cancel = true;\n break;\n case 13:\n // return/enter\n result.key = ev.altKey ? C0.ESC + C0.CR : C0.CR;\n result.cancel = true;\n break;\n case 27:\n // escape\n result.key = C0.ESC;\n if (ev.altKey) {\n result.key = C0.ESC + C0.ESC;\n }\n result.cancel = true;\n break;\n case 37:\n // left-arrow\n if (ev.metaKey) {\n break;\n }\n if (modifiers) {\n result.key = C0.ESC + '[1;' + (modifiers + 1) + 'D';\n // HACK: Make Alt + left-arrow behave like Ctrl + left-arrow: move one word backwards\n // http://unix.stackexchange.com/a/108106\n // macOS uses different escape sequences than linux\n if (result.key === C0.ESC + '[1;3D') {\n result.key = C0.ESC + (isMac ? 'b' : '[1;5D');\n }\n } else if (applicationCursorMode) {\n result.key = C0.ESC + 'OD';\n } else {\n result.key = C0.ESC + '[D';\n }\n break;\n case 39:\n // right-arrow\n if (ev.metaKey) {\n break;\n }\n if (modifiers) {\n result.key = C0.ESC + '[1;' + (modifiers + 1) + 'C';\n // HACK: Make Alt + right-arrow behave like Ctrl + right-arrow: move one word forward\n // http://unix.stackexchange.com/a/108106\n // macOS uses different escape sequences than linux\n if (result.key === C0.ESC + '[1;3C') {\n result.key = C0.ESC + (isMac ? 'f' : '[1;5C');\n }\n } else if (applicationCursorMode) {\n result.key = C0.ESC + 'OC';\n } else {\n result.key = C0.ESC + '[C';\n }\n break;\n case 38:\n // up-arrow\n if (ev.metaKey) {\n break;\n }\n if (modifiers) {\n result.key = C0.ESC + '[1;' + (modifiers + 1) + 'A';\n // HACK: Make Alt + up-arrow behave like Ctrl + up-arrow\n // http://unix.stackexchange.com/a/108106\n // macOS uses different escape sequences than linux\n if (!isMac && result.key === C0.ESC + '[1;3A') {\n result.key = C0.ESC + '[1;5A';\n }\n } else if (applicationCursorMode) {\n result.key = C0.ESC + 'OA';\n } else {\n result.key = C0.ESC + '[A';\n }\n break;\n case 40:\n // down-arrow\n if (ev.metaKey) {\n break;\n }\n if (modifiers) {\n result.key = C0.ESC + '[1;' + (modifiers + 1) + 'B';\n // HACK: Make Alt + down-arrow behave like Ctrl + down-arrow\n // http://unix.stackexchange.com/a/108106\n // macOS uses different escape sequences than linux\n if (!isMac && result.key === C0.ESC + '[1;3B') {\n result.key = C0.ESC + '[1;5B';\n }\n } else if (applicationCursorMode) {\n result.key = C0.ESC + 'OB';\n } else {\n result.key = C0.ESC + '[B';\n }\n break;\n case 45:\n // insert\n if (!ev.shiftKey && !ev.ctrlKey) {\n // <Ctrl> or <Shift> + <Insert> are used to\n // copy-paste on some systems.\n result.key = C0.ESC + '[2~';\n }\n break;\n case 46:\n // delete\n if (modifiers) {\n result.key = C0.ESC + '[3;' + (modifiers + 1) + '~';\n } else {\n result.key = C0.ESC + '[3~';\n }\n break;\n case 36:\n // home\n if (modifiers) {\n result.key = C0.ESC + '[1;' + (modifiers + 1) + 'H';\n } else if (applicationCursorMode) {\n result.key = C0.ESC + 'OH';\n } else {\n result.key = C0.ESC + '[H';\n }\n break;\n case 35:\n // end\n if (modifiers) {\n result.key = C0.ESC + '[1;' + (modifiers + 1) + 'F';\n } else if (applicationCursorMode) {\n result.key = C0.ESC + 'OF';\n } else {\n result.key = C0.ESC + '[F';\n }\n break;\n case 33:\n // page up\n if (ev.shiftKey) {\n result.type = KeyboardResultType.PAGE_UP;\n } else if (ev.ctrlKey) {\n result.key = C0.ESC + '[5;' + (modifiers + 1) + '~';\n } else {\n result.key = C0.ESC + '[5~';\n }\n break;\n case 34:\n // page down\n if (ev.shiftKey) {\n result.type = KeyboardResultType.PAGE_DOWN;\n } else if (ev.ctrlKey) {\n result.key = C0.ESC + '[6;' + (modifiers + 1) + '~';\n } else {\n result.key = C0.ESC + '[6~';\n }\n break;\n case 112:\n // F1-F12\n if (modifiers) {\n result.key = C0.ESC + '[1;' + (modifiers + 1) + 'P';\n } else {\n result.key = C0.ESC + 'OP';\n }\n break;\n case 113:\n if (modifiers) {\n result.key = C0.ESC + '[1;' + (modifiers + 1) + 'Q';\n } else {\n result.key = C0.ESC + 'OQ';\n }\n break;\n case 114:\n if (modifiers) {\n result.key = C0.ESC + '[1;' + (modifiers + 1) + 'R';\n } else {\n result.key = C0.ESC + 'OR';\n }\n break;\n case 115:\n if (modifiers) {\n result.key = C0.ESC + '[1;' + (modifiers + 1) + 'S';\n } else {\n result.key = C0.ESC + 'OS';\n }\n break;\n case 116:\n if (modifiers) {\n result.key = C0.ESC + '[15;' + (modifiers + 1) + '~';\n } else {\n result.key = C0.ESC + '[15~';\n }\n break;\n case 117:\n if (modifiers) {\n result.key = C0.ESC + '[17;' + (modifiers + 1) + '~';\n } else {\n result.key = C0.ESC + '[17~';\n }\n break;\n case 118:\n if (modifiers) {\n result.key = C0.ESC + '[18;' + (modifiers + 1) + '~';\n } else {\n result.key = C0.ESC + '[18~';\n }\n break;\n case 119:\n if (modifiers) {\n result.key = C0.ESC + '[19;' + (modifiers + 1) + '~';\n } else {\n result.key = C0.ESC + '[19~';\n }\n break;\n case 120:\n if (modifiers) {\n result.key = C0.ESC + '[20;' + (modifiers + 1) + '~';\n } else {\n result.key = C0.ESC + '[20~';\n }\n break;\n case 121:\n if (modifiers) {\n result.key = C0.ESC + '[21;' + (modifiers + 1) + '~';\n } else {\n result.key = C0.ESC + '[21~';\n }\n break;\n case 122:\n if (modifiers) {\n result.key = C0.ESC + '[23;' + (modifiers + 1) + '~';\n } else {\n result.key = C0.ESC + '[23~';\n }\n break;\n case 123:\n if (modifiers) {\n result.key = C0.ESC + '[24;' + (modifiers + 1) + '~';\n } else {\n result.key = C0.ESC + '[24~';\n }\n break;\n default:\n // a-z and space\n if (ev.ctrlKey && !ev.shiftKey && !ev.altKey && !ev.metaKey) {\n if (ev.keyCode >= 65 && ev.keyCode <= 90) {\n result.key = String.fromCharCode(ev.keyCode - 64);\n } else if (ev.keyCode === 32) {\n result.key = C0.NUL;\n } else if (ev.keyCode >= 51 && ev.keyCode <= 55) {\n // escape, file sep, group sep, record sep, unit sep\n result.key = String.fromCharCode(ev.keyCode - 51 + 27);\n } else if (ev.keyCode === 56) {\n result.key = C0.DEL;\n } else if (ev.keyCode === 219) {\n result.key = C0.ESC;\n } else if (ev.keyCode === 220) {\n result.key = C0.FS;\n } else if (ev.keyCode === 221) {\n result.key = C0.GS;\n }\n } else if ((!isMac || macOptionIsMeta) && ev.altKey && !ev.metaKey) {\n // On macOS this is a third level shift when !macOptionIsMeta. Use <Esc> instead.\n const keyMapping = KEYCODE_KEY_MAPPINGS[ev.keyCode];\n const key = keyMapping?.[!ev.shiftKey ? 0 : 1];\n if (key) {\n result.key = C0.ESC + key;\n } else if (ev.keyCode >= 65 && ev.keyCode <= 90) {\n const keyCode = ev.ctrlKey ? ev.keyCode - 64 : ev.keyCode + 32;\n let keyString = String.fromCharCode(keyCode);\n if (ev.shiftKey) {\n keyString = keyString.toUpperCase();\n }\n result.key = C0.ESC + keyString;\n } else if (ev.key === 'Dead' && ev.code.startsWith('Key')) {\n // Reference: https://github.com/xtermjs/xterm.js/issues/3725\n // Alt will produce a \"dead key\" (initate composition) with some\n // of the letters in US layout (e.g. N/E/U).\n // It's safe to match against Key* since no other `code` values begin with \"Key\".\n // https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/code/code_values#code_values_on_mac\n let keyString = ev.code.slice(3, 4);\n if (!ev.shiftKey) {\n keyString = keyString.toLowerCase();\n }\n result.key = C0.ESC + keyString;\n result.cancel = true;\n }\n } else if (isMac && !ev.altKey && !ev.ctrlKey && !ev.shiftKey && ev.metaKey) {\n if (ev.keyCode === 65) { // cmd + a\n result.type = KeyboardResultType.SELECT_ALL;\n }\n } else if (ev.key && !ev.ctrlKey && !ev.altKey && !ev.metaKey && ev.keyCode >= 48 && ev.key.length === 1) {\n // Include only keys that that result in a _single_ character; don't include num lock, volume up, etc.\n result.key = ev.key;\n } else if (ev.key && ev.ctrlKey) {\n if (ev.key === '_') { // ^_\n result.key = C0.US;\n }\n if (ev.key === '@') { // ^ + shift + 2 = ^ + @\n result.key = C0.NUL;\n }\n }\n break;\n }\n\n return result;\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\n/**\n * Polyfill - Convert UTF32 codepoint into JS string.\n * Note: The built-in String.fromCodePoint happens to be much slower\n * due to additional sanity checks. We can avoid them since\n * we always operate on legal UTF32 (granted by the input decoders)\n * and use this faster version instead.\n */\nexport function stringFromCodePoint(codePoint: number): string {\n if (codePoint > 0xFFFF) {\n codePoint -= 0x10000;\n return String.fromCharCode((codePoint >> 10) + 0xD800) + String.fromCharCode((codePoint % 0x400) + 0xDC00);\n }\n return String.fromCharCode(codePoint);\n}\n\n/**\n * Convert UTF32 char codes into JS string.\n * Basically the same as `stringFromCodePoint` but for multiple codepoints\n * in a loop (which is a lot faster).\n */\nexport function utf32ToString(data: Uint32Array, start: number = 0, end: number = data.length): string {\n let result = '';\n for (let i = start; i < end; ++i) {\n let codepoint = data[i];\n if (codepoint > 0xFFFF) {\n // JS strings are encoded as UTF16, thus a non BMP codepoint gets converted into a surrogate pair\n // conversion rules:\n // - subtract 0x10000 from code point, leaving a 20 bit number\n // - add high 10 bits to 0xD800 --> first surrogate\n // - add low 10 bits to 0xDC00 --> second surrogate\n codepoint -= 0x10000;\n result += String.fromCharCode((codepoint >> 10) + 0xD800) + String.fromCharCode((codepoint % 0x400) + 0xDC00);\n } else {\n result += String.fromCharCode(codepoint);\n }\n }\n return result;\n}\n\n/**\n * StringToUtf32 - decodes UTF16 sequences into UTF32 codepoints.\n * To keep the decoder in line with JS strings it handles single surrogates as UCS2.\n */\nexport class StringToUtf32 {\n private _interim: number = 0;\n\n /**\n * Clears interim and resets decoder to clean state.\n */\n public clear(): void {\n this._interim = 0;\n }\n\n /**\n * Decode JS string to UTF32 codepoints.\n * The methods assumes stream input and will store partly transmitted\n * surrogate pairs and decode them with the next data chunk.\n * Note: The method does no bound checks for target, therefore make sure\n * the provided input data does not exceed the size of `target`.\n * Returns the number of written codepoints in `target`.\n */\n public decode(input: string, target: Uint32Array): number {\n const length = input.length;\n\n if (!length) {\n return 0;\n }\n\n let size = 0;\n let startPos = 0;\n\n // handle leftover surrogate high\n if (this._interim) {\n const second = input.charCodeAt(startPos++);\n if (0xDC00 <= second && second <= 0xDFFF) {\n target[size++] = (this._interim - 0xD800) * 0x400 + second - 0xDC00 + 0x10000;\n } else {\n // illegal codepoint (USC2 handling)\n target[size++] = this._interim;\n target[size++] = second;\n }\n this._interim = 0;\n }\n\n for (let i = startPos; i < length; ++i) {\n const code = input.charCodeAt(i);\n // surrogate pair first\n if (0xD800 <= code && code <= 0xDBFF) {\n if (++i >= length) {\n this._interim = code;\n return size;\n }\n const second = input.charCodeAt(i);\n if (0xDC00 <= second && second <= 0xDFFF) {\n target[size++] = (code - 0xD800) * 0x400 + second - 0xDC00 + 0x10000;\n } else {\n // illegal codepoint (USC2 handling)\n target[size++] = code;\n target[size++] = second;\n }\n continue;\n }\n if (code === 0xFEFF) {\n // BOM\n continue;\n }\n target[size++] = code;\n }\n return size;\n }\n}\n\n/**\n * Utf8Decoder - decodes UTF8 byte sequences into UTF32 codepoints.\n */\nexport class Utf8ToUtf32 {\n public interim: Uint8Array = new Uint8Array(3);\n\n /**\n * Clears interim bytes and resets decoder to clean state.\n */\n public clear(): void {\n this.interim.fill(0);\n }\n\n /**\n * Decodes UTF8 byte sequences in `input` to UTF32 codepoints in `target`.\n * The methods assumes stream input and will store partly transmitted bytes\n * and decode them with the next data chunk.\n * Note: The method does no bound checks for target, therefore make sure\n * the provided data chunk does not exceed the size of `target`.\n * Returns the number of written codepoints in `target`.\n */\n public decode(input: Uint8Array, target: Uint32Array): number {\n const length = input.length;\n\n if (!length) {\n return 0;\n }\n\n let size = 0;\n let byte1: number;\n let byte2: number;\n let byte3: number;\n let byte4: number;\n let codepoint = 0;\n let startPos = 0;\n\n // handle leftover bytes\n if (this.interim[0]) {\n let discardInterim = false;\n let cp = this.interim[0];\n cp &= ((((cp & 0xE0) === 0xC0)) ? 0x1F : (((cp & 0xF0) === 0xE0)) ? 0x0F : 0x07);\n let pos = 0;\n let tmp: number;\n while ((tmp = this.interim[++pos] & 0x3F) && pos < 4) {\n cp <<= 6;\n cp |= tmp;\n }\n // missing bytes - read ahead from input\n const type = (((this.interim[0] & 0xE0) === 0xC0)) ? 2 : (((this.interim[0] & 0xF0) === 0xE0)) ? 3 : 4;\n const missing = type - pos;\n while (startPos < missing) {\n if (startPos >= length) {\n return 0;\n }\n tmp = input[startPos++];\n if ((tmp & 0xC0) !== 0x80) {\n // wrong continuation, discard interim bytes completely\n startPos--;\n discardInterim = true;\n break;\n } else {\n // need to save so we can continue short inputs in next call\n this.interim[pos++] = tmp;\n cp <<= 6;\n cp |= tmp & 0x3F;\n }\n }\n if (!discardInterim) {\n // final test is type dependent\n if (type === 2) {\n if (cp < 0x80) {\n // wrong starter byte\n startPos--;\n } else {\n target[size++] = cp;\n }\n } else if (type === 3) {\n if (cp < 0x0800 || (cp >= 0xD800 && cp <= 0xDFFF) || cp === 0xFEFF) {\n // illegal codepoint or BOM\n } else {\n target[size++] = cp;\n }\n } else {\n if (cp < 0x010000 || cp > 0x10FFFF) {\n // illegal codepoint\n } else {\n target[size++] = cp;\n }\n }\n }\n this.interim.fill(0);\n }\n\n // loop through input\n const fourStop = length - 4;\n let i = startPos;\n while (i < length) {\n /**\n * ASCII shortcut with loop unrolled to 4 consecutive ASCII chars.\n * This is a compromise between speed gain for ASCII\n * and penalty for non ASCII:\n * For best ASCII performance the char should be stored directly into target,\n * but even a single attempt to write to target and compare afterwards\n * penalizes non ASCII really bad (-50%), thus we load the char into byteX first,\n * which reduces ASCII performance by ~15%.\n * This trial for ASCII reduces non ASCII performance by ~10% which seems acceptible\n * compared to the gains.\n * Note that this optimization only takes place for 4 consecutive ASCII chars,\n * for any shorter it bails out. Worst case - all 4 bytes being read but\n * thrown away due to the last being a non ASCII char (-10% performance).\n */\n while (i < fourStop\n && !((byte1 = input[i]) & 0x80)\n && !((byte2 = input[i + 1]) & 0x80)\n && !((byte3 = input[i + 2]) & 0x80)\n && !((byte4 = input[i + 3]) & 0x80))\n {\n target[size++] = byte1;\n target[size++] = byte2;\n target[size++] = byte3;\n target[size++] = byte4;\n i += 4;\n }\n\n // reread byte1\n byte1 = input[i++];\n\n // 1 byte\n if (byte1 < 0x80) {\n target[size++] = byte1;\n\n // 2 bytes\n } else if ((byte1 & 0xE0) === 0xC0) {\n if (i >= length) {\n this.interim[0] = byte1;\n return size;\n }\n byte2 = input[i++];\n if ((byte2 & 0xC0) !== 0x80) {\n // wrong continuation\n i--;\n continue;\n }\n codepoint = (byte1 & 0x1F) << 6 | (byte2 & 0x3F);\n if (codepoint < 0x80) {\n // wrong starter byte\n i--;\n continue;\n }\n target[size++] = codepoint;\n\n // 3 bytes\n } else if ((byte1 & 0xF0) === 0xE0) {\n if (i >= length) {\n this.interim[0] = byte1;\n return size;\n }\n byte2 = input[i++];\n if ((byte2 & 0xC0) !== 0x80) {\n // wrong continuation\n i--;\n continue;\n }\n if (i >= length) {\n this.interim[0] = byte1;\n this.interim[1] = byte2;\n return size;\n }\n byte3 = input[i++];\n if ((byte3 & 0xC0) !== 0x80) {\n // wrong continuation\n i--;\n continue;\n }\n codepoint = (byte1 & 0x0F) << 12 | (byte2 & 0x3F) << 6 | (byte3 & 0x3F);\n if (codepoint < 0x0800 || (codepoint >= 0xD800 && codepoint <= 0xDFFF) || codepoint === 0xFEFF) {\n // illegal codepoint or BOM, no i-- here\n continue;\n }\n target[size++] = codepoint;\n\n // 4 bytes\n } else if ((byte1 & 0xF8) === 0xF0) {\n if (i >= length) {\n this.interim[0] = byte1;\n return size;\n }\n byte2 = input[i++];\n if ((byte2 & 0xC0) !== 0x80) {\n // wrong continuation\n i--;\n continue;\n }\n if (i >= length) {\n this.interim[0] = byte1;\n this.interim[1] = byte2;\n return size;\n }\n byte3 = input[i++];\n if ((byte3 & 0xC0) !== 0x80) {\n // wrong continuation\n i--;\n continue;\n }\n if (i >= length) {\n this.interim[0] = byte1;\n this.interim[1] = byte2;\n this.interim[2] = byte3;\n return size;\n }\n byte4 = input[i++];\n if ((byte4 & 0xC0) !== 0x80) {\n // wrong continuation\n i--;\n continue;\n }\n codepoint = (byte1 & 0x07) << 18 | (byte2 & 0x3F) << 12 | (byte3 & 0x3F) << 6 | (byte4 & 0x3F);\n if (codepoint < 0x010000 || codepoint > 0x10FFFF) {\n // illegal codepoint, no i-- here\n continue;\n }\n target[size++] = codepoint;\n } else {\n // illegal byte, just skip\n }\n }\n return size;\n }\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\nimport { IUnicodeVersionProvider } from 'common/services/Services';\nimport { fill } from 'common/TypedArrayUtils';\n\ntype CharWidth = 0 | 1 | 2;\n\nconst BMP_COMBINING = [\n [0x0300, 0x036F], [0x0483, 0x0486], [0x0488, 0x0489],\n [0x0591, 0x05BD], [0x05BF, 0x05BF], [0x05C1, 0x05C2],\n [0x05C4, 0x05C5], [0x05C7, 0x05C7], [0x0600, 0x0603],\n [0x0610, 0x0615], [0x064B, 0x065E], [0x0670, 0x0670],\n [0x06D6, 0x06E4], [0x06E7, 0x06E8], [0x06EA, 0x06ED],\n [0x070F, 0x070F], [0x0711, 0x0711], [0x0730, 0x074A],\n [0x07A6, 0x07B0], [0x07EB, 0x07F3], [0x0901, 0x0902],\n [0x093C, 0x093C], [0x0941, 0x0948], [0x094D, 0x094D],\n [0x0951, 0x0954], [0x0962, 0x0963], [0x0981, 0x0981],\n [0x09BC, 0x09BC], [0x09C1, 0x09C4], [0x09CD, 0x09CD],\n [0x09E2, 0x09E3], [0x0A01, 0x0A02], [0x0A3C, 0x0A3C],\n [0x0A41, 0x0A42], [0x0A47, 0x0A48], [0x0A4B, 0x0A4D],\n [0x0A70, 0x0A71], [0x0A81, 0x0A82], [0x0ABC, 0x0ABC],\n [0x0AC1, 0x0AC5], [0x0AC7, 0x0AC8], [0x0ACD, 0x0ACD],\n [0x0AE2, 0x0AE3], [0x0B01, 0x0B01], [0x0B3C, 0x0B3C],\n [0x0B3F, 0x0B3F], [0x0B41, 0x0B43], [0x0B4D, 0x0B4D],\n [0x0B56, 0x0B56], [0x0B82, 0x0B82], [0x0BC0, 0x0BC0],\n [0x0BCD, 0x0BCD], [0x0C3E, 0x0C40], [0x0C46, 0x0C48],\n [0x0C4A, 0x0C4D], [0x0C55, 0x0C56], [0x0CBC, 0x0CBC],\n [0x0CBF, 0x0CBF], [0x0CC6, 0x0CC6], [0x0CCC, 0x0CCD],\n [0x0CE2, 0x0CE3], [0x0D41, 0x0D43], [0x0D4D, 0x0D4D],\n [0x0DCA, 0x0DCA], [0x0DD2, 0x0DD4], [0x0DD6, 0x0DD6],\n [0x0E31, 0x0E31], [0x0E34, 0x0E3A], [0x0E47, 0x0E4E],\n [0x0EB1, 0x0EB1], [0x0EB4, 0x0EB9], [0x0EBB, 0x0EBC],\n [0x0EC8, 0x0ECD], [0x0F18, 0x0F19], [0x0F35, 0x0F35],\n [0x0F37, 0x0F37], [0x0F39, 0x0F39], [0x0F71, 0x0F7E],\n [0x0F80, 0x0F84], [0x0F86, 0x0F87], [0x0F90, 0x0F97],\n [0x0F99, 0x0FBC], [0x0FC6, 0x0FC6], [0x102D, 0x1030],\n [0x1032, 0x1032], [0x1036, 0x1037], [0x1039, 0x1039],\n [0x1058, 0x1059], [0x1160, 0x11FF], [0x135F, 0x135F],\n [0x1712, 0x1714], [0x1732, 0x1734], [0x1752, 0x1753],\n [0x1772, 0x1773], [0x17B4, 0x17B5], [0x17B7, 0x17BD],\n [0x17C6, 0x17C6], [0x17C9, 0x17D3], [0x17DD, 0x17DD],\n [0x180B, 0x180D], [0x18A9, 0x18A9], [0x1920, 0x1922],\n [0x1927, 0x1928], [0x1932, 0x1932], [0x1939, 0x193B],\n [0x1A17, 0x1A18], [0x1B00, 0x1B03], [0x1B34, 0x1B34],\n [0x1B36, 0x1B3A], [0x1B3C, 0x1B3C], [0x1B42, 0x1B42],\n [0x1B6B, 0x1B73], [0x1DC0, 0x1DCA], [0x1DFE, 0x1DFF],\n [0x200B, 0x200F], [0x202A, 0x202E], [0x2060, 0x2063],\n [0x206A, 0x206F], [0x20D0, 0x20EF], [0x302A, 0x302F],\n [0x3099, 0x309A], [0xA806, 0xA806], [0xA80B, 0xA80B],\n [0xA825, 0xA826], [0xFB1E, 0xFB1E], [0xFE00, 0xFE0F],\n [0xFE20, 0xFE23], [0xFEFF, 0xFEFF], [0xFFF9, 0xFFFB]\n];\nconst HIGH_COMBINING = [\n [0x10A01, 0x10A03], [0x10A05, 0x10A06], [0x10A0C, 0x10A0F],\n [0x10A38, 0x10A3A], [0x10A3F, 0x10A3F], [0x1D167, 0x1D169],\n [0x1D173, 0x1D182], [0x1D185, 0x1D18B], [0x1D1AA, 0x1D1AD],\n [0x1D242, 0x1D244], [0xE0001, 0xE0001], [0xE0020, 0xE007F],\n [0xE0100, 0xE01EF]\n];\n\n// BMP lookup table, lazy initialized during first addon loading\nlet table: Uint8Array;\n\nfunction bisearch(ucs: number, data: number[][]): boolean {\n let min = 0;\n let max = data.length - 1;\n let mid;\n if (ucs < data[0][0] || ucs > data[max][1]) {\n return false;\n }\n while (max >= min) {\n mid = (min + max) >> 1;\n if (ucs > data[mid][1]) {\n min = mid + 1;\n } else if (ucs < data[mid][0]) {\n max = mid - 1;\n } else {\n return true;\n }\n }\n return false;\n}\n\nexport class UnicodeV6 implements IUnicodeVersionProvider {\n public readonly version = '6';\n\n constructor() {\n // init lookup table once\n if (!table) {\n table = new Uint8Array(65536);\n fill(table, 1);\n table[0] = 0;\n // control chars\n fill(table, 0, 1, 32);\n fill(table, 0, 0x7f, 0xa0);\n\n // apply wide char rules first\n // wide chars\n fill(table, 2, 0x1100, 0x1160);\n table[0x2329] = 2;\n table[0x232a] = 2;\n fill(table, 2, 0x2e80, 0xa4d0);\n table[0x303f] = 1; // wrongly in last line\n\n fill(table, 2, 0xac00, 0xd7a4);\n fill(table, 2, 0xf900, 0xfb00);\n fill(table, 2, 0xfe10, 0xfe1a);\n fill(table, 2, 0xfe30, 0xfe70);\n fill(table, 2, 0xff00, 0xff61);\n fill(table, 2, 0xffe0, 0xffe7);\n\n // apply combining last to ensure we overwrite\n // wrongly wide set chars:\n // the original algo evals combining first and falls\n // through to wide check so we simply do here the opposite\n // combining 0\n for (let r = 0; r < BMP_COMBINING.length; ++r) {\n fill(table, 0, BMP_COMBINING[r][0], BMP_COMBINING[r][1] + 1);\n }\n }\n }\n\n public wcwidth(num: number): CharWidth {\n if (num < 32) return 0;\n if (num < 127) return 1;\n if (num < 65536) return table[num] as CharWidth;\n if (bisearch(num, HIGH_COMBINING)) return 0;\n if ((num >= 0x20000 && num <= 0x2fffd) || (num >= 0x30000 && num <= 0x3fffd)) return 2;\n return 1;\n }\n}\n","\n/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { EventEmitter, IEvent } from 'common/EventEmitter';\n\ndeclare const setTimeout: (handler: () => void, timeout?: number) => void;\n\n/**\n * Safety watermark to avoid memory exhaustion and browser engine crash on fast data input.\n * Enable flow control to avoid this limit and make sure that your backend correctly\n * propagates this to the underlying pty. (see docs for further instructions)\n * Since this limit is meant as a safety parachute to prevent browser crashs,\n * it is set to a very high number. Typically xterm.js gets unresponsive with\n * a 100 times lower number (>500 kB).\n */\nconst DISCARD_WATERMARK = 50000000; // ~50 MB\n\n/**\n * The max number of ms to spend on writes before allowing the renderer to\n * catch up with a 0ms setTimeout. A value of < 33 to keep us close to\n * 30fps, and a value of < 16 to try to run at 60fps. Of course, the real FPS\n * depends on the time it takes for the renderer to draw the frame.\n */\nconst WRITE_TIMEOUT_MS = 12;\n\n/**\n * Threshold of max held chunks in the write buffer, that were already processed.\n * This is a tradeoff between extensive write buffer shifts (bad runtime) and high\n * memory consumption by data thats not used anymore.\n */\nconst WRITE_BUFFER_LENGTH_THRESHOLD = 50;\n\n// queueMicrotask polyfill for nodejs < v11\nconst qmt: (cb: () => void) => void = (typeof queueMicrotask === 'undefined')\n ? (cb: () => void) => { Promise.resolve().then(cb); }\n : queueMicrotask;\n\n\nexport class WriteBuffer {\n private _writeBuffer: (string | Uint8Array)[] = [];\n private _callbacks: ((() => void) | undefined)[] = [];\n private _pendingData = 0;\n private _bufferOffset = 0;\n private _isSyncWriting = false;\n private _syncCalls = 0;\n public get onWriteParsed(): IEvent<void> { return this._onWriteParsed.event; }\n private _onWriteParsed = new EventEmitter<void>();\n\n constructor(private _action: (data: string | Uint8Array, promiseResult?: boolean) => void | Promise<boolean>) { }\n\n /**\n * @deprecated Unreliable, to be removed soon.\n */\n public writeSync(data: string | Uint8Array, maxSubsequentCalls?: number): void {\n // stop writeSync recursions with maxSubsequentCalls argument\n // This is dangerous to use as it will lose the current data chunk\n // and return immediately.\n if (maxSubsequentCalls !== undefined && this._syncCalls > maxSubsequentCalls) {\n // comment next line if a whole loop block should only contain x `writeSync` calls\n // (total flat vs. deep nested limit)\n this._syncCalls = 0;\n return;\n }\n // append chunk to buffer\n this._pendingData += data.length;\n this._writeBuffer.push(data);\n this._callbacks.push(undefined);\n\n // increase recursion counter\n this._syncCalls++;\n // exit early if another writeSync loop is active\n if (this._isSyncWriting) {\n return;\n }\n this._isSyncWriting = true;\n\n // force sync processing on pending data chunks to avoid in-band data scrambling\n // does the same as innerWrite but without event loop\n // we have to do it here as single loop steps to not corrupt loop subject\n // by another writeSync call triggered from _action\n let chunk: string | Uint8Array | undefined;\n while (chunk = this._writeBuffer.shift()) {\n this._action(chunk);\n const cb = this._callbacks.shift();\n if (cb) cb();\n }\n // reset to avoid reprocessing of chunks with scheduled innerWrite call\n // stopping scheduled innerWrite by offset > length condition\n this._pendingData = 0;\n this._bufferOffset = 0x7FFFFFFF;\n\n // allow another writeSync to loop\n this._isSyncWriting = false;\n this._syncCalls = 0;\n }\n\n public write(data: string | Uint8Array, callback?: () => void): void {\n if (this._pendingData > DISCARD_WATERMARK) {\n throw new Error('write data discarded, use flow control to avoid losing data');\n }\n\n // schedule chunk processing for next event loop run\n if (!this._writeBuffer.length) {\n this._bufferOffset = 0;\n setTimeout(() => this._innerWrite());\n }\n\n this._pendingData += data.length;\n this._writeBuffer.push(data);\n this._callbacks.push(callback);\n }\n\n /**\n * Inner write call, that enters the sliced chunk processing by timing.\n *\n * `lastTime` indicates, when the last _innerWrite call had started.\n * It is used to aggregate async handler execution under a timeout constraint\n * effectively lowering the redrawing needs, schematically:\n *\n * macroTask _innerWrite:\n * if (Date.now() - (lastTime | 0) < WRITE_TIMEOUT_MS):\n * schedule microTask _innerWrite(lastTime)\n * else:\n * schedule macroTask _innerWrite(0)\n *\n * overall execution order on task queues:\n *\n * macrotasks: [...] --> _innerWrite(0) --> [...] --> screenUpdate --> [...]\n * m t: |\n * i a: [...]\n * c s: |\n * r k: while < timeout:\n * o s: _innerWrite(timeout)\n *\n * `promiseResult` depicts the promise resolve value of an async handler.\n * This value gets carried forward through all saved stack states of the\n * paused parser for proper continuation.\n *\n * Note, for pure sync code `lastTime` and `promiseResult` have no meaning.\n */\n protected _innerWrite(lastTime: number = 0, promiseResult: boolean = true): void {\n const startTime = lastTime || Date.now();\n while (this._writeBuffer.length > this._bufferOffset) {\n const data = this._writeBuffer[this._bufferOffset];\n const result = this._action(data, promiseResult);\n if (result) {\n /**\n * If we get a promise as return value, we re-schedule the continuation\n * as thenable on the promise and exit right away.\n *\n * The exit here means, that we block input processing at the current active chunk,\n * the exact execution position within the chunk is preserved by the saved\n * stack content in InputHandler and EscapeSequenceParser.\n *\n * Resuming happens automatically from that saved stack state.\n * Also the resolved promise value is passed along the callstack to\n * `EscapeSequenceParser.parse` to correctly resume the stopped handler loop.\n *\n * Exceptions on async handlers will be logged to console async, but do not interrupt\n * the input processing (continues with next handler at the current input position).\n */\n\n /**\n * If a promise takes long to resolve, we should schedule continuation behind setTimeout.\n * This might already be too late, if our .then enters really late (executor + prev thens took very long).\n * This cannot be solved here for the handler itself (it is the handlers responsibility to slice hard work),\n * but we can at least schedule a screen update as we gain control.\n */\n const continuation: (r: boolean) => void = (r: boolean) => Date.now() - startTime >= WRITE_TIMEOUT_MS\n ? setTimeout(() => this._innerWrite(0, r))\n : this._innerWrite(startTime, r);\n\n /**\n * Optimization considerations:\n * The continuation above favors FPS over throughput by eval'ing `startTime` on resolve.\n * This might schedule too many screen updates with bad throughput drops (in case a slow\n * resolving handler sliced its work properly behind setTimeout calls). We cannot spot\n * this condition here, also the renderer has no way to spot nonsense updates either.\n * FIXME: A proper fix for this would track the FPS at the renderer entry level separately.\n *\n * If favoring of FPS shows bad throughtput impact, use the following instead. It favors\n * throughput by eval'ing `startTime` upfront pulling at least one more chunk into the\n * current microtask queue (executed before setTimeout).\n */\n // const continuation: (r: boolean) => void = Date.now() - startTime >= WRITE_TIMEOUT_MS\n // ? r => setTimeout(() => this._innerWrite(0, r))\n // : r => this._innerWrite(startTime, r);\n\n // Handle exceptions synchronously to current band position, idea:\n // 1. spawn a single microtask which we allow to throw hard\n // 2. spawn a promise immediately resolving to `true`\n // (executed on the same queue, thus properly aligned before continuation happens)\n result.catch(err => {\n qmt(() => {throw err;});\n return Promise.resolve(false);\n }).then(continuation);\n return;\n }\n\n const cb = this._callbacks[this._bufferOffset];\n if (cb) cb();\n this._bufferOffset++;\n this._pendingData -= data.length;\n\n if (Date.now() - startTime >= WRITE_TIMEOUT_MS) {\n break;\n }\n }\n if (this._writeBuffer.length > this._bufferOffset) {\n // Allow renderer to catch up before processing the next batch\n // trim already processed chunks if we are above threshold\n if (this._bufferOffset > WRITE_BUFFER_LENGTH_THRESHOLD) {\n this._writeBuffer = this._writeBuffer.slice(this._bufferOffset);\n this._callbacks = this._callbacks.slice(this._bufferOffset);\n this._bufferOffset = 0;\n }\n setTimeout(() => this._innerWrite());\n } else {\n this._writeBuffer.length = 0;\n this._callbacks.length = 0;\n this._pendingData = 0;\n this._bufferOffset = 0;\n }\n this._onWriteParsed.fire();\n }\n}\n","/**\n * Copyright (c) 2021 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\n\n// 'rgb:' rule - matching: r/g/b | rr/gg/bb | rrr/ggg/bbb | rrrr/gggg/bbbb (hex digits)\nconst RGB_REX = /^([\\da-f])\\/([\\da-f])\\/([\\da-f])$|^([\\da-f]{2})\\/([\\da-f]{2})\\/([\\da-f]{2})$|^([\\da-f]{3})\\/([\\da-f]{3})\\/([\\da-f]{3})$|^([\\da-f]{4})\\/([\\da-f]{4})\\/([\\da-f]{4})$/;\n// '#...' rule - matching any hex digits\nconst HASH_REX = /^[\\da-f]+$/;\n\n/**\n * Parse color spec to RGB values (8 bit per channel).\n * See `man xparsecolor` for details about certain format specifications.\n *\n * Supported formats:\n * - rgb:<red>/<green>/<blue> with <red>, <green>, <blue> in h | hh | hhh | hhhh\n * - #RGB, #RRGGBB, #RRRGGGBBB, #RRRRGGGGBBBB\n *\n * All other formats like rgbi: or device-independent string specifications\n * with float numbering are not supported.\n */\nexport function parseColor(data: string): [number, number, number] | undefined {\n if (!data) return;\n // also handle uppercases\n let low = data.toLowerCase();\n if (low.indexOf('rgb:') === 0) {\n // 'rgb:' specifier\n low = low.slice(4);\n const m = RGB_REX.exec(low);\n if (m) {\n const base = m[1] ? 15 : m[4] ? 255 : m[7] ? 4095 : 65535;\n return [\n Math.round(parseInt(m[1] || m[4] || m[7] || m[10], 16) / base * 255),\n Math.round(parseInt(m[2] || m[5] || m[8] || m[11], 16) / base * 255),\n Math.round(parseInt(m[3] || m[6] || m[9] || m[12], 16) / base * 255)\n ];\n }\n } else if (low.indexOf('#') === 0) {\n // '#' specifier\n low = low.slice(1);\n if (HASH_REX.exec(low) && [3, 6, 9, 12].includes(low.length)) {\n const adv = low.length / 3;\n const result: [number, number, number] = [0, 0, 0];\n for (let i = 0; i < 3; ++i) {\n const c = parseInt(low.slice(adv * i, adv * i + adv), 16);\n result[i] = adv === 1 ? c << 4 : adv === 2 ? c : adv === 3 ? c >> 4 : c >> 8;\n }\n return result;\n }\n }\n\n // Named colors are currently not supported due to the large addition to the xterm.js bundle size\n // they would add. In order to support named colors, we would need some way of optionally loading\n // additional payloads so startup/download time is not bloated (see #3530).\n}\n\n// pad hex output to requested bit width\nfunction pad(n: number, bits: number): string {\n const s = n.toString(16);\n const s2 = s.length < 2 ? '0' + s : s;\n switch (bits) {\n case 4:\n return s[0];\n case 8:\n return s2;\n case 12:\n return (s2 + s2).slice(0, 3);\n default:\n return s2 + s2;\n }\n}\n\n/**\n * Convert a given color to rgb:../../.. string of `bits` depth.\n */\nexport function toRgbString(color: [number, number, number], bits: number = 16): string {\n const [r, g, b] = color;\n return `rgb:${pad(r, bits)}/${pad(g, bits)}/${pad(b, bits)}`;\n}\n","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\n/**\n * Internal states of EscapeSequenceParser.\n */\nexport const enum ParserState {\n GROUND = 0,\n ESCAPE = 1,\n ESCAPE_INTERMEDIATE = 2,\n CSI_ENTRY = 3,\n CSI_PARAM = 4,\n CSI_INTERMEDIATE = 5,\n CSI_IGNORE = 6,\n SOS_PM_APC_STRING = 7,\n OSC_STRING = 8,\n DCS_ENTRY = 9,\n DCS_PARAM = 10,\n DCS_IGNORE = 11,\n DCS_INTERMEDIATE = 12,\n DCS_PASSTHROUGH = 13\n}\n\n/**\n* Internal actions of EscapeSequenceParser.\n*/\nexport const enum ParserAction {\n IGNORE = 0,\n ERROR = 1,\n PRINT = 2,\n EXECUTE = 3,\n OSC_START = 4,\n OSC_PUT = 5,\n OSC_END = 6,\n CSI_DISPATCH = 7,\n PARAM = 8,\n COLLECT = 9,\n ESC_DISPATCH = 10,\n CLEAR = 11,\n DCS_HOOK = 12,\n DCS_PUT = 13,\n DCS_UNHOOK = 14\n}\n\n/**\n * Internal states of OscParser.\n */\nexport const enum OscState {\n START = 0,\n ID = 1,\n PAYLOAD = 2,\n ABORT = 3\n}\n\n// payload limit for OSC and DCS\nexport const PAYLOAD_LIMIT = 10000000;\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IDisposable } from 'common/Types';\nimport { IDcsHandler, IParams, IHandlerCollection, IDcsParser, DcsFallbackHandlerType, ISubParserStackState } from 'common/parser/Types';\nimport { utf32ToString } from 'common/input/TextDecoder';\nimport { Params } from 'common/parser/Params';\nimport { PAYLOAD_LIMIT } from 'common/parser/Constants';\n\nconst EMPTY_HANDLERS: IDcsHandler[] = [];\n\nexport class DcsParser implements IDcsParser {\n private _handlers: IHandlerCollection<IDcsHandler> = Object.create(null);\n private _active: IDcsHandler[] = EMPTY_HANDLERS;\n private _ident: number = 0;\n private _handlerFb: DcsFallbackHandlerType = () => { };\n private _stack: ISubParserStackState = {\n paused: false,\n loopPosition: 0,\n fallThrough: false\n };\n\n public dispose(): void {\n this._handlers = Object.create(null);\n this._handlerFb = () => { };\n this._active = EMPTY_HANDLERS;\n }\n\n public registerHandler(ident: number, handler: IDcsHandler): IDisposable {\n if (this._handlers[ident] === undefined) {\n this._handlers[ident] = [];\n }\n const handlerList = this._handlers[ident];\n handlerList.push(handler);\n return {\n dispose: () => {\n const handlerIndex = handlerList.indexOf(handler);\n if (handlerIndex !== -1) {\n handlerList.splice(handlerIndex, 1);\n }\n }\n };\n }\n\n public clearHandler(ident: number): void {\n if (this._handlers[ident]) delete this._handlers[ident];\n }\n\n public setHandlerFallback(handler: DcsFallbackHandlerType): void {\n this._handlerFb = handler;\n }\n\n public reset(): void {\n // force cleanup leftover handlers\n if (this._active.length) {\n for (let j = this._stack.paused ? this._stack.loopPosition - 1 : this._active.length - 1; j >= 0; --j) {\n this._active[j].unhook(false);\n }\n }\n this._stack.paused = false;\n this._active = EMPTY_HANDLERS;\n this._ident = 0;\n }\n\n public hook(ident: number, params: IParams): void {\n // always reset leftover handlers\n this.reset();\n this._ident = ident;\n this._active = this._handlers[ident] || EMPTY_HANDLERS;\n if (!this._active.length) {\n this._handlerFb(this._ident, 'HOOK', params);\n } else {\n for (let j = this._active.length - 1; j >= 0; j--) {\n this._active[j].hook(params);\n }\n }\n }\n\n public put(data: Uint32Array, start: number, end: number): void {\n if (!this._active.length) {\n this._handlerFb(this._ident, 'PUT', utf32ToString(data, start, end));\n } else {\n for (let j = this._active.length - 1; j >= 0; j--) {\n this._active[j].put(data, start, end);\n }\n }\n }\n\n public unhook(success: boolean, promiseResult: boolean = true): void | Promise<boolean> {\n if (!this._active.length) {\n this._handlerFb(this._ident, 'UNHOOK', success);\n } else {\n let handlerResult: boolean | Promise<boolean> = false;\n let j = this._active.length - 1;\n let fallThrough = false;\n if (this._stack.paused) {\n j = this._stack.loopPosition - 1;\n handlerResult = promiseResult;\n fallThrough = this._stack.fallThrough;\n this._stack.paused = false;\n }\n if (!fallThrough && handlerResult === false) {\n for (; j >= 0; j--) {\n handlerResult = this._active[j].unhook(success);\n if (handlerResult === true) {\n break;\n } else if (handlerResult instanceof Promise) {\n this._stack.paused = true;\n this._stack.loopPosition = j;\n this._stack.fallThrough = false;\n return handlerResult;\n }\n }\n j--;\n }\n // cleanup left over handlers (fallThrough for async)\n for (; j >= 0; j--) {\n handlerResult = this._active[j].unhook(false);\n if (handlerResult instanceof Promise) {\n this._stack.paused = true;\n this._stack.loopPosition = j;\n this._stack.fallThrough = true;\n return handlerResult;\n }\n }\n }\n this._active = EMPTY_HANDLERS;\n this._ident = 0;\n }\n}\n\n// predefine empty params as [0] (ZDM)\nconst EMPTY_PARAMS = new Params();\nEMPTY_PARAMS.addParam(0);\n\n/**\n * Convenient class to create a DCS handler from a single callback function.\n * Note: The payload is currently limited to 50 MB (hardcoded).\n */\nexport class DcsHandler implements IDcsHandler {\n private _data = '';\n private _params: IParams = EMPTY_PARAMS;\n private _hitLimit: boolean = false;\n\n constructor(private _handler: (data: string, params: IParams) => boolean | Promise<boolean>) { }\n\n public hook(params: IParams): void {\n // since we need to preserve params until `unhook`, we have to clone it\n // (only borrowed from parser and spans multiple parser states)\n // perf optimization:\n // clone only, if we have non empty params, otherwise stick with default\n this._params = (params.length > 1 || params.params[0]) ? params.clone() : EMPTY_PARAMS;\n this._data = '';\n this._hitLimit = false;\n }\n\n public put(data: Uint32Array, start: number, end: number): void {\n if (this._hitLimit) {\n return;\n }\n this._data += utf32ToString(data, start, end);\n if (this._data.length > PAYLOAD_LIMIT) {\n this._data = '';\n this._hitLimit = true;\n }\n }\n\n public unhook(success: boolean): boolean | Promise<boolean> {\n let ret: boolean | Promise<boolean> = false;\n if (this._hitLimit) {\n ret = false;\n } else if (success) {\n ret = this._handler(this._data, this._params);\n if (ret instanceof Promise) {\n // need to hold data and params until `ret` got resolved\n // dont care for errors, data will be freed anyway on next start\n return ret.then(res => {\n this._params = EMPTY_PARAMS;\n this._data = '';\n this._hitLimit = false;\n return res;\n });\n }\n }\n this._params = EMPTY_PARAMS;\n this._data = '';\n this._hitLimit = false;\n return ret;\n }\n}\n","/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IParsingState, IDcsHandler, IEscapeSequenceParser, IParams, IOscHandler, IHandlerCollection, CsiHandlerType, OscFallbackHandlerType, IOscParser, EscHandlerType, IDcsParser, DcsFallbackHandlerType, IFunctionIdentifier, ExecuteFallbackHandlerType, CsiFallbackHandlerType, EscFallbackHandlerType, PrintHandlerType, PrintFallbackHandlerType, ExecuteHandlerType, IParserStackState, ParserStackType, ResumableHandlersType } from 'common/parser/Types';\nimport { ParserState, ParserAction } from 'common/parser/Constants';\nimport { Disposable } from 'common/Lifecycle';\nimport { IDisposable } from 'common/Types';\nimport { fill } from 'common/TypedArrayUtils';\nimport { Params } from 'common/parser/Params';\nimport { OscParser } from 'common/parser/OscParser';\nimport { DcsParser } from 'common/parser/DcsParser';\n\n/**\n * Table values are generated like this:\n * index: currentState << TableValue.INDEX_STATE_SHIFT | charCode\n * value: action << TableValue.TRANSITION_ACTION_SHIFT | nextState\n */\nconst enum TableAccess {\n TRANSITION_ACTION_SHIFT = 4,\n TRANSITION_STATE_MASK = 15,\n INDEX_STATE_SHIFT = 8\n}\n\n/**\n * Transition table for EscapeSequenceParser.\n */\nexport class TransitionTable {\n public table: Uint8Array;\n\n constructor(length: number) {\n this.table = new Uint8Array(length);\n }\n\n /**\n * Set default transition.\n * @param action default action\n * @param next default next state\n */\n public setDefault(action: ParserAction, next: ParserState): void {\n fill(this.table, action << TableAccess.TRANSITION_ACTION_SHIFT | next);\n }\n\n /**\n * Add a transition to the transition table.\n * @param code input character code\n * @param state current parser state\n * @param action parser action to be done\n * @param next next parser state\n */\n public add(code: number, state: ParserState, action: ParserAction, next: ParserState): void {\n this.table[state << TableAccess.INDEX_STATE_SHIFT | code] = action << TableAccess.TRANSITION_ACTION_SHIFT | next;\n }\n\n /**\n * Add transitions for multiple input character codes.\n * @param codes input character code array\n * @param state current parser state\n * @param action parser action to be done\n * @param next next parser state\n */\n public addMany(codes: number[], state: ParserState, action: ParserAction, next: ParserState): void {\n for (let i = 0; i < codes.length; i++) {\n this.table[state << TableAccess.INDEX_STATE_SHIFT | codes[i]] = action << TableAccess.TRANSITION_ACTION_SHIFT | next;\n }\n }\n}\n\n\n// Pseudo-character placeholder for printable non-ascii characters (unicode).\nconst NON_ASCII_PRINTABLE = 0xA0;\n\n\n/**\n * VT500 compatible transition table.\n * Taken from https://vt100.net/emu/dec_ansi_parser.\n */\nexport const VT500_TRANSITION_TABLE = (function (): TransitionTable {\n const table: TransitionTable = new TransitionTable(4095);\n\n // range macro for byte\n const BYTE_VALUES = 256;\n const blueprint = Array.apply(null, Array(BYTE_VALUES)).map((unused: any, i: number) => i);\n const r = (start: number, end: number): number[] => blueprint.slice(start, end);\n\n // Default definitions.\n const PRINTABLES = r(0x20, 0x7f); // 0x20 (SP) included, 0x7F (DEL) excluded\n const EXECUTABLES = r(0x00, 0x18);\n EXECUTABLES.push(0x19);\n EXECUTABLES.push.apply(EXECUTABLES, r(0x1c, 0x20));\n\n const states: number[] = r(ParserState.GROUND, ParserState.DCS_PASSTHROUGH + 1);\n let state: any;\n\n // set default transition\n table.setDefault(ParserAction.ERROR, ParserState.GROUND);\n // printables\n table.addMany(PRINTABLES, ParserState.GROUND, ParserAction.PRINT, ParserState.GROUND);\n // global anywhere rules\n for (state in states) {\n table.addMany([0x18, 0x1a, 0x99, 0x9a], state, ParserAction.EXECUTE, ParserState.GROUND);\n table.addMany(r(0x80, 0x90), state, ParserAction.EXECUTE, ParserState.GROUND);\n table.addMany(r(0x90, 0x98), state, ParserAction.EXECUTE, ParserState.GROUND);\n table.add(0x9c, state, ParserAction.IGNORE, ParserState.GROUND); // ST as terminator\n table.add(0x1b, state, ParserAction.CLEAR, ParserState.ESCAPE); // ESC\n table.add(0x9d, state, ParserAction.OSC_START, ParserState.OSC_STRING); // OSC\n table.addMany([0x98, 0x9e, 0x9f], state, ParserAction.IGNORE, ParserState.SOS_PM_APC_STRING);\n table.add(0x9b, state, ParserAction.CLEAR, ParserState.CSI_ENTRY); // CSI\n table.add(0x90, state, ParserAction.CLEAR, ParserState.DCS_ENTRY); // DCS\n }\n // rules for executables and 7f\n table.addMany(EXECUTABLES, ParserState.GROUND, ParserAction.EXECUTE, ParserState.GROUND);\n table.addMany(EXECUTABLES, ParserState.ESCAPE, ParserAction.EXECUTE, ParserState.ESCAPE);\n table.add(0x7f, ParserState.ESCAPE, ParserAction.IGNORE, ParserState.ESCAPE);\n table.addMany(EXECUTABLES, ParserState.OSC_STRING, ParserAction.IGNORE, ParserState.OSC_STRING);\n table.addMany(EXECUTABLES, ParserState.CSI_ENTRY, ParserAction.EXECUTE, ParserState.CSI_ENTRY);\n table.add(0x7f, ParserState.CSI_ENTRY, ParserAction.IGNORE, ParserState.CSI_ENTRY);\n table.addMany(EXECUTABLES, ParserState.CSI_PARAM, ParserAction.EXECUTE, ParserState.CSI_PARAM);\n table.add(0x7f, ParserState.CSI_PARAM, ParserAction.IGNORE, ParserState.CSI_PARAM);\n table.addMany(EXECUTABLES, ParserState.CSI_IGNORE, ParserAction.EXECUTE, ParserState.CSI_IGNORE);\n table.addMany(EXECUTABLES, ParserState.CSI_INTERMEDIATE, ParserAction.EXECUTE, ParserState.CSI_INTERMEDIATE);\n table.add(0x7f, ParserState.CSI_INTERMEDIATE, ParserAction.IGNORE, ParserState.CSI_INTERMEDIATE);\n table.addMany(EXECUTABLES, ParserState.ESCAPE_INTERMEDIATE, ParserAction.EXECUTE, ParserState.ESCAPE_INTERMEDIATE);\n table.add(0x7f, ParserState.ESCAPE_INTERMEDIATE, ParserAction.IGNORE, ParserState.ESCAPE_INTERMEDIATE);\n // osc\n table.add(0x5d, ParserState.ESCAPE, ParserAction.OSC_START, ParserState.OSC_STRING);\n table.addMany(PRINTABLES, ParserState.OSC_STRING, ParserAction.OSC_PUT, ParserState.OSC_STRING);\n table.add(0x7f, ParserState.OSC_STRING, ParserAction.OSC_PUT, ParserState.OSC_STRING);\n table.addMany([0x9c, 0x1b, 0x18, 0x1a, 0x07], ParserState.OSC_STRING, ParserAction.OSC_END, ParserState.GROUND);\n table.addMany(r(0x1c, 0x20), ParserState.OSC_STRING, ParserAction.IGNORE, ParserState.OSC_STRING);\n // sos/pm/apc does nothing\n table.addMany([0x58, 0x5e, 0x5f], ParserState.ESCAPE, ParserAction.IGNORE, ParserState.SOS_PM_APC_STRING);\n table.addMany(PRINTABLES, ParserState.SOS_PM_APC_STRING, ParserAction.IGNORE, ParserState.SOS_PM_APC_STRING);\n table.addMany(EXECUTABLES, ParserState.SOS_PM_APC_STRING, ParserAction.IGNORE, ParserState.SOS_PM_APC_STRING);\n table.add(0x9c, ParserState.SOS_PM_APC_STRING, ParserAction.IGNORE, ParserState.GROUND);\n table.add(0x7f, ParserState.SOS_PM_APC_STRING, ParserAction.IGNORE, ParserState.SOS_PM_APC_STRING);\n // csi entries\n table.add(0x5b, ParserState.ESCAPE, ParserAction.CLEAR, ParserState.CSI_ENTRY);\n table.addMany(r(0x40, 0x7f), ParserState.CSI_ENTRY, ParserAction.CSI_DISPATCH, ParserState.GROUND);\n table.addMany(r(0x30, 0x3c), ParserState.CSI_ENTRY, ParserAction.PARAM, ParserState.CSI_PARAM);\n table.addMany([0x3c, 0x3d, 0x3e, 0x3f], ParserState.CSI_ENTRY, ParserAction.COLLECT, ParserState.CSI_PARAM);\n table.addMany(r(0x30, 0x3c), ParserState.CSI_PARAM, ParserAction.PARAM, ParserState.CSI_PARAM);\n table.addMany(r(0x40, 0x7f), ParserState.CSI_PARAM, ParserAction.CSI_DISPATCH, ParserState.GROUND);\n table.addMany([0x3c, 0x3d, 0x3e, 0x3f], ParserState.CSI_PARAM, ParserAction.IGNORE, ParserState.CSI_IGNORE);\n table.addMany(r(0x20, 0x40), ParserState.CSI_IGNORE, ParserAction.IGNORE, ParserState.CSI_IGNORE);\n table.add(0x7f, ParserState.CSI_IGNORE, ParserAction.IGNORE, ParserState.CSI_IGNORE);\n table.addMany(r(0x40, 0x7f), ParserState.CSI_IGNORE, ParserAction.IGNORE, ParserState.GROUND);\n table.addMany(r(0x20, 0x30), ParserState.CSI_ENTRY, ParserAction.COLLECT, ParserState.CSI_INTERMEDIATE);\n table.addMany(r(0x20, 0x30), ParserState.CSI_INTERMEDIATE, ParserAction.COLLECT, ParserState.CSI_INTERMEDIATE);\n table.addMany(r(0x30, 0x40), ParserState.CSI_INTERMEDIATE, ParserAction.IGNORE, ParserState.CSI_IGNORE);\n table.addMany(r(0x40, 0x7f), ParserState.CSI_INTERMEDIATE, ParserAction.CSI_DISPATCH, ParserState.GROUND);\n table.addMany(r(0x20, 0x30), ParserState.CSI_PARAM, ParserAction.COLLECT, ParserState.CSI_INTERMEDIATE);\n // esc_intermediate\n table.addMany(r(0x20, 0x30), ParserState.ESCAPE, ParserAction.COLLECT, ParserState.ESCAPE_INTERMEDIATE);\n table.addMany(r(0x20, 0x30), ParserState.ESCAPE_INTERMEDIATE, ParserAction.COLLECT, ParserState.ESCAPE_INTERMEDIATE);\n table.addMany(r(0x30, 0x7f), ParserState.ESCAPE_INTERMEDIATE, ParserAction.ESC_DISPATCH, ParserState.GROUND);\n table.addMany(r(0x30, 0x50), ParserState.ESCAPE, ParserAction.ESC_DISPATCH, ParserState.GROUND);\n table.addMany(r(0x51, 0x58), ParserState.ESCAPE, ParserAction.ESC_DISPATCH, ParserState.GROUND);\n table.addMany([0x59, 0x5a, 0x5c], ParserState.ESCAPE, ParserAction.ESC_DISPATCH, ParserState.GROUND);\n table.addMany(r(0x60, 0x7f), ParserState.ESCAPE, ParserAction.ESC_DISPATCH, ParserState.GROUND);\n // dcs entry\n table.add(0x50, ParserState.ESCAPE, ParserAction.CLEAR, ParserState.DCS_ENTRY);\n table.addMany(EXECUTABLES, ParserState.DCS_ENTRY, ParserAction.IGNORE, ParserState.DCS_ENTRY);\n table.add(0x7f, ParserState.DCS_ENTRY, ParserAction.IGNORE, ParserState.DCS_ENTRY);\n table.addMany(r(0x1c, 0x20), ParserState.DCS_ENTRY, ParserAction.IGNORE, ParserState.DCS_ENTRY);\n table.addMany(r(0x20, 0x30), ParserState.DCS_ENTRY, ParserAction.COLLECT, ParserState.DCS_INTERMEDIATE);\n table.addMany(r(0x30, 0x3c), ParserState.DCS_ENTRY, ParserAction.PARAM, ParserState.DCS_PARAM);\n table.addMany([0x3c, 0x3d, 0x3e, 0x3f], ParserState.DCS_ENTRY, ParserAction.COLLECT, ParserState.DCS_PARAM);\n table.addMany(EXECUTABLES, ParserState.DCS_IGNORE, ParserAction.IGNORE, ParserState.DCS_IGNORE);\n table.addMany(r(0x20, 0x80), ParserState.DCS_IGNORE, ParserAction.IGNORE, ParserState.DCS_IGNORE);\n table.addMany(r(0x1c, 0x20), ParserState.DCS_IGNORE, ParserAction.IGNORE, ParserState.DCS_IGNORE);\n table.addMany(EXECUTABLES, ParserState.DCS_PARAM, ParserAction.IGNORE, ParserState.DCS_PARAM);\n table.add(0x7f, ParserState.DCS_PARAM, ParserAction.IGNORE, ParserState.DCS_PARAM);\n table.addMany(r(0x1c, 0x20), ParserState.DCS_PARAM, ParserAction.IGNORE, ParserState.DCS_PARAM);\n table.addMany(r(0x30, 0x3c), ParserState.DCS_PARAM, ParserAction.PARAM, ParserState.DCS_PARAM);\n table.addMany([0x3c, 0x3d, 0x3e, 0x3f], ParserState.DCS_PARAM, ParserAction.IGNORE, ParserState.DCS_IGNORE);\n table.addMany(r(0x20, 0x30), ParserState.DCS_PARAM, ParserAction.COLLECT, ParserState.DCS_INTERMEDIATE);\n table.addMany(EXECUTABLES, ParserState.DCS_INTERMEDIATE, ParserAction.IGNORE, ParserState.DCS_INTERMEDIATE);\n table.add(0x7f, ParserState.DCS_INTERMEDIATE, ParserAction.IGNORE, ParserState.DCS_INTERMEDIATE);\n table.addMany(r(0x1c, 0x20), ParserState.DCS_INTERMEDIATE, ParserAction.IGNORE, ParserState.DCS_INTERMEDIATE);\n table.addMany(r(0x20, 0x30), ParserState.DCS_INTERMEDIATE, ParserAction.COLLECT, ParserState.DCS_INTERMEDIATE);\n table.addMany(r(0x30, 0x40), ParserState.DCS_INTERMEDIATE, ParserAction.IGNORE, ParserState.DCS_IGNORE);\n table.addMany(r(0x40, 0x7f), ParserState.DCS_INTERMEDIATE, ParserAction.DCS_HOOK, ParserState.DCS_PASSTHROUGH);\n table.addMany(r(0x40, 0x7f), ParserState.DCS_PARAM, ParserAction.DCS_HOOK, ParserState.DCS_PASSTHROUGH);\n table.addMany(r(0x40, 0x7f), ParserState.DCS_ENTRY, ParserAction.DCS_HOOK, ParserState.DCS_PASSTHROUGH);\n table.addMany(EXECUTABLES, ParserState.DCS_PASSTHROUGH, ParserAction.DCS_PUT, ParserState.DCS_PASSTHROUGH);\n table.addMany(PRINTABLES, ParserState.DCS_PASSTHROUGH, ParserAction.DCS_PUT, ParserState.DCS_PASSTHROUGH);\n table.add(0x7f, ParserState.DCS_PASSTHROUGH, ParserAction.IGNORE, ParserState.DCS_PASSTHROUGH);\n table.addMany([0x1b, 0x9c, 0x18, 0x1a], ParserState.DCS_PASSTHROUGH, ParserAction.DCS_UNHOOK, ParserState.GROUND);\n // special handling of unicode chars\n table.add(NON_ASCII_PRINTABLE, ParserState.GROUND, ParserAction.PRINT, ParserState.GROUND);\n table.add(NON_ASCII_PRINTABLE, ParserState.OSC_STRING, ParserAction.OSC_PUT, ParserState.OSC_STRING);\n table.add(NON_ASCII_PRINTABLE, ParserState.CSI_IGNORE, ParserAction.IGNORE, ParserState.CSI_IGNORE);\n table.add(NON_ASCII_PRINTABLE, ParserState.DCS_IGNORE, ParserAction.IGNORE, ParserState.DCS_IGNORE);\n table.add(NON_ASCII_PRINTABLE, ParserState.DCS_PASSTHROUGH, ParserAction.DCS_PUT, ParserState.DCS_PASSTHROUGH);\n return table;\n})();\n\n\n/**\n * EscapeSequenceParser.\n * This class implements the ANSI/DEC compatible parser described by\n * Paul Williams (https://vt100.net/emu/dec_ansi_parser).\n *\n * To implement custom ANSI compliant escape sequences it is not needed to\n * alter this parser, instead consider registering a custom handler.\n * For non ANSI compliant sequences change the transition table with\n * the optional `transitions` constructor argument and\n * reimplement the `parse` method.\n *\n * This parser is currently hardcoded to operate in ZDM (Zero Default Mode)\n * as suggested by the original parser, thus empty parameters are set to 0.\n * This this is not in line with the latest ECMA-48 specification\n * (ZDM was part of the early specs and got completely removed later on).\n *\n * Other than the original parser from vt100.net this parser supports\n * sub parameters in digital parameters separated by colons. Empty sub parameters\n * are set to -1 (no ZDM for sub parameters).\n *\n * About prefix and intermediate bytes:\n * This parser follows the assumptions of the vt100.net parser with these restrictions:\n * - only one prefix byte is allowed as first parameter byte, byte range 0x3c .. 0x3f\n * - max. two intermediates are respected, byte range 0x20 .. 0x2f\n * Note that this is not in line with ECMA-48 which does not limit either of those.\n * Furthermore ECMA-48 allows the prefix byte range at any param byte position. Currently\n * there are no known sequences that follow the broader definition of the specification.\n *\n * TODO: implement error recovery hook via error handler return values\n */\nexport class EscapeSequenceParser extends Disposable implements IEscapeSequenceParser {\n public initialState: number;\n public currentState: number;\n public precedingCodepoint: number;\n\n // buffers over several parse calls\n protected _params: Params;\n protected _collect: number;\n\n // handler lookup containers\n protected _printHandler: PrintHandlerType;\n protected _executeHandlers: { [flag: number]: ExecuteHandlerType };\n protected _csiHandlers: IHandlerCollection<CsiHandlerType>;\n protected _escHandlers: IHandlerCollection<EscHandlerType>;\n protected _oscParser: IOscParser;\n protected _dcsParser: IDcsParser;\n protected _errorHandler: (state: IParsingState) => IParsingState;\n\n // fallback handlers\n protected _printHandlerFb: PrintFallbackHandlerType;\n protected _executeHandlerFb: ExecuteFallbackHandlerType;\n protected _csiHandlerFb: CsiFallbackHandlerType;\n protected _escHandlerFb: EscFallbackHandlerType;\n protected _errorHandlerFb: (state: IParsingState) => IParsingState;\n\n // parser stack save for async handler support\n protected _parseStack: IParserStackState = {\n state: ParserStackType.NONE,\n handlers: [],\n handlerPos: 0,\n transition: 0,\n chunkPos: 0\n };\n\n constructor(\n protected readonly _transitions: TransitionTable = VT500_TRANSITION_TABLE\n ) {\n super();\n\n this.initialState = ParserState.GROUND;\n this.currentState = this.initialState;\n this._params = new Params(); // defaults to 32 storable params/subparams\n this._params.addParam(0); // ZDM\n this._collect = 0;\n this.precedingCodepoint = 0;\n\n // set default fallback handlers and handler lookup containers\n this._printHandlerFb = (data, start, end): void => { };\n this._executeHandlerFb = (code: number): void => { };\n this._csiHandlerFb = (ident: number, params: IParams): void => { };\n this._escHandlerFb = (ident: number): void => { };\n this._errorHandlerFb = (state: IParsingState): IParsingState => state;\n this._printHandler = this._printHandlerFb;\n this._executeHandlers = Object.create(null);\n this._csiHandlers = Object.create(null);\n this._escHandlers = Object.create(null);\n this._oscParser = new OscParser();\n this._dcsParser = new DcsParser();\n this._errorHandler = this._errorHandlerFb;\n\n // swallow 7bit ST (ESC+\\)\n this.registerEscHandler({ final: '\\\\' }, () => true);\n }\n\n protected _identifier(id: IFunctionIdentifier, finalRange: number[] = [0x40, 0x7e]): number {\n let res = 0;\n if (id.prefix) {\n if (id.prefix.length > 1) {\n throw new Error('only one byte as prefix supported');\n }\n res = id.prefix.charCodeAt(0);\n if (res && 0x3c > res || res > 0x3f) {\n throw new Error('prefix must be in range 0x3c .. 0x3f');\n }\n }\n if (id.intermediates) {\n if (id.intermediates.length > 2) {\n throw new Error('only two bytes as intermediates are supported');\n }\n for (let i = 0; i < id.intermediates.length; ++i) {\n const intermediate = id.intermediates.charCodeAt(i);\n if (0x20 > intermediate || intermediate > 0x2f) {\n throw new Error('intermediate must be in range 0x20 .. 0x2f');\n }\n res <<= 8;\n res |= intermediate;\n }\n }\n if (id.final.length !== 1) {\n throw new Error('final must be a single byte');\n }\n const finalCode = id.final.charCodeAt(0);\n if (finalRange[0] > finalCode || finalCode > finalRange[1]) {\n throw new Error(`final must be in range ${finalRange[0]} .. ${finalRange[1]}`);\n }\n res <<= 8;\n res |= finalCode;\n\n return res;\n }\n\n public identToString(ident: number): string {\n const res: string[] = [];\n while (ident) {\n res.push(String.fromCharCode(ident & 0xFF));\n ident >>= 8;\n }\n return res.reverse().join('');\n }\n\n public dispose(): void {\n this._csiHandlers = Object.create(null);\n this._executeHandlers = Object.create(null);\n this._escHandlers = Object.create(null);\n this._oscParser.dispose();\n this._dcsParser.dispose();\n }\n\n public setPrintHandler(handler: PrintHandlerType): void {\n this._printHandler = handler;\n }\n public clearPrintHandler(): void {\n this._printHandler = this._printHandlerFb;\n }\n\n public registerEscHandler(id: IFunctionIdentifier, handler: EscHandlerType): IDisposable {\n const ident = this._identifier(id, [0x30, 0x7e]);\n if (this._escHandlers[ident] === undefined) {\n this._escHandlers[ident] = [];\n }\n const handlerList = this._escHandlers[ident];\n handlerList.push(handler);\n return {\n dispose: () => {\n const handlerIndex = handlerList.indexOf(handler);\n if (handlerIndex !== -1) {\n handlerList.splice(handlerIndex, 1);\n }\n }\n };\n }\n public clearEscHandler(id: IFunctionIdentifier): void {\n if (this._escHandlers[this._identifier(id, [0x30, 0x7e])]) delete this._escHandlers[this._identifier(id, [0x30, 0x7e])];\n }\n public setEscHandlerFallback(handler: EscFallbackHandlerType): void {\n this._escHandlerFb = handler;\n }\n\n public setExecuteHandler(flag: string, handler: ExecuteHandlerType): void {\n this._executeHandlers[flag.charCodeAt(0)] = handler;\n }\n public clearExecuteHandler(flag: string): void {\n if (this._executeHandlers[flag.charCodeAt(0)]) delete this._executeHandlers[flag.charCodeAt(0)];\n }\n public setExecuteHandlerFallback(handler: ExecuteFallbackHandlerType): void {\n this._executeHandlerFb = handler;\n }\n\n public registerCsiHandler(id: IFunctionIdentifier, handler: CsiHandlerType): IDisposable {\n const ident = this._identifier(id);\n if (this._csiHandlers[ident] === undefined) {\n this._csiHandlers[ident] = [];\n }\n const handlerList = this._csiHandlers[ident];\n handlerList.push(handler);\n return {\n dispose: () => {\n const handlerIndex = handlerList.indexOf(handler);\n if (handlerIndex !== -1) {\n handlerList.splice(handlerIndex, 1);\n }\n }\n };\n }\n public clearCsiHandler(id: IFunctionIdentifier): void {\n if (this._csiHandlers[this._identifier(id)]) delete this._csiHandlers[this._identifier(id)];\n }\n public setCsiHandlerFallback(callback: (ident: number, params: IParams) => void): void {\n this._csiHandlerFb = callback;\n }\n\n public registerDcsHandler(id: IFunctionIdentifier, handler: IDcsHandler): IDisposable {\n return this._dcsParser.registerHandler(this._identifier(id), handler);\n }\n public clearDcsHandler(id: IFunctionIdentifier): void {\n this._dcsParser.clearHandler(this._identifier(id));\n }\n public setDcsHandlerFallback(handler: DcsFallbackHandlerType): void {\n this._dcsParser.setHandlerFallback(handler);\n }\n\n public registerOscHandler(ident: number, handler: IOscHandler): IDisposable {\n return this._oscParser.registerHandler(ident, handler);\n }\n public clearOscHandler(ident: number): void {\n this._oscParser.clearHandler(ident);\n }\n public setOscHandlerFallback(handler: OscFallbackHandlerType): void {\n this._oscParser.setHandlerFallback(handler);\n }\n\n public setErrorHandler(callback: (state: IParsingState) => IParsingState): void {\n this._errorHandler = callback;\n }\n public clearErrorHandler(): void {\n this._errorHandler = this._errorHandlerFb;\n }\n\n /**\n * Reset parser to initial values.\n *\n * This can also be used to lift the improper continuation error condition\n * when dealing with async handlers. Use this only as a last resort to silence\n * that error when the terminal has no pending data to be processed. Note that\n * the interrupted async handler might continue its work in the future messing\n * up the terminal state even further.\n */\n public reset(): void {\n this.currentState = this.initialState;\n this._oscParser.reset();\n this._dcsParser.reset();\n this._params.reset();\n this._params.addParam(0); // ZDM\n this._collect = 0;\n this.precedingCodepoint = 0;\n // abort pending continuation from async handler\n // Here the RESET type indicates, that the next parse call will\n // ignore any saved stack, instead continues sync with next codepoint from GROUND\n if (this._parseStack.state !== ParserStackType.NONE) {\n this._parseStack.state = ParserStackType.RESET;\n this._parseStack.handlers = []; // also release handlers ref\n }\n }\n\n /**\n * Async parse support.\n */\n protected _preserveStack(\n state: ParserStackType,\n handlers: ResumableHandlersType,\n handlerPos: number,\n transition: number,\n chunkPos: number\n ): void {\n this._parseStack.state = state;\n this._parseStack.handlers = handlers;\n this._parseStack.handlerPos = handlerPos;\n this._parseStack.transition = transition;\n this._parseStack.chunkPos = chunkPos;\n }\n\n /**\n * Parse UTF32 codepoints in `data` up to `length`.\n *\n * Note: For several actions with high data load the parsing is optimized\n * by using local read ahead loops with hardcoded conditions to\n * avoid costly table lookups. Make sure that any change of table values\n * will be reflected in the loop conditions as well and vice versa.\n * Affected states/actions:\n * - GROUND:PRINT\n * - CSI_PARAM:PARAM\n * - DCS_PARAM:PARAM\n * - OSC_STRING:OSC_PUT\n * - DCS_PASSTHROUGH:DCS_PUT\n *\n * Note on asynchronous handler support:\n * Any handler returning a promise will be treated as asynchronous.\n * To keep the in-band blocking working for async handlers, `parse` pauses execution,\n * creates a stack save and returns the promise to the caller.\n * For proper continuation of the paused state it is important\n * to await the promise resolving. On resolve the parse must be repeated\n * with the same chunk of data and the resolved value in `promiseResult`\n * until no promise is returned.\n *\n * Important: With only sync handlers defined, parsing is completely synchronous as well.\n * As soon as an async handler is involved, synchronous parsing is not possible anymore.\n *\n * Boilerplate for proper parsing of multiple chunks with async handlers:\n *\n * ```typescript\n * async function parseMultipleChunks(chunks: Uint32Array[]): Promise<void> {\n * for (const chunk of chunks) {\n * let result: void | Promise<boolean>;\n * let prev: boolean | undefined;\n * while (result = parser.parse(chunk, chunk.length, prev)) {\n * prev = await result;\n * }\n * }\n * // finished parsing all chunks...\n * }\n * ```\n */\n public parse(data: Uint32Array, length: number, promiseResult?: boolean): void | Promise<boolean> {\n let code = 0;\n let transition = 0;\n let start = 0;\n let handlerResult: void | boolean | Promise<boolean>;\n\n // resume from async handler\n if (this._parseStack.state) {\n // allow sync parser reset even in continuation mode\n // Note: can be used to recover parser from improper continuation error below\n if (this._parseStack.state === ParserStackType.RESET) {\n this._parseStack.state = ParserStackType.NONE;\n start = this._parseStack.chunkPos + 1; // continue with next codepoint in GROUND\n } else {\n if (promiseResult === undefined || this._parseStack.state === ParserStackType.FAIL) {\n /**\n * Reject further parsing on improper continuation after pausing.\n * This is a really bad condition with screwed up execution order and prolly messed up\n * terminal state, therefore we exit hard with an exception and reject any further parsing.\n *\n * Note: With `Terminal.write` usage this exception should never occur, as the top level\n * calls are guaranteed to handle async conditions properly. If you ever encounter this\n * exception in your terminal integration it indicates, that you injected data chunks to\n * `InputHandler.parse` or `EscapeSequenceParser.parse` synchronously without waiting for\n * continuation of a running async handler.\n *\n * It is possible to get rid of this error by calling `reset`. But dont rely on that,\n * as the pending async handler still might mess up the terminal later. Instead fix the faulty\n * async handling, so this error will not be thrown anymore.\n */\n this._parseStack.state = ParserStackType.FAIL;\n throw new Error('improper continuation due to previous async handler, giving up parsing');\n }\n\n // we have to resume the old handler loop if:\n // - return value of the promise was `false`\n // - handlers are not exhausted yet\n const handlers = this._parseStack.handlers;\n let handlerPos = this._parseStack.handlerPos - 1;\n switch (this._parseStack.state) {\n case ParserStackType.CSI:\n if (promiseResult === false && handlerPos > -1) {\n for (; handlerPos >= 0; handlerPos--) {\n handlerResult = (handlers as CsiHandlerType[])[handlerPos](this._params);\n if (handlerResult === true) {\n break;\n } else if (handlerResult instanceof Promise) {\n this._parseStack.handlerPos = handlerPos;\n return handlerResult;\n }\n }\n }\n this._parseStack.handlers = [];\n break;\n case ParserStackType.ESC:\n if (promiseResult === false && handlerPos > -1) {\n for (; handlerPos >= 0; handlerPos--) {\n handlerResult = (handlers as EscHandlerType[])[handlerPos]();\n if (handlerResult === true) {\n break;\n } else if (handlerResult instanceof Promise) {\n this._parseStack.handlerPos = handlerPos;\n return handlerResult;\n }\n }\n }\n this._parseStack.handlers = [];\n break;\n case ParserStackType.DCS:\n code = data[this._parseStack.chunkPos];\n handlerResult = this._dcsParser.unhook(code !== 0x18 && code !== 0x1a, promiseResult);\n if (handlerResult) {\n return handlerResult;\n }\n if (code === 0x1b) this._parseStack.transition |= ParserState.ESCAPE;\n this._params.reset();\n this._params.addParam(0); // ZDM\n this._collect = 0;\n break;\n case ParserStackType.OSC:\n code = data[this._parseStack.chunkPos];\n handlerResult = this._oscParser.end(code !== 0x18 && code !== 0x1a, promiseResult);\n if (handlerResult) {\n return handlerResult;\n }\n if (code === 0x1b) this._parseStack.transition |= ParserState.ESCAPE;\n this._params.reset();\n this._params.addParam(0); // ZDM\n this._collect = 0;\n break;\n }\n // cleanup before continuing with the main sync loop\n this._parseStack.state = ParserStackType.NONE;\n start = this._parseStack.chunkPos + 1;\n this.precedingCodepoint = 0;\n this.currentState = this._parseStack.transition & TableAccess.TRANSITION_STATE_MASK;\n }\n }\n\n // continue with main sync loop\n\n // process input string\n for (let i = start; i < length; ++i) {\n code = data[i];\n\n // normal transition & action lookup\n transition = this._transitions.table[this.currentState << TableAccess.INDEX_STATE_SHIFT | (code < 0xa0 ? code : NON_ASCII_PRINTABLE)];\n switch (transition >> TableAccess.TRANSITION_ACTION_SHIFT) {\n case ParserAction.PRINT:\n // read ahead with loop unrolling\n // Note: 0x20 (SP) is included, 0x7F (DEL) is excluded\n for (let j = i + 1; ; ++j) {\n if (j >= length || (code = data[j]) < 0x20 || (code > 0x7e && code < NON_ASCII_PRINTABLE)) {\n this._printHandler(data, i, j);\n i = j - 1;\n break;\n }\n if (++j >= length || (code = data[j]) < 0x20 || (code > 0x7e && code < NON_ASCII_PRINTABLE)) {\n this._printHandler(data, i, j);\n i = j - 1;\n break;\n }\n if (++j >= length || (code = data[j]) < 0x20 || (code > 0x7e && code < NON_ASCII_PRINTABLE)) {\n this._printHandler(data, i, j);\n i = j - 1;\n break;\n }\n if (++j >= length || (code = data[j]) < 0x20 || (code > 0x7e && code < NON_ASCII_PRINTABLE)) {\n this._printHandler(data, i, j);\n i = j - 1;\n break;\n }\n }\n break;\n case ParserAction.EXECUTE:\n if (this._executeHandlers[code]) this._executeHandlers[code]();\n else this._executeHandlerFb(code);\n this.precedingCodepoint = 0;\n break;\n case ParserAction.IGNORE:\n break;\n case ParserAction.ERROR:\n const inject: IParsingState = this._errorHandler(\n {\n position: i,\n code,\n currentState: this.currentState,\n collect: this._collect,\n params: this._params,\n abort: false\n });\n if (inject.abort) return;\n // inject values: currently not implemented\n break;\n case ParserAction.CSI_DISPATCH:\n // Trigger CSI Handler\n const handlers = this._csiHandlers[this._collect << 8 | code];\n let j = handlers ? handlers.length - 1 : -1;\n for (; j >= 0; j--) {\n // true means success and to stop bubbling\n // a promise indicates an async handler that needs to finish before progressing\n handlerResult = handlers[j](this._params);\n if (handlerResult === true) {\n break;\n } else if (handlerResult instanceof Promise) {\n this._preserveStack(ParserStackType.CSI, handlers, j, transition, i);\n return handlerResult;\n }\n }\n if (j < 0) {\n this._csiHandlerFb(this._collect << 8 | code, this._params);\n }\n this.precedingCodepoint = 0;\n break;\n case ParserAction.PARAM:\n // inner loop: digits (0x30 - 0x39) and ; (0x3b) and : (0x3a)\n do {\n switch (code) {\n case 0x3b:\n this._params.addParam(0); // ZDM\n break;\n case 0x3a:\n this._params.addSubParam(-1);\n break;\n default: // 0x30 - 0x39\n this._params.addDigit(code - 48);\n }\n } while (++i < length && (code = data[i]) > 0x2f && code < 0x3c);\n i--;\n break;\n case ParserAction.COLLECT:\n this._collect <<= 8;\n this._collect |= code;\n break;\n case ParserAction.ESC_DISPATCH:\n const handlersEsc = this._escHandlers[this._collect << 8 | code];\n let jj = handlersEsc ? handlersEsc.length - 1 : -1;\n for (; jj >= 0; jj--) {\n // true means success and to stop bubbling\n // a promise indicates an async handler that needs to finish before progressing\n handlerResult = handlersEsc[jj]();\n if (handlerResult === true) {\n break;\n } else if (handlerResult instanceof Promise) {\n this._preserveStack(ParserStackType.ESC, handlersEsc, jj, transition, i);\n return handlerResult;\n }\n }\n if (jj < 0) {\n this._escHandlerFb(this._collect << 8 | code);\n }\n this.precedingCodepoint = 0;\n break;\n case ParserAction.CLEAR:\n this._params.reset();\n this._params.addParam(0); // ZDM\n this._collect = 0;\n break;\n case ParserAction.DCS_HOOK:\n this._dcsParser.hook(this._collect << 8 | code, this._params);\n break;\n case ParserAction.DCS_PUT:\n // inner loop - exit DCS_PUT: 0x18, 0x1a, 0x1b, 0x7f, 0x80 - 0x9f\n // unhook triggered by: 0x1b, 0x9c (success) and 0x18, 0x1a (abort)\n for (let j = i + 1; ; ++j) {\n if (j >= length || (code = data[j]) === 0x18 || code === 0x1a || code === 0x1b || (code > 0x7f && code < NON_ASCII_PRINTABLE)) {\n this._dcsParser.put(data, i, j);\n i = j - 1;\n break;\n }\n }\n break;\n case ParserAction.DCS_UNHOOK:\n handlerResult = this._dcsParser.unhook(code !== 0x18 && code !== 0x1a);\n if (handlerResult) {\n this._preserveStack(ParserStackType.DCS, [], 0, transition, i);\n return handlerResult;\n }\n if (code === 0x1b) transition |= ParserState.ESCAPE;\n this._params.reset();\n this._params.addParam(0); // ZDM\n this._collect = 0;\n this.precedingCodepoint = 0;\n break;\n case ParserAction.OSC_START:\n this._oscParser.start();\n break;\n case ParserAction.OSC_PUT:\n // inner loop: 0x20 (SP) included, 0x7F (DEL) included\n for (let j = i + 1; ; j++) {\n if (j >= length || (code = data[j]) < 0x20 || (code > 0x7f && code < NON_ASCII_PRINTABLE)) {\n this._oscParser.put(data, i, j);\n i = j - 1;\n break;\n }\n }\n break;\n case ParserAction.OSC_END:\n handlerResult = this._oscParser.end(code !== 0x18 && code !== 0x1a);\n if (handlerResult) {\n this._preserveStack(ParserStackType.OSC, [], 0, transition, i);\n return handlerResult;\n }\n if (code === 0x1b) transition |= ParserState.ESCAPE;\n this._params.reset();\n this._params.addParam(0); // ZDM\n this._collect = 0;\n this.precedingCodepoint = 0;\n break;\n }\n this.currentState = transition & TableAccess.TRANSITION_STATE_MASK;\n }\n }\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IOscHandler, IHandlerCollection, OscFallbackHandlerType, IOscParser, ISubParserStackState } from 'common/parser/Types';\nimport { OscState, PAYLOAD_LIMIT } from 'common/parser/Constants';\nimport { utf32ToString } from 'common/input/TextDecoder';\nimport { IDisposable } from 'common/Types';\n\nconst EMPTY_HANDLERS: IOscHandler[] = [];\n\nexport class OscParser implements IOscParser {\n private _state = OscState.START;\n private _active = EMPTY_HANDLERS;\n private _id = -1;\n private _handlers: IHandlerCollection<IOscHandler> = Object.create(null);\n private _handlerFb: OscFallbackHandlerType = () => { };\n private _stack: ISubParserStackState = {\n paused: false,\n loopPosition: 0,\n fallThrough: false\n };\n\n public registerHandler(ident: number, handler: IOscHandler): IDisposable {\n if (this._handlers[ident] === undefined) {\n this._handlers[ident] = [];\n }\n const handlerList = this._handlers[ident];\n handlerList.push(handler);\n return {\n dispose: () => {\n const handlerIndex = handlerList.indexOf(handler);\n if (handlerIndex !== -1) {\n handlerList.splice(handlerIndex, 1);\n }\n }\n };\n }\n public clearHandler(ident: number): void {\n if (this._handlers[ident]) delete this._handlers[ident];\n }\n public setHandlerFallback(handler: OscFallbackHandlerType): void {\n this._handlerFb = handler;\n }\n\n public dispose(): void {\n this._handlers = Object.create(null);\n this._handlerFb = () => { };\n this._active = EMPTY_HANDLERS;\n }\n\n public reset(): void {\n // force cleanup handlers if payload was already sent\n if (this._state === OscState.PAYLOAD) {\n for (let j = this._stack.paused ? this._stack.loopPosition - 1 : this._active.length - 1; j >= 0; --j) {\n this._active[j].end(false);\n }\n }\n this._stack.paused = false;\n this._active = EMPTY_HANDLERS;\n this._id = -1;\n this._state = OscState.START;\n }\n\n private _start(): void {\n this._active = this._handlers[this._id] || EMPTY_HANDLERS;\n if (!this._active.length) {\n this._handlerFb(this._id, 'START');\n } else {\n for (let j = this._active.length - 1; j >= 0; j--) {\n this._active[j].start();\n }\n }\n }\n\n private _put(data: Uint32Array, start: number, end: number): void {\n if (!this._active.length) {\n this._handlerFb(this._id, 'PUT', utf32ToString(data, start, end));\n } else {\n for (let j = this._active.length - 1; j >= 0; j--) {\n this._active[j].put(data, start, end);\n }\n }\n }\n\n public start(): void {\n // always reset leftover handlers\n this.reset();\n this._state = OscState.ID;\n }\n\n /**\n * Put data to current OSC command.\n * Expects the identifier of the OSC command in the form\n * OSC id ; payload ST/BEL\n * Payload chunks are not further processed and get\n * directly passed to the handlers.\n */\n public put(data: Uint32Array, start: number, end: number): void {\n if (this._state === OscState.ABORT) {\n return;\n }\n if (this._state === OscState.ID) {\n while (start < end) {\n const code = data[start++];\n if (code === 0x3b) {\n this._state = OscState.PAYLOAD;\n this._start();\n break;\n }\n if (code < 0x30 || 0x39 < code) {\n this._state = OscState.ABORT;\n return;\n }\n if (this._id === -1) {\n this._id = 0;\n }\n this._id = this._id * 10 + code - 48;\n }\n }\n if (this._state === OscState.PAYLOAD && end - start > 0) {\n this._put(data, start, end);\n }\n }\n\n /**\n * Indicates end of an OSC command.\n * Whether the OSC got aborted or finished normally\n * is indicated by `success`.\n */\n public end(success: boolean, promiseResult: boolean = true): void | Promise<boolean> {\n if (this._state === OscState.START) {\n return;\n }\n // do nothing if command was faulty\n if (this._state !== OscState.ABORT) {\n // if we are still in ID state and get an early end\n // means that the command has no payload thus we still have\n // to announce START and send END right after\n if (this._state === OscState.ID) {\n this._start();\n }\n\n if (!this._active.length) {\n this._handlerFb(this._id, 'END', success);\n } else {\n let handlerResult: boolean | Promise<boolean> = false;\n let j = this._active.length - 1;\n let fallThrough = false;\n if (this._stack.paused) {\n j = this._stack.loopPosition - 1;\n handlerResult = promiseResult;\n fallThrough = this._stack.fallThrough;\n this._stack.paused = false;\n }\n if (!fallThrough && handlerResult === false) {\n for (; j >= 0; j--) {\n handlerResult = this._active[j].end(success);\n if (handlerResult === true) {\n break;\n } else if (handlerResult instanceof Promise) {\n this._stack.paused = true;\n this._stack.loopPosition = j;\n this._stack.fallThrough = false;\n return handlerResult;\n }\n }\n j--;\n }\n // cleanup left over handlers\n // we always have to call .end for proper cleanup,\n // here we use `success` to indicate whether a handler should execute\n for (; j >= 0; j--) {\n handlerResult = this._active[j].end(false);\n if (handlerResult instanceof Promise) {\n this._stack.paused = true;\n this._stack.loopPosition = j;\n this._stack.fallThrough = true;\n return handlerResult;\n }\n }\n }\n\n }\n this._active = EMPTY_HANDLERS;\n this._id = -1;\n this._state = OscState.START;\n }\n}\n\n/**\n * Convenient class to allow attaching string based handler functions\n * as OSC handlers.\n */\nexport class OscHandler implements IOscHandler {\n private _data = '';\n private _hitLimit: boolean = false;\n\n constructor(private _handler: (data: string) => boolean | Promise<boolean>) { }\n\n public start(): void {\n this._data = '';\n this._hitLimit = false;\n }\n\n public put(data: Uint32Array, start: number, end: number): void {\n if (this._hitLimit) {\n return;\n }\n this._data += utf32ToString(data, start, end);\n if (this._data.length > PAYLOAD_LIMIT) {\n this._data = '';\n this._hitLimit = true;\n }\n }\n\n public end(success: boolean): boolean | Promise<boolean> {\n let ret: boolean | Promise<boolean> = false;\n if (this._hitLimit) {\n ret = false;\n } else if (success) {\n ret = this._handler(this._data);\n if (ret instanceof Promise) {\n // need to hold data until `ret` got resolved\n // dont care for errors, data will be freed anyway on next start\n return ret.then(res => {\n this._data = '';\n this._hitLimit = false;\n return res;\n });\n }\n }\n this._data = '';\n this._hitLimit = false;\n return ret;\n }\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\nimport { IParams, ParamsArray } from 'common/parser/Types';\n\n// max value supported for a single param/subparam (clamped to positive int32 range)\nconst MAX_VALUE = 0x7FFFFFFF;\n// max allowed subparams for a single sequence (hardcoded limitation)\nconst MAX_SUBPARAMS = 256;\n\n/**\n * Params storage class.\n * This type is used by the parser to accumulate sequence parameters and sub parameters\n * and transmit them to the input handler actions.\n *\n * NOTES:\n * - params object for action handlers is borrowed, use `.toArray` or `.clone` to get a copy\n * - never read beyond `params.length - 1` (likely to contain arbitrary data)\n * - `.getSubParams` returns a borrowed typed array, use `.getSubParamsAll` for cloned sub params\n * - hardcoded limitations:\n * - max. value for a single (sub) param is 2^31 - 1 (greater values are clamped to that)\n * - max. 256 sub params possible\n * - negative values are not allowed beside -1 (placeholder for default value)\n *\n * About ZDM (Zero Default Mode):\n * ZDM is not orchestrated by this class. If the parser is in ZDM,\n * it should add 0 for empty params, otherwise -1. This does not apply\n * to subparams, empty subparams should always be added with -1.\n */\nexport class Params implements IParams {\n // params store and length\n public params: Int32Array;\n public length: number;\n\n // sub params store and length\n protected _subParams: Int32Array;\n protected _subParamsLength: number;\n\n // sub params offsets from param: param idx --> [start, end] offset\n private _subParamsIdx: Uint16Array;\n private _rejectDigits: boolean;\n private _rejectSubDigits: boolean;\n private _digitIsSub: boolean;\n\n /**\n * Create a `Params` type from JS array representation.\n */\n public static fromArray(values: ParamsArray): Params {\n const params = new Params();\n if (!values.length) {\n return params;\n }\n // skip leading sub params\n for (let i = (Array.isArray(values[0])) ? 1 : 0; i < values.length; ++i) {\n const value = values[i];\n if (Array.isArray(value)) {\n for (let k = 0; k < value.length; ++k) {\n params.addSubParam(value[k]);\n }\n } else {\n params.addParam(value);\n }\n }\n return params;\n }\n\n /**\n * @param maxLength max length of storable parameters\n * @param maxSubParamsLength max length of storable sub parameters\n */\n constructor(public maxLength: number = 32, public maxSubParamsLength: number = 32) {\n if (maxSubParamsLength > MAX_SUBPARAMS) {\n throw new Error('maxSubParamsLength must not be greater than 256');\n }\n this.params = new Int32Array(maxLength);\n this.length = 0;\n this._subParams = new Int32Array(maxSubParamsLength);\n this._subParamsLength = 0;\n this._subParamsIdx = new Uint16Array(maxLength);\n this._rejectDigits = false;\n this._rejectSubDigits = false;\n this._digitIsSub = false;\n }\n\n /**\n * Clone object.\n */\n public clone(): Params {\n const newParams = new Params(this.maxLength, this.maxSubParamsLength);\n newParams.params.set(this.params);\n newParams.length = this.length;\n newParams._subParams.set(this._subParams);\n newParams._subParamsLength = this._subParamsLength;\n newParams._subParamsIdx.set(this._subParamsIdx);\n newParams._rejectDigits = this._rejectDigits;\n newParams._rejectSubDigits = this._rejectSubDigits;\n newParams._digitIsSub = this._digitIsSub;\n return newParams;\n }\n\n /**\n * Get a JS array representation of the current parameters and sub parameters.\n * The array is structured as follows:\n * sequence: \"1;2:3:4;5::6\"\n * array : [1, 2, [3, 4], 5, [-1, 6]]\n */\n public toArray(): ParamsArray {\n const res: ParamsArray = [];\n for (let i = 0; i < this.length; ++i) {\n res.push(this.params[i]);\n const start = this._subParamsIdx[i] >> 8;\n const end = this._subParamsIdx[i] & 0xFF;\n if (end - start > 0) {\n res.push(Array.prototype.slice.call(this._subParams, start, end));\n }\n }\n return res;\n }\n\n /**\n * Reset to initial empty state.\n */\n public reset(): void {\n this.length = 0;\n this._subParamsLength = 0;\n this._rejectDigits = false;\n this._rejectSubDigits = false;\n this._digitIsSub = false;\n }\n\n /**\n * Add a parameter value.\n * `Params` only stores up to `maxLength` parameters, any later\n * parameter will be ignored.\n * Note: VT devices only stored up to 16 values, xterm seems to\n * store up to 30.\n */\n public addParam(value: number): void {\n this._digitIsSub = false;\n if (this.length >= this.maxLength) {\n this._rejectDigits = true;\n return;\n }\n if (value < -1) {\n throw new Error('values lesser than -1 are not allowed');\n }\n this._subParamsIdx[this.length] = this._subParamsLength << 8 | this._subParamsLength;\n this.params[this.length++] = value > MAX_VALUE ? MAX_VALUE : value;\n }\n\n /**\n * Add a sub parameter value.\n * The sub parameter is automatically associated with the last parameter value.\n * Thus it is not possible to add a subparameter without any parameter added yet.\n * `Params` only stores up to `subParamsLength` sub parameters, any later\n * sub parameter will be ignored.\n */\n public addSubParam(value: number): void {\n this._digitIsSub = true;\n if (!this.length) {\n return;\n }\n if (this._rejectDigits || this._subParamsLength >= this.maxSubParamsLength) {\n this._rejectSubDigits = true;\n return;\n }\n if (value < -1) {\n throw new Error('values lesser than -1 are not allowed');\n }\n this._subParams[this._subParamsLength++] = value > MAX_VALUE ? MAX_VALUE : value;\n this._subParamsIdx[this.length - 1]++;\n }\n\n /**\n * Whether parameter at index `idx` has sub parameters.\n */\n public hasSubParams(idx: number): boolean {\n return ((this._subParamsIdx[idx] & 0xFF) - (this._subParamsIdx[idx] >> 8) > 0);\n }\n\n /**\n * Return sub parameters for parameter at index `idx`.\n * Note: The values are borrowed, thus you need to copy\n * the values if you need to hold them in nonlocal scope.\n */\n public getSubParams(idx: number): Int32Array | null {\n const start = this._subParamsIdx[idx] >> 8;\n const end = this._subParamsIdx[idx] & 0xFF;\n if (end - start > 0) {\n return this._subParams.subarray(start, end);\n }\n return null;\n }\n\n /**\n * Return all sub parameters as {idx: subparams} mapping.\n * Note: The values are not borrowed.\n */\n public getSubParamsAll(): {[idx: number]: Int32Array} {\n const result: {[idx: number]: Int32Array} = {};\n for (let i = 0; i < this.length; ++i) {\n const start = this._subParamsIdx[i] >> 8;\n const end = this._subParamsIdx[i] & 0xFF;\n if (end - start > 0) {\n result[i] = this._subParams.slice(start, end);\n }\n }\n return result;\n }\n\n /**\n * Add a single digit value to current parameter.\n * This is used by the parser to account digits on a char by char basis.\n */\n public addDigit(value: number): void {\n let length;\n if (this._rejectDigits\n || !(length = this._digitIsSub ? this._subParamsLength : this.length)\n || (this._digitIsSub && this._rejectSubDigits)\n ) {\n return;\n }\n\n const store = this._digitIsSub ? this._subParams : this.params;\n const cur = store[length - 1];\n store[length - 1] = ~cur ? Math.min(cur * 10 + value, MAX_VALUE) : value;\n }\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ITerminalAddon, IDisposable, Terminal } from 'xterm';\n\nexport interface ILoadedAddon {\n instance: ITerminalAddon;\n dispose: () => void;\n isDisposed: boolean;\n}\n\nexport class AddonManager implements IDisposable {\n protected _addons: ILoadedAddon[] = [];\n\n constructor() {\n }\n\n public dispose(): void {\n for (let i = this._addons.length - 1; i >= 0; i--) {\n this._addons[i].instance.dispose();\n }\n }\n\n public loadAddon(terminal: Terminal, instance: ITerminalAddon): void {\n const loadedAddon: ILoadedAddon = {\n instance,\n dispose: instance.dispose,\n isDisposed: false\n };\n this._addons.push(loadedAddon);\n instance.dispose = () => this._wrappedAddonDispose(loadedAddon);\n instance.activate(terminal as any);\n }\n\n private _wrappedAddonDispose(loadedAddon: ILoadedAddon): void {\n if (loadedAddon.isDisposed) {\n // Do nothing if already disposed\n return;\n }\n let index = -1;\n for (let i = 0; i < this._addons.length; i++) {\n if (this._addons[i] === loadedAddon) {\n index = i;\n break;\n }\n }\n if (index === -1) {\n throw new Error('Could not dispose an addon that has not been loaded');\n }\n loadedAddon.isDisposed = true;\n loadedAddon.dispose.apply(loadedAddon.instance);\n this._addons.splice(index, 1);\n }\n}\n","/**\n * Copyright (c) 2021 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IBuffer as IBufferApi, IBufferLine as IBufferLineApi, IBufferCell as IBufferCellApi } from 'xterm';\nimport { IBuffer } from 'common/buffer/Types';\nimport { BufferLineApiView } from 'common/public/BufferLineApiView';\nimport { CellData } from 'common/buffer/CellData';\n\nexport class BufferApiView implements IBufferApi {\n constructor(\n private _buffer: IBuffer,\n public readonly type: 'normal' | 'alternate'\n ) { }\n\n public init(buffer: IBuffer): BufferApiView {\n this._buffer = buffer;\n return this;\n }\n\n public get cursorY(): number { return this._buffer.y; }\n public get cursorX(): number { return this._buffer.x; }\n public get viewportY(): number { return this._buffer.ydisp; }\n public get baseY(): number { return this._buffer.ybase; }\n public get length(): number { return this._buffer.lines.length; }\n public getLine(y: number): IBufferLineApi | undefined {\n const line = this._buffer.lines.get(y);\n if (!line) {\n return undefined;\n }\n return new BufferLineApiView(line);\n }\n public getNullCell(): IBufferCellApi { return new CellData(); }\n}\n","/**\n * Copyright (c) 2021 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { CellData } from 'common/buffer/CellData';\nimport { IBufferLine, ICellData } from 'common/Types';\nimport { IBufferCell as IBufferCellApi, IBufferLine as IBufferLineApi } from 'xterm';\n\nexport class BufferLineApiView implements IBufferLineApi {\n constructor(private _line: IBufferLine) { }\n\n public get isWrapped(): boolean { return this._line.isWrapped; }\n public get length(): number { return this._line.length; }\n public getCell(x: number, cell?: IBufferCellApi): IBufferCellApi | undefined {\n if (x < 0 || x >= this._line.length) {\n return undefined;\n }\n\n if (cell) {\n this._line.loadCell(x, cell as ICellData);\n return cell;\n }\n return this._line.loadCell(x, new CellData());\n }\n public translateToString(trimRight?: boolean, startColumn?: number, endColumn?: number): string {\n return this._line.translateToString(trimRight, startColumn, endColumn);\n }\n}\n","/**\n * Copyright (c) 2021 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IBuffer as IBufferApi, IBufferNamespace as IBufferNamespaceApi } from 'xterm';\nimport { BufferApiView } from 'common/public/BufferApiView';\nimport { IEvent, EventEmitter } from 'common/EventEmitter';\nimport { ICoreTerminal } from 'common/Types';\n\nexport class BufferNamespaceApi implements IBufferNamespaceApi {\n private _normal: BufferApiView;\n private _alternate: BufferApiView;\n private _onBufferChange = new EventEmitter<IBufferApi>();\n public get onBufferChange(): IEvent<IBufferApi> { return this._onBufferChange.event; }\n\n constructor(private _core: ICoreTerminal) {\n this._normal = new BufferApiView(this._core.buffers.normal, 'normal');\n this._alternate = new BufferApiView(this._core.buffers.alt, 'alternate');\n this._core.buffers.onBufferActivate(() => this._onBufferChange.fire(this.active));\n }\n public get active(): IBufferApi {\n if (this._core.buffers.active === this._core.buffers.normal) { return this.normal; }\n if (this._core.buffers.active === this._core.buffers.alt) { return this.alternate; }\n throw new Error('Active buffer is neither normal nor alternate');\n }\n public get normal(): IBufferApi {\n return this._normal.init(this._core.buffers.normal);\n }\n public get alternate(): IBufferApi {\n return this._alternate.init(this._core.buffers.alt);\n }\n}\n","/**\n * Copyright (c) 2021 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IParams } from 'common/parser/Types';\nimport { IDisposable, IFunctionIdentifier, IParser } from 'xterm';\nimport { ICoreTerminal } from 'common/Types';\n\nexport class ParserApi implements IParser {\n constructor(private _core: ICoreTerminal) { }\n\n public registerCsiHandler(id: IFunctionIdentifier, callback: (params: (number | number[])[]) => boolean | Promise<boolean>): IDisposable {\n return this._core.registerCsiHandler(id, (params: IParams) => callback(params.toArray()));\n }\n public addCsiHandler(id: IFunctionIdentifier, callback: (params: (number | number[])[]) => boolean | Promise<boolean>): IDisposable {\n return this.registerCsiHandler(id, callback);\n }\n public registerDcsHandler(id: IFunctionIdentifier, callback: (data: string, param: (number | number[])[]) => boolean | Promise<boolean>): IDisposable {\n return this._core.registerDcsHandler(id, (data: string, params: IParams) => callback(data, params.toArray()));\n }\n public addDcsHandler(id: IFunctionIdentifier, callback: (data: string, param: (number | number[])[]) => boolean | Promise<boolean>): IDisposable {\n return this.registerDcsHandler(id, callback);\n }\n public registerEscHandler(id: IFunctionIdentifier, handler: () => boolean | Promise<boolean>): IDisposable {\n return this._core.registerEscHandler(id, handler);\n }\n public addEscHandler(id: IFunctionIdentifier, handler: () => boolean | Promise<boolean>): IDisposable {\n return this.registerEscHandler(id, handler);\n }\n public registerOscHandler(ident: number, callback: (data: string) => boolean | Promise<boolean>): IDisposable {\n return this._core.registerOscHandler(ident, callback);\n }\n public addOscHandler(ident: number, callback: (data: string) => boolean | Promise<boolean>): IDisposable {\n return this.registerOscHandler(ident, callback);\n }\n}\n","/**\n * Copyright (c) 2021 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ICoreTerminal } from 'common/Types';\nimport { IUnicodeHandling, IUnicodeVersionProvider } from 'xterm';\n\nexport class UnicodeApi implements IUnicodeHandling {\n constructor(private _core: ICoreTerminal) { }\n\n public register(provider: IUnicodeVersionProvider): void {\n this._core.unicodeService.register(provider);\n }\n\n public get versions(): string[] {\n return this._core.unicodeService.versions;\n }\n\n public get activeVersion(): string {\n return this._core.unicodeService.activeVersion;\n }\n\n public set activeVersion(version: string) {\n this._core.unicodeService.activeVersion = version;\n }\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IBufferService, IOptionsService } from 'common/services/Services';\nimport { BufferSet } from 'common/buffer/BufferSet';\nimport { IBufferSet, IBuffer } from 'common/buffer/Types';\nimport { EventEmitter, IEvent } from 'common/EventEmitter';\nimport { Disposable } from 'common/Lifecycle';\nimport { IAttributeData, IBufferLine, ScrollSource } from 'common/Types';\n\nexport const MINIMUM_COLS = 2; // Less than 2 can mess with wide chars\nexport const MINIMUM_ROWS = 1;\n\nexport class BufferService extends Disposable implements IBufferService {\n public serviceBrand: any;\n\n public cols: number;\n public rows: number;\n public buffers: IBufferSet;\n /** Whether the user is scrolling (locks the scroll position) */\n public isUserScrolling: boolean = false;\n\n private _onResize = new EventEmitter<{ cols: number, rows: number }>();\n public get onResize(): IEvent<{ cols: number, rows: number }> { return this._onResize.event; }\n private _onScroll = new EventEmitter<number>();\n public get onScroll(): IEvent<number> { return this._onScroll.event; }\n\n public get buffer(): IBuffer { return this.buffers.active; }\n\n /** An IBufferline to clone/copy from for new blank lines */\n private _cachedBlankLine: IBufferLine | undefined;\n\n constructor(\n @IOptionsService private _optionsService: IOptionsService\n ) {\n super();\n this.cols = Math.max(_optionsService.rawOptions.cols || 0, MINIMUM_COLS);\n this.rows = Math.max(_optionsService.rawOptions.rows || 0, MINIMUM_ROWS);\n this.buffers = new BufferSet(_optionsService, this);\n }\n\n public dispose(): void {\n super.dispose();\n this.buffers.dispose();\n }\n\n public resize(cols: number, rows: number): void {\n this.cols = cols;\n this.rows = rows;\n this.buffers.resize(cols, rows);\n this.buffers.setupTabStops(this.cols);\n this._onResize.fire({ cols, rows });\n }\n\n public reset(): void {\n this.buffers.reset();\n this.isUserScrolling = false;\n }\n\n /**\n * Scroll the terminal down 1 row, creating a blank line.\n * @param isWrapped Whether the new line is wrapped from the previous line.\n */\n public scroll(eraseAttr: IAttributeData, isWrapped: boolean = false): void {\n const buffer = this.buffer;\n\n let newLine: IBufferLine | undefined;\n newLine = this._cachedBlankLine;\n if (!newLine || newLine.length !== this.cols || newLine.getFg(0) !== eraseAttr.fg || newLine.getBg(0) !== eraseAttr.bg) {\n newLine = buffer.getBlankLine(eraseAttr, isWrapped);\n this._cachedBlankLine = newLine;\n }\n newLine.isWrapped = isWrapped;\n\n const topRow = buffer.ybase + buffer.scrollTop;\n const bottomRow = buffer.ybase + buffer.scrollBottom;\n\n if (buffer.scrollTop === 0) {\n // Determine whether the buffer is going to be trimmed after insertion.\n const willBufferBeTrimmed = buffer.lines.isFull;\n\n // Insert the line using the fastest method\n if (bottomRow === buffer.lines.length - 1) {\n if (willBufferBeTrimmed) {\n buffer.lines.recycle().copyFrom(newLine);\n } else {\n buffer.lines.push(newLine.clone());\n }\n } else {\n buffer.lines.splice(bottomRow + 1, 0, newLine.clone());\n }\n\n // Only adjust ybase and ydisp when the buffer is not trimmed\n if (!willBufferBeTrimmed) {\n buffer.ybase++;\n // Only scroll the ydisp with ybase if the user has not scrolled up\n if (!this.isUserScrolling) {\n buffer.ydisp++;\n }\n } else {\n // When the buffer is full and the user has scrolled up, keep the text\n // stable unless ydisp is right at the top\n if (this.isUserScrolling) {\n buffer.ydisp = Math.max(buffer.ydisp - 1, 0);\n }\n }\n } else {\n // scrollTop is non-zero which means no line will be going to the\n // scrollback, instead we can just shift them in-place.\n const scrollRegionHeight = bottomRow - topRow + 1 /* as it's zero-based */;\n buffer.lines.shiftElements(topRow + 1, scrollRegionHeight - 1, -1);\n buffer.lines.set(bottomRow, newLine.clone());\n }\n\n // Move the viewport to the bottom of the buffer unless the user is\n // scrolling.\n if (!this.isUserScrolling) {\n buffer.ydisp = buffer.ybase;\n }\n\n this._onScroll.fire(buffer.ydisp);\n }\n\n /**\n * Scroll the display of the terminal\n * @param disp The number of lines to scroll down (negative scroll up).\n * @param suppressScrollEvent Don't emit the scroll event as scrollLines. This is used\n * to avoid unwanted events being handled by the viewport when the event was triggered from the\n * viewport originally.\n */\n public scrollLines(disp: number, suppressScrollEvent?: boolean, source?: ScrollSource): void {\n const buffer = this.buffer;\n if (disp < 0) {\n if (buffer.ydisp === 0) {\n return;\n }\n this.isUserScrolling = true;\n } else if (disp + buffer.ydisp >= buffer.ybase) {\n this.isUserScrolling = false;\n }\n\n const oldYdisp = buffer.ydisp;\n buffer.ydisp = Math.max(Math.min(buffer.ydisp + disp, buffer.ybase), 0);\n\n // No change occurred, don't trigger scroll/refresh\n if (oldYdisp === buffer.ydisp) {\n return;\n }\n\n if (!suppressScrollEvent) {\n this._onScroll.fire(buffer.ydisp);\n }\n }\n\n /**\n * Scroll the display of the terminal by a number of pages.\n * @param pageCount The number of pages to scroll (negative scrolls up).\n */\n public scrollPages(pageCount: number): void {\n this.scrollLines(pageCount * (this.rows - 1));\n }\n\n /**\n * Scrolls the display of the terminal to the top.\n */\n public scrollToTop(): void {\n this.scrollLines(-this.buffer.ydisp);\n }\n\n /**\n * Scrolls the display of the terminal to the bottom.\n */\n public scrollToBottom(): void {\n this.scrollLines(this.buffer.ybase - this.buffer.ydisp);\n }\n\n public scrollToLine(line: number): void {\n const scrollAmount = line - this.buffer.ydisp;\n if (scrollAmount !== 0) {\n this.scrollLines(scrollAmount);\n }\n }\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ICharsetService } from 'common/services/Services';\nimport { ICharset } from 'common/Types';\n\nexport class CharsetService implements ICharsetService {\n public serviceBrand: any;\n\n public charset: ICharset | undefined;\n public glevel: number = 0;\n\n private _charsets: (ICharset | undefined)[] = [];\n\n public reset(): void {\n this.charset = undefined;\n this._charsets = [];\n this.glevel = 0;\n }\n\n public setgLevel(g: number): void {\n this.glevel = g;\n this.charset = this._charsets[g];\n }\n\n public setgCharset(g: number, charset: ICharset | undefined): void {\n this._charsets[g] = charset;\n if (this.glevel === g) {\n this.charset = charset;\n }\n }\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\nimport { IBufferService, ICoreService, ICoreMouseService } from 'common/services/Services';\nimport { EventEmitter, IEvent } from 'common/EventEmitter';\nimport { ICoreMouseProtocol, ICoreMouseEvent, CoreMouseEncoding, CoreMouseEventType, CoreMouseButton, CoreMouseAction } from 'common/Types';\n\n/**\n * Supported default protocols.\n */\nconst DEFAULT_PROTOCOLS: {[key: string]: ICoreMouseProtocol} = {\n /**\n * NONE\n * Events: none\n * Modifiers: none\n */\n NONE: {\n events: CoreMouseEventType.NONE,\n restrict: () => false\n },\n /**\n * X10\n * Events: mousedown\n * Modifiers: none\n */\n X10: {\n events: CoreMouseEventType.DOWN,\n restrict: (e: ICoreMouseEvent) => {\n // no wheel, no move, no up\n if (e.button === CoreMouseButton.WHEEL || e.action !== CoreMouseAction.DOWN) {\n return false;\n }\n // no modifiers\n e.ctrl = false;\n e.alt = false;\n e.shift = false;\n return true;\n }\n },\n /**\n * VT200\n * Events: mousedown / mouseup / wheel\n * Modifiers: all\n */\n VT200: {\n events: CoreMouseEventType.DOWN | CoreMouseEventType.UP | CoreMouseEventType.WHEEL,\n restrict: (e: ICoreMouseEvent) => {\n // no move\n if (e.action === CoreMouseAction.MOVE) {\n return false;\n }\n return true;\n }\n },\n /**\n * DRAG\n * Events: mousedown / mouseup / wheel / mousedrag\n * Modifiers: all\n */\n DRAG: {\n events: CoreMouseEventType.DOWN | CoreMouseEventType.UP | CoreMouseEventType.WHEEL | CoreMouseEventType.DRAG,\n restrict: (e: ICoreMouseEvent) => {\n // no move without button\n if (e.action === CoreMouseAction.MOVE && e.button === CoreMouseButton.NONE) {\n return false;\n }\n return true;\n }\n },\n /**\n * ANY\n * Events: all mouse related events\n * Modifiers: all\n */\n ANY: {\n events:\n CoreMouseEventType.DOWN | CoreMouseEventType.UP | CoreMouseEventType.WHEEL\n | CoreMouseEventType.DRAG | CoreMouseEventType.MOVE,\n restrict: (e: ICoreMouseEvent) => true\n }\n};\n\nconst enum Modifiers {\n SHIFT = 4,\n ALT = 8,\n CTRL = 16\n}\n\n// helper for default encoders to generate the event code.\nfunction eventCode(e: ICoreMouseEvent, isSGR: boolean): number {\n let code = (e.ctrl ? Modifiers.CTRL : 0) | (e.shift ? Modifiers.SHIFT : 0) | (e.alt ? Modifiers.ALT : 0);\n if (e.button === CoreMouseButton.WHEEL) {\n code |= 64;\n code |= e.action;\n } else {\n code |= e.button & 3;\n if (e.button & 4) {\n code |= 64;\n }\n if (e.button & 8) {\n code |= 128;\n }\n if (e.action === CoreMouseAction.MOVE) {\n code |= CoreMouseAction.MOVE;\n } else if (e.action === CoreMouseAction.UP && !isSGR) {\n // special case - only SGR can report button on release\n // all others have to go with NONE\n code |= CoreMouseButton.NONE;\n }\n }\n return code;\n}\n\nconst S = String.fromCharCode;\n\n/**\n * Supported default encodings.\n */\nconst DEFAULT_ENCODINGS: {[key: string]: CoreMouseEncoding} = {\n /**\n * DEFAULT - CSI M Pb Px Py\n * Single byte encoding for coords and event code.\n * Can encode values up to 223 (1-based).\n */\n DEFAULT: (e: ICoreMouseEvent) => {\n const params = [eventCode(e, false) + 32, e.col + 32, e.row + 32];\n // supress mouse report if we exceed addressible range\n // Note this is handled differently by emulators\n // - xterm: sends 0;0 coords instead\n // - vte, konsole: no report\n if (params[0] > 255 || params[1] > 255 || params[2] > 255) {\n return '';\n }\n return `\\x1b[M${S(params[0])}${S(params[1])}${S(params[2])}`;\n },\n /**\n * SGR - CSI < Pb ; Px ; Py M|m\n * No encoding limitation.\n * Can report button on release and works with a well formed sequence.\n */\n SGR: (e: ICoreMouseEvent) => {\n const final = (e.action === CoreMouseAction.UP && e.button !== CoreMouseButton.WHEEL) ? 'm' : 'M';\n return `\\x1b[<${eventCode(e, true)};${e.col};${e.row}${final}`;\n }\n};\n\n/**\n * CoreMouseService\n *\n * Provides mouse tracking reports with different protocols and encodings.\n * - protocols: NONE (default), X10, VT200, DRAG, ANY\n * - encodings: DEFAULT, SGR (UTF8, URXVT removed in #2507)\n *\n * Custom protocols/encodings can be added by `addProtocol` / `addEncoding`.\n * To activate a protocol/encoding, set `activeProtocol` / `activeEncoding`.\n * Switching a protocol will send a notification event `onProtocolChange`\n * with a list of needed events to track.\n *\n * The service handles the mouse tracking state and decides whether to send\n * a tracking report to the backend based on protocol and encoding limitations.\n * To send a mouse event call `triggerMouseEvent`.\n */\nexport class CoreMouseService implements ICoreMouseService {\n private _protocols: {[name: string]: ICoreMouseProtocol} = {};\n private _encodings: {[name: string]: CoreMouseEncoding} = {};\n private _activeProtocol: string = '';\n private _activeEncoding: string = '';\n private _onProtocolChange = new EventEmitter<CoreMouseEventType>();\n private _lastEvent: ICoreMouseEvent | null = null;\n\n constructor(\n @IBufferService private readonly _bufferService: IBufferService,\n @ICoreService private readonly _coreService: ICoreService\n ) {\n // register default protocols and encodings\n for (const name of Object.keys(DEFAULT_PROTOCOLS)) this.addProtocol(name, DEFAULT_PROTOCOLS[name]);\n for (const name of Object.keys(DEFAULT_ENCODINGS)) this.addEncoding(name, DEFAULT_ENCODINGS[name]);\n // call reset to set defaults\n this.reset();\n }\n\n public addProtocol(name: string, protocol: ICoreMouseProtocol): void {\n this._protocols[name] = protocol;\n }\n\n public addEncoding(name: string, encoding: CoreMouseEncoding): void {\n this._encodings[name] = encoding;\n }\n\n public get activeProtocol(): string {\n return this._activeProtocol;\n }\n\n public get areMouseEventsActive(): boolean {\n return this._protocols[this._activeProtocol].events !== 0;\n }\n\n public set activeProtocol(name: string) {\n if (!this._protocols[name]) {\n throw new Error(`unknown protocol \"${name}\"`);\n }\n this._activeProtocol = name;\n this._onProtocolChange.fire(this._protocols[name].events);\n }\n\n public get activeEncoding(): string {\n return this._activeEncoding;\n }\n\n public set activeEncoding(name: string) {\n if (!this._encodings[name]) {\n throw new Error(`unknown encoding \"${name}\"`);\n }\n this._activeEncoding = name;\n }\n\n public reset(): void {\n this.activeProtocol = 'NONE';\n this.activeEncoding = 'DEFAULT';\n this._lastEvent = null;\n }\n\n /**\n * Event to announce changes in mouse tracking.\n */\n public get onProtocolChange(): IEvent<CoreMouseEventType> {\n return this._onProtocolChange.event;\n }\n\n /**\n * Triggers a mouse event to be sent.\n *\n * Returns true if the event passed all protocol restrictions and a report\n * was sent, otherwise false. The return value may be used to decide whether\n * the default event action in the bowser component should be omitted.\n *\n * Note: The method will change values of the given event object\n * to fullfill protocol and encoding restrictions.\n */\n public triggerMouseEvent(e: ICoreMouseEvent): boolean {\n // range check for col/row\n if (e.col < 0 || e.col >= this._bufferService.cols\n || e.row < 0 || e.row >= this._bufferService.rows) {\n return false;\n }\n\n // filter nonsense combinations of button + action\n if (e.button === CoreMouseButton.WHEEL && e.action === CoreMouseAction.MOVE) {\n return false;\n }\n if (e.button === CoreMouseButton.NONE && e.action !== CoreMouseAction.MOVE) {\n return false;\n }\n if (e.button !== CoreMouseButton.WHEEL && (e.action === CoreMouseAction.LEFT || e.action === CoreMouseAction.RIGHT)) {\n return false;\n }\n\n // report 1-based coords\n e.col++;\n e.row++;\n\n // debounce move at grid level\n if (e.action === CoreMouseAction.MOVE && this._lastEvent && this._compareEvents(this._lastEvent, e)) {\n return false;\n }\n\n // apply protocol restrictions\n if (!this._protocols[this._activeProtocol].restrict(e)) {\n return false;\n }\n\n // encode report and send\n const report = this._encodings[this._activeEncoding](e);\n if (report) {\n // always send DEFAULT as binary data\n if (this._activeEncoding === 'DEFAULT') {\n this._coreService.triggerBinaryEvent(report);\n } else {\n this._coreService.triggerDataEvent(report, true);\n }\n }\n\n this._lastEvent = e;\n\n return true;\n }\n\n public explainEvents(events: CoreMouseEventType): {[event: string]: boolean} {\n return {\n down: !!(events & CoreMouseEventType.DOWN),\n up: !!(events & CoreMouseEventType.UP),\n drag: !!(events & CoreMouseEventType.DRAG),\n move: !!(events & CoreMouseEventType.MOVE),\n wheel: !!(events & CoreMouseEventType.WHEEL)\n };\n }\n\n private _compareEvents(e1: ICoreMouseEvent, e2: ICoreMouseEvent): boolean {\n if (e1.col !== e2.col) return false;\n if (e1.row !== e2.row) return false;\n if (e1.button !== e2.button) return false;\n if (e1.action !== e2.action) return false;\n if (e1.ctrl !== e2.ctrl) return false;\n if (e1.alt !== e2.alt) return false;\n if (e1.shift !== e2.shift) return false;\n return true;\n }\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ICoreService, ILogService, IOptionsService, IBufferService } from 'common/services/Services';\nimport { EventEmitter, IEvent } from 'common/EventEmitter';\nimport { IDecPrivateModes, IModes } from 'common/Types';\nimport { clone } from 'common/Clone';\nimport { Disposable } from 'common/Lifecycle';\n\nconst DEFAULT_MODES: IModes = Object.freeze({\n insertMode: false\n});\n\nconst DEFAULT_DEC_PRIVATE_MODES: IDecPrivateModes = Object.freeze({\n applicationCursorKeys: false,\n applicationKeypad: false,\n bracketedPasteMode: false,\n origin: false,\n reverseWraparound: false,\n sendFocus: false,\n wraparound: true // defaults: xterm - true, vt100 - false\n});\n\nexport class CoreService extends Disposable implements ICoreService {\n public serviceBrand: any;\n\n public isCursorInitialized: boolean = false;\n public isCursorHidden: boolean = false;\n public modes: IModes;\n public decPrivateModes: IDecPrivateModes;\n\n // Circular dependency, this must be unset or memory will leak after Terminal.dispose\n private _scrollToBottom: (() => void) | undefined;\n\n private _onData = this.register(new EventEmitter<string>());\n public get onData(): IEvent<string> { return this._onData.event; }\n private _onUserInput = this.register(new EventEmitter<void>());\n public get onUserInput(): IEvent<void> { return this._onUserInput.event; }\n private _onBinary = this.register(new EventEmitter<string>());\n public get onBinary(): IEvent<string> { return this._onBinary.event; }\n\n constructor(\n // TODO: Move this into a service\n scrollToBottom: () => void,\n @IBufferService private readonly _bufferService: IBufferService,\n @ILogService private readonly _logService: ILogService,\n @IOptionsService private readonly _optionsService: IOptionsService\n ) {\n super();\n this._scrollToBottom = scrollToBottom;\n this.register({ dispose: () => this._scrollToBottom = undefined });\n this.modes = clone(DEFAULT_MODES);\n this.decPrivateModes = clone(DEFAULT_DEC_PRIVATE_MODES);\n }\n\n public reset(): void {\n this.modes = clone(DEFAULT_MODES);\n this.decPrivateModes = clone(DEFAULT_DEC_PRIVATE_MODES);\n }\n\n public triggerDataEvent(data: string, wasUserInput: boolean = false): void {\n // Prevents all events to pty process if stdin is disabled\n if (this._optionsService.rawOptions.disableStdin) {\n return;\n }\n\n // Input is being sent to the terminal, the terminal should focus the prompt.\n const buffer = this._bufferService.buffer;\n if (buffer.ybase !== buffer.ydisp) {\n this._scrollToBottom!();\n }\n\n // Fire onUserInput so listeners can react as well (eg. clear selection)\n if (wasUserInput) {\n this._onUserInput.fire();\n }\n\n // Fire onData API\n this._logService.debug(`sending data \"${data}\"`, () => data.split('').map(e => e.charCodeAt(0)));\n this._onData.fire(data);\n }\n\n public triggerBinaryEvent(data: string): void {\n if (this._optionsService.rawOptions.disableStdin) {\n return;\n }\n this._logService.debug(`sending binary \"${data}\"`, () => data.split('').map(e => e.charCodeAt(0)));\n this._onBinary.fire(data);\n }\n}\n","/**\n * Copyright (c) 2022 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { css } from 'common/Color';\nimport { EventEmitter } from 'common/EventEmitter';\nimport { Disposable } from 'common/Lifecycle';\nimport { IDecorationService, IInternalDecoration } from 'common/services/Services';\nimport { SortedList } from 'common/SortedList';\nimport { IColor } from 'common/Types';\nimport { IDecorationOptions, IDecoration, IMarker, IEvent } from 'xterm';\n\nexport class DecorationService extends Disposable implements IDecorationService {\n public serviceBrand: any;\n\n /**\n * A list of all decorations, sorted by the marker's line value. This relies on the fact that\n * while marker line values do change, they should all change by the same amount so this should\n * never become out of order.\n */\n private readonly _decorations: SortedList<IInternalDecoration> = new SortedList(e => e.marker.line);\n\n private _onDecorationRegistered = this.register(new EventEmitter<IInternalDecoration>());\n public get onDecorationRegistered(): IEvent<IInternalDecoration> { return this._onDecorationRegistered.event; }\n private _onDecorationRemoved = this.register(new EventEmitter<IInternalDecoration>());\n public get onDecorationRemoved(): IEvent<IInternalDecoration> { return this._onDecorationRemoved.event; }\n\n public get decorations(): IterableIterator<IInternalDecoration> { return this._decorations.values(); }\n\n constructor() {\n super();\n }\n\n public registerDecoration(options: IDecorationOptions): IDecoration | undefined {\n if (options.marker.isDisposed) {\n return undefined;\n }\n const decoration = new Decoration(options);\n if (decoration) {\n const markerDispose = decoration.marker.onDispose(() => decoration.dispose());\n decoration.onDispose(() => {\n if (decoration) {\n if (this._decorations.delete(decoration)) {\n this._onDecorationRemoved.fire(decoration);\n }\n markerDispose.dispose();\n }\n });\n this._decorations.insert(decoration);\n this._onDecorationRegistered.fire(decoration);\n }\n return decoration;\n }\n\n public reset(): void {\n for (const d of this._decorations.values()) {\n d.dispose();\n }\n this._decorations.clear();\n }\n\n public *getDecorationsAtLine(line: number): IterableIterator<IInternalDecoration> {\n return this._decorations.getKeyIterator(line);\n }\n\n public *getDecorationsAtCell(x: number, line: number, layer?: 'bottom' | 'top'): IterableIterator<IInternalDecoration> {\n let xmin = 0;\n let xmax = 0;\n for (const d of this._decorations.getKeyIterator(line)) {\n xmin = d.options.x ?? 0;\n xmax = xmin + (d.options.width ?? 1);\n if (x >= xmin && x < xmax && (!layer || (d.options.layer ?? 'bottom') === layer)) {\n yield d;\n }\n }\n }\n\n public dispose(): void {\n for (const d of this._decorations.values()) {\n this._onDecorationRemoved.fire(d);\n }\n this.reset();\n }\n}\n\nclass Decoration extends Disposable implements IInternalDecoration {\n public readonly marker: IMarker;\n public element: HTMLElement | undefined;\n public isDisposed: boolean = false;\n\n public readonly onRenderEmitter = this.register(new EventEmitter<HTMLElement>());\n public readonly onRender = this.onRenderEmitter.event;\n private _onDispose = this.register(new EventEmitter<void>());\n public readonly onDispose = this._onDispose.event;\n\n private _cachedBg: IColor | undefined | null = null;\n public get backgroundColorRGB(): IColor | undefined {\n if (this._cachedBg === null) {\n if (this.options.backgroundColor) {\n this._cachedBg = css.toColor(this.options.backgroundColor);\n } else {\n this._cachedBg = undefined;\n }\n }\n return this._cachedBg;\n }\n\n private _cachedFg: IColor | undefined | null = null;\n public get foregroundColorRGB(): IColor | undefined {\n if (this._cachedFg === null) {\n if (this.options.foregroundColor) {\n this._cachedFg = css.toColor(this.options.foregroundColor);\n } else {\n this._cachedFg = undefined;\n }\n }\n return this._cachedFg;\n }\n\n constructor(\n public readonly options: IDecorationOptions\n ) {\n super();\n this.marker = options.marker;\n if (this.options.overviewRulerOptions && !this.options.overviewRulerOptions.position) {\n this.options.overviewRulerOptions.position = 'full';\n }\n }\n\n public override dispose(): void {\n if (this._isDisposed) {\n return;\n }\n this._isDisposed = true;\n this._onDispose.fire();\n super.dispose();\n }\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IBufferService, IDirtyRowService } from 'common/services/Services';\n\nexport class DirtyRowService implements IDirtyRowService {\n public serviceBrand: any;\n\n private _start!: number;\n private _end!: number;\n\n public get start(): number { return this._start; }\n public get end(): number { return this._end; }\n\n constructor(\n @IBufferService private readonly _bufferService: IBufferService\n ) {\n this.clearRange();\n }\n\n public clearRange(): void {\n this._start = this._bufferService.buffer.y;\n this._end = this._bufferService.buffer.y;\n }\n\n public markDirty(y: number): void {\n if (y < this._start) {\n this._start = y;\n } else if (y > this._end) {\n this._end = y;\n }\n }\n\n public markRangeDirty(y1: number, y2: number): void {\n if (y1 > y2) {\n const temp = y1;\n y1 = y2;\n y2 = temp;\n }\n if (y1 < this._start) {\n this._start = y1;\n }\n if (y2 > this._end) {\n this._end = y2;\n }\n }\n\n public markAllDirty(): void {\n this.markRangeDirty(0, this._bufferService.rows - 1);\n }\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n *\n * This was heavily inspired from microsoft/vscode's dependency injection system (MIT).\n */\n/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { IInstantiationService, IServiceIdentifier } from 'common/services/Services';\nimport { getServiceDependencies } from 'common/services/ServiceRegistry';\n\nexport class ServiceCollection {\n\n private _entries = new Map<IServiceIdentifier<any>, any>();\n\n constructor(...entries: [IServiceIdentifier<any>, any][]) {\n for (const [id, service] of entries) {\n this.set(id, service);\n }\n }\n\n public set<T>(id: IServiceIdentifier<T>, instance: T): T {\n const result = this._entries.get(id);\n this._entries.set(id, instance);\n return result;\n }\n\n public forEach(callback: (id: IServiceIdentifier<any>, instance: any) => any): void {\n this._entries.forEach((value, key) => callback(key, value));\n }\n\n public has(id: IServiceIdentifier<any>): boolean {\n return this._entries.has(id);\n }\n\n public get<T>(id: IServiceIdentifier<T>): T | undefined {\n return this._entries.get(id);\n }\n}\n\nexport class InstantiationService implements IInstantiationService {\n public serviceBrand: undefined;\n\n private readonly _services: ServiceCollection = new ServiceCollection();\n\n constructor() {\n this._services.set(IInstantiationService, this);\n }\n\n public setService<T>(id: IServiceIdentifier<T>, instance: T): void {\n this._services.set(id, instance);\n }\n\n public getService<T>(id: IServiceIdentifier<T>): T | undefined {\n return this._services.get(id);\n }\n\n public createInstance<T>(ctor: any, ...args: any[]): T {\n const serviceDependencies = getServiceDependencies(ctor).sort((a, b) => a.index - b.index);\n\n const serviceArgs: any[] = [];\n for (const dependency of serviceDependencies) {\n const service = this._services.get(dependency.id);\n if (!service) {\n throw new Error(`[createInstance] ${ctor.name} depends on UNKNOWN service ${dependency.id}.`);\n }\n serviceArgs.push(service);\n }\n\n const firstServiceArgPos = serviceDependencies.length > 0 ? serviceDependencies[0].index : args.length;\n\n // check for argument mismatches, adjust static args if needed\n if (args.length !== firstServiceArgPos) {\n throw new Error(`[createInstance] First service dependency of ${ctor.name} at position ${firstServiceArgPos + 1} conflicts with ${args.length} static arguments`);\n }\n\n // now create the instance\n return new ctor(...[...args, ...serviceArgs]);\n }\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ILogService, IOptionsService, LogLevelEnum } from 'common/services/Services';\n\ntype LogType = (message?: any, ...optionalParams: any[]) => void;\n\ninterface IConsole {\n log: LogType;\n error: LogType;\n info: LogType;\n trace: LogType;\n warn: LogType;\n}\n\n// console is available on both node.js and browser contexts but the common\n// module doesn't depend on them so we need to explicitly declare it.\ndeclare const console: IConsole;\n\nconst optionsKeyToLogLevel: { [key: string]: LogLevelEnum } = {\n debug: LogLevelEnum.DEBUG,\n info: LogLevelEnum.INFO,\n warn: LogLevelEnum.WARN,\n error: LogLevelEnum.ERROR,\n off: LogLevelEnum.OFF\n};\n\nconst LOG_PREFIX = 'xterm.js: ';\n\nexport class LogService implements ILogService {\n public serviceBrand: any;\n\n public logLevel: LogLevelEnum = LogLevelEnum.OFF;\n\n constructor(\n @IOptionsService private readonly _optionsService: IOptionsService\n ) {\n this._updateLogLevel();\n this._optionsService.onOptionChange(key => {\n if (key === 'logLevel') {\n this._updateLogLevel();\n }\n });\n }\n\n private _updateLogLevel(): void {\n this.logLevel = optionsKeyToLogLevel[this._optionsService.rawOptions.logLevel];\n }\n\n private _evalLazyOptionalParams(optionalParams: any[]): void {\n for (let i = 0; i < optionalParams.length; i++) {\n if (typeof optionalParams[i] === 'function') {\n optionalParams[i] = optionalParams[i]();\n }\n }\n }\n\n private _log(type: LogType, message: string, optionalParams: any[]): void {\n this._evalLazyOptionalParams(optionalParams);\n type.call(console, LOG_PREFIX + message, ...optionalParams);\n }\n\n public debug(message: string, ...optionalParams: any[]): void {\n if (this.logLevel <= LogLevelEnum.DEBUG) {\n this._log(console.log, message, optionalParams);\n }\n }\n\n public info(message: string, ...optionalParams: any[]): void {\n if (this.logLevel <= LogLevelEnum.INFO) {\n this._log(console.info, message, optionalParams);\n }\n }\n\n public warn(message: string, ...optionalParams: any[]): void {\n if (this.logLevel <= LogLevelEnum.WARN) {\n this._log(console.warn, message, optionalParams);\n }\n }\n\n public error(message: string, ...optionalParams: any[]): void {\n if (this.logLevel <= LogLevelEnum.ERROR) {\n this._log(console.error, message, optionalParams);\n }\n }\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IOptionsService, ITerminalOptions, FontWeight } from 'common/services/Services';\nimport { EventEmitter, IEvent } from 'common/EventEmitter';\nimport { isMac } from 'common/Platform';\n\n// Source: https://freesound.org/people/altemark/sounds/45759/\n// This sound is released under the Creative Commons Attribution 3.0 Unported\n// (CC BY 3.0) license. It was created by 'altemark'. No modifications have been\n// made, apart from the conversion to base64.\nexport const DEFAULT_BELL_SOUND = 'data:audio/mp3;base64,SUQzBAAAAAAAI1RTU0UAAAAPAAADTGF2ZjU4LjMyLjEwNAAAAAAAAAAAAAAA//tQxAADB8AhSmxhIIEVCSiJrDCQBTcu3UrAIwUdkRgQbFAZC1CQEwTJ9mjRvBA4UOLD8nKVOWfh+UlK3z/177OXrfOdKl7pyn3Xf//WreyTRUoAWgBgkOAGbZHBgG1OF6zM82DWbZaUmMBptgQhGjsyYqc9ae9XFz280948NMBWInljyzsNRFLPWdnZGWrddDsjK1unuSrVN9jJsK8KuQtQCtMBjCEtImISdNKJOopIpBFpNSMbIHCSRpRR5iakjTiyzLhchUUBwCgyKiweBv/7UsQbg8isVNoMPMjAAAA0gAAABEVFGmgqK////9bP/6XCykxBTUUzLjEwMKqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq';\n\nexport const DEFAULT_OPTIONS: Readonly<ITerminalOptions> = {\n cols: 80,\n rows: 24,\n cursorBlink: false,\n cursorStyle: 'block',\n cursorWidth: 1,\n customGlyphs: true,\n bellSound: DEFAULT_BELL_SOUND,\n bellStyle: 'none',\n drawBoldTextInBrightColors: true,\n fastScrollModifier: 'alt',\n fastScrollSensitivity: 5,\n fontFamily: 'courier-new, courier, monospace',\n fontSize: 15,\n fontWeight: 'normal',\n fontWeightBold: 'bold',\n lineHeight: 1.0,\n linkTooltipHoverDuration: 500,\n letterSpacing: 0,\n logLevel: 'info',\n scrollback: 1000,\n scrollSensitivity: 1,\n screenReaderMode: false,\n macOptionIsMeta: false,\n macOptionClickForcesSelection: false,\n minimumContrastRatio: 1,\n disableStdin: false,\n allowProposedApi: true,\n allowTransparency: false,\n tabStopWidth: 8,\n theme: {},\n rightClickSelectsWord: isMac,\n rendererType: 'canvas',\n windowOptions: {},\n windowsMode: false,\n wordSeparator: ' ()[]{}\\',\"`',\n altClickMovesCursor: true,\n convertEol: false,\n termName: 'xterm',\n cancelEvents: false,\n overviewRulerWidth: undefined\n};\n\nconst FONT_WEIGHT_OPTIONS: Extract<FontWeight, string>[] = ['normal', 'bold', '100', '200', '300', '400', '500', '600', '700', '800', '900'];\n\nexport class OptionsService implements IOptionsService {\n public serviceBrand: any;\n\n public readonly rawOptions: ITerminalOptions;\n public options: ITerminalOptions;\n\n private _onOptionChange = new EventEmitter<string>();\n public get onOptionChange(): IEvent<string> { return this._onOptionChange.event; }\n\n constructor(options: Partial<ITerminalOptions>) {\n // set the default value of each option\n const defaultOptions = { ...DEFAULT_OPTIONS };\n for (const key in options) {\n if (key in defaultOptions) {\n try {\n const newValue = options[key];\n defaultOptions[key] = this._sanitizeAndValidateOption(key, newValue);\n } catch (e) {\n console.error(e);\n }\n }\n }\n\n // set up getters and setters for each option\n this.rawOptions = defaultOptions;\n this.options = { ... defaultOptions };\n this._setupOptions();\n }\n\n private _setupOptions(): void {\n const getter = (propName: string): any => {\n if (!(propName in DEFAULT_OPTIONS)) {\n throw new Error(`No option with key \"${propName}\"`);\n }\n return this.rawOptions[propName];\n };\n\n const setter = (propName: string, value: any): void => {\n if (!(propName in DEFAULT_OPTIONS)) {\n throw new Error(`No option with key \"${propName}\"`);\n }\n\n value = this._sanitizeAndValidateOption(propName, value);\n // Don't fire an option change event if they didn't change\n if (this.rawOptions[propName] !== value) {\n this.rawOptions[propName] = value;\n this._onOptionChange.fire(propName);\n }\n };\n\n for (const propName in this.rawOptions) {\n const desc = {\n get: getter.bind(this, propName),\n set: setter.bind(this, propName)\n };\n Object.defineProperty(this.options, propName, desc);\n }\n }\n\n public setOption(key: string, value: any): void {\n this.options[key] = value;\n }\n\n private _sanitizeAndValidateOption(key: string, value: any): any {\n switch (key) {\n case 'bellStyle':\n case 'cursorStyle':\n case 'rendererType':\n case 'wordSeparator':\n if (!value) {\n value = DEFAULT_OPTIONS[key];\n }\n break;\n case 'fontWeight':\n case 'fontWeightBold':\n if (typeof value === 'number' && 1 <= value && value <= 1000) {\n // already valid numeric value\n break;\n }\n value = FONT_WEIGHT_OPTIONS.includes(value) ? value : DEFAULT_OPTIONS[key];\n break;\n case 'cursorWidth':\n value = Math.floor(value);\n // Fall through for bounds check\n case 'lineHeight':\n case 'tabStopWidth':\n if (value < 1) {\n throw new Error(`${key} cannot be less than 1, value: ${value}`);\n }\n break;\n case 'minimumContrastRatio':\n value = Math.max(1, Math.min(21, Math.round(value * 10) / 10));\n break;\n case 'scrollback':\n value = Math.min(value, 4294967295);\n if (value < 0) {\n throw new Error(`${key} cannot be less than 0, value: ${value}`);\n }\n break;\n case 'fastScrollSensitivity':\n case 'scrollSensitivity':\n if (value <= 0) {\n throw new Error(`${key} cannot be less than or equal to 0, value: ${value}`);\n }\n case 'rows':\n case 'cols':\n if (!value && value !== 0) {\n throw new Error(`${key} must be numeric, value: ${value}`);\n }\n break;\n }\n return value;\n }\n\n public getOption(key: string): any {\n return this.options[key];\n }\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n *\n * This was heavily inspired from microsoft/vscode's dependency injection system (MIT).\n */\n/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { IServiceIdentifier } from 'common/services/Services';\n\nconst DI_TARGET = 'di$target';\nconst DI_DEPENDENCIES = 'di$dependencies';\n\nexport const serviceRegistry: Map<string, IServiceIdentifier<any>> = new Map();\n\nexport function getServiceDependencies(ctor: any): { id: IServiceIdentifier<any>, index: number, optional: boolean }[] {\n return ctor[DI_DEPENDENCIES] || [];\n}\n\nexport function createDecorator<T>(id: string): IServiceIdentifier<T> {\n if (serviceRegistry.has(id)) {\n return serviceRegistry.get(id)!;\n }\n\n const decorator: any = function (target: Function, key: string, index: number): any {\n if (arguments.length !== 3) {\n throw new Error('@IServiceName-decorator can only be used to decorate a parameter');\n }\n\n storeServiceDependency(decorator, target, index);\n };\n\n decorator.toString = () => id;\n\n serviceRegistry.set(id, decorator);\n return decorator;\n}\n\nfunction storeServiceDependency(id: Function, target: Function, index: number): void {\n if ((target as any)[DI_TARGET] === target) {\n (target as any)[DI_DEPENDENCIES].push({ id, index });\n } else {\n (target as any)[DI_DEPENDENCIES] = [{ id, index }];\n (target as any)[DI_TARGET] = target;\n }\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IEvent, IEventEmitter } from 'common/EventEmitter';\nimport { IBuffer, IBufferSet } from 'common/buffer/Types';\nimport { IDecPrivateModes, ICoreMouseEvent, CoreMouseEncoding, ICoreMouseProtocol, CoreMouseEventType, ICharset, IWindowOptions, IModes, IAttributeData, ScrollSource, IDisposable, IColorRGB, IColor } from 'common/Types';\nimport { createDecorator } from 'common/services/ServiceRegistry';\nimport { IDecorationOptions, IDecoration } from 'xterm';\n\nexport const IBufferService = createDecorator<IBufferService>('BufferService');\nexport interface IBufferService {\n serviceBrand: undefined;\n\n readonly cols: number;\n readonly rows: number;\n readonly buffer: IBuffer;\n readonly buffers: IBufferSet;\n isUserScrolling: boolean;\n onResize: IEvent<{ cols: number, rows: number }>;\n onScroll: IEvent<number>;\n scroll(eraseAttr: IAttributeData, isWrapped?: boolean): void;\n scrollToBottom(): void;\n scrollToTop(): void;\n scrollToLine(line: number): void;\n scrollLines(disp: number, suppressScrollEvent?: boolean, source?: ScrollSource): void;\n scrollPages(pageCount: number): void;\n resize(cols: number, rows: number): void;\n reset(): void;\n}\n\nexport const ICoreMouseService = createDecorator<ICoreMouseService>('CoreMouseService');\nexport interface ICoreMouseService {\n activeProtocol: string;\n activeEncoding: string;\n areMouseEventsActive: boolean;\n addProtocol(name: string, protocol: ICoreMouseProtocol): void;\n addEncoding(name: string, encoding: CoreMouseEncoding): void;\n reset(): void;\n\n /**\n * Triggers a mouse event to be sent.\n *\n * Returns true if the event passed all protocol restrictions and a report\n * was sent, otherwise false. The return value may be used to decide whether\n * the default event action in the bowser component should be omitted.\n *\n * Note: The method will change values of the given event object\n * to fullfill protocol and encoding restrictions.\n */\n triggerMouseEvent(event: ICoreMouseEvent): boolean;\n\n /**\n * Event to announce changes in mouse tracking.\n */\n onProtocolChange: IEvent<CoreMouseEventType>;\n\n /**\n * Human readable version of mouse events.\n */\n explainEvents(events: CoreMouseEventType): { [event: string]: boolean };\n}\n\nexport const ICoreService = createDecorator<ICoreService>('CoreService');\nexport interface ICoreService {\n serviceBrand: undefined;\n\n /**\n * Initially the cursor will not be visible until the first time the terminal\n * is focused.\n */\n isCursorInitialized: boolean;\n isCursorHidden: boolean;\n\n readonly modes: IModes;\n readonly decPrivateModes: IDecPrivateModes;\n\n readonly onData: IEvent<string>;\n readonly onUserInput: IEvent<void>;\n readonly onBinary: IEvent<string>;\n\n reset(): void;\n\n /**\n * Triggers the onData event in the public API.\n * @param data The data that is being emitted.\n * @param wasFromUser Whether the data originated from the user (as opposed to\n * resulting from parsing incoming data). When true this will also:\n * - Scroll to the bottom of the buffer.s\n * - Fire the `onUserInput` event (so selection can be cleared).\n */\n triggerDataEvent(data: string, wasUserInput?: boolean): void;\n\n /**\n * Triggers the onBinary event in the public API.\n * @param data The data that is being emitted.\n */\n triggerBinaryEvent(data: string): void;\n}\n\nexport const ICharsetService = createDecorator<ICharsetService>('CharsetService');\nexport interface ICharsetService {\n serviceBrand: undefined;\n\n charset: ICharset | undefined;\n readonly glevel: number;\n\n reset(): void;\n\n /**\n * Set the G level of the terminal.\n * @param g\n */\n setgLevel(g: number): void;\n\n /**\n * Set the charset for the given G level of the terminal.\n * @param g\n * @param charset\n */\n setgCharset(g: number, charset: ICharset | undefined): void;\n}\n\nexport const IDirtyRowService = createDecorator<IDirtyRowService>('DirtyRowService');\nexport interface IDirtyRowService {\n serviceBrand: undefined;\n\n readonly start: number;\n readonly end: number;\n\n clearRange(): void;\n markDirty(y: number): void;\n markRangeDirty(y1: number, y2: number): void;\n markAllDirty(): void;\n}\n\nexport interface IServiceIdentifier<T> {\n (...args: any[]): void;\n type: T;\n}\n\nexport interface IBrandedService {\n serviceBrand: undefined;\n}\n\ntype GetLeadingNonServiceArgs<Args> =\n Args extends [...IBrandedService[]] ? []\n : Args extends [infer A1, ...IBrandedService[]] ? [A1]\n : Args extends [infer A1, infer A2, ...IBrandedService[]] ? [A1, A2]\n : Args extends [infer A1, infer A2, infer A3, ...IBrandedService[]] ? [A1, A2, A3]\n : Args extends [infer A1, infer A2, infer A3, infer A4, ...IBrandedService[]] ? [A1, A2, A3, A4]\n : Args extends [infer A1, infer A2, infer A3, infer A4, infer A5, ...IBrandedService[]] ? [A1, A2, A3, A4, A5]\n : Args extends [infer A1, infer A2, infer A3, infer A4, infer A5, infer A6, ...IBrandedService[]] ? [A1, A2, A3, A4, A5, A6]\n : Args extends [infer A1, infer A2, infer A3, infer A4, infer A5, infer A6, infer A7, ...IBrandedService[]] ? [A1, A2, A3, A4, A5, A6, A7]\n : Args extends [infer A1, infer A2, infer A3, infer A4, infer A5, infer A6, infer A7, infer A8, ...IBrandedService[]] ? [A1, A2, A3, A4, A5, A6, A7, A8]\n : never;\n\nexport const IInstantiationService = createDecorator<IInstantiationService>('InstantiationService');\nexport interface IInstantiationService {\n serviceBrand: undefined;\n\n setService<T>(id: IServiceIdentifier<T>, instance: T): void;\n getService<T>(id: IServiceIdentifier<T>): T | undefined;\n createInstance<Ctor extends new (...args: any[]) => any, R extends InstanceType<Ctor>>(t: Ctor, ...args: GetLeadingNonServiceArgs<ConstructorParameters<Ctor>>): R;\n}\n\nexport enum LogLevelEnum {\n DEBUG = 0,\n INFO = 1,\n WARN = 2,\n ERROR = 3,\n OFF = 4\n}\n\nexport const ILogService = createDecorator<ILogService>('LogService');\nexport interface ILogService {\n serviceBrand: undefined;\n\n logLevel: LogLevelEnum;\n\n debug(message: any, ...optionalParams: any[]): void;\n info(message: any, ...optionalParams: any[]): void;\n warn(message: any, ...optionalParams: any[]): void;\n error(message: any, ...optionalParams: any[]): void;\n}\n\nexport const IOptionsService = createDecorator<IOptionsService>('OptionsService');\nexport interface IOptionsService {\n serviceBrand: undefined;\n\n /**\n * Read only access to the raw options object, this is an internal-only fast path for accessing\n * single options without any validation as we trust TypeScript to enforce correct usage\n * internally.\n */\n readonly rawOptions: Readonly<ITerminalOptions>;\n readonly options: ITerminalOptions;\n\n readonly onOptionChange: IEvent<string>;\n\n setOption<T>(key: string, value: T): void;\n getOption<T>(key: string): T | undefined;\n}\n\nexport type FontWeight = 'normal' | 'bold' | '100' | '200' | '300' | '400' | '500' | '600' | '700' | '800' | '900' | number;\nexport type LogLevel = 'debug' | 'info' | 'warn' | 'error' | 'off';\n\nexport type RendererType = 'dom' | 'canvas';\n\nexport interface ITerminalOptions {\n allowProposedApi: boolean;\n allowTransparency: boolean;\n altClickMovesCursor: boolean;\n bellSound: string;\n bellStyle: 'none' | 'sound' /* | 'visual' | 'both' */;\n cols: number;\n convertEol: boolean;\n cursorBlink: boolean;\n cursorStyle: 'block' | 'underline' | 'bar';\n cursorWidth: number;\n customGlyphs: boolean;\n disableStdin: boolean;\n drawBoldTextInBrightColors: boolean;\n fastScrollModifier: 'alt' | 'ctrl' | 'shift' | undefined;\n fastScrollSensitivity: number;\n fontSize: number;\n fontFamily: string;\n fontWeight: FontWeight;\n fontWeightBold: FontWeight;\n letterSpacing: number;\n lineHeight: number;\n linkTooltipHoverDuration: number;\n logLevel: LogLevel;\n macOptionIsMeta: boolean;\n macOptionClickForcesSelection: boolean;\n minimumContrastRatio: number;\n rendererType: RendererType;\n rightClickSelectsWord: boolean;\n rows: number;\n screenReaderMode: boolean;\n scrollback: number;\n scrollSensitivity: number;\n tabStopWidth: number;\n theme: ITheme;\n windowsMode: boolean;\n windowOptions: IWindowOptions;\n wordSeparator: string;\n overviewRulerWidth?: number;\n\n [key: string]: any;\n cancelEvents: boolean;\n termName: string;\n}\n\nexport interface ITheme {\n foreground?: string;\n background?: string;\n cursor?: string;\n cursorAccent?: string;\n selection?: string;\n selectionForeground?: string;\n black?: string;\n red?: string;\n green?: string;\n yellow?: string;\n blue?: string;\n magenta?: string;\n cyan?: string;\n white?: string;\n brightBlack?: string;\n brightRed?: string;\n brightGreen?: string;\n brightYellow?: string;\n brightBlue?: string;\n brightMagenta?: string;\n brightCyan?: string;\n brightWhite?: string;\n}\n\nexport const IUnicodeService = createDecorator<IUnicodeService>('UnicodeService');\nexport interface IUnicodeService {\n serviceBrand: undefined;\n /** Register an Unicode version provider. */\n register(provider: IUnicodeVersionProvider): void;\n /** Registered Unicode versions. */\n readonly versions: string[];\n /** Currently active version. */\n activeVersion: string;\n /** Event triggered, when activate version changed. */\n readonly onChange: IEvent<string>;\n\n /**\n * Unicode version dependent\n */\n wcwidth(codepoint: number): number;\n getStringCellWidth(s: string): number;\n}\n\nexport interface IUnicodeVersionProvider {\n readonly version: string;\n wcwidth(ucs: number): 0 | 1 | 2;\n}\n\nexport const IDecorationService = createDecorator<IDecorationService>('DecorationService');\nexport interface IDecorationService extends IDisposable {\n serviceBrand: undefined;\n readonly decorations: IterableIterator<IInternalDecoration>;\n readonly onDecorationRegistered: IEvent<IInternalDecoration>;\n readonly onDecorationRemoved: IEvent<IInternalDecoration>;\n registerDecoration(decorationOptions: IDecorationOptions): IDecoration | undefined;\n reset(): void;\n /** Iterates over the decorations at a line (in no particular order). */\n getDecorationsAtLine(line: number): IterableIterator<IInternalDecoration>;\n /** Iterates over the decorations at a cell (in no particular order). */\n getDecorationsAtCell(x: number, line: number, layer?: 'bottom' | 'top'): IterableIterator<IInternalDecoration>;\n}\nexport interface IInternalDecoration extends IDecoration {\n readonly options: IDecorationOptions;\n readonly backgroundColorRGB: IColor | undefined;\n readonly foregroundColorRGB: IColor | undefined;\n readonly onRenderEmitter: IEventEmitter<HTMLElement>;\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\nimport { IUnicodeService, IUnicodeVersionProvider } from 'common/services/Services';\nimport { EventEmitter, IEvent } from 'common/EventEmitter';\nimport { UnicodeV6 } from 'common/input/UnicodeV6';\n\n\nexport class UnicodeService implements IUnicodeService {\n public serviceBrand: any;\n\n private _providers: {[key: string]: IUnicodeVersionProvider} = Object.create(null);\n private _active: string = '';\n private _activeProvider: IUnicodeVersionProvider;\n private _onChange = new EventEmitter<string>();\n public get onChange(): IEvent<string> { return this._onChange.event; }\n\n constructor() {\n const defaultProvider = new UnicodeV6();\n this.register(defaultProvider);\n this._active = defaultProvider.version;\n this._activeProvider = defaultProvider;\n }\n\n public get versions(): string[] {\n return Object.keys(this._providers);\n }\n\n public get activeVersion(): string {\n return this._active;\n }\n\n public set activeVersion(version: string) {\n if (!this._providers[version]) {\n throw new Error(`unknown Unicode version \"${version}\"`);\n }\n this._active = version;\n this._activeProvider = this._providers[version];\n this._onChange.fire(version);\n }\n\n public register(provider: IUnicodeVersionProvider): void {\n this._providers[provider.version] = provider;\n }\n\n /**\n * Unicode version dependent interface.\n */\n public wcwidth(num: number): number {\n return this._activeProvider.wcwidth(num);\n }\n\n public getStringCellWidth(s: string): number {\n let result = 0;\n const length = s.length;\n for (let i = 0; i < length; ++i) {\n let code = s.charCodeAt(i);\n // surrogate pair first\n if (0xD800 <= code && code <= 0xDBFF) {\n if (++i >= length) {\n // this should not happen with strings retrieved from\n // Buffer.translateToString as it converts from UTF-32\n // and therefore always should contain the second part\n // for any other string we still have to handle it somehow:\n // simply treat the lonely surrogate first as a single char (UCS-2 behavior)\n return result + this.wcwidth(code);\n }\n const second = s.charCodeAt(i);\n // convert surrogate pair to high codepoint only for valid second part (UTF-16)\n // otherwise treat them independently (UCS-2 behavior)\n if (0xDC00 <= second && second <= 0xDFFF) {\n code = (code - 0xD800) * 0x400 + second - 0xDC00 + 0x10000;\n } else {\n result += this.wcwidth(second);\n }\n }\n result += this.wcwidth(code);\n }\n return result;\n }\n}\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// startup\n// Load entry module and return exports\n// This entry module is referenced by other modules so it can't be inlined\nvar __webpack_exports__ = __webpack_require__(4389);\n"],"names":["root","factory","exports","module","define","amd","a","i","self","_terminal","_renderService","_liveRegionLineCount","_charsToConsume","_charsToAnnounce","_accessibilityTreeRoot","document","createElement","classList","add","tabIndex","_rowContainer","setAttribute","_rowElements","rows","_createAccessibilityTreeNode","appendChild","_topBoundaryFocusListener","e","_onBoundaryFocus","_bottomBoundaryFocusListener","addEventListener","length","_refreshRowsDimensions","_renderRowsDebouncer","TimeBasedDebouncer","_renderRows","bind","_refreshRows","_liveRegion","element","Error","insertAdjacentElement","register","onResize","_onResize","onRender","start","end","onScroll","onA11yChar","char","_onChar","onLineFeed","onA11yTab","spaceCount","_onTab","onKey","_onKey","key","onBlur","_clearLiveRegion","onDimensionsChange","_screenDprMonitor","ScreenDprMonitor","setListener","addDisposableDomListener","window","dispose","removeElementFromParent","this","position","boundaryElement","target","beforeBoundaryElement","getAttribute","buffer","lines","relatedTarget","topBoundaryElement","bottomBoundaryElement","pop","removeChild","shift","removeEventListener","newElement","unshift","push","scrollLines","focus","preventDefault","stopImmediatePropagation","children","_refreshRowDimensions","MAX_ROWS_TO_READ","textContent","Strings","tooMuchOutput","isMac","parentNode","setTimeout","keyChar","refresh","setSize","toString","lineData","translateBufferLineToString","ydisp","posInSet","innerText","_announceCharacters","dimensions","actualCellHeight","style","height","Disposable","AccessibilityManager","prepareTextForTerminal","text","replace","bracketTextForPaste","bracketedPasteMode","paste","textarea","coreService","decPrivateModes","triggerDataEvent","value","moveTextAreaUnderMouseCursor","ev","screenElement","pos","getBoundingClientRect","left","clientX","top","clientY","width","zIndex","selectionService","clipboardData","setData","selectionText","stopPropagation","getData","shouldSelectWord","rightClickSelect","select","_color","_rgba","clear","setCss","bg","fg","getCss","undefined","setColor","getColor","ColorContrastCache","DEFAULT_FOREGROUND","css","toColor","DEFAULT_BACKGROUND","DEFAULT_CURSOR","DEFAULT_CURSOR_ACCENT","DEFAULT_SELECTION","rgba","DEFAULT_ANSI_COLORS","Object","freeze","colors","v","r","g","b","channels","toCss","toRgba","c","allowTransparency","canvas","ctx","getContext","_ctx","globalCompositeOperation","_litmusColor","createLinearGradient","_contrastCache","foreground","background","cursor","cursorAccent","selectionTransparent","selectionOpaque","color","blend","selectionForeground","ansi","slice","contrastCache","_updateRestoreColors","onOptionsChange","setTheme","theme","_parseColor","selection","nullColor","isOpaque","opacity","black","red","green","yellow","blue","magenta","cyan","white","brightBlack","brightRed","brightGreen","brightYellow","brightBlue","brightMagenta","brightCyan","brightWhite","restoreColor","slot","_restoreColors","fallback","fillStyle","console","warn","fillRect","data","getImageData","substring","split","map","component","Number","alpha","Math","round","ColorManager","elements","parentElement","node","type","handler","options","disposed","_bufferService","_logService","_unicodeService","_linkMatchers","_nextLinkMatcherId","_onShowLinkUnderline","EventEmitter","_onHideLinkUnderline","_onLinkTooltip","_rowsToLinkify","event","attachToDom","mouseZoneManager","_element","_mouseZoneManager","linkifyRows","min","max","clearAll","_rowsTimeoutId","clearTimeout","_linkifyRows","Linkifier","_timeBeforeLatency","absoluteRowIndexStart","absoluteRowIndexEnd","overscanLineLimit","ceil","cols","iterator","hasNext","next","_doLinkifyRow","range","first","content","debug","registerLinkMatcher","regex","matcher","id","matchIndex","validationCallback","hoverTooltipCallback","tooltipCallback","hoverLeaveCallback","leaveCallback","willLinkActivate","priority","_addLinkMatcherToList","splice","deregisterLinkMatcher","matcherId","rowIndex","match","rex","RegExp","source","flags","stringIndex","uri","indexOf","lastIndex","bufferIndex","stringIndexToBufferIndex","line","get","attr","getFg","isValid","_addLink","exec","x","y","getStringCellWidth","x1","y1","floor","x2","y2","MouseZone","newWindow","open","opener","location","href","fire","_createLinkHoverEvent","remove","IBufferService","ILogService","IUnicodeService","clickCallback","hoverCallback","_linkProviders","_linkCacheDisposables","_isMouseOut","_activeLine","getDisposeArrayDisposable","_currentLink","registerLinkProvider","linkProvider","providerIndex","mouseService","renderService","_mouseService","_clearCurrentLink","_onMouseMove","_handleMouseDown","_handleMouseUp","_lastMouseEvent","_positionFromMouseEvent","composedPath","contains","_lastBufferCell","_onHover","_askForLink","_linkAtPosition","link","useLineCache","_activeProviderReplies","forEach","reply","linkWithState","Map","linkProvided","_checkLinkProviderResult","provideLinks","links","linksWithState","set","size","_removeIntersectingLinks","entries","replies","occupiedCells","Set","providerReply","startX","endX","has","index","hasLinkBefore","j","linkAtPosition","find","_handleNewLink","currentLink","_mouseDownLink","activate","startRow","endRow","_linkLeave","disposeArray","state","decorations","underline","pointerCursor","isHovered","_linkHover","defineProperties","toggle","_fireUnderlineEvent","onRenderedViewportChange","hover","showEvent","scrollOffset","_createLinkUnderlineEvent","leave","sameLine","wrappedFromLeft","wrappedToRight","coords","getCoords","Linkifier2","promptLabel","_screenElement","_selectionService","_optionsService","_zones","_areZonesActive","_lastHoverCoords","_initialSelectionLength","_onMouseDown","_mouseMoveListener","_mouseLeaveListener","_onMouseLeave","_clickListener","_onClick","_deactivate","zone","_activate","_currentZone","pageX","pageY","_findZoneEventAt","_tooltipTimeout","_onTooltip","rawOptions","linkTooltipHoverDuration","_getSelectionLength","currentSelectionLength","IMouseService","ISelectionService","IOptionsService","MouseZoneManager","_renderCallback","_refreshCallbacks","_animationFrame","cancelAnimationFrame","addRefreshCallback","callback","requestAnimationFrame","_innerRefresh","rowStart","rowEnd","rowCount","_rowCount","_rowStart","_rowEnd","_runRefreshCallbacks","RenderDebouncer","_currentDevicePixelRatio","devicePixelRatio","listener","_listener","clearListener","_outerListener","_updateDpr","_resolutionMediaMatchList","removeListener","matchMedia","addListener","browser","Browser","_keyDownHandled","_keyDownSeen","_keyPressHandled","_unprocessedDeadKey","_onCursorMove","_onRender","_onSelectionChange","_onTitleChange","_onBell","_onFocus","_onBlur","_onA11yCharEmitter","_onA11yTabEmitter","_setup","linkifier","_instantiationService","createInstance","linkifier2","_decorationService","DecorationService","setService","IDecorationService","_inputHandler","onRequestBell","bell","onRequestRefreshRows","onRequestSendFocus","_reportFocus","onRequestReset","reset","onRequestWindowsOptionsReport","_reportWindowsOptions","onColor","_handleColorEvent","forwardEvent","onCursorMove","onTitleChange","_afterResize","_colorManager","req","acc","ident","toColorRGB","C0","ESC","toRgbString","C1_ESCAPED","ST","setColors","viewport","onThemeChange","_isDisposed","_customKeyEventHandler","write","buffers","active","preventScroll","_updateOptions","_charSizeService","measure","setRenderer","_createRenderer","syncScrollArea","optionsService","screenReaderMode","_accessibilityManager","setupTabStops","_setTheme","_onTextAreaFocus","sendFocus","updateCursorStyle","_showCursor","blur","_onTextAreaBlur","_syncTextArea","isCursorInViewport","_compositionHelper","isComposing","cursorY","ybase","bufferLine","cursorX","cellHeight","getWidth","cellWidth","actualCellWidth","cursorTop","cursorLeft","lineHeight","_initGlobal","_bindKeys","hasSelection","copyHandler","pasteHandlerWrapper","handlePasteEvent","isFirefox","button","rightClickHandler","rightClickSelectsWord","isLinux","_keyUp","_keyDown","_keyPress","compositionstart","compositionupdate","compositionend","_inputEvent","updateCompositionElements","_queueLinkification","parent","isConnected","_document","ownerDocument","dir","fragment","createDocumentFragment","_viewportElement","_viewportScrollArea","_helperContainer","coreBrowserService","CoreBrowserService","ICoreBrowserService","CharSizeService","ICharSizeService","_theme","onOptionChange","_characterJoinerService","CharacterJoinerService","ICharacterJoinerService","renderer","RenderService","IRenderService","resize","_compositionView","CompositionHelper","_soundService","SoundService","ISoundService","MouseService","Viewport","amount","onRequestSyncScrollBar","onFocus","SelectionService","onRequestScrollLines","suppressScrollEvent","onSelectionChange","onRequestRedraw","onSelectionChanged","columnSelectMode","onLinuxMouseSelection","_onScroll","BufferDecorationRenderer","onMouseDown","coreMouseService","areMouseEventsActive","disable","enable","overviewRulerWidth","_overviewRulerRenderer","OverviewRulerRenderer","bindMouse","rendererType","Renderer","DomRenderer","el","sendEvent","but","action","getRawByteCoords","overrideType","buttons","getLinesScrolled","deltaY","triggerMouseEvent","col","row","ctrl","ctrlKey","alt","altKey","shiftKey","requestedEvents","mouseup","wheel","mousedrag","mousemove","eventListeners","cancel","onProtocolChange","events","logLevel","explainEvents","passive","activeProtocol","shouldForceSelection","hasScrollback","sequence","applicationCursorKeys","abs","onWheel","onTouchStart","onTouchMove","refreshRows","shouldColumnSelect","isCursorInitialized","disp","attachCustomKeyEventHandler","customKeyEventHandler","registerCharacterJoiner","joinerId","deregisterCharacterJoiner","deregister","markers","addMarker","cursorYOffset","normal","registerDecoration","decorationOptions","column","setSelection","getSelection","getSelectionPosition","startColumn","selectionStart","endColumn","selectionEnd","clearSelection","selectAll","selectLines","shouldIgnoreComposition","macOptionIsMeta","keydown","scrollToBottom","result","evaluateKeyboardEvent","scrollCount","_isThirdLevelShift","metaKey","charCodeAt","ETX","CR","domEvent","thirdLevelKey","isWindows","getModifierState","keyCode","wasModifierKeyOnlyEvent","charCode","which","String","fromCharCode","inputType","composed","_soundBell","playBellSound","hasValidSize","clearAllMarkers","getBlankLine","DEFAULT_ATTR_DATA","clearTextureAtlas","WindowsOptionsReportType","GET_WIN_SIZE_PIXELS","canvasWidth","scaledCanvasWidth","toFixed","canvasHeight","scaledCanvasHeight","GET_CELL_SIZE_PIXELS","scaledCellWidth","scaledCellHeight","force","cancelEvents","_visualBell","bellStyle","CoreTerminal","Terminal","_debounceThresholdMS","_lastRefreshMs","_additionalRefreshRequested","_refreshTimeoutID","refreshRequestTime","Date","now","elapsed","waitPeriodBeforeTrailingRefresh","_scrollLines","_scrollArea","scrollBarWidth","_currentRowHeight","_currentScaledCellHeight","_lastRecordedBufferLength","_lastRecordedViewportHeight","_lastRecordedBufferHeight","_lastTouchY","_lastScrollTop","_wheelPartialScroll","_refreshAnimationFrame","_ignoreNextScrollEvent","offsetWidth","_activeBuffer","onBufferActivate","activeBuffer","_renderDimensions","backgroundColor","_refresh","immediate","offsetHeight","newBufferHeight","scrollTop","offsetParent","diff","_bubbleScroll","scrollPosFromTop","cancelable","_getPixelsScrolled","_applyScrollModifier","deltaMode","WheelEvent","DOM_DELTA_LINE","DOM_DELTA_PAGE","DOM_DELTA_PIXEL","modifier","fastScrollModifier","fastScrollSensitivity","scrollSensitivity","touches","_decorationElements","_altBufferIsActive","_dimensionsChanged","_container","_queueRefresh","onDecorationRegistered","onDecorationRemoved","decoration","_removeDecoration","refreshDecorations","_renderDecoration","_refreshStyle","_refreshXPosition","_createElement","marker","display","onRenderEmitter","onDispose","anchor","right","delete","_zonePool","_zonePoolIndex","_linePadding","full","center","addDecoration","overviewRulerOptions","z","_lineIntersectsZone","_lineAdjacentToZone","_addLineToZone","startBufferLine","endBufferLine","setPadding","padding","ColorZoneStore","drawHeight","drawWidth","drawX","_colorZoneStore","_shouldUpdateDimensions","_shouldUpdateAnchor","_lastKnownBufferLength","_canvas","_refreshCanvasDimensions","insertBefore","_registerDecorationListeners","_registerBufferChangeListeners","_registerDimensionChangeListeners","_refreshDrawHeightConstants","_refreshColorZonePadding","_containerHeight","clientHeight","o","_refreshDrawConstants","outerWidth","innerWidth","pixelsPerLine","nonFullHeight","_width","_refreshDecorations","clearRect","lineWidth","zones","_renderColorZone","updateCanvasDimensions","updateAnchor","_textarea","_coreService","_isComposing","_isSendingComposition","_compositionPosition","_dataAlreadySent","_finalizeComposition","_handleAnyTextareaChanges","waitForPropagation","input","oldValue","dontRecurse","fontFamily","fontSize","compositionViewBounds","ICoreService","getCoordsRelativeToElement","rect","elementStyle","getComputedStyle","leftPadding","parseInt","getPropertyValue","topPadding","colCount","hasValidCharSize","isSelection","moveToRequestedRow","startY","targetY","bufferService","applicationCursor","wrappedRowsForRow","rowsToMove","wrappedRows","direction","verticalDirection","isWrapped","wrappedRowsCount","repeat","currentRow","lineWraps","startCol","endCol","forward","currentCol","bufferStr","mod","count","str","rpt","targetX","resetStartingRow","horizontalDirection","moveToRequestedCol","rowDifference","currX","colsFromRowEnd","CONSTRUCTOR_ONLY_OPTIONS","_core","_addonManager","AddonManager","_publicOptions","getter","propName","setter","_checkReadonlyOptions","desc","defineProperty","includes","_checkProposedApi","allowProposedApi","onBell","onBinary","onData","onWriteParsed","_parser","ParserApi","UnicodeApi","_buffer","BufferNamespaceApi","m","mouseTrackingMode","applicationCursorKeysMode","applicationKeypadMode","applicationKeypad","insertMode","modes","originMode","origin","reverseWraparoundMode","reverseWraparound","sendFocusMode","wraparoundMode","wraparound","columns","_verifyIntegers","registerMarker","_verifyPositiveIntegers","scrollPages","pageCount","scrollToTop","scrollToLine","writeUtf8","writeln","getOption","setOption","loadAddon","addon","values","Infinity","isNaN","_alpha","_colors","_rendererId","_scaledCharWidth","_scaledCharHeight","_scaledCellWidth","_scaledCellHeight","_scaledCharLeft","_scaledCharTop","_columnSelectMode","_currentGlyphIdentifier","chars","code","bold","dim","italic","_initCanvas","_charAtlas","throwIfFalsy","_clearAll","onOptionsChanged","onGridChanged","_selectionStart","_selectionEnd","colorSet","_refreshCharAtlas","_setTransparency","oldCanvas","cloneNode","replaceChild","acquireCharAtlas","warmUp","scaledCharWidth","scaledCharHeight","scaledCharLeft","scaledCharTop","_fillCells","_fillMiddleLineAtCells","cellOffset","_fillBottomLineAtCells","_fillLeftLineAtCell","_strokeRectAtCell","strokeRect","_clearCells","_fillCharTrueColor","cell","font","_getFont","textBaseline","TEXT_BASELINE","_clipRow","drawSuccess","customGlyphs","tryDrawCustomChar","getChars","fillText","_drawChars","contrastColor","_getContrastColor","isFgRGB","isBgRGB","_drawUncachedChars","isInverse","isBgDefault","INVERTED_DEFAULT_COLOR","getBgColor","isFgDefault","getFgColor","DEFAULT_COLOR","drawBoldTextInBrightColors","isBold","WHITESPACE_CELL_CHAR","getCode","WHITESPACE_CELL_CODE","isDim","isItalic","hasOverrides","getDecorationsAtCell","d","backgroundColorRGB","foregroundColorRGB","draw","fgOverride","save","opaque","AttributeData","join","globalAlpha","DIM_OPACITY","restore","beginPath","clip","fontWeightBold","fontWeight","bgOverride","isTop","layer","_isCellInSelection","minimumContrastRatio","excludeFromContrastRatioDemands","adjustedColor","fgColor","fgColorMode","getFgColorMode","bgColor","bgColorMode","getBgColorMode","temp","temp2","bgRgba","_resolveBackgroundRgba","fgRgba","_resolveForegroundRgba","ensureContrastRatio","inverse","BaseRenderLayer","BLINK_INTERVAL","container","rendererId","_onRequestRedraw","_coreBrowserService","decorationService","_cell","CellData","_state","isFocused","_cursorRenderers","_renderBarCursor","_renderBlockCursor","_renderUnderlineCursor","_cursorBlinkStateManager","_clearCursor","restartBlinkAnimation","pause","resume","cursorBlink","CursorBlinkStateManager","_render","isPaused","triggeredByAnimationFrame","isCursorHidden","viewportRelativeCursorY","loadCell","cursorStyle","_renderBlurCursor","isCursorVisible","cursorWidth","strokeStyle","CursorRenderLayer","_restartInterval","_blinkStartTimeout","_blinkInterval","clearInterval","_animationTimeRestarted","timeToStart","time","setInterval","blockElementDefinitions","w","h","patternCharacterDefinitions","boxDrawingDefinitions","xp","yp","powerlineDefinitions","horizontalPadding","xOffset","yOffset","blockElementDefinition","charDefinition","box","xEighth","yEighth","drawBlockElementChar","patternDefinition","patternSet","cachedPatterns","pattern","tmpCanvas","tmpCtx","imageData","ImageData","startsWith","parseFloat","putImageData","createPattern","drawPatternChar","boxDrawingDefinition","instructions","actualInstructions","instruction","f","svgToCanvasInstructionMap","args","translateArgs","error","stroke","closePath","drawBoxDrawingChar","powerlineDefinition","fill","drawPowerlineChar","clamp","bezierCurveTo","lineTo","moveTo","cache","GridCache","onShowLinkUnderline","onHideLinkUnderline","middleRowCount","is256Color","LinkRenderLayer","nextRendererId","instantiationService","_id","_renderLayers","TextRenderLayer","SelectionRenderLayer","_devicePixelRatio","_updateDimensions","removeTerminalFromCache","onDevicePixelRatioChange","l","onCharSizeChanged","_runOperation","operation","renderRows","letterSpacing","IInstantiationService","isPowerlineGlyph","codepoint","isBoxOrBlockGlyph","_clearState","_didStateChange","viewportStartRow","viewportEndRow","viewportCappedStartRow","viewportCappedEndRow","startRowEndCol","middleRowsCount","_areCoordinatesEqual","coord1","coord2","_characterWidth","_characterFont","_characterOverlapCache","_workCell","terminalFont","_forEachCell","firstRow","lastRow","joinedRanges","getJoinedCharacters","isJoined","lastCharX","JoinedCellData","translateToString","_isOverlapping","getCodePoint","NULL_CELL_CODE","_drawBackground","prevFillStyle","nextFillStyle","isBgPalette","_drawForeground","isInvisible","isUnderline","isStrikethrough","beginFrame","hasOwnProperty","overlaps","measureText","_didWarmUp","_doWarmUp","BaseCharAtlas","charAtlasCache","newConfig","generateConfig","ownedByIndex","entry","ownedBy","configEquals","config","atlas","newEntry","DynamicCharAtlas","clonedColors","colorCode","isLegacyEdge","CHAR_ATLAS_CELL_SPACING","TEXTURE_WIDTH","TEXTURE_HEIGHT","TRANSPARENT_COLOR","getGlyphCacheKey","glyph","_config","_drawToCacheCount","_glyphsWaitingOnBitmap","_bitmapCommitTimeout","_bitmap","_cacheCanvas","_cacheCtx","_tmpCtx","_height","capacity","_cacheMap","LRUMap","prealloc","_canCache","glyphKey","cacheValue","_drawFromCache","peek","_drawToCache","_toCoordinateX","_toCoordinateY","isEmpty","cacheX","cacheY","drawImage","inBitmap","_getColorFromAnsiIndex","idx","_getBackgroundColor","_getForegroundColor","fontStyle","clearColor","offset","_addGlyphToBitmap","isSafari","_generateBitmap","glyphsMovingToBitmap","createImageBitmap","then","bitmap","NoneCharAtlas","_map","_head","_tail","_nodePool","_unlinkNode","prev","_appendNode","tail","nodePool","peekValue","head","TERMINAL_CLASS_PREFIX","FG_CLASS_PREFIX","BG_CLASS_PREFIX","FOCUS_CLASS","nextTerminalId","_linkifier","_linkifier2","_terminalClass","_refreshRowElements","_selectionContainer","_injectCss","_rowFactory","DomRendererRowFactory","_onLinkHover","_onLinkLeave","_themeStyleElement","_dimensionsStyleElement","overflow","styles","_terminalSelector","BOLD_CLASS","ITALIC_CLASS","CURSOR_CLASS","CURSOR_STYLE_BLOCK_CLASS","CURSOR_BLINK_CLASS","CURSOR_STYLE_BAR_CLASS","CURSOR_STYLE_UNDERLINE_CLASS","documentFragment","isXFlipped","_createSelectionElement","colStart","colEnd","cursorAbsoluteY","rowElement","createRow","_setCellUnderline","enabled","span","textDecoration","DIM_CLASS","UNDERLINE_CLASS","STRIKETHROUGH_CLASS","isCursorRow","lineLength","charElement","isInSelection","resolvedBg","_addStyle","padStart","_applyMinimumContrast","padChar","isSelectAllActive","selectionStartLength","areSelectionValuesReversed","startPlusLength","onTrim","SelectionModel","_onCharSizeChange","_measureStrategy","DomMeasureStrategy","_parentElement","_result","_measureElement","geometry","firstCell","combinedData","isCombined","setFromCharData","getAsCharData","_characterJoiners","_nextCharacterJoinerId","joiner","ranges","lineStr","rangeStartColumn","currentStringIndex","rangeStartStringIndex","rangeAttrFG","rangeAttrBG","getBg","getTrimmedLength","_getJoinedRanges","startIndex","endIndex","allJoinedRanges","joinerRanges","_mergeRanges","_stringRangesToCellRanges","currentRangeIndex","currentRangeStarted","currentRange","getString","newRange","inRange","getRootNode","activeElement","hasFocus","_renderer","_isPaused","_needsFullRefresh","_isNextRenderRedrawOnly","_needsSelectionRefresh","_canvasWidth","_canvasHeight","_selectionState","_onDimensionsChange","_onRenderedViewportChange","_onRefreshRequest","_renderDebouncer","_fullRefresh","_handleOptionsChanged","onCharSizeChange","IntersectionObserver","_onIntersectionChange","threshold","observe","disconnect","isIntersecting","intersectionRatio","isRedrawOnly","_fireOnCanvasResize","NON_BREAKING_SPACE_CHAR","ALL_NON_BREAKING_SPACE_REGEX","_dragScrollAmount","_enabled","_mouseDownTimeStamp","_oldHasSelection","_oldSelectionStart","_oldSelectionEnd","_onLinuxMouseSelection","_onRedrawRequest","_onRequestScrollLines","_mouseUpListener","_onMouseUp","onUserInput","_trimListener","_onTrim","_onBufferActivate","_model","_activeSelectionMode","_removeMouseDownListeners","finalSelectionStart","finalSelectionEnd","lineText","isLinuxMouseSelection","_isClickInSelection","_getMouseBufferCoords","_areCoordsInSelection","isCellInSelection","_selectWordAtCursor","allowWhitespaceOnlySelection","getRangeLength","_selectWordAt","_getMouseEventScrollAmount","terminalHeight","macOptionClickForcesSelection","timeStamp","_onIncrementalClick","detail","_onSingleClick","_onDoubleClick","_onTripleClick","_addMouseDownListeners","_dragScrollIntervalTimer","_dragScroll","hasWidth","_selectLineAt","previousSelectionEnd","_selectToWordAt","timeElapsed","coordinates","moveToCellSequence","_fireEventIfSelectionChanged","_fireOnSelectionChange","_convertViewportColToCharacterIndex","charIndex","_getWordAt","followWrappedLinesAbove","followWrappedLinesBelow","charOffset","leftWideCharCount","rightWideCharCount","leftLongCharOffset","rightLongCharOffset","charAt","_isCharWordSeparator","trim","previousBufferLine","previousLineWordPosition","nextBufferLine","nextLineWordPosition","wordPosition","wordSeparator","wrappedRange","getWrappedRangeForLine","last","createDecorator","_audioContext","audioContextCtor","AudioContext","webkitAudioContext","audioContext","bellAudioSource","createBufferSource","decodeAudioData","_base64ToArrayBuffer","_removeMimeType","bellSound","connect","destination","base64","binaryString","atob","len","bytes","Uint8Array","dataURI","_maxLength","onDeleteEmitter","onInsertEmitter","onTrimEmitter","_array","Array","_startIndex","_length","newMaxLength","newArray","_getCyclicIndex","newLength","recycle","deleteCount","items","countToTrim","trimStart","shiftElements","expandListBy","CircularList","clone","val","depth","clonedObject","isArray","rgb","toPaddedHex","s","contrastRatio","l1","l2","fgR","fgG","fgB","bgR","bgG","bgB","ratio","rgbaColor","toChannels","rgbaMatch","relativeLuminance2","rs","gs","bs","pow","relativeLuminance","reduceLuminance","cr","increaseLuminance","bgL","fgL","resultB","resultA","resultARatio","hasWriteSyncWarnHappened","_onBinary","_onData","_onLineFeed","_onWriteParsed","InstantiationService","OptionsService","BufferService","LogService","CoreService","CoreMouseService","ICoreMouseService","_dirtyRowService","DirtyRowService","IDirtyRowService","unicodeService","UnicodeService","_charsetService","CharsetService","ICharsetService","InputHandler","markRangeDirty","scrollBottom","_writeBuffer","WriteBuffer","promiseResult","parse","_onScrollApi","_windowsMode","writeSync","maxSubsequentCalls","LogLevelEnum","WARN","MINIMUM_COLS","MINIMUM_ROWS","scroll","eraseAttr","registerEscHandler","registerDcsHandler","registerCsiHandler","registerOscHandler","windowsMode","_enableWindowsMode","updateWindowsModeWrappedState","final","_listeners","_disposed","_event","arg1","arg2","queue","call","from","to","GLEVEL","MAX_PARSEBUFFER_LENGTH","paramToWindowOption","n","opts","setWinLines","restoreWin","minimizeWin","setWinPosition","setWinSizePixels","raiseWin","lowerWin","refreshWin","setWinSizeChars","maximizeWin","fullscreenWin","getWinState","getWinPosition","getWinSizePixels","getScreenSizePixels","getCellSizePixels","getWinSizeChars","getScreenSizeChars","getIconTitle","getWinTitle","pushTitle","popTitle","_data","Uint32Array","hook","params","put","concat","subarray","unhook","success","utf32ToString","pt","_coreMouseService","EscapeSequenceParser","_parseBuffer","_stringDecoder","StringToUtf32","_utf8Decoder","Utf8ToUtf32","_windowTitle","_iconName","_windowTitleStack","_iconNameStack","_curAttrData","_eraseAttrDataInternal","_onRequestBell","_onRequestRefreshRows","_onRequestReset","_onRequestSendFocus","_onRequestSyncScrollBar","_onRequestWindowsOptionsReport","_onA11yChar","_onA11yTab","_onColor","_parseStack","paused","cursorStartX","cursorStartY","decodedLength","_specialColors","setCsiHandlerFallback","identifier","identToString","toArray","setEscHandlerFallback","setExecuteHandlerFallback","setOscHandlerFallback","setDcsHandlerFallback","payload","setPrintHandler","print","insertChars","intermediates","scrollLeft","cursorUp","scrollRight","cursorDown","cursorForward","cursorBackward","cursorNextLine","cursorPrecedingLine","cursorCharAbsolute","cursorPosition","cursorForwardTab","eraseInDisplay","prefix","eraseInLine","insertLines","deleteLines","deleteChars","scrollUp","scrollDown","eraseChars","cursorBackwardTab","charPosAbsolute","hPositionRelative","repeatPrecedingCharacter","sendDeviceAttributesPrimary","sendDeviceAttributesSecondary","linePosAbsolute","vPositionRelative","hVPosition","tabClear","setMode","setModePrivate","resetMode","resetModePrivate","charAttributes","deviceStatus","deviceStatusPrivate","softReset","setCursorStyle","setScrollRegion","saveCursor","windowOptions","restoreCursor","insertColumns","deleteColumns","setExecuteHandler","BEL","LF","lineFeed","VT","FF","carriageReturn","BS","backspace","HT","tab","SO","shiftOut","SI","shiftIn","C1","IND","NEL","nextLine","HTS","tabSet","OscHandler","setTitle","setIconName","setOrReportIndexedColor","setOrReportFgColor","setOrReportBgColor","setOrReportCursorColor","restoreIndexedColor","restoreFgColor","restoreBgColor","restoreCursorColor","reverseIndex","keypadApplicationMode","keypadNumericMode","fullReset","setgLevel","selectDefaultCharset","flag","selectCharset","CHARSETS","screenAlignmentPattern","setErrorHandler","DECRQSS","_preserveStack","_logSlowResolvingAsync","p","Promise","race","res","rej","catch","err","wasPaused","DEBUG","prototype","clearRange","decode","chWidth","charset","curAttr","bufferRow","markDirty","setCellFromCodePoint","extended","wcwidth","ch","stringFromCodePoint","_eraseAttrData","insertCells","getNullCell","NULL_CELL_WIDTH","addCodepointToCell","precedingCodepoint","hasContent","DcsHandler","convertEol","_restrictCursor","originalX","nextStop","maxCol","_setCursor","_moveCursor","diffToTop","diffToBottom","param","tabs","prevStop","_eraseInBufferLine","clearWrap","replaceCells","_resetBufferLine","clearMarkers","scrollBackSize","scrollBottomRowsOffset","scrollBottomAbsolute","deleteCells","_is","term","termName","setgCharset","DEFAULT_CHARSET","activeEncoding","activateAltBuffer","activateNormalBuffer","_updateAttrColor","mode","c1","c2","c3","fromColorRGB","_extractColor","accu","cSpace","advance","hasSubParams","subparams","getSubParams","underlineColor","_processUnderline","underlineStyle","updateExtended","savedX","savedY","savedCurAttrData","savedCharset","isBlinking","bottom","second","_savedCharset","slots","spec","parseColor","_setOrReportSpecialColor","collectAndFlag","scrollRegionHeight","level","markAllDirty","_disposables","unregister","disposables","array","isNode","navigator","userAgent","platform","test","isIpad","isIphone","_getKey","insert","_search","getKeyIterator","mid","SortedList","fillFallback","constructor","lastChar","CHAR_DATA_CODE_INDEX","ExtendedAttrs","newObj","isBlink","isFgPalette","isAttributeDefault","hasExtendedAttrs","getUnderlineColor","getUnderlineColorMode","isUnderlineColorRGB","isUnderlineColorPalette","isUnderlineColorDefault","getUnderlineStyle","MAX_BUFFER_SIZE","_hasScrollback","_nullCell","fromCharData","NULL_CELL_CHAR","_whitespaceCell","WHITESPACE_CELL_WIDTH","_isClearing","_cols","_rows","_getCorrectBufferLength","getWhitespaceCell","BufferLine","maxLength","relativeY","correctBufferLength","scrollback","fillViewportRows","fillAttr","newCols","newRows","nullCell","addToY","amountToTrim","_isReflowEnabled","_reflow","_reflowLarger","_reflowSmaller","toRemove","reflowLargerGetLinesToRemove","newLayoutResult","reflowLargerCreateNewLayout","reflowLargerApplyNewLayout","layout","_reflowLargerAdjustViewport","countRemoved","viewportAdjustments","toInsert","countToInsert","wrappedLines","absoluteY","trimmedLines","lastLineLength","destLineLengths","reflowSmallerGetNewLineLengths","linesToAdd","newLines","newLine","destLineIndex","destCol","srcLineIndex","srcCol","cellsToCopy","copyCellsFrom","wrappedLinesIndex","getWrappedLineTrimmedLength","setCell","insertEvents","originalLines","originalLinesLength","originalLineIndex","nextToInsertIndex","nextToInsert","countInsertedSoFar","nextI","insertCountEmitted","lineIndex","trimRight","CHAR_DATA_WIDTH_INDEX","CHAR_DATA_CHAR_INDEX","tabStopWidth","Marker","onInsert","onDelete","_removeMarker","startOverscan","endOverscan","BufferStringIterator","Buffer","_trimRight","_endIndex","_startOverscan","_endOverscan","_current","fillCellData","_combined","_extendedAttrs","cp","CHAR_DATA_ATTR_INDEX","codePoint","eAttrs","keys","copyFrom","src","applyInReverse","srcData","srcCombinedKeys","bufferCols","endsInNull","followingLineStartsWithWide","oldCols","bufferAbsoluteY","srcTrimmedTineLength","srcRemainingCells","destRemainingCells","countToRemove","nextToRemoveIndex","nextToRemoveStart","countRemovedSoFar","newLayout","newLayoutLines","newLineLengths","cellsNeeded","reduce","srcLine","cellsAvailable","oldTrimmedLength","endsWithWide","_normal","_alt","inactiveBuffer","BufferSet","obj","combined","DEFAULT_ATTR","_nextId","isDisposed","_onDispose","C","NUL","SOH","STX","EOT","ENQ","ACK","DLE","DC1","DC2","DC3","DC4","NAK","SYN","ETB","CAN","EM","SUB","FS","GS","RS","US","SP","DEL","PAD","HOP","BPH","NBH","SSA","ESA","HTJ","VTS","PLD","PLU","RI","SS2","SS3","DCS","PU1","PU2","STS","CCH","MW","SPA","EPA","SOS","SGCI","SCI","CSI","OSC","PM","APC","KEYCODE_KEY_MAPPINGS","applicationCursorMode","modifiers","keyMapping","keyString","toUpperCase","toLowerCase","_interim","startPos","interim","byte1","byte2","byte3","byte4","discardInterim","tmp","missing","fourStop","table","BMP_COMBINING","HIGH_COMBINING","version","num","ucs","bisearch","UnicodeV6","qmt","queueMicrotask","cb","resolve","_action","_callbacks","_pendingData","_bufferOffset","_isSyncWriting","_syncCalls","chunk","_innerWrite","lastTime","startTime","RGB_REX","HASH_REX","pad","bits","s2","low","base","adv","PAYLOAD_LIMIT","EMPTY_HANDLERS","_handlers","create","_active","_ident","_handlerFb","_stack","loopPosition","fallThrough","registerHandler","handlerList","handlerIndex","clearHandler","setHandlerFallback","handlerResult","DcsParser","EMPTY_PARAMS","Params","addParam","_handler","_params","_hitLimit","ret","setDefault","addMany","codes","TransitionTable","NON_ASCII_PRINTABLE","VT500_TRANSITION_TABLE","blueprint","apply","unused","PRINTABLES","EXECUTABLES","states","_transitions","handlers","handlerPos","transition","chunkPos","initialState","currentState","_collect","_printHandlerFb","_executeHandlerFb","_csiHandlerFb","_escHandlerFb","_errorHandlerFb","_printHandler","_executeHandlers","_csiHandlers","_escHandlers","_oscParser","OscParser","_dcsParser","_errorHandler","_identifier","finalRange","intermediate","finalCode","reverse","clearPrintHandler","clearEscHandler","clearExecuteHandler","clearCsiHandler","clearDcsHandler","clearOscHandler","clearErrorHandler","collect","abort","addSubParam","addDigit","handlersEsc","jj","_start","_put","MAX_VALUE","maxSubParamsLength","Int32Array","_subParams","_subParamsLength","_subParamsIdx","Uint16Array","_rejectDigits","_rejectSubDigits","_digitIsSub","fromArray","k","newParams","getSubParamsAll","store","cur","_addons","instance","terminal","loadedAddon","_wrappedAddonDispose","init","getLine","BufferLineApiView","BufferApiView","_line","getCell","_onBufferChange","_alternate","alternate","addCsiHandler","addDcsHandler","addEscHandler","addOscHandler","provider","versions","activeVersion","isUserScrolling","_cachedBlankLine","topRow","bottomRow","willBufferBeTrimmed","isFull","oldYdisp","scrollAmount","glevel","_charsets","DEFAULT_PROTOCOLS","NONE","restrict","X10","VT200","DRAG","ANY","eventCode","isSGR","S","DEFAULT_ENCODINGS","DEFAULT","SGR","_protocols","_encodings","_activeProtocol","_activeEncoding","_onProtocolChange","_lastEvent","addProtocol","addEncoding","name","protocol","encoding","_compareEvents","report","triggerBinaryEvent","down","up","drag","move","e1","e2","DEFAULT_MODES","DEFAULT_DEC_PRIVATE_MODES","_onUserInput","_scrollToBottom","wasUserInput","disableStdin","_decorations","_onDecorationRegistered","_onDecorationRemoved","Decoration","getDecorationsAtLine","xmin","xmax","_cachedBg","_cachedFg","foregroundColor","_end","_entries","service","ServiceCollection","_services","getService","ctor","serviceDependencies","getServiceDependencies","sort","serviceArgs","dependency","firstServiceArgPos","optionsKeyToLogLevel","info","INFO","ERROR","off","OFF","_updateLogLevel","_evalLazyOptionalParams","optionalParams","_log","message","log","DEFAULT_BELL_SOUND","DEFAULT_OPTIONS","altClickMovesCursor","FONT_WEIGHT_OPTIONS","_onOptionChange","defaultOptions","newValue","_sanitizeAndValidateOption","_setupOptions","storeServiceDependency","serviceRegistry","decorator","arguments","_providers","_onChange","defaultProvider","_activeProvider","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","__webpack_modules__"],"sourceRoot":""} |