quitando basura del index
[VSoRC/.git] / node_modules / xterm / lib / xterm.js.map
diff --git a/node_modules/xterm/lib/xterm.js.map b/node_modules/xterm/lib/xterm.js.map
deleted file mode 100644 (file)
index 9afd254..0000000
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"sources":["webpack:///webpack/universalModuleDefinition","webpack:///webpack/bootstrap","webpack:///./src/common/services/Services.ts","webpack:///./src/common/EventEmitter.ts","webpack:///./src/common/Lifecycle.ts","webpack:///./src/common/buffer/Constants.ts","webpack:///./src/common/buffer/CellData.ts","webpack:///./src/browser/services/Services.ts","webpack:///./src/common/buffer/AttributeData.ts","webpack:///./src/browser/Lifecycle.ts","webpack:///./src/common/input/TextDecoder.ts","webpack:///./src/browser/renderer/atlas/Constants.ts","webpack:///./src/common/Platform.ts","webpack:///./src/common/data/EscapeSequences.ts","webpack:///./src/browser/renderer/BaseRenderLayer.ts","webpack:///./src/common/services/ServiceRegistry.ts","webpack:///./src/common/TypedArrayUtils.ts","webpack:///./src/common/buffer/BufferLine.ts","webpack:///./src/browser/LocalizableStrings.ts","webpack:///./src/common/data/Charsets.ts","webpack:///./src/common/CharWidth.ts","webpack:///./src/common/parser/Params.ts","webpack:///./src/common/parser/OscParser.ts","webpack:///./src/common/parser/Constants.ts","webpack:///./src/common/parser/DcsParser.ts","webpack:///./src/browser/renderer/atlas/CharAtlasCache.ts","webpack:///./src/browser/renderer/atlas/CharAtlasUtils.ts","webpack:///./src/browser/ColorManager.ts","webpack:///./src/browser/renderer/RendererUtils.ts","webpack:///./src/browser/renderer/CharacterJoinerRegistry.ts","webpack:///./src/browser/input/Mouse.ts","webpack:///./src/browser/RenderDebouncer.ts","webpack:///./src/browser/ScreenDprMonitor.ts","webpack:///./src/common/Clone.ts","webpack:///./src/public/Terminal.ts","webpack:///./src/Terminal.ts","webpack:///./src/browser/input/CompositionHelper.ts","webpack:///./src/browser/Viewport.ts","webpack:///./src/browser/Clipboard.ts","webpack:///./src/InputHandler.ts","webpack:///./src/common/parser/EscapeSequenceParser.ts","webpack:///./src/renderer/Renderer.ts","webpack:///./src/browser/renderer/TextRenderLayer.ts","webpack:///./src/browser/renderer/GridCache.ts","webpack:///./src/browser/renderer/atlas/DynamicCharAtlas.ts","webpack:///./src/browser/renderer/atlas/BaseCharAtlas.ts","webpack:///./src/browser/renderer/atlas/LRUMap.ts","webpack:///./src/browser/renderer/SelectionRenderLayer.ts","webpack:///./src/renderer/CursorRenderLayer.ts","webpack:///./src/browser/renderer/LinkRenderLayer.ts","webpack:///./src/browser/Linkifier.ts","webpack:///./src/browser/services/SelectionService.ts","webpack:///./src/browser/selection/SelectionModel.ts","webpack:///./src/browser/input/MoveToCell.ts","webpack:///./src/browser/services/SoundService.ts","webpack:///./src/browser/MouseZoneManager.ts","webpack:///./src/AccessibilityManager.ts","webpack:///./src/renderer/dom/DomRenderer.ts","webpack:///./src/browser/renderer/dom/DomRendererRowFactory.ts","webpack:///./src/common/input/Keyboard.ts","webpack:///./src/WindowsMode.ts","webpack:///./src/browser/services/RenderService.ts","webpack:///./src/common/services/OptionsService.ts","webpack:///./src/browser/services/CharSizeService.ts","webpack:///./src/common/services/BufferService.ts","webpack:///./src/common/buffer/BufferSet.ts","webpack:///./src/common/buffer/Buffer.ts","webpack:///./src/common/CircularList.ts","webpack:///./src/common/buffer/BufferReflow.ts","webpack:///./src/common/buffer/Marker.ts","webpack:///./src/browser/services/MouseService.ts","webpack:///./src/common/services/CoreService.ts","webpack:///./src/common/services/LogService.ts","webpack:///./src/common/services/DirtyRowService.ts","webpack:///./src/common/services/InstantiationService.ts","webpack:///./src/common/services/CoreMouseService.ts","webpack:///./src/common/input/WriteBuffer.ts","webpack:///./src/public/AddonManager.ts"],"names":["root","factory","exports","module","define","amd","a","i","window","installedModules","__webpack_require__","moduleId","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","IBufferService","createDecorator","ICoreMouseService","ICoreService","IDirtyRowService","IInstantiationService","ILogService","IOptionsService","_listeners","this","_event","listener","push","dispose","length","splice","fire","data","queue","undefined","EventEmitter","_disposables","_isDisposed","forEach","register","unregister","index","indexOf","Disposable","DEFAULT_COLOR","DEFAULT_ATTR","CHAR_DATA_ATTR_INDEX","CHAR_DATA_CHAR_INDEX","CHAR_DATA_WIDTH_INDEX","CHAR_DATA_CODE_INDEX","NULL_CELL_CHAR","NULL_CELL_WIDTH","NULL_CELL_CODE","WHITESPACE_CELL_CHAR","WHITESPACE_CELL_WIDTH","WHITESPACE_CELL_CODE","content","fg","bg","combinedData","fromCharData","obj","CellData","setFromCharData","isCombined","getWidth","getChars","stringFromCodePoint","getCode","charCodeAt","combined","code","second","getAsCharData","AttributeData","ICharSizeService","IMouseService","IRenderService","ISelectionService","ISoundService","toColorRGB","fromColorRGB","clone","newObj","isInverse","isBold","isUnderline","isBlink","isInvisible","isItalic","isDim","getFgColorMode","getBgColorMode","isFgRGB","isBgRGB","isFgPalette","isBgPalette","isFgDefault","isBgDefault","getFgColor","getBgColor","node","type","handler","useCapture","addEventListener","removeEventListener","codePoint","String","fromCharCode","start","end","result","codepoint","_interim","clear","decode","input","target","size","startPos","StringToUtf32","interim","Uint8Array","fill","byte1","byte2","byte3","byte4","discardInterim","cp","pos","tmp","missing","fourStop","Utf8ToUtf32","INVERTED_DEFAULT_COLOR","DIM_OPACITY","CHAR_ATLAS_CELL_SPACING","isNode","navigator","userAgent","platform","contains","arr","el","isFirefox","isSafari","test","isMac","isIpad","isIphone","isWindows","isLinux","C0","NUL","SOH","STX","ETX","EOT","ENQ","ACK","BEL","BS","HT","LF","VT","FF","CR","SO","SI","DLE","DC1","DC2","DC3","DC4","NAK","SYN","ETB","CAN","EM","SUB","ESC","FS","GS","RS","US","SP","DEL","C1","PAD","HOP","BPH","NBH","IND","NEL","SSA","ESA","HTS","HTJ","VTS","PLD","PLU","RI","SS2","SS3","DCS","PU1","PU2","STS","CCH","MW","SPA","EPA","SOS","SGCI","SCI","CSI","ST","OSC","PM","APC","_container","id","zIndex","_alpha","_colors","_rendererId","_bufferService","_optionsService","_scaledCharWidth","_scaledCharHeight","_scaledCellWidth","_scaledCellHeight","_scaledCharLeft","_scaledCharTop","_currentGlyphIdentifier","chars","bold","dim","italic","_canvas","document","createElement","classList","add","style","toString","_initCanvas","appendChild","removeChild","_charAtlas","_ctx","throwIfFalsy","getContext","alpha","_clearAll","onOptionsChanged","onBlur","onFocus","onCursorMove","onGridChanged","startRow","endRow","onSelectionChanged","columnSelectMode","setColors","colorSet","_refreshCharAtlas","_setTransparency","oldCanvas","cloneNode","replaceChild","rows","acquireCharAtlas","options","warmUp","resize","scaledCellWidth","scaledCellHeight","scaledCharWidth","scaledCharHeight","scaledCharLeft","scaledCharTop","width","scaledCanvasWidth","height","scaledCanvasHeight","canvasWidth","canvasHeight","_fillCells","x","y","fillRect","_fillBottomLineAtCells","devicePixelRatio","_fillLeftLineAtCell","_strokeRectAtCell","lineWidth","strokeRect","clearRect","fillStyle","background","css","_clearCells","_fillCharTrueColor","cell","font","_getFont","textBaseline","_clipRow","fillText","_drawChars","_drawUncachedChars","drawBoldTextInBrightColors","draw","save","join","ansi","foreground","globalAlpha","restore","beginPath","rect","cols","clip","fontWeightBold","fontWeight","fontSize","fontFamily","BaseRenderLayer","DI_TARGET","DI_DEPENDENCIES","storeServiceDependency","serviceRegistry","Map","ctor","has","decorator","arguments","Error","set","fillFallback","array","b","constructor","CELL_SIZE","DEFAULT_ATTR_DATA","freeze","fillCellData","isWrapped","_combined","_data","Uint32Array","setCell","hasWidth","getFg","getBg","hasContent","getCodePoint","getString","loadCell","startIndex","setCellFromCodePoint","addCodepointToCell","insertCells","deleteCells","replaceCells","subarray","keys","parseInt","copyFrom","line","newLine","BufferLine","getTrimmedLength","copyCellsFrom","src","srcCol","destCol","applyInReverse","srcData","srcCombinedKeys","translateToString","trimRight","startCol","endCol","Math","min","promptLabel","tooMuchOutput","CHARSETS","DEFAULT_CHARSET","wcwidth","opts","COMBINING_BMP","COMBINING_HIGH","control","table","nul","num","ucs","mid","max","bisearch","MAX_SUBPARAMS","maxLength","maxSubParamsLength","params","Int32Array","_subParams","_subParamsLength","_subParamsIdx","Uint16Array","_rejectDigits","_rejectSubDigits","_digitIsSub","fromArray","values","Params","Array","k","addSubParam","addParam","newParams","toArray","res","slice","reset","hasSubParams","idx","getSubParams","getSubParamsAll","addDigit","store","cur","_state","_id","_handlers","_handlerFb","addHandler","ident","handlerList","handlerIndex","setHandler","clearHandler","setHandlerFallback","_start","handlers","j","_put","put","utf32ToString","_end","success","OscParser","_handler","_hitLimit","PAYLOAD_LIMIT","ret","OscHandler","EMPTY_HANDLERS","_active","_ident","unhook","hook","DcsParser","_params","DcsHandler","charAtlasCache","rendererId","colors","newConfig","generateConfig","ownedByIndex","entry","ownedBy","configEquals","config","atlas","newEntry","DynamicCharAtlas","clonedColors","cursor","cursorAccent","selection","allowTransparency","rgba","colorCode","DEFAULT_FOREGROUND","fromHex","DEFAULT_BACKGROUND","DEFAULT_CURSOR","DEFAULT_CURSOR_ACCENT","DEFAULT_SELECTION","toPaddedHex","DEFAULT_ANSI_COLORS","v","g","ch","canvas","ctx","globalCompositeOperation","_litmusColor","createLinearGradient","setTheme","theme","_parseColor","black","red","green","yellow","blue","magenta","cyan","white","brightBlack","brightRed","brightGreen","brightYellow","brightBlue","brightMagenta","brightCyan","brightWhite","fallback","console","warn","getImageData","ColorManager","firstCell","_width","JoinedCellData","_characterJoiners","_nextCharacterJoinerId","_workCell","registerCharacterJoiner","joiner","deregisterCharacterJoiner","joinerId","getJoinedCharacters","row","buffer","lines","ranges","lineStr","rangeStartColumn","currentStringIndex","rangeStartStringIndex","rangeAttrFG","rangeAttrBG","joinedRanges","_getJoinedRanges","endIndex","lineData","text","substring","joinerRanges","CharacterJoinerRegistry","_mergeRanges","_stringRangesToCellRanges","currentRangeIndex","currentRangeStarted","currentRange","newRange","inRange","range","getCoordsRelativeToElement","event","element","getBoundingClientRect","clientX","left","clientY","top","colCount","rowCount","hasValidCharSize","actualCellWidth","actualCellHeight","isSelection","coords","ceil","_renderCallback","_animationFrame","cancelAnimationFrame","refresh","rowStart","rowEnd","_rowCount","_rowStart","_rowEnd","requestAnimationFrame","_innerRefresh","RenderDebouncer","_currentDevicePixelRatio","setListener","_listener","clearListener","_outerListener","_updateDpr","_resolutionMediaMatchList","removeListener","matchMedia","addListener","ScreenDprMonitor","val","depth","clonedObject","isArray","_core","Terminal","_addonManager","AddonManager","onLineFeed","onSelectionChange","onData","onTitleChange","onScroll","onKey","onRender","onResize","_parser","ParserApi","textarea","BufferApiView","markers","blur","focus","columns","_verifyIntegers","open","parent","attachCustomKeyEventHandler","customKeyEventHandler","registerLinkMatcher","regex","deregisterLinkMatcher","matcherId","addMarker","cursorYOffset","hasSelection","select","column","getSelection","getSelectionPosition","clearSelection","selectAll","selectLines","scrollLines","amount","scrollPages","pageCount","scrollToTop","scrollToBottom","scrollToLine","write","callback","writeUtf8","writeln","paste","getOption","optionsService","setOption","loadAddon","addon","Strings","Infinity","isNaN","_buffer","ydisp","ybase","getLine","BufferLineApiView","_line","getCell","BufferCellApiView","startColumn","endColumn","_x","addCsiHandler","addDcsHandler","addEscHandler","addOscHandler","browser","Browser","mouseEvents","_keyDownHandled","_blankLine","_onCursorMove","_onData","_onKey","_onLineFeed","_onRender","_onResize","_onScroll","_onSelectionChange","_onTitleChange","_onFocus","_onBlur","onA11yCharEmitter","onA11yTabEmitter","_instantiationService","InstantiationService","OptionsService","setService","createInstance","BufferService","_logService","LogService","_coreService","CoreService","e","_coreMouseService","CoreMouseService","_dirtyRowService","DirtyRowService","_setupOptionsListeners","_setup","_writeBuffer","WriteBuffer","_inputHandler","parse","_windowsMode","_renderService","_customKeyEventHandler","parentNode","_parent","body","cursorState","cursorHidden","applicationKeypad","originMode","insertMode","wraparoundMode","bracketedPasteMode","charset","gcharset","glevel","charsets","curAttrData","_eraseAttrData","currentParam","_userScrolling","InputHandler","linkifier","Linkifier","windowsMode","applyWindowsMode","buffers","active","eraseAttrData","preventScroll","activeElement","hasFocus","onOptionChange","_charSizeService","measure","setRenderer","_createRenderer","viewport","syncScrollArea","screenReaderMode","_accessibilityManager","AccessibilityManager","setupTabStops","_setTheme","_onTextAreaFocus","ev","sendFocus","triggerDataEvent","updateCursorStyle","showCursor","_onTextAreaBlur","remove","_initGlobal","_bindKeys","addDisposableDomListener","copyHandler","_selectionService","pasteHandlerWrapper","handlePasteEvent","button","rightClickHandler","screenElement","rightClickSelectsWord","moveTextAreaUnderMouseCursor","_keyUp","_keyDown","_keyPress","_compositionHelper","compositionstart","compositionupdate","compositionend","updateCompositionElements","_queueLinkification","_document","ownerDocument","dir","setAttribute","fragment","createDocumentFragment","_viewportElement","_viewportScrollArea","_helperContainer","tabIndex","CharSizeService","_compositionView","CompositionHelper","_theme","_colorManager","renderer","RenderService","_soundService","SoundService","_mouseService","MouseService","Viewport","suppressEvent","onThemeChange","onDimensionsChange","SelectionService","onRedrawRequest","onLinuxMouseSelection","_mouseZoneManager","MouseZoneManager","clearAll","attachToDom","onMouseDown","disable","enable","bindMouse","rendererType","Renderer","DomRenderer","self","sendEvent","but","action","getRawByteCoords","overrideType","buttons","deltaY","triggerMouseEvent","col","ctrl","ctrlKey","alt","altKey","shift","shiftKey","requestedEvents","mouseup","wheel","mousedrag","mousemove","eventListeners","cancel","preventDefault","onProtocolChange","events","logLevel","debug","explainEvents","activeProtocol","shouldForceSelection","hasScrollback","getLinesScrolled","sequence","decPrivateModes","applicationCursorKeys","abs","onWheel","onTouchStart","onTouchMove","refreshRows","linkifyRows","shouldColumnSelect","scroll","eraseAttr","getBlankLine","topRow","scrollTop","bottomRow","scrollBottom","willBufferBeTrimmed","isFull","recycle","scrollRegionHeight","shiftElements","markRangeDirty","disp","suppressScrollEvent","oldYdisp","scrollAmount","normal","setSelection","selectionText","selectionStart","selectionEnd","keydown","evaluateKeyboardEvent","macOptionIsMeta","scrollCount","_isThirdLevelShift","domEvent","thirdLevelKey","metaKey","keyCode","setgLevel","setgCharset","wasModifierKeyOnlyEvent","charCode","which","bell","_soundBell","playBellSound","_visualBell","clearTimeout","_visualBellTimer","setTimeout","MINIMUM_COLS","MINIMUM_ROWS","hasValidSize","is","term","termName","handleTitle","title","inputHandler","userScrolling","force","cancelEvents","stopPropagation","bellStyle","writeSync","_textarea","_isComposing","_isSendingComposition","_compositionPosition","textContent","_finalizeComposition","_handleAnyTextareaChanges","waitForPropagation","_clearTextareaPosition","oldValue","diff","replace","dontRecurse","isCursorInViewport","cellHeight","lineHeight","cursorTop","cursorLeft","compositionViewBounds","FALLBACK_SCROLL_BAR_WIDTH","_scrollLines","_scrollArea","scrollBarWidth","_currentRowHeight","_lastRecordedBufferLength","_lastRecordedViewportHeight","_lastRecordedBufferHeight","_lastTouchY","_lastScrollTop","_wheelPartialScroll","_refreshAnimationFrame","_ignoreNextScrollEvent","offsetWidth","backgroundColor","_refresh","immediate","dimensions","offsetHeight","newBufferHeight","round","newScrollTop","offsetParent","_bubbleScroll","scrollPosFromTop","cancelable","_getPixelsScrolled","_applyScrollModifier","deltaMode","WheelEvent","DOM_DELTA_LINE","DOM_DELTA_PAGE","DOM_DELTA_PIXEL","floor","modifier","fastScrollModifier","fastScrollSensitivity","scrollSensitivity","touches","pageY","prepareTextForTerminal","bracketTextForPaste","coreService","position","selectionService","clipboardData","setData","getData","shouldSelectWord","isClickInSelection","selectWordAtCursor","GLEVEL","concat","pt","cursorStyle","cursorBlink","_terminal","EscapeSequenceParser","_parseBuffer","_stringDecoder","_utf8Decoder","setCsiHandlerFallback","identifier","identToString","setEscHandlerFallback","setExecuteHandlerFallback","setOscHandlerFallback","setDcsHandlerFallback","payload","setPrintHandler","print","setCsiHandler","final","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","restoreCursor","insertColumns","deleteColumns","setExecuteHandler","lineFeed","carriageReturn","backspace","tab","shiftOut","shiftIn","nextLine","tabSet","setOscHandler","setTitle","setEscHandler","reverseIndex","keypadApplicationMode","keypadNumericMode","selectDefaultCharset","flag","selectCharset","screenAlignmentPattern","setErrorHandler","state","error","setDcsHandler","DECRQSS","cursorStartX","cursorStartY","len","chWidth","curAttr","bufferRow","markDirty","getNullCell","precedingCodepoint","convertEol","_restrictCursor","originalX","nextStop","_setCursor","_moveCursor","diffToTop","diffToBottom","param","tabs","prevStop","_eraseInBufferLine","clearWrap","_resetBufferLine","scrollBackSize","trimStart","scrollBottomRowsOffset","scrollBottomAbsolute","savedCols","activeEncoding","activateAltBuffer","activateNormalBuffer","_extractColor","attr","accu","cSpace","advance","subparams","isBlinking","bottom","savedX","savedY","savedCurAttrData","savedCharset","_savedCharset","collectAndFlag","level","yOffset","markAllDirty","setDefault","next","addMany","codes","TransitionTable","VT500_TRANSITION_TABLE","blueprint","apply","map","unused","PRINTABLES","EXECUTABLES","states","TRANSITIONS","initialState","currentState","_collect","_printHandlerFb","_executeHandlerFb","_csiHandlerFb","_escHandlerFb","_errorHandlerFb","_printHandler","_executeHandlers","_csiHandlers","_escHandlers","_oscParser","_dcsParser","_errorHandler","_identifier","finalRange","intermediate","finalCode","reverse","clearPrintHandler","clearEscHandler","clearExecuteHandler","clearCsiHandler","clearDcsHandler","clearOscHandler","clearErrorHandler","transition","osc","dcs","collect","abort","handlersEsc","jj","nextRendererId","bufferService","_characterJoinerRegistry","_renderLayers","TextRenderLayer","SelectionRenderLayer","LinkRenderLayer","CursorRenderLayer","_devicePixelRatio","_updateDimensions","removeTerminalFromCache","onDevicePixelRatioChange","onCharSizeChanged","_runOperation","operation","renderRows","letterSpacing","container","characterJoinerRegistry","_characterWidth","_characterFont","_characterOverlapCache","GridCache","terminalFont","_forEachCell","firstRow","lastRow","joinerRegistry","isJoined","lastCharX","_isOverlapping","_drawBackground","startX","startY","prevFillStyle","nextFillStyle","_drawForeground","cache","beginFrame","overlaps","measureText","TEXTURE_WIDTH","TEXTURE_HEIGHT","TRANSPARENT_COLOR","getGlyphCacheKey","glyph","_config","_drawToCacheCount","_glyphsWaitingOnBitmap","_bitmapCommitTimeout","_bitmap","_cacheCanvas","_cacheCtx","tmpCanvas","_tmpCtx","_height","capacity","_cacheMap","LRUMap","prealloc","_canCache","glyphKey","cacheValue","_drawFromCache","peek","_drawToCache","_toCoordinateX","_toCoordinateY","isEmpty","cacheX","cacheY","drawImage","inBitmap","_getColorFromAnsiIndex","_getBackgroundColor","_getForegroundColor","fontStyle","imageData","color","offset","clearColor","putImageData","_addGlyphToBitmap","_generateBitmap","glyphsMovingToBitmap","createImageBitmap","then","bitmap","BaseCharAtlas","NoneCharAtlas","_didWarmUp","_doWarmUp","_map","_head","_tail","_nodePool","_unlinkNode","prev","_appendNode","tail","count","nodePool","peekValue","head","pop","_clearState","_didStateChange","viewportStartRow","viewportEndRow","viewportCappedStartRow","viewportCappedEndRow","startRowEndCol","middleRowsCount","_areCoordinatesEqual","coord1","coord2","_cell","isFocused","_cursorRenderers","_renderBarCursor","_renderBlockCursor","_renderUnderlineCursor","_clearCursor","_cursorBlinkStateManager","pause","resume","CursorBlinkStateManager","_render","restartBlinkAnimation","isPaused","triggeredByAnimationFrame","cursorY","viewportRelativeCursorY","_renderBlurCursor","isCursorVisible","strokeStyle","_restartInterval","_blinkStartTimeout","_blinkInterval","clearInterval","_animationTimeRestarted","Date","now","timeToStart","time","setInterval","onLinkHover","_onLinkHover","onLinkLeave","_onLinkLeave","_clearCurrentLink","x1","y1","middleRowCount","y2","x2","is256Color","_linkMatchers","_nextLinkMatcherId","_onLinkTooltip","_rowsToLinkify","mouseZoneManager","_element","_rowsTimeoutId","_linkifyRows","_timeBeforeLatency","absoluteRowIndexStart","absoluteRowIndexEnd","overscanLineLimit","iterator","hasNext","_doLinkifyRow","first","matcher","matchIndex","validationCallback","hoverTooltipCallback","tooltipCallback","hoverLeaveCallback","leaveCallback","willLinkActivate","priority","_addLinkMatcherToList","rowIndex","match","rex","RegExp","source","flags","stringIndex","uri","lastIndex","bufferIndex","stringIndexToBufferIndex","isValid","_addLink","exec","getStringCellWidth","MouseZone","_createLinkHoverEvent","clickCallback","hoverCallback","NON_BREAKING_SPACE_CHAR","ALL_NON_BREAKING_SPACE_REGEX","_screenElement","_dragScrollAmount","_enabled","_mouseDownTimeStamp","_onLinuxMouseSelection","_onRedrawRequest","_mouseMoveListener","_onMouseMove","_mouseUpListener","_onMouseUp","onUserInput","_trimListener","onTrim","_onTrim","onBufferActivate","_onBufferActivate","_model","SelectionModel","_activeSelectionMode","_removeMouseDownListeners","finalSelectionStart","finalSelectionEnd","lineText","translateBufferLineToString","bufferLine","isLinuxMouseSelection","_getMouseBufferCoords","_areCoordsInSelection","_selectWordAt","isSelectAllActive","getCoords","_getMouseEventScrollAmount","terminalHeight","macOptionClickForcesSelection","timeStamp","_onIncrementalClick","detail","_onSingleClick","_onDoubleClick","_onTripleClick","_addMouseDownListeners","_dragScrollIntervalTimer","_dragScroll","selectionStartLength","_selectLineAt","stopImmediatePropagation","previousSelectionEnd","_selectToWordAt","timeElapsed","coordinates","moveToCellSequence","activeBuffer","_convertViewportColToCharacterIndex","charIndex","_getWordAt","allowWhitespaceOnlySelection","followWrappedLinesAbove","followWrappedLinesBelow","charOffset","leftWideCharCount","rightWideCharCount","leftLongCharOffset","rightLongCharOffset","charAt","_isCharWordSeparator","trim","previousBufferLine","previousLineWordPosition","nextBufferLine","nextLineWordPosition","wordPosition","areSelectionValuesReversed","wordSeparator","wrappedRange","getWrappedRangeForLine","last","startPlusLength","moveToRequestedRow","targetY","applicationCursor","wrappedRowsForRow","repeat","wrappedRows","direction","verticalDirection","wrappedRowsCount","currentRow","lineWraps","horizontalDirection","targetX","forward","currentCol","bufferStr","mod","str","rpt","moveHorizontallyOnly","resetStartingRow","moveToRequestedCol","_audioContext","audioContextCtor","AudioContext","webkitAudioContext","audioContext","bellAudioSource","createBufferSource","decodeAudioData","_base64ToArrayBuffer","_removeMimeType","bellSound","connect","destination","base64","binaryString","atob","bytes","dataURI","split","_zones","_areZonesActive","_lastHoverCoords","_initialSelectionLength","_onMouseDown","_mouseLeaveListener","_onMouseLeave","_clickListener","_onClick","_deactivate","zone","_activate","_currentZone","pageX","_onHover","_findZoneEventAt","_tooltipTimeout","_onTooltip","_getSelectionLength","currentSelectionLength","_liveRegionLineCount","_charsToConsume","_charsToAnnounce","_accessibilityTreeRoot","_rowContainer","_rowElements","_createAccessibilityTreeNode","_topBoundaryFocusListener","_onBoundaryFocus","_bottomBoundaryFocusListener","_refreshRowsDimensions","_renderRowsDebouncer","_renderRows","_refreshRows","_liveRegion","insertAdjacentElement","onA11yChar","char","_onChar","onA11yTab","spaceCount","_onTab","_clearLiveRegion","_screenDprMonitor","boundaryElement","beforeBoundaryElement","getAttribute","relatedTarget","topBoundaryElement","bottomBoundaryElement","newElement","unshift","children","_refreshRowDimensions","MAX_ROWS_TO_READ","keyChar","setSize","posInSet","innerHTML","_announceCharacters","TERMINAL_CLASS_PREFIX","ROW_CONTAINER_CLASS","SELECTION_CLASS","nextTerminalId","_terminalClass","_refreshRowElements","_selectionContainer","_injectCss","_rowFactory","DomRendererRowFactory","_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","_createSelectionElement","colStart","colEnd","terminal","cursorAbsoluteY","cursorX","rowElement","createRow","_setCellUnderline","enabled","span","textDecoration","DIM_CLASS","UNDERLINE_CLASS","isCursorRow","cellWidth","lineLength","charElement","swapColor","KEYCODE_KEY_MAPPINGS","48","49","50","51","52","53","54","55","56","57","186","187","188","189","190","191","192","219","220","221","222","applicationCursorMode","modifiers","keyMapping","lastChar","_renderer","charSizeService","_isPaused","_needsFullRefresh","_canvasWidth","_canvasHeight","_onDimensionsChange","_onRefreshRequest","_renderDebouncer","onCharSizeChange","IntersectionObserver","_onIntersectionChange","threshold","observe","disconnect","intersectionRatio","_fireOnCanvasResize","changeOptions","_fullRefresh","DEFAULT_BELL_SOUND","DEFAULT_OPTIONS","scrollback","disableStdin","tabStopWidth","screenKeys","useFlowControl","CONSTRUCTOR_ONLY_OPTIONS","_onOptionChange","newValue","_sanitizeAndValidateOption","parentElement","_onCharSizeChange","_measureStrategy","DomMeasureStrategy","_parentElement","_result","_measureElement","geometry","BufferSet","_normal","Buffer","fillViewportRows","_alt","_activeBuffer","inactiveBuffer","fillAttr","newCols","newRows","MAX_BUFFER_SIZE","_hasScrollback","_nullCell","_whitespaceCell","_cols","_rows","CircularList","_getCorrectBufferLength","getWhitespaceCell","relativeY","correctBufferLength","nullCell","newMaxLength","addToY","amountToTrim","_isReflowEnabled","_reflow","_reflowLarger","_reflowSmaller","toRemove","reflowLargerGetLinesToRemove","newLayoutResult","reflowLargerCreateNewLayout","reflowLargerApplyNewLayout","layout","_reflowLargerAdjustViewport","countRemoved","viewportAdjustments","toInsert","countToInsert","wrappedLines","absoluteY","lastLineLength","destLineLengths","reflowSmallerGetNewLineLengths","linesToAdd","trimmedLines","newLines","destLineIndex","srcLineIndex","cellsToCopy","wrappedLinesIndex","getWrappedLineTrimmedLength","insertEvents","originalLines","originalLinesLength","originalLineIndex","nextToInsertIndex","nextToInsert","countInsertedSoFar","nextI","insertCountEmitted","onInsertEmitter","onTrimEmitter","lineIndex","marker","Marker","onInsert","onDelete","onDispose","_removeMarker","startOverscan","endOverscan","BufferStringIterator","_trimRight","_startIndex","_endIndex","_startOverscan","_endOverscan","_current","_maxLength","onDeleteEmitter","_array","_length","newArray","_getCyclicIndex","newLength","deleteCount","items","countToTrim","expandListBy","endsInNull","followingLineStartsWithWide","oldCols","bufferAbsoluteY","srcTrimmedTineLength","srcRemainingCells","destRemainingCells","countToRemove","nextToRemoveIndex","nextToRemoveStart","countRemovedSoFar","newLayout","newLayoutLines","newLineLengths","cellsNeeded","reduce","srcLine","cellsAvailable","oldTrimmedLength","endsWithWide","_nextId","isDisposed","_onDispose","DEFAULT_DEC_PRIVATE_MODES","_scrollToBottom","_onUserInput","wasUserInput","LogLevel","optionsKeyToLogLevel","DEBUG","info","INFO","WARN","ERROR","off","OFF","_updateLogLevel","_logLevel","_evalLazyOptionalParams","optionalParams","_log","message","log","clearRange","temp","_entries","entries","service","instance","ServiceCollection","_services","serviceDependencies","getServiceDependencies","sort","serviceArgs","dependency","firstServiceArgPos","args","DEFAULT_PROTOCOLS","NONE","restrict","X10","VT200","DRAG","ANY","eventCode","isSGR","S","DEFAULT_ENCODINGS","DEFAULT","SGR","_protocols","_encodings","_activeProtocol","_activeEncoding","_onProtocolChange","_lastEvent","addProtocol","addEncoding","protocol","encoding","_compareEvents","report","DOWN","UP","MOVE","WHEEL","e1","e2","_action","_callbacks","_pendingData","_bufferOffset","cb","_innerWrite","startTime","_addons","loadedAddon","_wrappedAddonDispose","activate"],"mappings":"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","file":"xterm.js","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})(window, function() {\nreturn "," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 32);\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IEvent } from 'common/EventEmitter';\nimport { IBuffer, IBufferSet } from 'common/buffer/Types';\nimport { IDecPrivateModes, ICoreMouseEvent, CoreMouseEncoding, ICoreMouseProtocol, CoreMouseEventType } from 'common/Types';\nimport { createDecorator } from 'common/services/ServiceRegistry';\n\nexport const IBufferService = createDecorator<IBufferService>('BufferService');\nexport interface IBufferService {\n  serviceBrand: any;\n\n  readonly cols: number;\n  readonly rows: number;\n  readonly buffer: IBuffer;\n  readonly buffers: IBufferSet;\n\n  // TODO: Move resize event here\n\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  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: any;\n\n  readonly decPrivateModes: IDecPrivateModes;\n\n  readonly onData: IEvent<string>;\n  readonly onUserInput: IEvent<void>;\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\nexport const IDirtyRowService = createDecorator<IDirtyRowService>('DirtyRowService');\nexport interface IDirtyRowService {\n  serviceBrand: any;\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 IConstructorSignature0<T> {\n  new(...services: { serviceBrand: any; }[]): T;\n}\n\nexport interface IConstructorSignature1<A1, T> {\n  new(first: A1, ...services: { serviceBrand: any; }[]): T;\n}\n\nexport interface IConstructorSignature2<A1, A2, T> {\n  new(first: A1, second: A2, ...services: { serviceBrand: any; }[]): T;\n}\n\nexport interface IConstructorSignature3<A1, A2, A3, T> {\n  new(first: A1, second: A2, third: A3, ...services: { serviceBrand: any; }[]): T;\n}\n\nexport interface IConstructorSignature4<A1, A2, A3, A4, T> {\n  new(first: A1, second: A2, third: A3, fourth: A4, ...services: { serviceBrand: any; }[]): T;\n}\n\nexport interface IConstructorSignature5<A1, A2, A3, A4, A5, T> {\n  new(first: A1, second: A2, third: A3, fourth: A4, fifth: A5, ...services: { serviceBrand: any; }[]): T;\n}\n\nexport interface IConstructorSignature6<A1, A2, A3, A4, A5, A6, T> {\n  new(first: A1, second: A2, third: A3, fourth: A4, fifth: A5, sixth: A6, ...services: { serviceBrand: any; }[]): T;\n}\n\nexport interface IConstructorSignature7<A1, A2, A3, A4, A5, A6, A7, T> {\n  new(first: A1, second: A2, third: A3, fourth: A4, fifth: A5, sixth: A6, seventh: A7, ...services: { serviceBrand: any; }[]): T;\n}\n\nexport interface IConstructorSignature8<A1, A2, A3, A4, A5, A6, A7, A8, T> {\n  new(first: A1, second: A2, third: A3, fourth: A4, fifth: A5, sixth: A6, seventh: A7, eigth: A8, ...services: { serviceBrand: any; }[]): T;\n}\n\nexport const IInstantiationService = createDecorator<IInstantiationService>('InstantiationService');\nexport interface IInstantiationService {\n  setService<T>(id: IServiceIdentifier<T>, instance: T): void;\n\n  createInstance<T>(ctor: IConstructorSignature0<T>): T;\n  createInstance<A1, T>(ctor: IConstructorSignature1<A1, T>, first: A1): T;\n  createInstance<A1, A2, T>(ctor: IConstructorSignature2<A1, A2, T>, first: A1, second: A2): T;\n  createInstance<A1, A2, A3, T>(ctor: IConstructorSignature3<A1, A2, A3, T>, first: A1, second: A2, third: A3): T;\n  createInstance<A1, A2, A3, A4, T>(ctor: IConstructorSignature4<A1, A2, A3, A4, T>, first: A1, second: A2, third: A3, fourth: A4): T;\n  createInstance<A1, A2, A3, A4, A5, T>(ctor: IConstructorSignature5<A1, A2, A3, A4, A5, T>, first: A1, second: A2, third: A3, fourth: A4, fifth: A5): T;\n  createInstance<A1, A2, A3, A4, A5, A6, T>(ctor: IConstructorSignature6<A1, A2, A3, A4, A5, A6, T>, first: A1, second: A2, third: A3, fourth: A4, fifth: A5, sixth: A6): T;\n  createInstance<A1, A2, A3, A4, A5, A6, A7, T>(ctor: IConstructorSignature7<A1, A2, A3, A4, A5, A6, A7, T>, first: A1, second: A2, third: A3, fourth: A4, fifth: A5, sixth: A6, seventh: A7): T;\n  createInstance<A1, A2, A3, A4, A5, A6, A7, A8, T>(ctor: IConstructorSignature8<A1, A2, A3, A4, A5, A6, A7, A8, T>, first: A1, second: A2, third: A3, fourth: A4, fifth: A5, sixth: A6, seventh: A7, eigth: A8): T;\n}\n\nexport const ILogService = createDecorator<ILogService>('LogService');\nexport interface ILogService {\n  serviceBrand: any;\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: any;\n\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';\nexport type LogLevel = 'debug' | 'info' | 'warn' | 'error' | 'off';\nexport type RendererType = 'dom' | 'canvas';\n\nexport interface IPartialTerminalOptions {\n  allowTransparency?: boolean;\n  bellSound?: string;\n  bellStyle?: 'none' /*| 'visual'*/ | 'sound' /*| 'both'*/;\n  cols?: number;\n  cursorBlink?: boolean;\n  cursorStyle?: 'block' | 'underline' | 'bar';\n  disableStdin?: boolean;\n  drawBoldTextInBrightColors?: boolean;\n  fastScrollModifier?: 'alt' | 'ctrl' | 'shift';\n  fastScrollSensitivity?: number;\n  fontSize?: number;\n  fontFamily?: string;\n  fontWeight?: FontWeight;\n  fontWeightBold?: FontWeight;\n  letterSpacing?: number;\n  lineHeight?: number;\n  logLevel?: LogLevel;\n  macOptionIsMeta?: boolean;\n  macOptionClickForcesSelection?: boolean;\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  wordSeparator?: string;\n}\n\nexport interface ITerminalOptions {\n  allowTransparency: boolean;\n  bellSound: string;\n  bellStyle: 'none' /*| 'visual'*/ | 'sound' /*| 'both'*/;\n  cols: number;\n  cursorBlink: boolean;\n  cursorStyle: 'block' | 'underline' | 'bar';\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  logLevel: LogLevel;\n  macOptionIsMeta: boolean;\n  macOptionClickForcesSelection: boolean;\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  wordSeparator: string;\n\n  [key: string]: any;\n  cancelEvents: boolean;\n  convertEol: boolean;\n  screenKeys: boolean;\n  termName: string;\n  useFlowControl: boolean;\n}\n\nexport interface ITheme {\n  foreground?: string;\n  background?: string;\n  cursor?: string;\n  cursorAccent?: string;\n  selection?: 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","/**\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> {\n  (e: T): void;\n}\n\nexport interface IEvent<T> {\n  (listener: (e: T) => any): IDisposable;\n}\n\nexport interface IEventEmitter<T> {\n  event: IEvent<T>;\n  fire(data: T): void;\n}\n\nexport class EventEmitter<T> implements IEventEmitter<T> {\n  private _listeners: IListener<T>[] = [];\n  private _event?: IEvent<T>;\n\n  public get event(): IEvent<T> {\n    if (!this._event) {\n      this._event = (listener: (e: T) => any) => {\n        this._listeners.push(listener);\n        const disposable = {\n          dispose: () => {\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        return disposable;\n      };\n    }\n    return this._event;\n  }\n\n  public fire(data: T): void {\n    const queue: IListener<T>[] = [];\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, data);\n    }\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    this._disposables.forEach(d => d.dispose());\n    this._disposables.length = 0;\n  }\n\n  /**\n   * Registers a disposable object.\n   * @param d The disposable to register.\n   */\n  public register<T extends IDisposable>(d: T): void {\n    this._disposables.push(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 * 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..31 (32th bit unused)\n   */\n  INVERSE = 0x4000000,\n  BOLD = 0x8000000,\n  UNDERLINE = 0x10000000,\n  BLINK = 0x20000000,\n  INVISIBLE = 0x40000000\n}\n\nexport const enum BgFlags {\n  /**\n   * bit 27..32 (upper 4 unused)\n   */\n  ITALIC = 0x4000000,\n  DIM = 0x8000000\n}\n","/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { CharData, ICellData } 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 } 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: number = 0;\n  public fg: number = 0;\n  public bg: number = 0;\n  public combinedData: string = '';\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\nimport { IEvent } from 'common/EventEmitter';\nimport { IRenderDimensions, IRenderer, CharacterJoinerHandler } from 'browser/renderer/Types';\nimport { IColorSet } from 'browser/Types';\nimport { ISelectionRedrawRequestEvent } from 'browser/selection/Types';\nimport { createDecorator } from 'common/services/ServiceRegistry';\nimport { IDisposable } from 'common/Types';\n\nexport const ICharSizeService = createDecorator<ICharSizeService>('CharSizeService');\nexport interface ICharSizeService {\n  serviceBrand: any;\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 IMouseService = createDecorator<IMouseService>('MouseService');\nexport interface IMouseService {\n  serviceBrand: any;\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: any;\n\n  onDimensionsChange: IEvent<IRenderDimensions>;\n  onRender: IEvent<{ start: number, end: number }>;\n  onRefreshRequest: IEvent<{ start: number, end: number }>;\n\n  dimensions: IRenderDimensions;\n\n  refreshRows(start: number, end: number): void;\n  resize(cols: number, rows: number): void;\n  changeOptions(): 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], end: [number, number], columnSelectMode: boolean): void;\n  onCursorMove(): void;\n  clear(): void;\n  registerCharacterJoiner(handler: CharacterJoinerHandler): number;\n  deregisterCharacterJoiner(joinerId: number): boolean;\n}\n\nexport const ISelectionService = createDecorator<ISelectionService>('SelectionService');\nexport interface ISelectionService {\n  serviceBrand: any;\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 onRedrawRequest: IEvent<ISelectionRedrawRequestEvent>;\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  isClickInSelection(event: MouseEvent): boolean;\n  selectWordAtCursor(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}\n\nexport const ISoundService = createDecorator<ISoundService>('SoundService');\nexport interface ISoundService {\n  serviceBrand: any;\n\n  playBellSound(): void;\n}\n","/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IAttributeData, IColorRGB } from 'common/Types';\nimport { Attributes, FgFlags, BgFlags } from 'common/buffer/Constants';\n\nexport class AttributeData implements IAttributeData {\n  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  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    return newObj;\n  }\n\n  // data\n  public fg: number = 0;\n  public bg: number = 0;\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\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\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","/**\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  useCapture?: boolean\n): IDisposable {\n  node.addEventListener(type, handler, useCapture);\n  return {\n    dispose: () => {\n      if (!handler) {\n        // Already disposed\n        return;\n      }\n      node.removeEventListener(type, handler, useCapture);\n    }\n  };\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  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      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  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)) {\n            // illegal codepoint\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)) {\n          // illegal codepoint, 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) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nexport const INVERTED_DEFAULT_COLOR = 257;\nexport const DIM_OPACITY = 0.5;\n\nexport const CHAR_ATLAS_CELL_SPACING = 1;\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.indexOf('Firefox');\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 = contains(['Macintosh', 'MacIntel', 'MacPPC', 'Mac68K'], platform);\nexport const isIpad = platform === 'iPad';\nexport const isIphone = platform === 'iPhone';\nexport const isWindows = contains(['Windows', 'Win16', 'Win32', 'WinCE'], platform);\nexport const isLinux = platform.indexOf('Linux') >= 0;\n\n/**\n * Return if the given array contains the given element\n * @param arr The array to search for the given element.\n * @param el The element to look for into the array\n */\nfunction contains(arr: any[], el: any): boolean {\n  return arr.indexOf(el) >= 0;\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}\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 } from 'common/Types';\nimport { DEFAULT_COLOR, WHITESPACE_CELL_CHAR, WHITESPACE_CELL_CODE } from 'common/buffer/Constants';\nimport { IGlyphIdentifier } from 'browser/renderer/atlas/Types';\nimport { DIM_OPACITY, INVERTED_DEFAULT_COLOR } 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, IOptionsService } from 'common/services/Services';\nimport { throwIfFalsy } from 'browser/renderer/RendererUtils';\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  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  ) {\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    this._container.removeChild(this._canvas);\n    if (this._charAtlas) {\n      this._charAtlas.dispose();\n    }\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  public onSelectionChanged(start: [number, number], end: [number, number], columnSelectMode: boolean = false): void {}\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 = <HTMLCanvasElement>this._canvas.cloneNode();\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.options, 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  /**\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 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): void {\n    this._ctx.fillRect(\n        x * this._scaledCellWidth,\n        y * this._scaledCellHeight,\n        window.devicePixelRatio,\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 = 'middle';\n    this._clipRow(y);\n    this._ctx.fillText(\n        cell.getChars(),\n        x * this._scaledCellWidth + this._scaledCharLeft,\n        y * this._scaledCellHeight + this._scaledCharTop + this._scaledCharHeight / 2);\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\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 (cell.isFgRGB() || cell.isBgRGB()) {\n      this._drawUncachedChars(cell, x, y);\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.options.drawBoldTextInBrightColors && cell.isBold() && fg < 8 && fg !== INVERTED_DEFAULT_COLOR;\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    const atlasDidDraw = this._charAtlas && this._charAtlas.draw(\n      this._ctx,\n      this._currentGlyphIdentifier,\n      x * this._scaledCellWidth + this._scaledCharLeft,\n      y * this._scaledCellHeight + this._scaledCharTop\n    );\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): void {\n    this._ctx.save();\n    this._ctx.font = this._getFont(!!cell.isBold(), !!cell.isItalic());\n    this._ctx.textBaseline = 'middle';\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        this._ctx.fillStyle = this._colors.ansi[cell.getBgColor()].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.options.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    // Draw the character\n    this._ctx.fillText(\n        cell.getChars(),\n        x * this._scaledCellWidth + this._scaledCharLeft,\n        y * this._scaledCellHeight + this._scaledCharTop + this._scaledCharHeight / 2);\n    this._ctx.restore();\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.options.fontWeightBold : this._optionsService.options.fontWeight;\n    const fontStyle = isItalic ? 'italic' : '';\n\n    return `${fontStyle} ${fontWeight} ${this._optionsService.options.fontSize * window.devicePixelRatio}px ${this._optionsService.options.fontFamily}`;\n  }\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) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nexport type TypedArray = Uint8Array | Uint16Array | Uint32Array | Uint8ClampedArray\n  | Int8Array | Int16Array | Int32Array\n  | 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) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { CharData, IBufferLine, ICellData } 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 } from 'common/buffer/Constants';\nimport { CellData } from 'common/buffer/CellData';\nimport { AttributeData } 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  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    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    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): void {\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): void {\n    pos %= this.length;\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\n  public deleteCells(pos: number, n: number, fillCellData: ICellData): 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\n  public replaceCells(start: number, end: number, fillCellData: ICellData): void {\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\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    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.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    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\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) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nexport let promptLabel = 'Terminal input';\nexport let tooMuchOutput = 'Too much output to announce, navigate to rows manually to read';\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 | null } = {};\n\n/**\n * The default character set, US.\n */\nexport const DEFAULT_CHARSET: ICharset | null = 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': '\\u0009', // '\\t'\n  'c': '\\u000c', // '\\f'\n  'd': '\\u000d', // '\\r'\n  'e': '\\u000a', // '\\n'\n  'f': '\\u00b0', // '°'\n  'g': '\\u00b1', // '±'\n  'h': '\\u2424', // '\\u2424' (NL)\n  'i': '\\u000b', // '\\v'\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'] = null;\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  '_': 'è',\n  '`': 'ô',\n  '{': 'ä',\n  '|': 'ö',\n  '}': 'ü',\n  '~': 'û'\n};\n","/**\n * Copyright (c) 2016 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { fill } from 'common/TypedArrayUtils';\n\nexport const wcwidth = (function(opts: {nul: number, control: number}): (ucs: number) => number {\n  // extracted from https://www.cl.cam.ac.uk/%7Emgk25/ucs/wcwidth.c\n  // combining characters\n  const COMBINING_BMP = [\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  ];\n  const COMBINING_HIGH = [\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  // binary search\n  function 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  function wcwidthHigh(ucs: number): 0 | 1 | 2 {\n    if (bisearch(ucs, COMBINING_HIGH)) {\n      return 0;\n    }\n    if ((ucs >= 0x20000 && ucs <= 0x2fffd) || (ucs >= 0x30000 && ucs <= 0x3fffd)) {\n      return 2;\n    }\n    return 1;\n  }\n  const control = opts.control | 0;\n\n  // create lookup table for BMP plane\n  const table = new Uint8Array(65536);\n  fill(table, 1);\n  table[0] = opts.nul;\n  // control chars\n  fill(table, opts.control, 1, 32);\n  fill(table, opts.control, 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 < COMBINING_BMP.length; ++r) {\n    fill(table, 0, COMBINING_BMP[r][0], COMBINING_BMP[r][1] + 1);\n  }\n\n  return function (num: number): number {\n    if (num < 32) {\n      return control | 0;\n    }\n    if (num < 127) {\n      return 1;\n    }\n    if (num < 65536) {\n      return table[num];\n    }\n    // do a full search for high codepoints\n    return wcwidthHigh(num);\n  };\n})({nul: 0, control: 0});  // configurable options\n\n/**\n * Get the terminal cell width for a string.\n */\nexport function 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 + 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 += wcwidth(second);\n      }\n    }\n    result += wcwidth(code);\n  }\n  return result;\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 = (values[0] instanceof Array) ? 1 : 0; i < values.length; ++i) {\n      const value = values[i];\n      if (value instanceof Array) {\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 { IOscHandler, IHandlerCollection, OscFallbackHandlerType, IOscParser } from 'common/parser/Types';\nimport { OscState, PAYLOAD_LIMIT } from 'common/parser/Constants';\nimport { utf32ToString } from 'common/input/TextDecoder';\nimport { IDisposable } from 'common/Types';\n\n\nexport class OscParser implements IOscParser {\n  private _state = OscState.START;\n  private _id = -1;\n  private _handlers: IHandlerCollection<IOscHandler> = Object.create(null);\n  private _handlerFb: OscFallbackHandlerType = () => { };\n\n  public addHandler(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 setHandler(ident: number, handler: IOscHandler): void {\n    this._handlers[ident] = [handler];\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  }\n\n  public reset(): void {\n    // cleanup handlers if payload was already sent\n    if (this._state === OscState.PAYLOAD) {\n      this.end(false);\n    }\n    this._id = -1;\n    this._state = OscState.START;\n  }\n\n  private _start(): void {\n    const handlers = this._handlers[this._id];\n    if (!handlers) {\n      this._handlerFb(this._id, 'START');\n    } else {\n      for (let j = handlers.length - 1; j >= 0; j--) {\n        handlers[j].start();\n      }\n    }\n  }\n\n  private _put(data: Uint32Array, start: number, end: number): void {\n    const handlers = this._handlers[this._id];\n    if (!handlers) {\n      this._handlerFb(this._id, 'PUT', utf32ToString(data, start, end));\n    } else {\n      for (let j = handlers.length - 1; j >= 0; j--) {\n        handlers[j].put(data, start, end);\n      }\n    }\n  }\n\n  private _end(success: boolean): void {\n    // other than the old code we always have to call .end\n    // to keep the bubbling we use `success` to indicate\n    // whether a handler should execute\n    const handlers = this._handlers[this._id];\n    if (!handlers) {\n      this._handlerFb(this._id, 'END', success);\n    } else {\n      let j = handlers.length - 1;\n      for (; j >= 0; j--) {\n        if (handlers[j].end(success) !== false) {\n          break;\n        }\n      }\n      j--;\n      // cleanup left over handlers\n      for (; j >= 0; j--) {\n        handlers[j].end(false);\n      }\n    }\n  }\n\n  public start(): void {\n    // always reset leftover handlers\n    this.reset();\n    this._id = -1;\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): void {\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      this._end(success);\n    }\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) => any) {}\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): any {\n    let ret;\n    if (this._hitLimit) {\n      ret = false;\n    } else if (success) {\n      ret = this._handler(this._data);\n    }\n    this._data = '';\n    this._hitLimit = false;\n    return ret;\n  }\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 } 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\n  public dispose(): void {\n    this._handlers = Object.create(null);\n    this._handlerFb = () => {};\n  }\n\n  public addHandler(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 setHandler(ident: number, handler: IDcsHandler): void {\n    this._handlers[ident] = [handler];\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    if (this._active.length) {\n      this.unhook(false);\n    }\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): void {\n    if (!this._active.length) {\n      this._handlerFb(this._ident, 'UNHOOK', success);\n    } else {\n      let j = this._active.length - 1;\n      for (; j >= 0; j--) {\n        if (this._active[j].unhook(success) !== false) {\n          break;\n        }\n      }\n      j--;\n      // cleanup left over handlers\n      for (; j >= 0; j--) {\n        this._active[j].unhook(false);\n      }\n    }\n    this._active = EMPTY_HANDLERS;\n    this._ident = 0;\n  }\n}\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 | undefined;\n  private _hitLimit: boolean = false;\n\n  constructor(private _handler: (data: string, params: IParams) => any) {}\n\n  public hook(params: IParams): void {\n    this._params = params.clone();\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): any {\n    let ret;\n    if (this._hitLimit) {\n      ret = false;\n    } else if (success) {\n      ret = this._handler(this._data, this._params ? this._params : new Params());\n    }\n    this._params = undefined;\n    this._data = '';\n    this._hitLimit = false;\n    return ret;\n  }\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    // For the static char atlas, we only use the first 16 colors, but we need all 256 for the\n    // dynamic character atlas.\n    ansi: colors.ansi.slice(0, 16)\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 { IColorManager, IColor, IColorSet } from 'browser/Types';\nimport { ITheme } from 'common/services/Services';\n\nconst DEFAULT_FOREGROUND = fromHex('#ffffff');\nconst DEFAULT_BACKGROUND = fromHex('#000000');\nconst DEFAULT_CURSOR = fromHex('#ffffff');\nconst DEFAULT_CURSOR_ACCENT = fromHex('#000000');\nconst DEFAULT_SELECTION = {\n  css: 'rgba(255, 255, 255, 0.3)',\n  rgba: 0xFFFFFF77\n};\n\n// An IIFE to generate DEFAULT_ANSI_COLORS. Do not mutate DEFAULT_ANSI_COLORS, instead make a copy\n// and mutate that.\nexport const DEFAULT_ANSI_COLORS = (() => {\n  const colors = [\n    // dark:\n    fromHex('#2e3436'),\n    fromHex('#cc0000'),\n    fromHex('#4e9a06'),\n    fromHex('#c4a000'),\n    fromHex('#3465a4'),\n    fromHex('#75507b'),\n    fromHex('#06989a'),\n    fromHex('#d3d7cf'),\n    // bright:\n    fromHex('#555753'),\n    fromHex('#ef2929'),\n    fromHex('#8ae234'),\n    fromHex('#fce94f'),\n    fromHex('#729fcf'),\n    fromHex('#ad7fa8'),\n    fromHex('#34e2e2'),\n    fromHex('#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: `#${toPaddedHex(r)}${toPaddedHex(g)}${toPaddedHex(b)}`,\n      // Use >>> 0 to force a conversion to an unsigned int\n      rgba: ((r << 24) | (g << 16) | (b << 8) | 0xFF) >>> 0\n    });\n  }\n\n  // Generate greys (232-255)\n  for (let i = 0; i < 24; i++) {\n    const c = 8 + i * 10;\n    const ch = toPaddedHex(c);\n    colors.push({\n      css: `#${ch}${ch}${ch}`,\n      rgba: ((c << 24) | (c << 16) | (c << 8) | 0xFF) >>> 0\n    });\n  }\n\n  return colors;\n})();\n\nfunction fromHex(css: string): IColor {\n  return {\n    css,\n    rgba: parseInt(css.slice(1), 16) << 8 | 0xFF\n  };\n}\n\nfunction toPaddedHex(c: number): string {\n  const s = c.toString(16);\n  return s.length < 2 ? '0' + s : s;\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\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.colors = {\n      foreground: DEFAULT_FOREGROUND,\n      background: DEFAULT_BACKGROUND,\n      cursor: DEFAULT_CURSOR,\n      cursorAccent: DEFAULT_CURSOR_ACCENT,\n      selection: DEFAULT_SELECTION,\n      ansi: DEFAULT_ANSI_COLORS.slice()\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.selection = this._parseColor(theme.selection, DEFAULT_SELECTION, true);\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  }\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    if (!allowTransparency && data[3] !== 0xFF) {\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    return {\n      css,\n      rgba: (data[0] << 24 | data[1] << 16 | data[2] << 8 | data[3]) >>> 0\n    };\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","/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IBufferLine, ICellData, CharData } from 'common/Types';\nimport { ICharacterJoinerRegistry, ICharacterJoiner } from 'browser/renderer/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';\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 CharacterJoinerRegistry implements ICharacterJoinerRegistry {\n\n  private _characterJoiners: ICharacterJoiner[] = [];\n  private _nextCharacterJoinerId: number = 0;\n  private _workCell: CellData = new CellData();\n\n  constructor(private _bufferService: IBufferService) { }\n\n  public registerCharacterJoiner(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 deregisterCharacterJoiner(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    const joinedRanges: [number, number][] = this._characterJoiners[0].handler(text);\n    for (let i = 1; i < this._characterJoiners.length; i++) {\n      // We merge any overlapping ranges across the different joiners\n      const joinerRanges = this._characterJoiners[i].handler(text);\n      for (let j = 0; j < joinerRanges.length; j++) {\n        CharacterJoinerRegistry._mergeRanges(joinedRanges, joinerRanges[j]);\n      }\n    }\n    this._stringRangesToCellRanges(joinedRanges, lineData, startCol);\n    return joinedRanges;\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) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nexport function getCoordsRelativeToElement(event: {clientX: number, clientY: number}, element: HTMLElement): [number, number] {\n  const rect = element.getBoundingClientRect();\n  return [event.clientX - rect.left, event.clientY - rect.top];\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(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(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 { IDisposable } from 'common/Types';\n\n/**\n * Debounces calls to render terminal rows using animation frames.\n */\nexport class RenderDebouncer implements IDisposable {\n  private _rowStart: number | undefined;\n  private _rowEnd: number | undefined;\n  private _rowCount: number | undefined;\n  private _animationFrame: number | undefined;\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 refresh(rowStart: number, rowEnd: number, 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    // Make sure values are set\n    if (this._rowStart === undefined || this._rowEnd === undefined || this._rowCount === undefined) {\n      return;\n    }\n\n    // Clamp values\n    this._rowStart = Math.max(this._rowStart, 0);\n    this._rowEnd = Math.min(this._rowEnd, this._rowCount - 1);\n\n    // Run render callback\n    this._renderCallback(this._rowStart, this._rowEnd);\n\n    // Reset debouncer\n    this._rowStart = undefined;\n    this._rowEnd = undefined;\n    this._animationFrame = undefined;\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._resolutionMediaMatchList || !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) 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) : val[key]);\n  }\n\n  return clonedObject as T;\n}\n","/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { Terminal as ITerminalApi, ITerminalOptions, IMarker, IDisposable, ILinkMatcherOptions, ITheme, ILocalizableStrings, ITerminalAddon, ISelectionPosition, IBuffer as IBufferApi, IBufferLine as IBufferLineApi, IBufferCell as IBufferCellApi, IParser, IFunctionIdentifier } from 'xterm';\nimport { ITerminal } from '../Types';\nimport { IBufferLine } from 'common/Types';\nimport { IBuffer } from 'common/buffer/Types';\nimport { Terminal as TerminalCore } from '../Terminal';\nimport * as Strings from '../browser/LocalizableStrings';\nimport { IEvent } from 'common/EventEmitter';\nimport { AddonManager } from './AddonManager';\nimport { IParams } from 'common/parser/Types';\n\nexport class Terminal implements ITerminalApi {\n  private _core: ITerminal;\n  private _addonManager: AddonManager;\n  private _parser: IParser;\n\n  constructor(options?: ITerminalOptions) {\n    this._core = new TerminalCore(options);\n    this._addonManager = new AddonManager();\n  }\n\n  public get onCursorMove(): IEvent<void> { return this._core.onCursorMove; }\n  public get onLineFeed(): IEvent<void> { return this._core.onLineFeed; }\n  public get onSelectionChange(): IEvent<void> { return this._core.onSelectionChange; }\n  public get onData(): IEvent<string> { return this._core.onData; }\n  public get onTitleChange(): IEvent<string> { return this._core.onTitleChange; }\n  public get onScroll(): IEvent<number> { return this._core.onScroll; }\n  public get onKey(): IEvent<{ key: string, domEvent: KeyboardEvent }> { return this._core.onKey; }\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\n  public get element(): HTMLElement | undefined { return this._core.element; }\n  public get parser(): IParser {\n    if (!this._parser) {\n      this._parser = new ParserApi(this._core);\n    }\n    return this._parser;\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(): IBufferApi { return new BufferApiView(this._core.buffer); }\n  public get markers(): ReadonlyArray<IMarker> { return this._core.markers; }\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    return this._core.registerLinkMatcher(regex, handler, options);\n  }\n  public deregisterLinkMatcher(matcherId: number): void {\n    this._core.deregisterLinkMatcher(matcherId);\n  }\n  public registerCharacterJoiner(handler: (text: string) => [number, number][]): number {\n    return this._core.registerCharacterJoiner(handler);\n  }\n  public deregisterCharacterJoiner(joinerId: number): void {\n    this._core.deregisterCharacterJoiner(joinerId);\n  }\n  public addMarker(cursorYOffset: number): IMarker {\n    this._verifyIntegers(cursorYOffset);\n    return this._core.addMarker(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' | 'fontWeight' | 'fontWeightBold' | 'logLevel' | 'rendererType' | 'termName' | 'wordSeparator'): string;\n  public getOption(key: 'allowTransparency' | 'cancelEvents' | 'convertEol' | 'cursorBlink' | 'disableStdin' | 'macOptionIsMeta' | 'rightClickSelectsWord' | 'popOnBell' | 'screenKeys' | 'useFlowControl' | 'visualBell'): boolean;\n  public getOption(key: 'colors'): string[];\n  public getOption(key: 'cols' | 'fontSize' | 'letterSpacing' | 'lineHeight' | 'rows' | 'tabStopWidth' | 'scrollback'): number;\n  public getOption(key: 'handler'): (data: string) => void;\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'): 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' | 'cancelEvents' | 'convertEol' | 'cursorBlink' | 'disableStdin' | 'macOptionIsMeta' | 'rightClickSelectsWord' | 'popOnBell' | 'screenKeys' | 'useFlowControl' | 'visualBell', value: boolean): void;\n  public setOption(key: 'colors', value: string[]): void;\n  public setOption(key: 'fontSize' | 'letterSpacing' | 'lineHeight' | 'tabStopWidth' | 'scrollback', value: number): void;\n  public setOption(key: 'handler', value: (data: string) => void): 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._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 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    values.forEach(value => {\n      if (value === Infinity || isNaN(value) || value % 1 !== 0) {\n        throw new Error('This API only accepts integers');\n      }\n    });\n  }\n}\n\nclass BufferApiView implements IBufferApi {\n  constructor(private _buffer: IBuffer) {}\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}\n\nclass BufferLineApiView implements IBufferLineApi {\n  constructor(private _line: IBufferLine) {}\n\n  public get isWrapped(): boolean { return this._line.isWrapped; }\n  public getCell(x: number): IBufferCellApi | undefined {\n    if (x < 0 || x >= this._line.length) {\n      return undefined;\n    }\n    return new BufferCellApiView(this._line, x);\n  }\n  public translateToString(trimRight?: boolean, startColumn?: number, endColumn?: number): string {\n    return this._line.translateToString(trimRight, startColumn, endColumn);\n  }\n}\n\nclass BufferCellApiView implements IBufferCellApi {\n  constructor(private _line: IBufferLine, private _x: number) {}\n  public get char(): string { return this._line.getString(this._x); }\n  public get width(): number { return this._line.getWidth(this._x); }\n}\n\nclass ParserApi implements IParser {\n  constructor(private _core: ITerminal) {}\n\n  public addCsiHandler(id: IFunctionIdentifier, callback: (params: (number | number[])[]) => boolean): IDisposable {\n    return this._core.addCsiHandler(id, (params: IParams) => callback(params.toArray()));\n  }\n  public addDcsHandler(id: IFunctionIdentifier, callback: (data: string, param: (number | number[])[]) => boolean): IDisposable {\n    return this._core.addDcsHandler(id, (data: string, params: IParams) => callback(data, params.toArray()));\n  }\n  public addEscHandler(id: IFunctionIdentifier, handler: () => boolean): IDisposable {\n    return this._core.addEscHandler(id, handler);\n  }\n  public addOscHandler(ident: number, callback: (data: string) => boolean): IDisposable {\n    return this._core.addOscHandler(ident, callback);\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 { IInputHandlingTerminal, ICompositionHelper, ITerminalOptions, ITerminal, IBrowser, CustomKeyEventHandler } from './Types';\nimport { IRenderer, CharacterJoinerHandler } 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 } from 'common/data/EscapeSequences';\nimport { InputHandler } from './InputHandler';\nimport { Renderer } from './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 } from 'xterm';\nimport { DomRenderer } from './renderer/dom/DomRenderer';\nimport { IKeyboardEvent, KeyboardResultType, ICharset, IBufferLine, IAttributeData, CoreMouseEventType, CoreMouseButton, CoreMouseAction } from 'common/Types';\nimport { evaluateKeyboardEvent } from 'common/input/Keyboard';\nimport { EventEmitter, IEvent } from 'common/EventEmitter';\nimport { DEFAULT_ATTR_DATA } from 'common/buffer/BufferLine';\nimport { applyWindowsMode } from './WindowsMode';\nimport { ColorManager } from 'browser/ColorManager';\nimport { RenderService } from 'browser/services/RenderService';\nimport { IOptionsService, IBufferService, ICoreMouseService, ICoreService, ILogService, IDirtyRowService, IInstantiationService } from 'common/services/Services';\nimport { OptionsService } from 'common/services/OptionsService';\nimport { ICharSizeService, IRenderService, IMouseService, ISelectionService, ISoundService } from 'browser/services/Services';\nimport { CharSizeService } from 'browser/services/CharSizeService';\nimport { BufferService, MINIMUM_COLS, MINIMUM_ROWS } from 'common/services/BufferService';\nimport { Disposable } from 'common/Lifecycle';\nimport { IBufferSet, IBuffer } from 'common/buffer/Types';\nimport { Attributes } from 'common/buffer/Constants';\nimport { MouseService } from 'browser/services/MouseService';\nimport { IParams, IFunctionIdentifier } from 'common/parser/Types';\nimport { CoreService } from 'common/services/CoreService';\nimport { LogService } from 'common/services/LogService';\nimport { ILinkifier, IMouseZoneManager, LinkMatcherHandler, ILinkMatcherOptions, IViewport } from 'browser/Types';\nimport { DirtyRowService } from 'common/services/DirtyRowService';\nimport { InstantiationService } from 'common/services/InstantiationService';\nimport { CoreMouseService } from 'common/services/CoreMouseService';\nimport { WriteBuffer } from 'common/input/WriteBuffer';\n\n// Let it work inside Node.js for automated testing purposes.\nconst document = (typeof window !== 'undefined') ? window.document : null;\n\n\nexport class Terminal extends Disposable implements ITerminal, IDisposable, IInputHandlingTerminal {\n  public textarea: HTMLTextAreaElement;\n  public element: HTMLElement;\n  public screenElement: HTMLElement;\n\n  /**\n   * The HTMLElement that the terminal is created in, set by Terminal.open.\n   */\n  private _parent: HTMLElement | null;\n  private _document: Document;\n  private _viewportScrollArea: HTMLElement;\n  private _viewportElement: HTMLElement;\n  private _helperContainer: HTMLElement;\n  private _compositionView: HTMLElement;\n\n  private _visualBellTimer: number;\n\n  public browser: IBrowser = <any>Browser;\n\n  // TODO: We should remove options once components adopt optionsService\n  public get options(): ITerminalOptions { return this.optionsService.options; }\n\n  // TODO: This can be changed to an enum or boolean, 0 and 1 seem to be the only options\n  public cursorState: number;\n  public cursorHidden: boolean;\n\n  private _customKeyEventHandler: CustomKeyEventHandler;\n\n  // common services\n  private _bufferService: IBufferService;\n  private _coreService: ICoreService;\n  private _coreMouseService: ICoreMouseService;\n  private _dirtyRowService: IDirtyRowService;\n  private _instantiationService: IInstantiationService;\n  private _logService: ILogService;\n  public optionsService: IOptionsService;\n\n  // browser services\n  private _charSizeService: ICharSizeService;\n  private _mouseService: IMouseService;\n  private _renderService: IRenderService;\n  private _selectionService: ISelectionService;\n  private _soundService: ISoundService;\n\n  // modes\n  public applicationKeypad: boolean;\n  public originMode: boolean;\n  public insertMode: boolean;\n  public wraparoundMode: boolean; // defaults: xterm - true, vt100 - false\n  public bracketedPasteMode: boolean;\n\n  // charset\n  // The current charset\n  public charset: ICharset;\n  public gcharset: number;\n  public glevel: number;\n  public charsets: ICharset[];\n\n  // mouse properties\n  public mouseEvents: CoreMouseEventType = CoreMouseEventType.NONE;\n  public sendFocus: boolean;\n\n  // misc\n  public savedCols: number;\n\n  public curAttrData: IAttributeData;\n  private _eraseAttrData: IAttributeData;\n\n  public params: (string | number)[];\n  public currentParam: string | number;\n\n  // write buffer\n  private _writeBuffer: WriteBuffer;\n\n  // Store if user went browsing history in scrollback\n  private _userScrolling: boolean;\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  private _inputHandler: InputHandler;\n  public linkifier: ILinkifier;\n  public viewport: IViewport;\n  private _compositionHelper: ICompositionHelper;\n  private _mouseZoneManager: IMouseZoneManager;\n  private _accessibilityManager: AccessibilityManager;\n  private _colorManager: ColorManager;\n  private _theme: ITheme;\n  private _windowsMode: IDisposable | undefined;\n\n  // bufferline to clone/copy from for new blank lines\n  private _blankLine: IBufferLine = null;\n\n  public get cols(): number { return this._bufferService.cols; }\n  public get rows(): number { return this._bufferService.rows; }\n\n  private _onCursorMove = new EventEmitter<void>();\n  public get onCursorMove(): IEvent<void> { return this._onCursorMove.event; }\n  private _onData = new EventEmitter<string>();\n  public get onData(): IEvent<string> { return this._onData.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 _onLineFeed = new EventEmitter<void>();\n  public get onLineFeed(): IEvent<void> { return this._onLineFeed.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 _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  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\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  public onA11yCharEmitter = new EventEmitter<string>();\n  public get onA11yChar(): IEvent<string> { return this.onA11yCharEmitter.event; }\n  public 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: ITerminalOptions = {}\n  ) {\n    super();\n\n    // Setup and initialize common services\n    this._instantiationService = new InstantiationService();\n    this.optionsService = new OptionsService(options);\n    this._instantiationService.setService(IOptionsService, this.optionsService);\n    this._bufferService = 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._instantiationService.createInstance(CoreService, () => this.scrollToBottom());\n    this._instantiationService.setService(ICoreService, this._coreService);\n    this._coreService.onData(e => this._onData.fire(e));\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\n    this._setupOptionsListeners();\n    this._setup();\n\n    this._writeBuffer = new WriteBuffer(data => this._inputHandler.parse(data));\n  }\n\n  public dispose(): void {\n    if (this._isDisposed) {\n      return;\n    }\n    super.dispose();\n    if (this._windowsMode) {\n      this._windowsMode.dispose();\n      this._windowsMode = undefined;\n    }\n    if (this._renderService) {\n      this._renderService.dispose();\n    }\n    this._customKeyEventHandler = null;\n    this.write = () => {};\n    if (this.element && this.element.parentNode) {\n      this.element.parentNode.removeChild(this.element);\n    }\n  }\n\n  private _setup(): void {\n    this._parent = document ? document.body : null;\n\n    this.cursorState = 0;\n    this.cursorHidden = false;\n    this._customKeyEventHandler = null;\n\n    // modes\n    this.applicationKeypad = false;\n    this.originMode = false;\n    this.insertMode = false;\n    this.wraparoundMode = true; // defaults: xterm - true, vt100 - false\n    this.bracketedPasteMode = false;\n\n    // charset\n    this.charset = null;\n    this.gcharset = null;\n    this.glevel = 0;\n    // TODO: Can this be just []?\n    this.charsets = [null];\n\n    this.curAttrData = DEFAULT_ATTR_DATA.clone();\n    this._eraseAttrData = DEFAULT_ATTR_DATA.clone();\n\n    this.params = [];\n    this.currentParam = 0;\n\n    this._userScrolling = false;\n\n    // Register input handler and refire/handle events\n    this._inputHandler = new InputHandler(this, this._bufferService, this._coreService, this._dirtyRowService, this._logService, this.optionsService, this._coreMouseService);\n    this._inputHandler.onCursorMove(() => this._onCursorMove.fire());\n    this._inputHandler.onLineFeed(() => this._onLineFeed.fire());\n    this.register(this._inputHandler);\n\n    this.linkifier = this.linkifier || new Linkifier(this._bufferService, this._logService);\n\n    if (this.options.windowsMode) {\n      this._windowsMode = applyWindowsMode(this);\n    }\n  }\n\n  /**\n   * Convenience property to active buffer.\n   */\n  public get buffer(): IBuffer {\n    return this.buffers.active;\n  }\n\n  public get buffers(): IBufferSet {\n    return this._bufferService.buffers;\n  }\n\n  /**\n   * back_color_erase feature for xterm.\n   */\n  public eraseAttrData(): IAttributeData {\n    this._eraseAttrData.bg &= ~(Attributes.CM_MASK | 0xFFFFFF);\n    this._eraseAttrData.bg |= this.curAttrData.bg & ~0xFC000000;\n    return this._eraseAttrData;\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  public get isFocused(): boolean {\n    return document.activeElement === this.textarea && document.hasFocus();\n  }\n\n  private _setupOptionsListeners(): void {\n    // TODO: These listeners should be owned by individual components\n    this.optionsService.onOptionChange(key => {\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          if (this._renderService) {\n            this._renderService.clear();\n          }\n          if (this._charSizeService) {\n            this._charSizeService.measure();\n          }\n          break;\n        case 'drawBoldTextInBrightColors':\n        case 'letterSpacing':\n        case 'lineHeight':\n        case 'fontWeight':\n        case 'fontWeightBold':\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.buffers.resize(this.cols, this.rows);\n          if (this.viewport) {\n            this.viewport.syncScrollArea();\n          }\n          break;\n        case 'screenReaderMode':\n          if (this.optionsService.options.screenReaderMode) {\n            if (!this._accessibilityManager && this._renderService) {\n              this._accessibilityManager = new AccessibilityManager(this, this._renderService);\n            }\n          } else {\n            if (this._accessibilityManager) {\n              this._accessibilityManager.dispose();\n              this._accessibilityManager = null;\n            }\n          }\n          break;\n        case 'tabStopWidth': this.buffers.setupTabStops(); break;\n        case 'theme':\n          this._setTheme(this.optionsService.options.theme);\n          break;\n        case 'windowsMode':\n          if (this.optionsService.options.windowsMode) {\n            if (!this._windowsMode) {\n              this._windowsMode = applyWindowsMode(this);\n            }\n          } else {\n            if (this._windowsMode) {\n              this._windowsMode.dispose();\n              this._windowsMode = undefined;\n            }\n          }\n          break;\n      }\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.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.sendFocus) {\n      this._coreService.triggerDataEvent(C0.ESC + '[O');\n    }\n    this.element.classList.remove('focus');\n    this._onBlur.fire();\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) => handlePasteEvent(event, this.textarea, this.bracketedPasteMode, 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(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    this._parent = parent || this._parent;\n\n    if (!this._parent) {\n      throw new Error('Terminal requires a parent element.');\n    }\n\n    if (!document.body.contains(parent)) {\n      this._logService.warn('Terminal.open was called on an element that was not attached to the DOM');\n    }\n\n    this._document = this._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    this._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    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    this._charSizeService = this._instantiationService.createInstance(CharSizeService, this._document, this._helperContainer);\n    this._instantiationService.setService(ICharSizeService, this._charSizeService);\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._theme = this.options.theme || this._theme;\n    this.options.theme = undefined;\n    this._colorManager = new ColorManager(document, this.options.allowTransparency);\n    this._colorManager.setTheme(this._theme);\n\n    const renderer = this._createRenderer();\n    this._renderService = this._instantiationService.createInstance(RenderService, renderer, this.rows, this.screenElement);\n    this._instantiationService.setService(IRenderService, this._renderService);\n    this._renderService.onRender(e => this._onRender.fire(e));\n    this.onResize(e => this._renderService.resize(e.cols, e.rows));\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, suppressEvent: boolean) => this.scrollLines(amount, suppressEvent),\n      this._viewportElement,\n      this._viewportScrollArea\n    );\n    this.viewport.onThemeChange(this._colorManager.colors);\n    this.register(this.viewport);\n\n    this.register(this.onCursorMove(() => this._renderService.onCursorMove()));\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._instantiationService.createInstance(SelectionService,\n      (amount: number, suppressEvent: boolean) => this.scrollLines(amount, suppressEvent),\n      this.element,\n      this.screenElement);\n    this._instantiationService.setService(ISelectionService, this._selectionService);\n    this.register(this._selectionService.onSelectionChange(() => this._onSelectionChange.fire()));\n    this.register(this._selectionService.onRedrawRequest(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(() => {\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\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.mouseEvents) {\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    // 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 new Renderer(this._colorManager.colors, this, this._bufferService, this._charSizeService, this.optionsService);\n      case 'dom': return new DomRenderer(this, this._colorManager.colors, this._charSizeService, this.optionsService);\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    if (this._colorManager) {\n      this._colorManager.setTheme(theme);\n    }\n    if (this._renderService) {\n      this._renderService.setColors(this._colorManager.colors);\n    }\n    if (this.viewport) {\n      this.viewport.onThemeChange(this._colorManager.colors);\n    }\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      let pos;\n\n      // get mouse coordinates\n      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;\n      switch ((<any>ev).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          // only UP/DOWN wheel events are respected\n          if ((ev as WheelEvent).deltaY !== 0) {\n            action = (ev as WheelEvent).deltaY < 0 ? CoreMouseAction.UP : CoreMouseAction.DOWN;\n          }\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: Event) => void} = {\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        ev.preventDefault();\n        return this.cancel(ev);\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._coreMouseService.onProtocolChange(events => {\n      // apply global changes on events\n      this.mouseEvents = events;\n      if (events) {\n        if (this.optionsService.options.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);\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.mouseEvents || 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      if (!requestedEvents.wheel) {\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        if (!this.buffer.hasScrollback) {\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        }\n        return;\n      }\n    }));\n\n    // allow wheel scrolling in\n    // the shell for example\n    this.register(addDisposableDomListener(el, 'wheel', (ev: WheelEvent) => {\n      if (requestedEvents.wheel) return;\n      if (!this.viewport.onWheel(ev)) {\n        return this.cancel(ev);\n      }\n    }));\n\n    this.register(addDisposableDomListener(el, 'touchstart', (ev: TouchEvent) => {\n      if (this.mouseEvents) return;\n      this.viewport.onTouchStart(ev);\n      return this.cancel(ev);\n    }));\n\n    this.register(addDisposableDomListener(el, 'touchmove', (ev: TouchEvent) => {\n      if (this.mouseEvents) return;\n      if (!this.viewport.onTouchMove(ev)) {\n        return this.cancel(ev);\n      }\n    }));\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    if (this._renderService) {\n      this._renderService.refreshRows(start, end);\n    }\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    if (this.linkifier) {\n      this.linkifier.linkifyRows(start, end);\n    }\n  }\n\n  /**\n   * Change the cursor style for different selection modes\n   */\n  public updateCursorStyle(ev: KeyboardEvent): void {\n    if (this._selectionService && 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  public showCursor(): void {\n    if (!this.cursorState) {\n      this.cursorState = 1;\n      this.refresh(this.buffer.y, this.buffer.y);\n    }\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(isWrapped: boolean = false): void {\n    let newLine: IBufferLine;\n    newLine = this._blankLine;\n    const eraseAttr = this.eraseAttrData();\n    if (!newLine || newLine.length !== this.cols || newLine.getFg(0) !== eraseAttr.fg || newLine.getBg(0) !== eraseAttr.bg) {\n      newLine = this.buffer.getBlankLine(eraseAttr, isWrapped);\n      this._blankLine = newLine;\n    }\n    newLine.isWrapped = isWrapped;\n\n    const topRow = this.buffer.ybase + this.buffer.scrollTop;\n    const bottomRow = this.buffer.ybase + this.buffer.scrollBottom;\n\n    if (this.buffer.scrollTop === 0) {\n      // Determine whether the buffer is going to be trimmed after insertion.\n      const willBufferBeTrimmed = this.buffer.lines.isFull;\n\n      // Insert the line using the fastest method\n      if (bottomRow === this.buffer.lines.length - 1) {\n        if (willBufferBeTrimmed) {\n          this.buffer.lines.recycle().copyFrom(newLine);\n        } else {\n          this.buffer.lines.push(newLine.clone());\n        }\n      } else {\n        this.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        this.buffer.ybase++;\n        // Only scroll the ydisp with ybase if the user has not scrolled up\n        if (!this._userScrolling) {\n          this.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._userScrolling) {\n          this.buffer.ydisp = Math.max(this.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      this.buffer.lines.shiftElements(topRow + 1, scrollRegionHeight - 1, -1);\n      this.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._userScrolling) {\n      this.buffer.ydisp = this.buffer.ybase;\n    }\n\n    // Flag rows that need updating\n    this._dirtyRowService.markRangeDirty(this.buffer.scrollTop, this.buffer.scrollBottom);\n\n    this._onScroll.fire(this.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): void {\n    if (disp < 0) {\n      if (this.buffer.ydisp === 0) {\n        return;\n      }\n      this._userScrolling = true;\n    } else if (disp + this.buffer.ydisp >= this.buffer.ybase) {\n      this._userScrolling = false;\n    }\n\n    const oldYdisp = this.buffer.ydisp;\n    this.buffer.ydisp = Math.max(Math.min(this.buffer.ydisp + disp, this.buffer.ybase), 0);\n\n    // No change occurred, don't trigger scroll/refresh\n    if (oldYdisp === this.buffer.ydisp) {\n      return;\n    }\n\n    if (!suppressScrollEvent) {\n      this._onScroll.fire(this.buffer.ydisp);\n    }\n\n    this.refresh(0, this.rows - 1);\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  public paste(data: string): void {\n    paste(data, this.textarea, this.bracketedPasteMode, 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  /** Add handler for ESC escape sequence. See xterm.d.ts for details. */\n  public addEscHandler(id: IFunctionIdentifier, callback: () => boolean): IDisposable {\n    return this._inputHandler.addEscHandler(id, callback);\n  }\n\n  /** Add handler for DCS escape sequence. See xterm.d.ts for details. */\n  public addDcsHandler(id: IFunctionIdentifier, callback: (data: string, param: IParams) => boolean): IDisposable {\n    return this._inputHandler.addDcsHandler(id, callback);\n  }\n\n  /** Add handler for CSI escape sequence. See xterm.d.ts for details. */\n  public addCsiHandler(id: IFunctionIdentifier, callback: (params: IParams) => boolean): IDisposable {\n    return this._inputHandler.addCsiHandler(id, callback);\n  }\n  /** Add handler for OSC escape sequence. See xterm.d.ts for details. */\n  public addOscHandler(ident: number, callback: (data: string) => boolean): IDisposable {\n    return this._inputHandler.addOscHandler(ident, callback);\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 registerCharacterJoiner(handler: CharacterJoinerHandler): number {\n    const joinerId = this._renderService.registerCharacterJoiner(handler);\n    this.refresh(0, this.rows - 1);\n    return joinerId;\n  }\n\n  public deregisterCharacterJoiner(joinerId: number): void {\n    if (this._renderService.deregisterCharacterJoiner(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 {\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  /**\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.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    if (this._selectionService) {\n      this._selectionService.clearSelection();\n    }\n  }\n\n  /**\n   * Selects all text within the terminal.\n   */\n  public selectAll(): void {\n    if (this._selectionService) {\n      this._selectionService.selectAll();\n    }\n  }\n\n  public selectLines(start: number, end: number): void {\n    if (this._selectionService) {\n      this._selectionService.selectLines(start, end);\n    }\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 {\n    this._keyDownHandled = false;\n\n    if (this._customKeyEventHandler && this._customKeyEventHandler(event) === false) {\n      return false;\n    }\n\n    if (!this._compositionHelper.keydown(event)) {\n      if (this.buffer.ybase !== this.buffer.ydisp) {\n        this.scrollToBottom();\n      }\n      return false;\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    // 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.options.screenReaderMode) {\n      return this.cancel(event, true);\n    }\n\n    this._keyDownHandled = true;\n  }\n\n  private _isThirdLevelShift(browser: IBrowser, ev: IKeyboardEvent): 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\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  /**\n   * Set the G level of the terminal\n   * @param g\n   */\n  public setgLevel(g: number): void {\n    this.glevel = g;\n    this.charset = this.charsets[g];\n  }\n\n  /**\n   * Set the charset for the given G level of the terminal\n   * @param g\n   * @param charset\n   */\n  public setgCharset(g: number, charset: ICharset): void {\n    this.charsets[g] = charset;\n    if (this.glevel === g) {\n      this.charset = charset;\n    }\n  }\n\n  protected _keyUp(ev: KeyboardEvent): void {\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  }\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    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    return true;\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    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 (isNaN(x) || isNaN(y)) {\n      return;\n    }\n\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    if (x < MINIMUM_COLS) x = MINIMUM_COLS;\n    if (y < MINIMUM_ROWS) y = MINIMUM_ROWS;\n\n    this.buffers.resize(x, y);\n\n    this._bufferService.resize(x, y);\n    this.buffers.setupTabStops(this.cols);\n\n    if (this._charSizeService) {\n      this._charSizeService.measure();\n    }\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    this.refresh(0, this.rows - 1);\n    this._onResize.fire({ cols: x, rows: y });\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.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(this.buffer.ydisp);\n  }\n\n  /**\n   * Evaluate if the current terminal is the given argument.\n   * @param term The terminal name to evaluate\n   */\n  public is(term: string): boolean {\n    return (this.options.termName + '').indexOf(term) === 0;\n  }\n\n  /**\n   * Emit the data event and populate the given data.\n   * @param data The data to populate in the event.\n   */\n  // public handler(data: string): void {\n  //   // Prevents all events to pty process if stdin is disabled\n  //   if (this.options.disableStdin) {\n  //     return;\n  //   }\n\n  //   // Clear the selection if the selection manager is available and has an active selection\n  //   if (this.selectionService && this.selectionService.hasSelection) {\n  //     this.selectionService.clearSelection();\n  //   }\n\n  //   // Input is being sent to the terminal, the terminal should focus the prompt.\n  //   if (this.buffer.ybase !== this.buffer.ydisp) {\n  //     this.scrollToBottom();\n  //   }\n  //   this._onData.fire(data);\n  // }\n\n  /**\n   * Emit the 'title' event and populate the given title.\n   * @param title The title to populate in the event.\n   */\n  public handleTitle(title: string): void {\n    this._onTitleChange.fire(title);\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    const inputHandler = this._inputHandler;\n    const cursorState = this.cursorState;\n    const userScrolling = this._userScrolling;\n\n    this._setup();\n    this._bufferService.reset();\n    this._coreService.reset();\n    this._coreMouseService.reset();\n    if (this._selectionService) {\n      this._selectionService.reset();\n    }\n\n    // reattach\n    this._customKeyEventHandler = customKeyEventHandler;\n    this._inputHandler = inputHandler;\n    this.cursorState = cursorState;\n    this._userScrolling = userScrolling;\n\n    // do a full screen refresh\n    this.refresh(0, this.rows - 1);\n    if (this.viewport) {\n      this.viewport.syncScrollArea();\n    }\n  }\n\n  // TODO: Remove cancel function and cancelEvents option\n  public cancel(ev: Event, force?: boolean): boolean {\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  public write(data: string | Uint8Array, callback?: () => void): void {\n    this._writeBuffer.write(data, callback);\n  }\n\n  public writeSync(data: string | Uint8Array): void {\n    this._writeBuffer.writeSync(data);\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) 2016 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ICharSizeService } 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\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  constructor(\n    private readonly _textarea: HTMLTextAreaElement,\n    private readonly _compositionView: HTMLElement,\n    @IBufferService private readonly _bufferService: IBufferService,\n    @IOptionsService private readonly _optionsService: IOptionsService,\n    @ICharSizeService private readonly _charSizeService: ICharSizeService,\n    @ICoreService private readonly _coreService: ICoreService\n  ) {\n    this._isComposing = false;\n    this._isSendingComposition = false;\n    this._compositionPosition = { start: 0, end: 0 };\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._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: CompositionEvent): 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      } else 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    this._clearTextareaPosition();\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          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          this._coreService.triggerDataEvent(input, true);\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._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 cellHeight = Math.ceil(this._charSizeService.height * this._optionsService.options.lineHeight);\n      const cursorTop = this._bufferService.buffer.y * cellHeight;\n      const cursorLeft = this._bufferService.buffer.x * this._charSizeService.width;\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.options.fontFamily;\n      this._compositionView.style.fontSize = this._optionsService.options.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      this._textarea.style.width = compositionViewBounds.width + 'px';\n      this._textarea.style.height = compositionViewBounds.height + '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   * Clears the textarea's position so that the cursor does not blink on IE.\n   * @private\n   */\n  private _clearTextareaPosition(): void {\n    this._textarea.style.left = '';\n    this._textarea.style.top = '';\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';\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 _lastRecordedBufferLength: number = 0;\n  private _lastRecordedViewportHeight: number = 0;\n  private _lastRecordedBufferHeight: number = 0;\n  private _lastTouchY: number = 0;\n  private _lastScrollTop: number = 0;\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, suppressEvent: boolean) => void,\n    private readonly _viewportElement: HTMLElement,\n    private readonly _scrollArea: 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    // 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._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   * 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    const newScrollTop = this._bufferService.buffer.ydisp * this._currentRowHeight;\n    if (this._lastScrollTop !== newScrollTop) {\n      this._refresh(immediate);\n      return;\n    }\n\n    // If element's scroll top changed, this can happen when hiding the element\n    if (this._lastScrollTop !== this._viewportElement.scrollTop) {\n      this._refresh(immediate);\n      return;\n    }\n\n    // If row height changed\n    if (this._renderService.dimensions.scaledCellHeight / window.devicePixelRatio !== this._currentRowHeight) {\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      return;\n    }\n\n    const newRow = Math.round(this._lastScrollTop / this._currentRowHeight);\n    const diff = newRow - this._bufferService.buffer.ydisp;\n    this._scrollLines(diff, true);\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) {\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) {\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.options.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.options.fastScrollSensitivity * this._optionsService.options.scrollSensitivity;\n    }\n\n    return amount * this._optionsService.options.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) 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, bracketedPasteMode: boolean, coreService: ICoreService): void {\n  ev.stopPropagation();\n  if (ev.clipboardData) {\n    const text = ev.clipboardData.getData('text/plain');\n    paste(text, textarea, bracketedPasteMode, coreService);\n  }\n}\n\nexport function paste(text: string, textarea: HTMLTextAreaElement, bracketedPasteMode: boolean, coreService: ICoreService): void {\n  text = prepareTextForTerminal(text);\n  text = bracketTextForPaste(text, 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.position = 'absolute';\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  // Reset the terminal textarea's styling\n  // Timeout needs to be long enough for click event to be handled.\n  setTimeout(() => {\n    textarea.style.position = null;\n    textarea.style.width = null;\n    textarea.style.height = null;\n    textarea.style.left = null;\n    textarea.style.top = null;\n    textarea.style.zIndex = null;\n  }, 200);\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 && !selectionService.isClickInSelection(ev)) {\n    selectionService.selectWordAtCursor(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) 2014 The xterm.js authors. All rights reserved.\n * Copyright (c) 2012-2013, Christopher Jeffrey (MIT License)\n * @license MIT\n */\n\nimport { IInputHandler, IInputHandlingTerminal } from './Types';\nimport { C0, C1 } from 'common/data/EscapeSequences';\nimport { CHARSETS, DEFAULT_CHARSET } from 'common/data/Charsets';\nimport { wcwidth } from 'common/CharWidth';\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 } from 'common/buffer/Constants';\nimport { CellData } from 'common/buffer/CellData';\nimport { AttributeData } from 'common/buffer/AttributeData';\nimport { IAttributeData, IDisposable } from 'common/Types';\nimport { ICoreService, IBufferService, IOptionsService, ILogService, IDirtyRowService, ICoreMouseService } from 'common/services/Services';\nimport { OscHandler } from 'common/parser/OscParser';\nimport { DcsHandler } from 'common/parser/DcsParser';\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 * Max length of the UTF32 input buffer. Real memory consumption is 4 times higher.\n */\nconst MAX_PARSEBUFFER_LENGTH = 131072;\n\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 */\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  hook(params: IParams): void {\n    this._data = new Uint32Array(0);\n  }\n\n  put(data: Uint32Array, start: number, end: number): void {\n    this._data = concat(this._data, data.subarray(start, end));\n  }\n\n  unhook(success: boolean): void {\n    if (!success) {\n      this._data = new Uint32Array(0);\n      return;\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        return this._coreService.triggerDataEvent(`${C0.ESC}P1$r0\"q${C0.ESC}\\\\`);\n      case '\"p': // DECSCL\n        return this._coreService.triggerDataEvent(`${C0.ESC}P1$r61\"p${C0.ESC}\\\\`);\n      case 'r': // DECSTBM\n        const pt = '' + (this._bufferService.buffer.scrollTop + 1) +\n                ';' + (this._bufferService.buffer.scrollBottom + 1) + 'r';\n        return this._coreService.triggerDataEvent(`${C0.ESC}P1$r${pt}${C0.ESC}\\\\`);\n      case 'm': // SGR\n        // TODO: report real settings instead of 0m\n        return this._coreService.triggerDataEvent(`${C0.ESC}P1$r0m${C0.ESC}\\\\`);\n      case ' q': // DECSCUSR\n        const STYLES: {[key: string]: number} = {'block': 2, 'underline': 4, 'bar': 6};\n        let style = STYLES[this._optionsService.options.cursorStyle];\n        style -= this._optionsService.options.cursorBlink ? 1 : 0;\n        return this._coreService.triggerDataEvent(`${C0.ESC}P1$r${style} q${C0.ESC}\\\\`);\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  }\n}\n\n/**\n * DCS Ps; Ps| Pt ST\n *   DECUDK (https://vt100.net/docs/vt510-rm/DECUDK.html)\n *   not supported\n */\n\n/**\n * DCS + q Pt ST (xterm)\n *   Request Terminfo String\n *   not implemented\n */\n\n/**\n * DCS + p Pt ST (xterm)\n *   Set Terminfo Data\n *   not supported\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\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\n  constructor(\n    protected _terminal: IInputHandlingTerminal,\n    private readonly _bufferService: IBufferService,\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 _parser: IEscapeSequenceParser = new EscapeSequenceParser())\n  {\n    super();\n\n    this.register(this._parser);\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.setCsiHandler({final: '@'}, params => this.insertChars(params));\n    this._parser.setCsiHandler({intermediates: ' ', final: '@'}, params => this.scrollLeft(params));\n    this._parser.setCsiHandler({final: 'A'}, params => this.cursorUp(params));\n    this._parser.setCsiHandler({intermediates: ' ', final: 'A'}, params => this.scrollRight(params));\n    this._parser.setCsiHandler({final: 'B'}, params => this.cursorDown(params));\n    this._parser.setCsiHandler({final: 'C'}, params => this.cursorForward(params));\n    this._parser.setCsiHandler({final: 'D'}, params => this.cursorBackward(params));\n    this._parser.setCsiHandler({final: 'E'}, params => this.cursorNextLine(params));\n    this._parser.setCsiHandler({final: 'F'}, params => this.cursorPrecedingLine(params));\n    this._parser.setCsiHandler({final: 'G'}, params => this.cursorCharAbsolute(params));\n    this._parser.setCsiHandler({final: 'H'}, params => this.cursorPosition(params));\n    this._parser.setCsiHandler({final: 'I'}, params => this.cursorForwardTab(params));\n    this._parser.setCsiHandler({final: 'J'}, params => this.eraseInDisplay(params));\n    this._parser.setCsiHandler({prefix: '?', final: 'J'}, params => this.eraseInDisplay(params));\n    this._parser.setCsiHandler({final: 'K'}, params => this.eraseInLine(params));\n    this._parser.setCsiHandler({prefix: '?', final: 'K'}, params => this.eraseInLine(params));\n    this._parser.setCsiHandler({final: 'L'}, params => this.insertLines(params));\n    this._parser.setCsiHandler({final: 'M'}, params => this.deleteLines(params));\n    this._parser.setCsiHandler({final: 'P'}, params => this.deleteChars(params));\n    this._parser.setCsiHandler({final: 'S'}, params => this.scrollUp(params));\n    this._parser.setCsiHandler({final: 'T'}, params => this.scrollDown(params));\n    this._parser.setCsiHandler({final: 'X'}, params => this.eraseChars(params));\n    this._parser.setCsiHandler({final: 'Z'}, params => this.cursorBackwardTab(params));\n    this._parser.setCsiHandler({final: '`'}, params => this.charPosAbsolute(params));\n    this._parser.setCsiHandler({final: 'a'}, params => this.hPositionRelative(params));\n    this._parser.setCsiHandler({final: 'b'}, params => this.repeatPrecedingCharacter(params));\n    this._parser.setCsiHandler({final: 'c'}, params => this.sendDeviceAttributesPrimary(params));\n    this._parser.setCsiHandler({prefix: '>', final: 'c'}, params => this.sendDeviceAttributesSecondary(params));\n    this._parser.setCsiHandler({final: 'd'}, params => this.linePosAbsolute(params));\n    this._parser.setCsiHandler({final: 'e'}, params => this.vPositionRelative(params));\n    this._parser.setCsiHandler({final: 'f'}, params => this.hVPosition(params));\n    this._parser.setCsiHandler({final: 'g'}, params => this.tabClear(params));\n    this._parser.setCsiHandler({final: 'h'}, params => this.setMode(params));\n    this._parser.setCsiHandler({prefix: '?', final: 'h'}, params => this.setModePrivate(params));\n    this._parser.setCsiHandler({final: 'l'}, params => this.resetMode(params));\n    this._parser.setCsiHandler({prefix: '?', final: 'l'}, params => this.resetModePrivate(params));\n    this._parser.setCsiHandler({final: 'm'}, params => this.charAttributes(params));\n    this._parser.setCsiHandler({final: 'n'}, params => this.deviceStatus(params));\n    this._parser.setCsiHandler({prefix: '?', final: 'n'}, params => this.deviceStatusPrivate(params));\n    this._parser.setCsiHandler({intermediates: '!', final: 'p'}, params => this.softReset(params));\n    this._parser.setCsiHandler({intermediates: ' ', final: 'q'}, params => this.setCursorStyle(params));\n    this._parser.setCsiHandler({final: 'r'}, params => this.setScrollRegion(params));\n    this._parser.setCsiHandler({final: 's'}, params => this.saveCursor(params));\n    this._parser.setCsiHandler({final: 'u'}, params => this.restoreCursor(params));\n    this._parser.setCsiHandler({intermediates: '\\'', final: '}'}, params => this.insertColumns(params));\n    this._parser.setCsiHandler({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.setOscHandler(0, new OscHandler((data: string) => this.setTitle(data)));\n    //   1 - icon name\n    //   2 - title\n    this._parser.setOscHandler(2, new OscHandler((data: string) => this.setTitle(data)));\n    //   3 - set property X in the form \"prop=value\"\n    //   4 - Change Color Number\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    //  11 - Change VT100 text background color to Pt.\n    //  12 - Change text cursor color to Pt.\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    // 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    // 111 - Reset VT100 text background color.\n    // 112 - Reset text cursor color.\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.setEscHandler({final: '7'}, () => this.saveCursor());\n    this._parser.setEscHandler({final: '8'}, () => this.restoreCursor());\n    this._parser.setEscHandler({final: 'D'}, () => this.index());\n    this._parser.setEscHandler({final: 'E'}, () => this.nextLine());\n    this._parser.setEscHandler({final: 'H'}, () => this.tabSet());\n    this._parser.setEscHandler({final: 'M'}, () => this.reverseIndex());\n    this._parser.setEscHandler({final: '='}, () => this.keypadApplicationMode());\n    this._parser.setEscHandler({final: '>'}, () => this.keypadNumericMode());\n    this._parser.setEscHandler({final: 'c'}, () => this.reset());\n    this._parser.setEscHandler({final: 'n'}, () => this.setgLevel(2));\n    this._parser.setEscHandler({final: 'o'}, () => this.setgLevel(3));\n    this._parser.setEscHandler({final: '|'}, () => this.setgLevel(3));\n    this._parser.setEscHandler({final: '}'}, () => this.setgLevel(2));\n    this._parser.setEscHandler({final: '~'}, () => this.setgLevel(1));\n    this._parser.setEscHandler({intermediates: '%', final: '@'}, () => this.selectDefaultCharset());\n    this._parser.setEscHandler({intermediates: '%', final: 'G'}, () => this.selectDefaultCharset());\n    for (const flag in CHARSETS) {\n      this._parser.setEscHandler({intermediates: '(', final: flag}, () => this.selectCharset('(' + flag));\n      this._parser.setEscHandler({intermediates: ')', final: flag}, () => this.selectCharset(')' + flag));\n      this._parser.setEscHandler({intermediates: '*', final: flag}, () => this.selectCharset('*' + flag));\n      this._parser.setEscHandler({intermediates: '+', final: flag}, () => this.selectCharset('+' + flag));\n      this._parser.setEscHandler({intermediates: '-', final: flag}, () => this.selectCharset('-' + flag));\n      this._parser.setEscHandler({intermediates: '.', final: flag}, () => this.selectCharset('.' + flag));\n      this._parser.setEscHandler({intermediates: '/', final: flag}, () => this.selectCharset('/' + flag)); // TODO: supported?\n    }\n    this._parser.setEscHandler({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.setDcsHandler({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  public parse(data: string | Uint8Array): void {\n    let buffer = this._bufferService.buffer;\n    const cursorStartX = buffer.x;\n    const cursorStartY = buffer.y;\n\n    this._logService.debug('parsing data', data);\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    // process big data in smaller chunks\n    if (data.length > MAX_PARSEBUFFER_LENGTH) {\n      for (let i = 0; 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        this._parser.parse(this._parseBuffer, len);\n      }\n    } else {\n      const len = (typeof data === 'string')\n        ? this._stringDecoder.decode(data, this._parseBuffer)\n        : this._utf8Decoder.decode(data, this._parseBuffer);\n      this._parser.parse(this._parseBuffer, len);\n    }\n\n    buffer = this._bufferService.buffer;\n    if (buffer.x !== cursorStartX || buffer.y !== cursorStartY) {\n      this._onCursorMove.fire();\n    }\n    this._terminal.refresh(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 buffer = this._bufferService.buffer;\n    const charset = this._terminal.charset;\n    const screenReaderMode = this._optionsService.options.screenReaderMode;\n    const cols = this._bufferService.cols;\n    const wraparoundMode = this._terminal.wraparoundMode;\n    const insertMode = this._terminal.insertMode;\n    const curAttr = this._terminal.curAttrData;\n    let bufferRow = buffer.lines.get(buffer.y + buffer.ybase);\n\n    this._dirtyRowService.markDirty(buffer.y);\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 = 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._terminal.onA11yCharEmitter.fire(stringFromCodePoint(code));\n      }\n\n      // insert combining char at last cursor position\n      // FIXME: needs handling after cursor jumps\n      // buffer.x should never be 0 for a combining char\n      // since they always follow a cell consuming char\n      // therefore we can test for buffer.x to avoid overflow left\n      if (!chWidth && buffer.x) {\n        if (!bufferRow.getWidth(buffer.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(buffer.x - 2, code);\n        } else {\n          bufferRow.addCodepointToCell(buffer.x - 1, code);\n        }\n        continue;\n      }\n\n      // goto next line if ch would overflow\n      // TODO: needs a global min terminal width of 2\n      // FIXME: additionally ensure chWidth fits into a line\n      //   -->  maybe forbid cols<xy at higher level as it would\n      //        introduce a bad runtime penalty here\n      if (buffer.x + chWidth - 1 >= cols) {\n        // autowrap - DECAWM\n        // automatically wraps to the beginning of the next line\n        if (wraparoundMode) {\n          buffer.x = 0;\n          buffer.y++;\n          if (buffer.y === buffer.scrollBottom + 1) {\n            buffer.y--;\n            this._terminal.scroll(true);\n          } else {\n            if (buffer.y >= this._bufferService.rows) {\n              buffer.y = this._bufferService.rows - 1;\n            }\n            // The line already exists (eg. the initial viewport), mark it as a\n            // wrapped line\n            buffer.lines.get(buffer.y).isWrapped = true;\n          }\n          // row changed, get it again\n          bufferRow = buffer.lines.get(buffer.y + buffer.ybase);\n        } else {\n          buffer.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(buffer.x, chWidth, buffer.getNullCell(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);\n        }\n      }\n\n      // write current char to buffer and advance cursor\n      bufferRow.setCellFromCodePoint(buffer.x++, code, chWidth, curAttr.fg, curAttr.bg);\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 buffer.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(buffer.x++, 0, 0, curAttr.fg, curAttr.bg);\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) {\n      bufferRow.loadCell(buffer.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    this._dirtyRowService.markDirty(buffer.y);\n  }\n\n  /**\n   * Forward addCsiHandler from parser.\n   */\n  public addCsiHandler(id: IFunctionIdentifier, callback: (params: IParams) => boolean): IDisposable {\n    return this._parser.addCsiHandler(id, callback);\n  }\n\n  /**\n   * Forward addDcsHandler from parser.\n   */\n  public addDcsHandler(id: IFunctionIdentifier, callback: (data: string, param: IParams) => boolean): IDisposable {\n    return this._parser.addDcsHandler(id, new DcsHandler(callback));\n  }\n\n  /**\n   * Forward addEscHandler from parser.\n   */\n  public addEscHandler(id: IFunctionIdentifier, callback: () => boolean): IDisposable {\n    return this._parser.addEscHandler(id, callback);\n  }\n\n  /**\n   * Forward addOscHandler from parser.\n   */\n  public addOscHandler(ident: number, callback: (data: string) => boolean): IDisposable {\n    return this._parser.addOscHandler(ident, new OscHandler(callback));\n  }\n\n  /**\n   * BEL\n   * Bell (Ctrl-G).\n   */\n  public bell(): void {\n    this._terminal.bell();\n  }\n\n  /**\n   * LF\n   * Line Feed or New Line (NL).  (LF  is Ctrl-J).\n   */\n  public lineFeed(): void {\n    // make buffer local for faster access\n    const buffer = this._bufferService.buffer;\n\n    if (this._optionsService.options.convertEol) {\n      buffer.x = 0;\n    }\n    buffer.y++;\n    if (buffer.y === buffer.scrollBottom + 1) {\n      buffer.y--;\n      this._terminal.scroll();\n    } else if (buffer.y >= this._bufferService.rows) {\n      buffer.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 (buffer.x >= this._bufferService.cols) {\n      buffer.x--;\n    }\n\n    this._onLineFeed.fire();\n  }\n\n  /**\n   * CR\n   * Carriage Return (Ctrl-M).\n   */\n  public carriageReturn(): void {\n    this._bufferService.buffer.x = 0;\n  }\n\n  /**\n   * BS\n   * Backspace (Ctrl-H).\n   */\n  public backspace(): void {\n    this._restrictCursor();\n    if (this._bufferService.buffer.x > 0) {\n      this._bufferService.buffer.x--;\n    }\n  }\n\n  /**\n   * TAB\n   * Horizontal Tab (HT) (Ctrl-I).\n   */\n  public tab(): void {\n    if (this._bufferService.buffer.x >= this._bufferService.cols) {\n      return;\n    }\n    const originalX = this._bufferService.buffer.x;\n    this._bufferService.buffer.x = this._bufferService.buffer.nextStop();\n    if (this._optionsService.options.screenReaderMode) {\n      this._terminal.onA11yTabEmitter.fire(this._bufferService.buffer.x - originalX);\n    }\n  }\n\n  /**\n   * SO\n   * Shift Out (Ctrl-N) -> Switch to Alternate Character Set.  This invokes the\n   * G1 character set.\n   */\n  public shiftOut(): void {\n    this._terminal.setgLevel(1);\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  public shiftIn(): void {\n    this._terminal.setgLevel(0);\n  }\n\n  /**\n   * Restrict cursor to viewport size / scroll margin (origin mode).\n   */\n  private _restrictCursor(): void {\n    this._bufferService.buffer.x = Math.min(this._bufferService.cols - 1, Math.max(0, this._bufferService.buffer.x));\n    this._bufferService.buffer.y = this._terminal.originMode\n      ? Math.min(this._bufferService.buffer.scrollBottom, Math.max(this._bufferService.buffer.scrollTop, this._bufferService.buffer.y))\n      : Math.min(this._bufferService.rows - 1, Math.max(0, this._bufferService.buffer.y));\n  }\n\n  /**\n   * Set absolute cursor position.\n   */\n  private _setCursor(x: number, y: number): void {\n    if (this._terminal.originMode) {\n      this._bufferService.buffer.x = x;\n      this._bufferService.buffer.y = this._bufferService.buffer.scrollTop + y;\n    } else {\n      this._bufferService.buffer.x = x;\n      this._bufferService.buffer.y = y;\n    }\n    this._restrictCursor();\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._bufferService.buffer.x + x, this._bufferService.buffer.y + y);\n  }\n\n  /**\n   * CSI Ps A\n   * Cursor Up Ps Times (default = 1) (CUU).\n   */\n  public cursorUp(params: IParams): void {\n    // stop at scrollTop\n    const diffToTop = this._bufferService.buffer.y - this._bufferService.buffer.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  }\n\n  /**\n   * CSI Ps B\n   * Cursor Down Ps Times (default = 1) (CUD).\n   */\n  public cursorDown(params: IParams): void {\n    // stop at scrollBottom\n    const diffToBottom = this._bufferService.buffer.scrollBottom - this._bufferService.buffer.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  }\n\n  /**\n   * CSI Ps C\n   * Cursor Forward Ps Times (default = 1) (CUF).\n   */\n  public cursorForward(params: IParams): void {\n    this._moveCursor(params.params[0] || 1, 0);\n  }\n\n  /**\n   * CSI Ps D\n   * Cursor Backward Ps Times (default = 1) (CUB).\n   */\n  public cursorBackward(params: IParams): void {\n    this._moveCursor(-(params.params[0] || 1), 0);\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  public cursorNextLine(params: IParams): void {\n    this.cursorDown(params);\n    this._bufferService.buffer.x = 0;\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  public cursorPrecedingLine(params: IParams): void {\n    this.cursorUp(params);\n    this._bufferService.buffer.x = 0;\n  }\n\n  /**\n   * CSI Ps G\n   * Cursor Character Absolute  [column] (default = [row,1]) (CHA).\n   */\n  public cursorCharAbsolute(params: IParams): void {\n    this._setCursor((params.params[0] || 1) - 1, this._bufferService.buffer.y);\n  }\n\n  /**\n   * CSI Ps ; Ps H\n   * Cursor Position [row;column] (default = [1,1]) (CUP).\n   */\n  public cursorPosition(params: IParams): void {\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\n  /**\n   * CSI Pm `  Character Position Absolute\n   *   [column] (default = [row,1]) (HPA).\n   * Currently same functionality as CHA.\n   */\n  public charPosAbsolute(params: IParams): void {\n    this._setCursor((params.params[0] || 1) - 1, this._bufferService.buffer.y);\n  }\n\n  /**\n   * CSI Pm a  Character Position Relative\n   *   [columns] (default = [row,col+1]) (HPR)\n   * Currently same functionality as CUF.\n   */\n  public hPositionRelative(params: IParams): void {\n    this._moveCursor(params.params[0] || 1, 0);\n  }\n\n  /**\n   * CSI Pm d  Vertical Position Absolute (VPA)\n   *   [row] (default = [1,column])\n   */\n  public linePosAbsolute(params: IParams): void {\n    this._setCursor(this._bufferService.buffer.x, (params.params[0] || 1) - 1);\n  }\n\n  /**\n   * CSI Pm e  Vertical Position Relative (VPR)\n   *   [rows] (default = [row+1,column])\n   * reuse CSI Ps B ?\n   */\n  public vPositionRelative(params: IParams): void {\n    this._moveCursor(0, params.params[0] || 1);\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  public hVPosition(params: IParams): void {\n    this.cursorPosition(params);\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  public tabClear(params: IParams): void {\n    const param = params.params[0];\n    if (param === 0) {\n      delete this._bufferService.buffer.tabs[this._bufferService.buffer.x];\n    } else if (param === 3) {\n      this._bufferService.buffer.tabs = {};\n    }\n  }\n\n  /**\n   * CSI Ps I\n   *   Cursor Forward Tabulation Ps tab stops (default = 1) (CHT).\n   */\n  public cursorForwardTab(params: IParams): void {\n    if (this._bufferService.buffer.x >= this._bufferService.cols) {\n      return;\n    }\n    let param = params.params[0] || 1;\n    while (param--) {\n      this._bufferService.buffer.x = this._bufferService.buffer.nextStop();\n    }\n  }\n\n  /**\n   * CSI Ps Z  Cursor Backward Tabulation Ps tab stops (default = 1) (CBT).\n   */\n  public cursorBackwardTab(params: IParams): void {\n    if (this._bufferService.buffer.x >= this._bufferService.cols) {\n      return;\n    }\n    let param = params.params[0] || 1;\n\n    // make buffer local for faster access\n    const buffer = this._bufferService.buffer;\n\n    while (param--) {\n      buffer.x = buffer.prevStop();\n    }\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   */\n  private _eraseInBufferLine(y: number, start: number, end: number, clearWrap: boolean = false): void {\n    const line = this._bufferService.buffer.lines.get(this._bufferService.buffer.ybase + y);\n    line.replaceCells(\n      start,\n      end,\n      this._bufferService.buffer.getNullCell(this._terminal.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._bufferService.buffer.lines.get(this._bufferService.buffer.ybase + y);\n    line.fill(this._bufferService.buffer.getNullCell(this._terminal.eraseAttrData()));\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  public eraseInDisplay(params: IParams): void {\n    this._restrictCursor();\n    let j;\n    switch (params.params[0]) {\n      case 0:\n        j = this._bufferService.buffer.y;\n        this._dirtyRowService.markDirty(j);\n        this._eraseInBufferLine(j++, this._bufferService.buffer.x, this._bufferService.cols, this._bufferService.buffer.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._bufferService.buffer.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._bufferService.buffer.x + 1, true);\n        if (this._bufferService.buffer.x + 1 >= this._bufferService.cols) {\n          // Deleted entire previous line. This next line can no longer be wrapped.\n          this._bufferService.buffer.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._bufferService.buffer.lines.length - this._bufferService.rows;\n        if (scrollBackSize > 0) {\n          this._bufferService.buffer.lines.trimStart(scrollBackSize);\n          this._bufferService.buffer.ybase = Math.max(this._bufferService.buffer.ybase - scrollBackSize, 0);\n          this._bufferService.buffer.ydisp = Math.max(this._bufferService.buffer.ydisp - scrollBackSize, 0);\n          // Force a scroll event to refresh viewport\n          this._onScroll.fire(0);\n        }\n        break;\n    }\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  public eraseInLine(params: IParams): void {\n    this._restrictCursor();\n    switch (params.params[0]) {\n      case 0:\n        this._eraseInBufferLine(this._bufferService.buffer.y, this._bufferService.buffer.x, this._bufferService.cols);\n        break;\n      case 1:\n        this._eraseInBufferLine(this._bufferService.buffer.y, 0, this._bufferService.buffer.x + 1);\n        break;\n      case 2:\n        this._eraseInBufferLine(this._bufferService.buffer.y, 0, this._bufferService.cols);\n        break;\n    }\n    this._dirtyRowService.markDirty(this._bufferService.buffer.y);\n  }\n\n  /**\n   * CSI Ps L\n   * Insert Ps Line(s) (default = 1) (IL).\n   */\n  public insertLines(params: IParams): void {\n    this._restrictCursor();\n    let param = params.params[0] || 1;\n\n    // make buffer local for faster access\n    const buffer = this._bufferService.buffer;\n\n    if (buffer.y > buffer.scrollBottom || buffer.y < buffer.scrollTop) {\n      return;\n    }\n\n    const row: number = buffer.y + buffer.ybase;\n\n    const scrollBottomRowsOffset = this._bufferService.rows - 1 - buffer.scrollBottom;\n    const scrollBottomAbsolute = this._bufferService.rows - 1 + buffer.ybase - scrollBottomRowsOffset + 1;\n    while (param--) {\n      // test: echo -e '\\e[44m\\e[1L\\e[0m'\n      // blankLine(true) - xterm/linux behavior\n      buffer.lines.splice(scrollBottomAbsolute - 1, 1);\n      buffer.lines.splice(row, 0, buffer.getBlankLine(this._terminal.eraseAttrData()));\n    }\n\n    this._dirtyRowService.markRangeDirty(buffer.y, buffer.scrollBottom);\n    buffer.x = 0; // see https://vt100.net/docs/vt220-rm/chapter4.html - vt220 only?\n  }\n\n  /**\n   * CSI Ps M\n   * Delete Ps Line(s) (default = 1) (DL).\n   */\n  public deleteLines(params: IParams): void {\n    this._restrictCursor();\n    let param = params.params[0] || 1;\n\n    // make buffer local for faster access\n    const buffer = this._bufferService.buffer;\n\n    if (buffer.y > buffer.scrollBottom || buffer.y < buffer.scrollTop) {\n      return;\n    }\n\n    const row: number = buffer.y + buffer.ybase;\n\n    let j: number;\n    j = this._bufferService.rows - 1 - buffer.scrollBottom;\n    j = this._bufferService.rows - 1 + buffer.ybase - j;\n    while (param--) {\n      // test: echo -e '\\e[44m\\e[1M\\e[0m'\n      // blankLine(true) - xterm/linux behavior\n      buffer.lines.splice(row, 1);\n      buffer.lines.splice(j, 0, buffer.getBlankLine(this._terminal.eraseAttrData()));\n    }\n\n    this._dirtyRowService.markRangeDirty(buffer.y, buffer.scrollBottom);\n    buffer.x = 0; // see https://vt100.net/docs/vt220-rm/chapter4.html - vt220 only?\n  }\n\n  /**\n   * CSI Ps @\n   * Insert Ps (Blank) Character(s) (default = 1) (ICH).\n   */\n  public insertChars(params: IParams): void {\n    this._restrictCursor();\n    const line = this._bufferService.buffer.lines.get(this._bufferService.buffer.y + this._bufferService.buffer.ybase);\n    if (line) {\n      line.insertCells(\n        this._bufferService.buffer.x,\n        params.params[0] || 1,\n        this._bufferService.buffer.getNullCell(this._terminal.eraseAttrData())\n      );\n      this._dirtyRowService.markDirty(this._bufferService.buffer.y);\n    }\n  }\n\n  /**\n   * CSI Ps P\n   * Delete Ps Character(s) (default = 1) (DCH).\n   */\n  public deleteChars(params: IParams): void {\n    this._restrictCursor();\n    const line = this._bufferService.buffer.lines.get(this._bufferService.buffer.y + this._bufferService.buffer.ybase);\n    if (line) {\n      line.deleteCells(\n        this._bufferService.buffer.x,\n        params.params[0] || 1,\n        this._bufferService.buffer.getNullCell(this._terminal.eraseAttrData())\n      );\n      this._dirtyRowService.markDirty(this._bufferService.buffer.y);\n    }\n  }\n\n  /**\n   * CSI Ps S  Scroll up Ps lines (default = 1) (SU).\n   */\n  public scrollUp(params: IParams): void {\n    let param = params.params[0] || 1;\n\n    // make buffer local for faster access\n    const buffer = this._bufferService.buffer;\n\n    while (param--) {\n      buffer.lines.splice(buffer.ybase + buffer.scrollTop, 1);\n      buffer.lines.splice(buffer.ybase + buffer.scrollBottom, 0, buffer.getBlankLine(this._terminal.eraseAttrData()));\n    }\n    this._dirtyRowService.markRangeDirty(buffer.scrollTop, buffer.scrollBottom);\n  }\n\n  /**\n   * CSI Ps T  Scroll down Ps lines (default = 1) (SD).\n   */\n  public scrollDown(params: IParams): void {\n    let param = params.params[0] || 1;\n\n    // make buffer local for faster access\n    const buffer = this._bufferService.buffer;\n\n    while (param--) {\n      buffer.lines.splice(buffer.ybase + buffer.scrollBottom, 1);\n      buffer.lines.splice(buffer.ybase + buffer.scrollTop, 0, buffer.getBlankLine(DEFAULT_ATTR_DATA));\n    }\n    this._dirtyRowService.markRangeDirty(buffer.scrollTop, buffer.scrollBottom);\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  public scrollLeft(params: IParams): void {\n    const buffer = this._bufferService.buffer;\n    if (buffer.y > buffer.scrollBottom || buffer.y < buffer.scrollTop) {\n      return;\n    }\n    const param = params.params[0] || 1;\n    for (let y = buffer.scrollTop; y <= buffer.scrollBottom; ++y) {\n      const line = buffer.lines.get(buffer.ybase + y);\n      line.deleteCells(0, param, buffer.getNullCell(this._terminal.eraseAttrData()));\n      line.isWrapped = false;\n    }\n    this._dirtyRowService.markRangeDirty(buffer.scrollTop, buffer.scrollBottom);\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  public scrollRight(params: IParams): void {\n    const buffer = this._bufferService.buffer;\n    if (buffer.y > buffer.scrollBottom || buffer.y < buffer.scrollTop) {\n      return;\n    }\n    const param = params.params[0] || 1;\n    for (let y = buffer.scrollTop; y <= buffer.scrollBottom; ++y) {\n      const line = buffer.lines.get(buffer.ybase + y);\n      line.insertCells(0, param, buffer.getNullCell(this._terminal.eraseAttrData()));\n      line.isWrapped = false;\n    }\n    this._dirtyRowService.markRangeDirty(buffer.scrollTop, buffer.scrollBottom);\n  }\n\n  /**\n   * CSI Pm ' }\n   * Insert Ps Column(s) (default = 1) (DECIC), VT420 and up.\n   */\n  public insertColumns(params: IParams): void {\n    const buffer = this._bufferService.buffer;\n    if (buffer.y > buffer.scrollBottom || buffer.y < buffer.scrollTop) {\n      return;\n    }\n    const param = params.params[0] || 1;\n    for (let y = buffer.scrollTop; y <= buffer.scrollBottom; ++y) {\n      const line = this._bufferService.buffer.lines.get(buffer.ybase + y);\n      line.insertCells(buffer.x, param, buffer.getNullCell(this._terminal.eraseAttrData()));\n      line.isWrapped = false;\n    }\n    this._dirtyRowService.markRangeDirty(buffer.scrollTop, buffer.scrollBottom);\n  }\n\n  /**\n   * CSI Pm ' ~\n   * Delete Ps Column(s) (default = 1) (DECDC), VT420 and up.\n   */\n  public deleteColumns(params: IParams): void {\n    const buffer = this._bufferService.buffer;\n    if (buffer.y > buffer.scrollBottom || buffer.y < buffer.scrollTop) {\n      return;\n    }\n    const param = params.params[0] || 1;\n    for (let y = buffer.scrollTop; y <= buffer.scrollBottom; ++y) {\n      const line = buffer.lines.get(buffer.ybase + y);\n      line.deleteCells(buffer.x, param, buffer.getNullCell(this._terminal.eraseAttrData()));\n      line.isWrapped = false;\n    }\n    this._dirtyRowService.markRangeDirty(buffer.scrollTop, buffer.scrollBottom);\n  }\n\n  /**\n   * CSI Ps X\n   * Erase Ps Character(s) (default = 1) (ECH).\n   */\n  public eraseChars(params: IParams): void {\n    this._restrictCursor();\n    const line = this._bufferService.buffer.lines.get(this._bufferService.buffer.y + this._bufferService.buffer.ybase);\n    if (line) {\n      line.replaceCells(\n        this._bufferService.buffer.x,\n        this._bufferService.buffer.x + (params.params[0] || 1),\n        this._bufferService.buffer.getNullCell(this._terminal.eraseAttrData())\n      );\n      this._dirtyRowService.markDirty(this._bufferService.buffer.y);\n    }\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  public repeatPrecedingCharacter(params: IParams): void {\n    if (!this._parser.precedingCodepoint) {\n      return;\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  }\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   * 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  public sendDeviceAttributesPrimary(params: IParams): void {\n    if (params.params[0] > 0) {\n      return;\n    }\n    if (this._terminal.is('xterm') || this._terminal.is('rxvt-unicode') || this._terminal.is('screen')) {\n      this._coreService.triggerDataEvent(C0.ESC + '[?1;2c');\n    } else if (this._terminal.is('linux')) {\n      this._coreService.triggerDataEvent(C0.ESC + '[?6c');\n    }\n  }\n  public sendDeviceAttributesSecondary(params: IParams): void {\n    if (params.params[0] > 0) {\n      return;\n    }\n    // xterm and urxvt\n    // seem to spit this\n    // out around ~370 times (?).\n    if (this._terminal.is('xterm')) {\n      this._coreService.triggerDataEvent(C0.ESC + '[>0;276;0c');\n    } else if (this._terminal.is('rxvt-unicode')) {\n      this._coreService.triggerDataEvent(C0.ESC + '[>85;95;0c');\n    } else if (this._terminal.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._terminal.is('screen')) {\n      this._coreService.triggerDataEvent(C0.ESC + '[>83;40003;0c');\n    }\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   * 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  public setMode(params: IParams): void {\n    for (let i = 0; i < params.length; i++) {\n      switch (params.params[i]) {\n        case 4:\n          this._terminal.insertMode = true;\n          break;\n        case 20:\n          // this._t.convertEol = true;\n          break;\n      }\n    }\n  }\n  public setModePrivate(params: IParams): void {\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._terminal.setgCharset(0, DEFAULT_CHARSET);\n          this._terminal.setgCharset(1, DEFAULT_CHARSET);\n          this._terminal.setgCharset(2, DEFAULT_CHARSET);\n          this._terminal.setgCharset(3, DEFAULT_CHARSET);\n          // set VT100 mode here\n          break;\n        case 3: // 132 col mode\n          // TODO: move DECCOLM into compat addon\n          this._terminal.savedCols = this._bufferService.cols;\n          this._terminal.resize(132, this._bufferService.rows);\n          this._terminal.reset();\n          break;\n        case 6:\n          this._terminal.originMode = true;\n          this._setCursor(0, 0);\n          break;\n        case 7:\n          this._terminal.wraparoundMode = true;\n          break;\n        case 12:\n          // this.cursorBlink = true;\n          break;\n        case 66:\n          this._logService.debug('Serial port requested application keypad.');\n          this._terminal.applicationKeypad = true;\n          if (this._terminal.viewport) {\n            this._terminal.viewport.syncScrollArea();\n          }\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._terminal.sendFocus = true;\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._terminal.cursorHidden = 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._terminal.eraseAttrData());\n          this._terminal.refresh(0, this._bufferService.rows - 1);\n          if (this._terminal.viewport) {\n            this._terminal.viewport.syncScrollArea();\n          }\n          this._terminal.showCursor();\n          break;\n        case 2004: // bracketed paste mode (https://cirw.in/blog/bracketed-paste)\n          this._terminal.bracketedPasteMode = true;\n          break;\n      }\n    }\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   * 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  public resetMode(params: IParams): void {\n    for (let i = 0; i < params.length; i++) {\n      switch (params.params[i]) {\n        case 4:\n          this._terminal.insertMode = false;\n          break;\n        case 20:\n          // this._t.convertEol = false;\n          break;\n      }\n    }\n  }\n  public resetModePrivate(params: IParams): void {\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          // TODO: move DECCOLM into compat addon\n          // Note: This impl currently does not enforce col 80, instead reverts\n          // to previous terminal width before entering DECCOLM 132\n          if (this._bufferService.cols === 132 && this._terminal.savedCols) {\n            this._terminal.resize(this._terminal.savedCols, this._bufferService.rows);\n          }\n          delete this._terminal.savedCols;\n          this._terminal.reset();\n          break;\n        case 6:\n          this._terminal.originMode = false;\n          this._setCursor(0, 0);\n          break;\n        case 7:\n          this._terminal.wraparoundMode = false;\n          break;\n        case 12:\n          // this.cursorBlink = false;\n          break;\n        case 66:\n          this._logService.debug('Switching back to normal keypad.');\n          this._terminal.applicationKeypad = false;\n          if (this._terminal.viewport) {\n            this._terminal.viewport.syncScrollArea();\n          }\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._terminal.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._terminal.cursorHidden = 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._terminal.refresh(0, this._bufferService.rows - 1);\n          if (this._terminal.viewport) {\n            this._terminal.viewport.syncScrollArea();\n          }\n          this._terminal.showCursor();\n          break;\n        case 2004: // bracketed paste mode (https://cirw.in/blog/bracketed-paste)\n          this._terminal.bracketedPasteMode = false;\n          break;\n      }\n    }\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    if (accu[0] === 38) {\n      if (accu[1] === 2) {\n        attr.fg |= Attributes.CM_RGB;\n        attr.fg &= ~Attributes.RGB_MASK;\n        attr.fg |= AttributeData.fromColorRGB([accu[3], accu[4], accu[5]]);\n      } else if (accu[1] === 5) {\n        attr.fg &= ~(Attributes.CM_MASK | Attributes.PCOLOR_MASK);\n        attr.fg |= Attributes.CM_P256 | (accu[3] & 0xff);\n      }\n    } else if (accu[0] === 48) {\n      if (accu[1] === 2) {\n        attr.bg |= Attributes.CM_RGB;\n        attr.bg &= ~Attributes.RGB_MASK;\n        attr.bg |= AttributeData.fromColorRGB([accu[3], accu[4], accu[5]]);\n      } else if (accu[1] === 5) {\n        attr.bg &= ~(Attributes.CM_MASK | Attributes.PCOLOR_MASK);\n        attr.bg |= Attributes.CM_P256 | (accu[3] & 0xff);\n      }\n    }\n\n    return advance;\n  }\n\n  /**\n   * CSI Pm m  Character Attributes (SGR).\n   *     Ps = 0  -> Normal (default).\n   *     Ps = 1  -> Bold.\n   *     Ps = 2  -> Faint, decreased intensity (ISO 6429).\n   *     Ps = 4  -> Underlined.\n   *     Ps = 5  -> Blink (appears as Bold).\n   *     Ps = 7  -> Inverse.\n   *     Ps = 8  -> Invisible, i.e., hidden (VT300).\n   *     Ps = 2 2  -> Normal (neither bold nor faint).\n   *     Ps = 2 4  -> Not underlined.\n   *     Ps = 2 5  -> Steady (not blinking).\n   *     Ps = 2 7  -> Positive (not inverse).\n   *     Ps = 2 8  -> Visible, i.e., not hidden (VT300).\n   *     Ps = 3 0  -> Set foreground color to Black.\n   *     Ps = 3 1  -> Set foreground color to Red.\n   *     Ps = 3 2  -> Set foreground color to Green.\n   *     Ps = 3 3  -> Set foreground color to Yellow.\n   *     Ps = 3 4  -> Set foreground color to Blue.\n   *     Ps = 3 5  -> Set foreground color to Magenta.\n   *     Ps = 3 6  -> Set foreground color to Cyan.\n   *     Ps = 3 7  -> Set foreground color to White.\n   *     Ps = 3 9  -> Set foreground color to default (original).\n   *     Ps = 4 0  -> Set background color to Black.\n   *     Ps = 4 1  -> Set background color to Red.\n   *     Ps = 4 2  -> Set background color to Green.\n   *     Ps = 4 3  -> Set background color to Yellow.\n   *     Ps = 4 4  -> Set background color to Blue.\n   *     Ps = 4 5  -> Set background color to Magenta.\n   *     Ps = 4 6  -> Set background color to Cyan.\n   *     Ps = 4 7  -> Set background color to White.\n   *     Ps = 4 9  -> Set background color to default (original).\n   *\n   *   If 16-color support is compiled, the following apply.  Assume\n   *   that xterm's resources are set so that the ISO color codes are\n   *   the first 8 of a set of 16.  Then the aixterm colors are the\n   *   bright versions of the ISO colors:\n   *     Ps = 9 0  -> Set foreground color to Black.\n   *     Ps = 9 1  -> Set foreground color to Red.\n   *     Ps = 9 2  -> Set foreground color to Green.\n   *     Ps = 9 3  -> Set foreground color to Yellow.\n   *     Ps = 9 4  -> Set foreground color to Blue.\n   *     Ps = 9 5  -> Set foreground color to Magenta.\n   *     Ps = 9 6  -> Set foreground color to Cyan.\n   *     Ps = 9 7  -> Set foreground color to White.\n   *     Ps = 1 0 0  -> Set background color to Black.\n   *     Ps = 1 0 1  -> Set background color to Red.\n   *     Ps = 1 0 2  -> Set background color to Green.\n   *     Ps = 1 0 3  -> Set background color to Yellow.\n   *     Ps = 1 0 4  -> Set background color to Blue.\n   *     Ps = 1 0 5  -> Set background color to Magenta.\n   *     Ps = 1 0 6  -> Set background color to Cyan.\n   *     Ps = 1 0 7  -> Set background color to White.\n   *\n   *   If xterm is compiled with the 16-color support disabled, it\n   *   supports the following, from rxvt:\n   *     Ps = 1 0 0  -> Set foreground and background color to\n   *     default.\n   *\n   *   If 88- or 256-color support is compiled, the following apply.\n   *     Ps = 3 8  ; 5  ; Ps -> Set foreground color to the second\n   *     Ps.\n   *     Ps = 4 8  ; 5  ; Ps -> Set background color to the second\n   *     Ps.\n   */\n  public charAttributes(params: IParams): void {\n    // Optimize a single SGR0.\n    if (params.length === 1 && params.params[0] === 0) {\n      this._terminal.curAttrData.fg = DEFAULT_ATTR_DATA.fg;\n      this._terminal.curAttrData.bg = DEFAULT_ATTR_DATA.bg;\n      return;\n    }\n\n    const l = params.length;\n    let p;\n    const attr = this._terminal.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      } 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 === 2) {\n        // dimmed text\n        attr.bg |= BgFlags.DIM;\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 === 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) {\n        // fg color 256 and RGB\n        i += this._extractColor(params, i, attr);\n      } else if (p === 100) {\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  }\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  public deviceStatus(params: IParams): void {\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._bufferService.buffer.y + 1;\n        const x = this._bufferService.buffer.x + 1;\n        this._coreService.triggerDataEvent(`${C0.ESC}[${y};${x}R`);\n        break;\n    }\n  }\n\n  public deviceStatusPrivate(params: IParams): void {\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._bufferService.buffer.y + 1;\n        const x = this._bufferService.buffer.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  }\n\n  /**\n   * CSI ! p   Soft terminal reset (DECSTR).\n   * http://vt100.net/docs/vt220-rm/table4-10.html\n   */\n  public softReset(params: IParams): void {\n    this._terminal.cursorHidden = false;\n    this._terminal.insertMode = false;\n    this._terminal.originMode = false;\n    this._terminal.wraparoundMode = true;  // defaults: xterm - true, vt100 - false\n    this._terminal.applicationKeypad = false; // ?\n    if (this._terminal.viewport) {\n      this._terminal.viewport.syncScrollArea();\n    }\n    this._coreService.decPrivateModes.applicationCursorKeys = false;\n    this._bufferService.buffer.scrollTop = 0;\n    this._bufferService.buffer.scrollBottom = this._bufferService.rows - 1;\n    this._terminal.curAttrData = DEFAULT_ATTR_DATA.clone();\n    this._bufferService.buffer.x = this._bufferService.buffer.y = 0; // ?\n    this._terminal.charset = null;\n    this._terminal.glevel = 0; // ??\n    this._terminal.charsets = [null]; // ??\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  public setCursorStyle(params: IParams): void {\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  }\n\n  /**\n   * CSI Ps ; Ps r\n   *   Set Scrolling Region [top;bottom] (default = full size of win-\n   *   dow) (DECSTBM).\n   */\n  public setScrollRegion(params: IParams): void {\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._bufferService.buffer.scrollTop = top - 1;\n      this._bufferService.buffer.scrollBottom = bottom - 1;\n      this._setCursor(0, 0);\n    }\n  }\n\n\n  /**\n   * CSI s\n   * ESC 7\n   *   Save cursor (ANSI.SYS).\n   */\n  public saveCursor(params?: IParams): void {\n    this._bufferService.buffer.savedX = this._bufferService.buffer.x;\n    this._bufferService.buffer.savedY = this._bufferService.buffer.ybase + this._bufferService.buffer.y;\n    this._bufferService.buffer.savedCurAttrData.fg = this._terminal.curAttrData.fg;\n    this._bufferService.buffer.savedCurAttrData.bg = this._terminal.curAttrData.bg;\n    this._bufferService.buffer.savedCharset = this._terminal.charset;\n  }\n\n\n  /**\n   * CSI u\n   * ESC 8\n   *   Restore cursor (ANSI.SYS).\n   */\n  public restoreCursor(params?: IParams): void {\n    this._bufferService.buffer.x = this._bufferService.buffer.savedX || 0;\n    this._bufferService.buffer.y = Math.max(this._bufferService.buffer.savedY - this._bufferService.buffer.ybase, 0);\n    this._terminal.curAttrData.fg = this._bufferService.buffer.savedCurAttrData.fg;\n    this._terminal.curAttrData.bg = this._bufferService.buffer.savedCurAttrData.bg;\n    this._terminal.charset = (this as any)._savedCharset;\n    if (this._bufferService.buffer.savedCharset) {\n      this._terminal.charset = this._bufferService.buffer.savedCharset;\n    }\n    this._restrictCursor();\n  }\n\n\n  /**\n   * OSC 0; <data> ST (set icon name + window title)\n   * OSC 2; <data> ST (set window title)\n   *   Proxy to set window title. Icon name is not supported.\n   */\n  public setTitle(data: string): void {\n    this._terminal.handleTitle(data);\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  public nextLine(): void {\n    this._bufferService.buffer.x = 0;\n    this.index();\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(): void {\n    this._logService.debug('Serial port requested application keypad.');\n    this._terminal.applicationKeypad = true;\n    if (this._terminal.viewport) {\n      this._terminal.viewport.syncScrollArea();\n    }\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(): void {\n    this._logService.debug('Switching back to normal keypad.');\n    this._terminal.applicationKeypad = false;\n    if (this._terminal.viewport) {\n      this._terminal.viewport.syncScrollArea();\n    }\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(): void {\n    this._terminal.setgLevel(0);\n    this._terminal.setgCharset(0, DEFAULT_CHARSET); // US (default)\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): void {\n    if (collectAndFlag.length !== 2) {\n      this.selectDefaultCharset();\n      return;\n    }\n    if (collectAndFlag[0] === '/') {\n      return;  // TODO: Is this supported?\n    }\n    this._terminal.setgCharset(GLEVEL[collectAndFlag[0]], CHARSETS[collectAndFlag[1]] || DEFAULT_CHARSET);\n    return;\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  public index(): void {\n    this._restrictCursor();\n    const buffer = this._bufferService.buffer;\n    this._bufferService.buffer.y++;\n    if (buffer.y === buffer.scrollBottom + 1) {\n      buffer.y--;\n      this._terminal.scroll();\n    } else if (buffer.y >= this._bufferService.rows) {\n      buffer.y = this._bufferService.rows - 1;\n    }\n    this._restrictCursor();\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  public tabSet(): void {\n    this._bufferService.buffer.tabs[this._bufferService.buffer.x] = 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  public reverseIndex(): void {\n    this._restrictCursor();\n    const buffer = this._bufferService.buffer;\n    if (buffer.y === buffer.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 = buffer.scrollBottom - buffer.scrollTop;\n      buffer.lines.shiftElements(buffer.y + buffer.ybase, scrollRegionHeight, 1);\n      buffer.lines.set(buffer.y + buffer.ybase, buffer.getBlankLine(this._terminal.eraseAttrData()));\n      this._dirtyRowService.markRangeDirty(buffer.scrollTop, buffer.scrollBottom);\n    } else {\n      buffer.y--;\n      this._restrictCursor(); // quickfix to not run out of bounds\n    }\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 reset(): void {\n    this._parser.reset();\n    this._terminal.reset();  // TODO: save to move from terminal?\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): void {\n    this._terminal.setgLevel(level);  // TODO: save to move from terminal?\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   * TODO: move DECALN into compat addon\n   */\n  public screenAlignmentPattern(): void {\n    // prepare cell data\n    const cell = new CellData();\n    cell.content = 1 << Content.WIDTH_SHIFT | 'E'.charCodeAt(0);\n    cell.fg = this._terminal.curAttrData.fg;\n    cell.bg = this._terminal.curAttrData.bg;\n\n    const buffer = this._bufferService.buffer;\n\n    this._setCursor(0, 0);\n    for (let yOffset = 0; yOffset < this._bufferService.rows; ++yOffset) {\n      const row = buffer.y + buffer.ybase + yOffset;\n      buffer.lines.get(row).fill(cell);\n      buffer.lines.get(row).isWrapped = false;\n    }\n    this._dirtyRowService.markAllDirty();\n    this._setCursor(0, 0);\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 } 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) => 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  constructor(readonly TRANSITIONS: TransitionTable = VT500_TRANSITION_TABLE) {\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.setEscHandler({final: '\\\\'}, () => {});\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 addEscHandler(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 setEscHandler(id: IFunctionIdentifier, handler: EscHandlerType): void {\n    this._escHandlers[this._identifier(id, [0x30, 0x7e])] = [handler];\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 addCsiHandler(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 setCsiHandler(id: IFunctionIdentifier, handler: CsiHandlerType): void {\n    this._csiHandlers[this._identifier(id)] = [handler];\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 addDcsHandler(id: IFunctionIdentifier, handler: IDcsHandler): IDisposable {\n    return this._dcsParser.addHandler(this._identifier(id), handler);\n  }\n  public setDcsHandler(id: IFunctionIdentifier, handler: IDcsHandler): void {\n    this._dcsParser.setHandler(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 addOscHandler(ident: number, handler: IOscHandler): IDisposable {\n    return this._oscParser.addHandler(ident, handler);\n  }\n  public setOscHandler(ident: number, handler: IOscHandler): void {\n    this._oscParser.setHandler(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  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  }\n\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  public parse(data: Uint32Array, length: number): void {\n    let code = 0;\n    let transition = 0;\n    let currentState = this.currentState;\n    const osc = this._oscParser;\n    const dcs = this._dcsParser;\n    let collect = this._collect;\n    const params = this._params;\n    const table: Uint8Array = this.TRANSITIONS.table;\n\n    // process input string\n    for (let i = 0; i < length; ++i) {\n      code = data[i];\n\n      // normal transition & action lookup\n      transition = table[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,\n              collect,\n              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[collect << 8 | code];\n          let j = handlers ? handlers.length - 1 : -1;\n          for (; j >= 0; j--) {\n            // undefined or true means success and to stop bubbling\n            if (handlers[j](params) !== false) {\n              break;\n            }\n          }\n          if (j < 0) {\n            this._csiHandlerFb(collect << 8 | code, 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                params.addParam(0);  // ZDM\n                break;\n              case 0x3a:\n                params.addSubParam(-1);\n                break;\n              default:  // 0x30 - 0x39\n                params.addDigit(code - 48);\n            }\n          } while (++i < length && (code = data[i]) > 0x2f && code < 0x3c);\n          i--;\n          break;\n        case ParserAction.COLLECT:\n          collect <<= 8;\n          collect |= code;\n          break;\n        case ParserAction.ESC_DISPATCH:\n          const handlersEsc = this._escHandlers[collect << 8 | code];\n          let jj = handlersEsc ? handlersEsc.length - 1 : -1;\n          for (; jj >= 0; jj--) {\n            // undefined or true means success and to stop bubbling\n            if (handlersEsc[jj]() !== false) {\n              break;\n            }\n          }\n          if (jj < 0) {\n            this._escHandlerFb(collect << 8 | code);\n          }\n          this.precedingCodepoint = 0;\n          break;\n        case ParserAction.CLEAR:\n          params.reset();\n          params.addParam(0); // ZDM\n          collect = 0;\n          break;\n        case ParserAction.DCS_HOOK:\n          dcs.hook(collect << 8 | code, 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              dcs.put(data, i, j);\n              i = j - 1;\n              break;\n            }\n          }\n          break;\n        case ParserAction.DCS_UNHOOK:\n          dcs.unhook(code !== 0x18 && code !== 0x1a);\n          if (code === 0x1b) transition |= ParserState.ESCAPE;\n          params.reset();\n          params.addParam(0); // ZDM\n          collect = 0;\n          this.precedingCodepoint = 0;\n          break;\n        case ParserAction.OSC_START:\n          osc.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 <= 0x9f)) {\n              osc.put(data, i, j);\n              i = j - 1;\n              break;\n            }\n          }\n          break;\n        case ParserAction.OSC_END:\n          osc.end(code !== 0x18 && code !== 0x1a);\n          if (code === 0x1b) transition |= ParserState.ESCAPE;\n          params.reset();\n          params.addParam(0); // ZDM\n          collect = 0;\n          this.precedingCodepoint = 0;\n          break;\n      }\n      currentState = transition & TableAccess.TRANSITION_STATE_MASK;\n    }\n\n    // save collected intermediates\n    this._collect = collect;\n\n    // save state\n    this.currentState = currentState;\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 './CursorRenderLayer';\nimport { IRenderLayer, IRenderer, IRenderDimensions, CharacterJoinerHandler, ICharacterJoinerRegistry } from 'browser/renderer/Types';\nimport { ITerminal } from '../Types';\nimport { LinkRenderLayer } from '../browser/renderer/LinkRenderLayer';\nimport { CharacterJoinerRegistry } from 'browser/renderer/CharacterJoinerRegistry';\nimport { Disposable } from 'common/Lifecycle';\nimport { IColorSet } from 'browser/Types';\nimport { ICharSizeService } from 'browser/services/Services';\nimport { IBufferService, IOptionsService } from 'common/services/Services';\nimport { removeTerminalFromCache } from 'browser/renderer/atlas/CharAtlasCache';\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  private _characterJoinerRegistry: ICharacterJoinerRegistry;\n\n  public dimensions: IRenderDimensions;\n\n  constructor(\n    private _colors: IColorSet,\n    private readonly _terminal: ITerminal,\n    readonly bufferService: IBufferService,\n    private readonly _charSizeService: ICharSizeService,\n    readonly optionsService: IOptionsService\n  ) {\n    super();\n    const allowTransparency = this._terminal.options.allowTransparency;\n    this._characterJoinerRegistry = new CharacterJoinerRegistry(bufferService);\n\n    this._renderLayers = [\n      new TextRenderLayer(this._terminal.screenElement, 0, this._colors, this._characterJoinerRegistry, allowTransparency, this._id, bufferService, optionsService),\n      new SelectionRenderLayer(this._terminal.screenElement, 1, this._colors, this._id, bufferService, optionsService),\n      new LinkRenderLayer(this._terminal.screenElement, 2, this._colors, this._id, this._terminal.linkifier, bufferService, optionsService),\n      new CursorRenderLayer(this._terminal.screenElement, 3, this._colors, this._terminal, this._id, bufferService, optionsService)\n    ];\n    this.dimensions = {\n      scaledCharWidth: null,\n      scaledCharHeight: null,\n      scaledCellWidth: null,\n      scaledCellHeight: null,\n      scaledCharLeft: null,\n      scaledCharTop: null,\n      scaledCanvasWidth: null,\n      scaledCanvasHeight: null,\n      canvasWidth: null,\n      canvasHeight: null,\n      actualCellWidth: null,\n      actualCellHeight: null\n    };\n    this._devicePixelRatio = window.devicePixelRatio;\n    this._updateDimensions();\n    this.onOptionsChanged();\n  }\n\n  public dispose(): void {\n    super.dispose();\n    this._renderLayers.forEach(l => l.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._terminal.cols, this._terminal.rows);\n    }\n  }\n\n  public setColors(colors: IColorSet): void {\n    this._colors = colors;\n\n    // Clear layers and force a full render\n    this._renderLayers.forEach(l => {\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    this._renderLayers.forEach(l => l.resize(this.dimensions));\n\n    // Resize the screen\n    this._terminal.screenElement.style.width = `${this.dimensions.canvasWidth}px`;\n    this._terminal.screenElement.style.height = `${this.dimensions.canvasHeight}px`;\n  }\n\n  public onCharSizeChanged(): void {\n    this.onResize(this._terminal.cols, this._terminal.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], end: [number, number], columnSelectMode: boolean = false): void {\n    this._runOperation(l => l.onSelectionChanged(start, end, columnSelectMode));\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    this._renderLayers.forEach(l => operation(l));\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    this._renderLayers.forEach(l => l.onGridChanged(start, end));\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._terminal.options.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._terminal.options.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._terminal.options.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._terminal.options.letterSpacing / 2);\n\n    // Recalculate the canvas dimensions; scaled* define the actual number of\n    // pixel in the canvas\n    this.dimensions.scaledCanvasHeight = this._terminal.rows * this.dimensions.scaledCellHeight;\n    this.dimensions.scaledCanvasWidth = this._terminal.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._terminal.rows;\n    this.dimensions.actualCellWidth = this.dimensions.canvasWidth / this._terminal.cols;\n  }\n\n  public registerCharacterJoiner(handler: CharacterJoinerHandler): number {\n    return this._characterJoinerRegistry.registerCharacterJoiner(handler);\n  }\n\n  public deregisterCharacterJoiner(joinerId: number): boolean {\n    return this._characterJoinerRegistry.deregisterCharacterJoiner(joinerId);\n  }\n}\n","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ICharacterJoinerRegistry, 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 { JoinedCellData } from 'browser/renderer/CharacterJoinerRegistry';\nimport { IColorSet } from 'browser/Types';\nimport { CellData } from 'common/buffer/CellData';\nimport { IOptionsService, IBufferService } from 'common/services/Services';\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 _characterJoinerRegistry: ICharacterJoinerRegistry;\n  private _workCell = new CellData();\n\n  constructor(\n    container: HTMLElement,\n    zIndex: number,\n    colors: IColorSet,\n    characterJoinerRegistry: ICharacterJoinerRegistry,\n    alpha: boolean,\n    rendererId: number,\n    readonly bufferService: IBufferService,\n    readonly optionsService: IOptionsService\n  ) {\n    super(container, 'text', zIndex, alpha, colors, rendererId, bufferService, optionsService);\n    this._state = new GridCache<CharData>();\n    this._characterJoinerRegistry = characterJoinerRegistry;\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    joinerRegistry: ICharacterJoinerRegistry | null,\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 = joinerRegistry ? joinerRegistry.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\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, null, (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      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 ? 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 ? 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, this._characterJoinerRegistry, (cell, x, y) => {\n      if (cell.isInvisible()) {\n        return;\n      }\n      this._drawChars(cell, x, y);\n      if (cell.isUnderline()) {\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            this._ctx.fillStyle = this._colors.ansi[cell.getBgColor()].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.options.drawBoldTextInBrightColors && cell.isBold() && fg < 8) {\n              fg += 8;\n            }\n            this._ctx.fillStyle = this._colors.ansi[fg].css;\n          }\n        }\n\n        this._fillBottomLineAtCells(x, y, cell.getWidth());\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.options.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\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 { DIM_OPACITY, INVERTED_DEFAULT_COLOR } 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 'browser/Types';\nimport { throwIfFalsy } from 'browser/renderer/RendererUtils';\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 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    } else 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    } else if (glyph.bg === INVERTED_DEFAULT_COLOR) {\n      return this._config.colors.foreground;\n    } else 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 this._config.colors.background;\n    } else 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 = 'middle';\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 / 2);\n    this._tmpCtx.restore();\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    const 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    // 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\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  protected _doWarmUp(): 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\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) 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, 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    readonly bufferService: IBufferService,\n    readonly optionsService: IOptionsService\n  ) {\n    super(container, 'selection', zIndex, true, colors, rendererId, bufferService, optionsService);\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], end: [number, number], columnSelectMode: boolean): void {\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      return;\n    }\n\n    this._ctx.fillStyle = this._colors.selection.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 === viewportCappedEndRow ? 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], end: [number, number], 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 { BaseRenderLayer } from '../browser/renderer/BaseRenderLayer';\nimport { ITerminal } from '../Types';\nimport { ICellData } from 'common/Types';\nimport { CellData } from 'common/buffer/CellData';\nimport { IColorSet } from 'browser/Types';\nimport { IBufferService, IOptionsService } from 'common/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;\n  private _cell: ICellData = new CellData();\n\n  constructor(\n    container: HTMLElement,\n    zIndex: number,\n    colors: IColorSet,\n    private _terminal: ITerminal,\n    rendererId: number,\n    readonly bufferService: IBufferService,\n    readonly optionsService: IOptionsService\n  ) {\n    super(container, 'cursor', zIndex, true, colors, rendererId, bufferService, optionsService);\n    this._state = {\n      x: null,\n      y: null,\n      isFocused: null,\n      style: null,\n      width: null\n    };\n    this._cursorRenderers = {\n      'bar': this._renderBarCursor.bind(this),\n      'block': this._renderBlockCursor.bind(this),\n      'underline': this._renderUnderlineCursor.bind(this)\n    };\n    // TODO: Consider initial options? Maybe onOptionsChanged should be called at the end of open?\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: null,\n      y: null,\n      isFocused: null,\n      style: null,\n      width: null\n    };\n  }\n\n  public reset(): void {\n    this._clearCursor();\n    if (this._cursorBlinkStateManager) {\n      this._cursorBlinkStateManager.dispose();\n      this._cursorBlinkStateManager = null;\n      this.onOptionsChanged();\n    }\n  }\n\n  public onBlur(): void {\n    if (this._cursorBlinkStateManager) {\n      this._cursorBlinkStateManager.pause();\n    }\n    this._terminal.refresh(this._bufferService.buffer.y, this._bufferService.buffer.y);\n  }\n\n  public onFocus(): void {\n    if (this._cursorBlinkStateManager) {\n      this._cursorBlinkStateManager.resume();\n    } else {\n      this._terminal.refresh(this._bufferService.buffer.y, this._bufferService.buffer.y);\n    }\n  }\n\n  public onOptionsChanged(): void {\n    if (this._optionsService.options.cursorBlink) {\n      if (!this._cursorBlinkStateManager) {\n        this._cursorBlinkStateManager = new CursorBlinkStateManager(this._terminal.isFocused, () => {\n          this._render(true);\n        });\n      }\n    } else {\n      if (this._cursorBlinkStateManager) {\n        this._cursorBlinkStateManager.dispose();\n        this._cursorBlinkStateManager = null;\n      }\n    }\n    // Request a refresh from the terminal as management of rendering is being\n    // moved back to the terminal\n    this._terminal.refresh(this._bufferService.buffer.y, this._bufferService.buffer.y);\n  }\n\n  public onCursorMove(): void {\n    if (this._cursorBlinkStateManager) {\n      this._cursorBlinkStateManager.restartBlinkAnimation();\n    }\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._terminal.cursorState || this._terminal.cursorHidden) {\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    this._bufferService.buffer.lines.get(cursorY).loadCell(this._bufferService.buffer.x, this._cell);\n    if (this._cell.content === undefined) {\n      return;\n    }\n\n    if (!this._terminal.isFocused) {\n      this._clearCursor();\n      this._ctx.save();\n      this._ctx.fillStyle = this._colors.cursor.css;\n      const cursorStyle = this._optionsService.options.cursorStyle;\n      if (cursorStyle && cursorStyle !== 'block') {\n        this._cursorRenderers[cursorStyle](this._bufferService.buffer.x, viewportRelativeCursorY, this._cell);\n      } else {\n        this._renderBlurCursor(this._bufferService.buffer.x, viewportRelativeCursorY, this._cell);\n      }\n      this._ctx.restore();\n      this._state.x = this._bufferService.buffer.x;\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 === this._bufferService.buffer.x &&\n          this._state.y === viewportRelativeCursorY &&\n          this._state.isFocused === this._terminal.isFocused &&\n          this._state.style === this._optionsService.options.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.options.cursorStyle || 'block'](this._bufferService.buffer.x, viewportRelativeCursorY, this._cell);\n    this._ctx.restore();\n\n    this._state.x = this._bufferService.buffer.x;\n    this._state.y = viewportRelativeCursorY;\n    this._state.isFocused = false;\n    this._state.style = this._optionsService.options.cursorStyle;\n    this._state.width = this._cell.getWidth();\n  }\n\n  private _clearCursor(): void {\n    if (this._state) {\n      this._clearCells(this._state.x, this._state.y, this._state.width, 1);\n      this._state = {\n        x: null,\n        y: null,\n        isFocused: null,\n        style: null,\n        width: null\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);\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;\n  private _blinkStartTimeout: number;\n  private _blinkInterval: number;\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;\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 = null;\n    }\n    if (this._blinkStartTimeout) {\n      window.clearTimeout(this._blinkStartTimeout);\n      this._blinkStartTimeout = null;\n    }\n    if (this._animationFrame) {\n      window.cancelAnimationFrame(this._animationFrame);\n      this._animationFrame = null;\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 = null;\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    }\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 = <number><any>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 = null;\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 = null;\n      });\n\n      // Setup the blink interval\n      this._blinkInterval = <number><any>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 = null;\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 = null;\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 = null;\n    }\n    if (this._blinkStartTimeout) {\n      window.clearTimeout(this._blinkStartTimeout);\n      this._blinkStartTimeout = null;\n    }\n    if (this._animationFrame) {\n      window.cancelAnimationFrame(this._animationFrame);\n      this._animationFrame = null;\n    }\n  }\n\n  public resume(): void {\n    this._animationTimeRestarted = null;\n    this._restartInterval();\n    this.restartBlinkAnimation();\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 } from 'browser/Types';\nimport { IBufferService, 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    readonly bufferService: IBufferService,\n    readonly optionsService: IOptionsService\n  ) {\n    super(container, 'link', zIndex, true, colors, rendererId, bufferService, optionsService);\n    linkifier.onLinkHover(e => this._onLinkHover(e));\n    linkifier.onLinkLeave(e => this._onLinkLeave(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 _onLinkHover(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 _onLinkLeave(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 { ILinkifierEvent, ILinkMatcher, LinkMatcherHandler, ILinkMatcherOptions, ILinkifier, IMouseZoneManager, IMouseZone, IRegisteredLinkMatcher } from 'browser/Types';\nimport { IBufferStringIteratorResult } from 'common/buffer/Types';\nimport { getStringCellWidth } from 'common/CharWidth';\nimport { EventEmitter, IEvent } from 'common/EventEmitter';\nimport { ILogService, IBufferService } 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 _onLinkHover = new EventEmitter<ILinkifierEvent>();\n  public get onLinkHover(): IEvent<ILinkifierEvent> { return this._onLinkHover.event; }\n  private _onLinkLeave = new EventEmitter<ILinkifierEvent>();\n  public get onLinkLeave(): IEvent<ILinkifierEvent> { return this._onLinkLeave.event; }\n  private _onLinkTooltip = new EventEmitter<ILinkifierEvent>();\n  public get onLinkTooltip(): IEvent<ILinkifierEvent> { return this._onLinkTooltip.event; }\n\n  constructor(\n    protected readonly _bufferService: IBufferService,\n    private readonly _logService: ILogService\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    this._rowsTimeoutId = <number><any>setTimeout(() => this._linkifyRows(), Linkifier._timeBeforeLatency);\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\n    const width = 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        window.open(uri, '_blank');\n      },\n      () => {\n        this._onLinkHover.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._onLinkLeave.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) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ISelectionRedrawRequestEvent } 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 { ICharSizeService, IMouseService, ISelectionService } from 'browser/services/Services';\nimport { IBufferService, IOptionsService, ICoreService } from 'common/services/Services';\nimport { getCoordsRelativeToElement } from 'browser/input/Mouse';\nimport { moveToCellSequence } from 'browser/input/MoveToCell';\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 implements ISelectionService {\n  serviceBrand: any;\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\n  private _onLinuxMouseSelection = new EventEmitter<string>();\n  public get onLinuxMouseSelection(): IEvent<string> { return this._onLinuxMouseSelection.event; }\n  private _onRedrawRequest = new EventEmitter<ISelectionRedrawRequestEvent>();\n  public get onRedrawRequest(): IEvent<ISelectionRedrawRequestEvent> { return this._onRedrawRequest.event; }\n  private _onSelectionChange = new EventEmitter<void>();\n  public get onSelectionChange(): IEvent<void> { return this._onSelectionChange.event; }\n\n  constructor(\n    private readonly _scrollLines: (amount: number, suppressEvent: boolean) => void,\n    private readonly _element: HTMLElement,\n    private readonly _screenElement: HTMLElement,\n    @ICharSizeService private readonly _charSizeService: ICharSizeService,\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  ) {\n    // Init listeners\n    this._mouseMoveListener = event => this._onMouseMove(<MouseEvent>event);\n    this._mouseUpListener = event => this._onMouseUp(<MouseEvent>event);\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._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 (let i = start[1]; i <= end[1]; i++) {\n        const lineText = buffer.translateBufferLineToString(i, true, start[0], end[0]);\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 && 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  public 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  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  public selectWordAtCursor(event: MouseEvent): void {\n    const coords = this._getMouseBufferCoords(event);\n    if (coords) {\n      this._selectWordAt(coords, false);\n      this._model.selectionEnd = undefined;\n      this.refresh(true);\n    }\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(event, this._screenElement)[1];\n    const terminalHeight = this._bufferService.rows * Math.ceil(this._charSizeService.height * this._optionsService.options.lineHeight);\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.options.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 work.\n   * @param event The mouse event.\n   */\n  private _onDoubleClick(event: MouseEvent): void {\n    const coords = this._getMouseBufferCoords(event);\n    if (coords) {\n      this._activeSelectionMode = SelectionMode.WORD;\n      this._selectWordAt(coords, true);\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.options.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._scrollLines(this._dragScrollAmount, 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) {\n      if (event.altKey && 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 if (this.hasSelection) {\n      this._onSelectionChange.fire();\n    }\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    if (this._trimListener) {\n      this._trimListener.dispose();\n    }\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  }\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 && 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.options.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    this._model.selectionStart = [0, wrappedRange.first];\n    this._model.selectionEnd = [this._bufferService.cols, wrappedRange.last];\n    this._model.selectionStartLength = 0;\n  }\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        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        return [Math.max(this.selectionStart[0] + this.selectionStartLength, 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) 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  return moveHorizontallyOnly(startX, startY, targetX, targetY, bufferService, applicationCursor);\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\nfunction moveHorizontallyOnly(startX: number, startY: number, targetX: number, targetY: number, bufferService: IBufferService, applicationCursor: boolean): string {\n  const direction = horizontalDirection(startX, startY, targetX, targetY, bufferService, applicationCursor);\n  return repeat(Math.abs(startX - targetX), 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 && 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 && line.isWrapped;\n\n  while (lineWraps && currentRow >= 0 && currentRow < bufferService.rows) {\n    rowCount++;\n    line = bufferService.buffer.lines.get(--currentRow);\n    lineWraps = line && 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 { IOptionsService } from 'common/services/Services';\nimport { ISoundService } from 'browser/services/Services';\n\nexport class SoundService implements ISoundService {\n  serviceBrand: any;\n\n  private static _audioContext: AudioContext;\n\n  static get audioContext(): AudioContext | null {\n    if (!SoundService._audioContext) {\n      const audioContextCtor: typeof AudioContext = (<any>window).AudioContext || (<any>window).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.options.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) 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 } from 'common/services/Services';\n\nconst HOVER_DURATION = 500;\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  ) {\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 = <number><any>setTimeout(() => this._onTooltip(e), HOVER_DURATION);\n  }\n\n  private _onTooltip(e: MouseEvent): void {\n    this._tooltipTimeout = undefined;\n    const zone = this._findZoneEventAt(e);\n    if (zone && zone.tooltipCallback) {\n      zone.tooltipCallback(e);\n    }\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) {\n      if (zone.willLinkActivate(e)) {\n        e.preventDefault();\n        e.stopImmediatePropagation();\n      }\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) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport * as Strings from './browser/LocalizableStrings';\nimport { ITerminal } from './Types';\nimport { IBuffer } from 'common/buffer/Types';\nimport { isMac } from 'common/Platform';\nimport { RenderDebouncer } from 'browser/RenderDebouncer';\nimport { addDisposableDomListener } from 'browser/Lifecycle';\nimport { Disposable } from 'common/Lifecycle';\nimport { ScreenDprMonitor } from 'browser/ScreenDprMonitor';\nimport { IRenderService } from 'browser/services/Services';\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: RenderDebouncer;\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\n    this._rowContainer = document.createElement('div');\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 RenderDebouncer(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    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    this._terminal.element.removeChild(this._accessibilityTreeRoot);\n    this._rowElements.length = 0;\n  }\n\n  private _onBoundaryFocus(e: FocusEvent, position: BoundaryPosition): void {\n    const boundaryElement = <HTMLElement>e.target;\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      if (this._liveRegion.parentNode) {\n        this._accessibilityTreeRoot.removeChild(this._liveRegion);\n      }\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.innerHTML = '&nbsp;';\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) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IRenderer, IRenderDimensions, CharacterJoinerHandler } from 'browser/renderer/Types';\nimport { ITerminal } from '../../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 } from 'browser/Types';\nimport { ICharSizeService } from 'browser/services/Services';\nimport { IOptionsService } from 'common/services/Services';\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  constructor(\n    private _terminal: ITerminal,\n    private _colors: IColorSet,\n    private _charSizeService: ICharSizeService,\n    private _optionsService: IOptionsService\n  ) {\n    super();\n\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._terminal.cols, this._terminal.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: null,\n      scaledCharHeight: null,\n      scaledCellWidth: null,\n      scaledCellHeight: null,\n      scaledCharLeft: null,\n      scaledCharTop: null,\n      scaledCanvasWidth: null,\n      scaledCanvasHeight: null,\n      canvasWidth: null,\n      canvasHeight: null,\n      actualCellWidth: null,\n      actualCellHeight: null\n    };\n    this._updateDimensions();\n    this._injectCss();\n\n    this._rowFactory = new DomRendererRowFactory(document, this._optionsService);\n\n    this._terminal.element.classList.add(TERMINAL_CLASS_PREFIX + this._terminalClass);\n    this._terminal.screenElement.appendChild(this._rowContainer);\n    this._terminal.screenElement.appendChild(this._selectionContainer);\n\n    this._terminal.linkifier.onLinkHover(e => this._onLinkHover(e));\n    this._terminal.linkifier.onLinkLeave(e => this._onLinkLeave(e));\n  }\n\n  public dispose(): void {\n    this._terminal.element.classList.remove(TERMINAL_CLASS_PREFIX + this._terminalClass);\n    this._terminal.screenElement.removeChild(this._rowContainer);\n    this._terminal.screenElement.removeChild(this._selectionContainer);\n    this._terminal.screenElement.removeChild(this._themeStyleElement);\n    this._terminal.screenElement.removeChild(this._dimensionsStyleElement);\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._terminal.options.letterSpacing);\n    this.dimensions.scaledCellHeight = Math.floor(this.dimensions.scaledCharHeight * this._terminal.options.lineHeight);\n    this.dimensions.scaledCharLeft = 0;\n    this.dimensions.scaledCharTop = 0;\n    this.dimensions.scaledCanvasWidth = this.dimensions.scaledCellWidth * this._terminal.cols;\n    this.dimensions.scaledCanvasHeight = this.dimensions.scaledCellHeight * this._terminal.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._terminal.cols;\n    this.dimensions.actualCellHeight = this.dimensions.canvasHeight / this._terminal.rows;\n\n    this._rowElements.forEach(element => {\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._terminal.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.innerHTML = styles;\n\n    this._selectionContainer.style.height = (<any>this._terminal)._viewportElement.style.height;\n    this._terminal.screenElement.style.width = `${this.dimensions.canvasWidth}px`;\n    this._terminal.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._terminal.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        ` background-color: ${this._colors.background.css};` +\n        ` font-family: ${this._terminal.options.fontFamily};` +\n        ` font-size: ${this._terminal.options.fontSize}px;` +\n        `}`;\n    // Text styles\n    styles +=\n        `${this._terminalSelector} span:not(.${BOLD_CLASS}) {` +\n        ` font-weight: ${this._terminal.options.fontWeight};` +\n        `}` +\n        `${this._terminalSelector} span.${BOLD_CLASS} {` +\n        ` font-weight: ${this._terminal.options.fontWeightBold};` +\n        `}` +\n        `${this._terminalSelector} span.${ITALIC_CLASS} {` +\n        ` font-style: italic;` +\n        `}`;\n    // Blink animation\n    styles +=\n        `@keyframes blink_box_shadow {` +\n        ` 50% {` +\n        `  box-shadow: none;` +\n        ` }` +\n        `}`;\n    styles +=\n        `@keyframes blink_block {` +\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 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 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: 1px 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.selection.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: ${this._colors.background.css}; }` +\n        `${this._terminalSelector} .${BG_CLASS_PREFIX}${INVERTED_DEFAULT_COLOR} { background-color: ${this._colors.foreground.css}; }`;\n\n    this._themeStyleElement.innerHTML = 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], end: [number, number], columnSelectMode: boolean): void {\n    // Remove all selections\n    while (this._selectionContainer.children.length) {\n      this._selectionContainer.removeChild(this._selectionContainer.children[0]);\n    }\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._terminal.buffer.ydisp;\n    const viewportEndRow = end[1] - this._terminal.buffer.ydisp;\n    const viewportCappedStartRow = Math.max(viewportStartRow, 0);\n    const viewportCappedEndRow = Math.min(viewportEndRow, this._terminal.rows - 1);\n\n    // No need to draw the selection\n    if (viewportCappedStartRow >= this._terminal.rows || viewportCappedEndRow < 0) {\n      return;\n    }\n\n    // Create the selections\n    const documentFragment = document.createDocumentFragment();\n\n    if (columnSelectMode) {\n      documentFragment.appendChild(\n        this._createSelectionElement(viewportCappedStartRow, 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 === viewportCappedEndRow ? end[0] : this._terminal.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._terminal.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._terminal.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    this._terminal.refresh(0, this._terminal.rows - 1);\n  }\n\n  public clear(): void {\n    this._rowElements.forEach(e => e.innerHTML = '');\n  }\n\n  public renderRows(start: number, end: number): void {\n    const terminal = this._terminal;\n\n    const cursorAbsoluteY = terminal.buffer.ybase + terminal.buffer.y;\n    const cursorX = this._terminal.buffer.x;\n    const cursorBlink = this._terminal.options.cursorBlink;\n\n    for (let y = start; y <= end; y++) {\n      const rowElement = this._rowElements[y];\n      rowElement.innerHTML = '';\n\n      const row = y + terminal.buffer.ydisp;\n      const lineData = terminal.buffer.lines.get(row);\n      const cursorStyle = terminal.options.cursorStyle;\n      rowElement.appendChild(this._rowFactory.createRow(lineData, row === cursorAbsoluteY, cursorStyle, cursorX, cursorBlink, this.dimensions.actualCellWidth, terminal.cols));\n    }\n  }\n\n  private get _terminalSelector(): string {\n    return `.${TERMINAL_CLASS_PREFIX}${this._terminalClass}`;\n  }\n\n  public registerCharacterJoiner(handler: CharacterJoinerHandler): number { return -1; }\n  public deregisterCharacterJoiner(joinerId: number): boolean { return false; }\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 = <HTMLElement>row.children[x];\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 } from 'common/Types';\nimport { INVERTED_DEFAULT_COLOR } from 'browser/renderer/atlas/Constants';\nimport { AttributeData } from 'common/buffer/AttributeData';\nimport { NULL_CELL_CODE, WHITESPACE_CELL_CHAR } from 'common/buffer/Constants';\nimport { CellData } from 'common/buffer/CellData';\nimport { IOptionsService } from 'common/services/Services';\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 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  constructor(\n    private _document: Document,\n    private _optionsService: IOptionsService\n  ) {\n  }\n\n  public createRow(lineData: IBufferLine, isCursorRow: boolean, cursorStyle: string | undefined, cursorX: number, cursorBlink: boolean, cellWidth: number, cols: number): DocumentFragment {\n    const fragment = this._document.createDocumentFragment();\n\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      const 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      const charElement = this._document.createElement('span');\n      if (width > 1) {\n        charElement.style.width = `${cellWidth * width}px`;\n      }\n\n      if (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 (this._workCell.isBold()) {\n        charElement.classList.add(BOLD_CLASS);\n      }\n\n      if (this._workCell.isItalic()) {\n        charElement.classList.add(ITALIC_CLASS);\n      }\n\n      if (this._workCell.isDim()) {\n        charElement.classList.add(DIM_CLASS);\n      }\n\n      if (this._workCell.isUnderline()) {\n        charElement.classList.add(UNDERLINE_CLASS);\n      }\n\n      charElement.textContent = this._workCell.getChars() || WHITESPACE_CELL_CHAR;\n\n      const swapColor = this._workCell.isInverse();\n\n      // fg\n      if (this._workCell.isFgRGB()) {\n        let style = charElement.getAttribute('style') || '';\n        style += `${swapColor ? 'background-' : ''}color:rgb(${(AttributeData.toColorRGB(this._workCell.getFgColor())).join(',')});`;\n        charElement.setAttribute('style', style);\n      } else if (this._workCell.isFgPalette()) {\n        let fg = this._workCell.getFgColor();\n        if (this._workCell.isBold() && fg < 8 && !swapColor && this._optionsService.options.drawBoldTextInBrightColors) {\n          fg += 8;\n        }\n        charElement.classList.add(`xterm-${swapColor ? 'b' : 'f'}g-${fg}`);\n      } else if (swapColor) {\n        charElement.classList.add(`xterm-bg-${INVERTED_DEFAULT_COLOR}`);\n      }\n\n      // bg\n      if (this._workCell.isBgRGB()) {\n        let style = charElement.getAttribute('style') || '';\n        style += `${swapColor ? '' : 'background-'}color:rgb(${(AttributeData.toColorRGB(this._workCell.getBgColor())).join(',')});`;\n        charElement.setAttribute('style', style);\n      } else if (this._workCell.isBgPalette()) {\n        charElement.classList.add(`xterm-${swapColor ? 'f' : 'b'}g-${this._workCell.getBgColor()}`);\n      } else if (swapColor) {\n        charElement.classList.add(`xterm-fg-${INVERTED_DEFAULT_COLOR}`);\n      }\n\n      fragment.appendChild(charElement);\n    }\n    return fragment;\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\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 = C0.CR;\n      result.cancel = true;\n      break;\n    case 27:\n      // escape\n      result.key = C0.ESC;\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 {\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 {\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 && 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          result.key = C0.ESC + String.fromCharCode(keyCode);\n        }\n      } else if (isMac && !ev.altKey && !ev.ctrlKey && 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      }\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\nimport { IDisposable } from 'xterm';\nimport { ITerminal } from './Types';\nimport { CHAR_DATA_CODE_INDEX, NULL_CELL_CODE, WHITESPACE_CELL_CODE } from 'common/buffer/Constants';\n\nexport function applyWindowsMode(terminal: ITerminal): IDisposable {\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  return terminal.onLineFeed(() => {\n    const line = terminal.buffer.lines.get(terminal.buffer.ybase + terminal.buffer.y - 1);\n    const lastChar = line.get(terminal.cols - 1);\n\n    const nextLine = terminal.buffer.lines.get(terminal.buffer.ybase + terminal.buffer.y);\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) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IRenderer, IRenderDimensions, CharacterJoinerHandler } 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 } from 'browser/Types';\nimport { IOptionsService } from 'common/services/Services';\nimport { ICharSizeService, IRenderService } from 'browser/services/Services';\n\nexport class RenderService extends Disposable implements IRenderService {\n  serviceBrand: any;\n\n  private _renderDebouncer: RenderDebouncer;\n  private _screenDprMonitor: ScreenDprMonitor;\n\n  private _isPaused: boolean = false;\n  private _needsFullRefresh: boolean = false;\n  private _canvasWidth: number = 0;\n  private _canvasHeight: number = 0;\n\n  private _onDimensionsChange = new EventEmitter<IRenderDimensions>();\n  public get onDimensionsChange(): IEvent<IRenderDimensions> { return this._onDimensionsChange.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    readonly screenElement: HTMLElement,\n    @IOptionsService readonly optionsService: IOptionsService,\n    @ICharSizeService readonly charSizeService: ICharSizeService\n  ) {\n    super();\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(optionsService.onOptionChange(() => this._renderer.onOptionsChanged()));\n    this.register(charSizeService.onCharSizeChange(() => this.onCharSizeChanged()));\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.intersectionRatio === 0;\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): void {\n    if (this._isPaused) {\n      this._needsFullRefresh = true;\n      return;\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    this._onRender.fire({ start, end });\n  }\n\n  public resize(cols: number, rows: number): void {\n    this._rowCount = rows;\n    this._fireOnCanvasResize();\n  }\n\n  public changeOptions(): void {\n    this._renderer.onOptionsChanged();\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    this._renderer.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.refreshRows(0, this._rowCount - 1);\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 setColors(colors: IColorSet): void {\n    this._renderer.setColors(colors);\n    this._fullRefresh();\n  }\n\n  public onDevicePixelRatioChange(): void {\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], end: [number, number], columnSelectMode: boolean): void {\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  public registerCharacterJoiner(handler: CharacterJoinerHandler): number {\n    return this._renderer.registerCharacterJoiner(handler);\n  }\n\n  public deregisterCharacterJoiner(joinerId: number): boolean {\n    return this._renderer.deregisterCharacterJoiner(joinerId);\n  }\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IOptionsService, ITerminalOptions, IPartialTerminalOptions } from 'common/services/Services';\nimport { EventEmitter, IEvent } from 'common/EventEmitter';\nimport { isMac } from 'common/Platform';\nimport { clone } from 'common/Clone';\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\n// TODO: Freeze?\nexport const DEFAULT_OPTIONS: ITerminalOptions = Object.freeze({\n  cols: 80,\n  rows: 24,\n  cursorBlink: false,\n  cursorStyle: 'block',\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  letterSpacing: 0,\n  logLevel: 'info',\n  scrollback: 1000,\n  scrollSensitivity: 1,\n  screenReaderMode: false,\n  macOptionIsMeta: false,\n  macOptionClickForcesSelection: false,\n  disableStdin: false,\n  allowTransparency: false,\n  tabStopWidth: 8,\n  theme: {},\n  rightClickSelectsWord: isMac,\n  rendererType: 'canvas',\n  windowsMode: false,\n\n  convertEol: false,\n  termName: 'xterm',\n  screenKeys: false,\n  cancelEvents: false,\n  useFlowControl: false,\n  wordSeparator: ' ()[]{}\\',:;\"'\n});\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 OptionsService implements IOptionsService {\n  serviceBrand: any;\n\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: IPartialTerminalOptions) {\n    this.options = clone(DEFAULT_OPTIONS);\n    Object.keys(options).forEach(k => {\n      if (k in this.options) {\n        const newValue = options[k as keyof IPartialTerminalOptions] as any;\n        this.options[k] = newValue;\n      }\n    });\n  }\n\n  public setOption(key: string, value: any): void {\n    if (!(key in DEFAULT_OPTIONS)) {\n      throw new Error('No option with key \"' + key + '\"');\n    }\n    if (CONSTRUCTOR_ONLY_OPTIONS.indexOf(key) !== -1) {\n      throw new Error(`Option \"${key}\" can only be set in the constructor`);\n    }\n    if (this.options[key] === value) {\n      return;\n    }\n\n    value = this._sanitizeAndValidateOption(key, value);\n\n    // Don't fire an option change event if they didn't change\n    if (this.options[key] === value) {\n      return;\n    }\n\n    this.options[key] = value;\n    this._onOptionChange.fire(key);\n  }\n\n  private _sanitizeAndValidateOption(key: string, value: any): any {\n    switch (key) {\n      case 'bellStyle':\n      case 'cursorStyle':\n      case 'fontWeight':\n      case 'fontWeightBold':\n      case 'rendererType':\n      case 'wordSeparator':\n        if (!value) {\n          value = DEFAULT_OPTIONS[key];\n        }\n        break;\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 '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        break;\n    }\n    return value;\n  }\n\n  public getOption(key: string): any {\n    if (!(key in DEFAULT_OPTIONS)) {\n      throw new Error(`No option with key \"${key}\"`);\n    }\n    return this.options[key];\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  serviceBrand: any;\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    readonly document: Document,\n    readonly 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.options.fontFamily;\n    this._measureElement.style.fontSize = `${this._optionsService.options.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) 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';\n\nexport const MINIMUM_COLS = 2; // Less than 2 can mess with wide chars\nexport const MINIMUM_ROWS = 1;\n\nexport class BufferService implements IBufferService {\n  serviceBrand: any;\n\n  public cols: number;\n  public rows: number;\n  public buffers: IBufferSet;\n\n  public get buffer(): IBuffer { return this.buffers.active; }\n\n  constructor(\n    @IOptionsService private _optionsService: IOptionsService\n  ) {\n    this.cols = Math.max(_optionsService.options.cols, MINIMUM_COLS);\n    this.rows = Math.max(_optionsService.options.rows, MINIMUM_ROWS);\n    this.buffers = new BufferSet(_optionsService, this);\n  }\n\n  public resize(cols: number, rows: number): void {\n    this.cols = cols;\n    this.rows = rows;\n  }\n\n  public reset(): void {\n    this.buffers = new BufferSet(this._optionsService, this);\n  }\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';\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 implements IBufferSet {\n  private _normal: Buffer;\n  private _alt: Buffer;\n  private _activeBuffer: Buffer;\n\n\n  private _onBufferActivate = 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    readonly optionsService: IOptionsService,\n    readonly bufferService: IBufferService\n  ) {\n    this._normal = new Buffer(true, optionsService, 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, optionsService, bufferService);\n    this._activeBuffer = this._normal;\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) 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';\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 | null = 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\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    } else {\n      this._nullCell.fg = 0;\n      this._nullCell.bg = 0;\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    } else {\n      this._whitespaceCell.fg = 0;\n      this._whitespaceCell.bg = 0;\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.options.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.options.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.options.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        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.options.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  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    this.markers.splice(this.markers.indexOf(marker), 1);\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 result = '';\n    for (let i = range.first; i <= range.last; ++i) {\n      result += this._buffer.translateBufferLineToString(i, this._trimRight);\n    }\n    this._current = range.last + 1;\n    return {range: range, content: result};\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    }\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\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) 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) 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  }\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  serviceBrand: any;\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      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 { ICoreService, ILogService, IOptionsService, IBufferService } from 'common/services/Services';\nimport { EventEmitter, IEvent } from 'common/EventEmitter';\nimport { IDecPrivateModes } from 'common/Types';\nimport { clone } from 'common/Clone';\n\nconst DEFAULT_DEC_PRIVATE_MODES: IDecPrivateModes = Object.freeze({\n  applicationCursorKeys: false\n});\n\nexport class CoreService implements ICoreService {\n  serviceBrand: any;\n\n  public decPrivateModes: IDecPrivateModes;\n\n  private _onData = new EventEmitter<string>();\n  public get onData(): IEvent<string> { return this._onData.event; }\n  private _onUserInput = new EventEmitter<void>();\n  public get onUserInput(): IEvent<void> { return this._onUserInput.event; }\n\n  constructor(\n    // TODO: Move this into a service\n    private readonly _scrollToBottom: () => void,\n    @IBufferService private readonly _bufferService: IBufferService,\n    @ILogService private readonly _logService: ILogService,\n    @IOptionsService private readonly _optionsService: IOptionsService\n  ) {\n    this.decPrivateModes = clone(DEFAULT_DEC_PRIVATE_MODES);\n  }\n\n  public reset(): void {\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.options.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","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ILogService, IOptionsService } 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\n\nexport enum LogLevel {\n  DEBUG = 0,\n  INFO = 1,\n  WARN = 2,\n  ERROR = 3,\n  OFF = 4\n}\n\nconst optionsKeyToLogLevel: { [key: string]: LogLevel } = {\n  debug: LogLevel.DEBUG,\n  info: LogLevel.INFO,\n  warn: LogLevel.WARN,\n  error: LogLevel.ERROR,\n  off: LogLevel.OFF\n};\n\nconst LOG_PREFIX = 'xterm.js: ';\n\nexport class LogService implements ILogService {\n  serviceBrand: any;\n\n  private _logLevel!: LogLevel;\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.options.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  debug(message: string, ...optionalParams: any[]): void {\n    if (this._logLevel <= LogLevel.DEBUG) {\n      this._log(console.log, message, optionalParams);\n    }\n  }\n\n  info(message: string, ...optionalParams: any[]): void {\n    if (this._logLevel <= LogLevel.INFO) {\n      this._log(console.info, message, optionalParams);\n    }\n  }\n\n  warn(message: string, ...optionalParams: any[]): void {\n    if (this._logLevel <= LogLevel.WARN) {\n      this._log(console.warn, message, optionalParams);\n    }\n  }\n\n  error(message: string, ...optionalParams: any[]): void {\n    if (this._logLevel <= LogLevel.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 { IBufferService, IDirtyRowService } from 'common/services/Services';\n\nexport class DirtyRowService implements IDirtyRowService {\n  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  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  forEach(callback: (id: IServiceIdentifier<any>, instance: any) => any): void {\n    this._entries.forEach((value, key) => callback(key, value));\n  }\n\n  has(id: IServiceIdentifier<any>): boolean {\n    return this._entries.has(id);\n  }\n\n  get<T>(id: IServiceIdentifier<T>): T {\n    return this._entries.get(id);\n  }\n}\n\nexport class InstantiationService implements IInstantiationService {\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 createInstance<T>(ctor: any, ...args: any[]): any {\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 <T>new ctor(...[...args, ...serviceArgs]);\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. The Encoding of higher\n   * values is not UTF-8 compatible (and currently limited\n   * to 95 in xterm.js).\n   */\n  DEFAULT: (e: ICoreMouseEvent) => {\n    let params = [eventCode(e, false) + 32, e.col + 32, e.row + 32];\n    // FIXME: we are currently limited to ASCII range\n    params = params.map(v => (v > 127) ? 127 : v);\n    // FIXED: params = params.map(v => (v > 255) ? 0 : value);\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    Object.keys(DEFAULT_PROTOCOLS).forEach(name => this.addProtocol(name, DEFAULT_PROTOCOLS[name]));\n    Object.keys(DEFAULT_ENCODINGS).forEach(name => 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 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    this._coreService.triggerDataEvent(report, true);\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/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\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\nexport class WriteBuffer {\n  private _writeBuffer: (string | Uint8Array)[] = [];\n  private _callbacks: ((() => void) | undefined)[] = [];\n  private _pendingData = 0;\n  private _bufferOffset = 0;\n\n  constructor(private _action: (data: string | Uint8Array) => void) { }\n\n  public writeSync(data: string | Uint8Array): void {\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    if (this._writeBuffer.length) {\n      for (let i = this._bufferOffset; i < this._writeBuffer.length; ++i) {\n        const data = this._writeBuffer[i];\n        const cb = this._callbacks[i];\n        this._action(data);\n        if (cb) cb();\n      }\n      // reset all to avoid reprocessing of chunks with scheduled innerWrite call\n      this._writeBuffer = [];\n      this._callbacks = [];\n      this._pendingData = 0;\n      // stop scheduled innerWrite by offset > length condition\n      this._bufferOffset = 0x7FFFFFFF;\n    }\n    // handle current data chunk\n    this._action(data);\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  protected _innerWrite(): void {\n    const startTime = Date.now();\n    while (this._writeBuffer.length > this._bufferOffset) {\n      const data = this._writeBuffer[this._bufferOffset];\n      const cb = this._callbacks[this._bufferOffset];\n      this._bufferOffset++;\n\n      this._action(data);\n      this._pendingData -= data.length;\n      if (cb) cb();\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(), 0);\n    } else {\n      this._writeBuffer = [];\n      this._callbacks = [];\n      this._pendingData = 0;\n      this._bufferOffset = 0;\n    }\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(<any>terminal);\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"],"sourceRoot":""}
\ No newline at end of file