{"version":3,"sources":["../src/titlebar/index.ts","../src/base/common/color.ts","../src/base/common/lifecycle.ts","../src/base/common/iterator.ts","../src/base/common/linkedList.ts","../src/base/common/event.ts","../src/base/browser/browser.ts","../src/base/common/platform.ts","../src/base/common/keyCodes.ts","../src/base/browser/keyboardEvent.ts","../src/base/browser/mouseEvent.ts","../src/base/common/async.ts","../src/base/common/arrays.ts","../src/base/common/dom.ts","../src/menubar/index.ts","../src/consts.ts","../src/menubar/menu/item.ts","../src/base/common/strings.ts","../src/types/ipc-contract.ts","../src/menubar/menu/separator.ts","../src/menubar/menu/submenu.ts","../src/menubar/menu/index.ts","../src/base/browser/touch.ts","raw-loader:/home/runner/work/custom-electron-titlebar/custom-electron-titlebar/static/theme/base.css?raw","raw-loader:/home/runner/work/custom-electron-titlebar/custom-electron-titlebar/static/theme/mac.css?raw","raw-loader:/home/runner/work/custom-electron-titlebar/custom-electron-titlebar/static/theme/win.css?raw","../src/titlebar/themebar.ts","../src/titlebar/theme-config.ts","../src/index.ts"],"sourcesContent":["/* ---------------------------------------------------------------------------------------------\n *  Copyright (c) AlexTorresDev. All rights reserved.\n *  Licensed under the MIT License. See License.txt in the project root for license information.\n *-------------------------------------------------------------------------------------------- */\n\nimport { ipcRenderer, Menu } from 'electron'\nimport { Color } from 'base/common/color'\nimport {\n  $,\n  addClass,\n  addDisposableListener,\n  append,\n  EventType,\n  hide,\n  prepend,\n  removeClass,\n  show\n} from 'base/common/dom'\nimport { IDisposable } from 'base/common/lifecycle'\nimport {\n  isLinux,\n  isFreeBSD,\n  isMacintosh,\n  isWindows,\n  platform,\n  PlatformToString\n} from 'base/common/platform'\nimport { MenuBar } from 'menubar'\nimport { TitleBarOptions, TitlebarThemeConfig } from './options'\nimport { ThemeBar } from './themebar'\nimport { normalizeThemeConfig } from './theme-config'\nimport {\n  ACTIVE_FOREGROUND,\n  ACTIVE_FOREGROUND_DARK,\n  BOTTOM_TITLEBAR_HEIGHT,\n  DEFAULT_ITEM_SELECTOR,\n  getPx,\n  INACTIVE_FOREGROUND,\n  INACTIVE_FOREGROUND_DARK,\n  loadWindowIcons,\n  menuIcons,\n  TOP_TITLEBAR_HEIGHT_MAC,\n  TOP_TITLEBAR_HEIGHT_WIN\n} from 'consts'\nimport { IpcChannels } from 'types/ipc-contract'\n\nexport class CustomTitlebar extends ThemeBar {\n  private titlebar: HTMLElement\n  private dragRegion: HTMLElement\n  private icon: HTMLElement\n  private menuBarContainer: HTMLElement\n  private title: HTMLElement\n  private controlsContainer: HTMLElement\n  private container: HTMLElement\n\n  private menuBar?: MenuBar\n  private titleResizeListener?: IDisposable\n  private forcedForegroundColor?: Color\n\n  private isInactive: boolean = false\n\n  private controls: {\n    minimize: HTMLElement\n    maximize: HTMLElement\n    close: HTMLElement\n  }\n\n  private resizer: {\n    top: HTMLElement\n    left: HTMLElement\n  }\n\n  private currentOptions: TitleBarOptions = {\n    closeable: true,\n    enableMnemonics: true,\n    // hideWhenClickingClose: false,\n    iconSize: 16,\n    itemBackgroundColor: undefined,\n    maximizable: true,\n    menuPosition: 'left',\n    menuTransparency: 0,\n    minimizable: true,\n    onlyShowMenuBar: false,\n    removeMenuBar: false,\n    shadow: false,\n    titleHorizontalAlignment: 'center',\n    tooltips: {\n      close: 'Close',\n      maximize: 'Maximize',\n      minimize: 'Minimize',\n      restoreDown: 'Restore Down'\n    },\n    unfocusEffect: true,\n    minWidth: 400,\n    minHeight: 270\n  }\n\n  private platformIcons: { [key: string]: string }\n\n  private readonly onWindowMaximizeEvent = (_: unknown, isMaximized: boolean) =>\n    this.onDidChangeMaximized(isMaximized)\n  private readonly onWindowFullscreenEvent = (\n    _: unknown,\n    isFullScreen: boolean\n  ) => this.onWindowFullScreen(isFullScreen)\n  private readonly onWindowFocusEvent = (_: unknown, isFocused: boolean) =>\n    this.onWindowFocus(isFocused)\n\n  /**\n   * Create a new TitleBar instance\n   * @param options The options for the title bar\n   */\n  constructor(options: TitleBarOptions = {}) {\n    super()\n\n    this.currentOptions = { ...this.currentOptions, ...options }\n\n    const jWindowIcons = (menuIcons as any)[\n      PlatformToString(platform)?.toLocaleLowerCase()\n    ]\n    this.platformIcons = jWindowIcons\n\n    this.titlebar = $('.cet-titlebar')\n    this.dragRegion = $('.cet-drag-region')\n    this.icon = $('.cet-icon')\n    this.menuBarContainer = $('.cet-menubar')\n    this.title = $('.cet-title')\n    this.controlsContainer = $('.cet-window-controls')\n    this.container = $('.cet-container')\n\n    this.controls = {\n      minimize: $('.cet-control-minimize'),\n      maximize: $('.cet-control-maximize'),\n      close: $('.cet-control-close')\n    }\n\n    this.resizer = {\n      top: $('.cet-resizer.top'),\n      left: $('.cet-resizer.left')\n    }\n\n    append(this.titlebar, this.dragRegion)\n    append(this.titlebar, this.resizer.left)\n    append(this.titlebar, this.resizer.top)\n\n    this.loadIcons()\n    this.setupBackgroundColor()\n    this.createIcon()\n    this.setupMenubar()\n    this.setupTitle()\n    this.setupWindowControls()\n    this.setupContainer()\n    this.setupTitleBar()\n\n    this.loadEvents()\n    this.applyThemeConfigFromSource()\n\n    // this.registerTheme(ThemeBar.win)\n  }\n\n  private loadIcons() {\n    const icons = this.currentOptions.icons\n\n    if (icons) {\n      const { platformIcons } = loadWindowIcons(icons)\n      this.platformIcons = platformIcons\n    }\n  }\n\n  /**\n   * Setup the background color of the title bar\n   * By default, it will use the meta theme-color or msapplication-TileColor and if it doesn't exist, it will use white\n   */\n  private setupBackgroundColor() {\n    let color = this.currentOptions.backgroundColor\n\n    if (!color) {\n      const metaColor = document.querySelector(\n        'meta[name=\"theme-color\"], meta[name=\"msapplication-TileColor\"]'\n      )\n      const metaContent = metaColor?.getAttribute('content')\n      if (metaContent) {\n        color = Color.fromHex(metaContent)\n      }\n\n      if (!color) color = Color.WHITE\n\n      this.currentOptions.backgroundColor = color\n    }\n\n    this.titlebar.style.backgroundColor = color.toString()\n  }\n\n  /**\n   * Render the icon of the title bar, if is mac, it will not render\n   * By default, it will use the first icon found in the head of the document\n   */\n  private createIcon() {\n    // const onlyRendererMenuBar = this.currentOptions.onlyShowMenuBar\n\n    if (isMacintosh) return\n\n    let icon = this.currentOptions.icon\n\n    if (!icon) {\n      const linkIcon = document.querySelector(\n        'link[rel=\"icon\"], link[rel=\"shortcut icon\"]'\n      )\n      const href = linkIcon?.getAttribute('href')\n      if (href) {\n        icon = href\n        this.currentOptions.icon = href\n      }\n    }\n\n    if (icon) {\n      const windowIcon = append(this.icon, $('img'))\n\n      if (typeof icon === 'string') {\n        windowIcon.setAttribute('src', icon)\n      } else {\n        windowIcon.setAttribute('src', icon.toDataURL())\n      }\n\n      this.setIconSize(this.currentOptions.iconSize!)\n      append(this.titlebar, this.icon)\n    }\n  }\n\n  private setIconSize(size: number) {\n    if (!this.icon.firstElementChild) return\n\n    if (size < 16) size = 16\n    if (size > 24) size = 24\n\n    this.icon.firstElementChild.setAttribute('style', `height: ${size}px`)\n  }\n\n  private setupMenubar() {\n    ipcRenderer\n      .invoke(IpcChannels.REQUEST_APPLICATION_MENU)\n      ?.then((menu?: Menu) => this.updateMenu(menu))\n\n    const menuPosition = this.currentOptions.menuPosition\n    const removeMenuBar = this.currentOptions.removeMenuBar\n\n    if (menuPosition) {\n      this.updateMenuPosition(menuPosition)\n    }\n\n    if (removeMenuBar) {\n      if (this.menuBarContainer.parentElement) {\n        this.menuBarContainer.parentElement.removeChild(this.menuBarContainer)\n      }\n      return\n    }\n\n    append(this.titlebar, this.menuBarContainer)\n\n    ipcRenderer.send(\n      IpcChannels.SET_MINIMUM_SIZE,\n      this.currentOptions.minWidth,\n      this.currentOptions.minHeight\n    )\n  }\n\n  private setupTitle() {\n    const onlyRendererMenuBar = this.currentOptions.onlyShowMenuBar\n\n    if (onlyRendererMenuBar) return\n\n    this.updateTitle(document.title)\n    this.updateTitleAlignment(this.currentOptions.titleHorizontalAlignment!)\n    append(this.titlebar, this.title)\n  }\n\n  private createControlButton(\n    element: HTMLElement,\n    icon: string,\n    title: string,\n    active: boolean = true\n  ) {\n    addClass(element, 'cet-control-icon')\n    element.innerHTML = icon\n    element.title = title\n\n    if (!active) {\n      addClass(element, 'inactive')\n    }\n\n    append(this.controlsContainer, element)\n  }\n\n  private setupWindowControls() {\n    const onlyRendererMenuBar = this.currentOptions.onlyShowMenuBar\n    const tooltips = this.currentOptions.tooltips!\n\n    if (isMacintosh || onlyRendererMenuBar) return\n\n    this.createControlButton(\n      this.controls.minimize,\n      this.platformIcons?.minimize,\n      tooltips.minimize!,\n      this.currentOptions.minimizable\n    )\n    this.createControlButton(\n      this.controls.maximize,\n      this.platformIcons?.maximize,\n      tooltips.maximize!,\n      this.currentOptions.maximizable\n    )\n    this.createControlButton(\n      this.controls.close,\n      this.platformIcons?.close,\n      tooltips.close!,\n      this.currentOptions.closeable\n    )\n\n    append(this.titlebar, this.controlsContainer)\n  }\n\n  private setupContainer() {\n    const containerOverflow = this.currentOptions.containerOverflow\n\n    if (containerOverflow) {\n      this.container.style.overflow = containerOverflow\n    }\n\n    while (document.body.firstChild) {\n      append(this.container, document.body.firstChild)\n    }\n\n    append(document.body, this.container)\n  }\n\n  private setupTitleBar() {\n    const order = this.currentOptions.order\n    const hasShadow = this.currentOptions.shadow\n\n    addClass(\n      this.titlebar,\n      `cet-${PlatformToString(platform)?.toLocaleLowerCase()}`\n    )\n\n    if (order) {\n      addClass(this.titlebar, `cet-${order}`)\n    }\n\n    if (hasShadow) {\n      addClass(this.titlebar, 'cet-shadow')\n    }\n\n    if (!isMacintosh) {\n      this.title.style.cursor = 'default'\n    }\n\n    prepend(document.body, this.titlebar)\n  }\n\n  private loadEvents() {\n    const onlyRendererMenuBar = this.currentOptions.onlyShowMenuBar\n\n    if (onlyRendererMenuBar) return\n\n    const minimizable = this.currentOptions.minimizable\n    const maximizable = this.currentOptions.maximizable\n    const closeable = this.currentOptions.closeable\n\n    void ipcRenderer\n      .invoke(IpcChannels.GET_WINDOW_MAXIMIZED)\n      .then((isMaximized: boolean) => {\n        this.onDidChangeMaximized(isMaximized)\n      })\n\n    ipcRenderer.on('window-maximize', this.onWindowMaximizeEvent)\n    ipcRenderer.on('window-fullscreen', this.onWindowFullscreenEvent)\n    ipcRenderer.on('window-focus', this.onWindowFocusEvent)\n\n    if (minimizable) {\n      this._register(\n        addDisposableListener(this.controls.minimize, EventType.CLICK, () => {\n          ipcRenderer.send(IpcChannels.WINDOW_EVENT, 'window-minimize')\n        })\n      )\n    }\n\n    if (isMacintosh) {\n      this._register(\n        addDisposableListener(this.titlebar, EventType.DBLCLICK, () => {\n          ipcRenderer.send(IpcChannels.WINDOW_EVENT, 'window-maximize')\n        })\n      )\n    }\n\n    if (maximizable) {\n      this._register(\n        addDisposableListener(this.controls.maximize, EventType.CLICK, () => {\n          ipcRenderer.send(IpcChannels.WINDOW_EVENT, 'window-maximize')\n        })\n      )\n    }\n\n    if (closeable) {\n      this._register(\n        addDisposableListener(this.controls.close, EventType.CLICK, () => {\n          ipcRenderer.send(IpcChannels.WINDOW_EVENT, 'window-close')\n        })\n      )\n    }\n  }\n\n  private closeMenu = () => {\n    if (this.menuBar) {\n      this.menuBar.blur()\n    }\n  }\n\n  private onBlur() {\n    this.isInactive = true\n    this.updateStyles()\n  }\n\n  private onFocus() {\n    this.isInactive = false\n    this.updateStyles()\n  }\n\n  private onMenuBarVisibilityChanged(visible: boolean) {\n    if (isWindows || isLinux || isFreeBSD) {\n      if (visible) {\n        // Hack to fix issue #52522 with layered webkit-app-region elements appearing under cursor\n        hide(this.dragRegion)\n        setTimeout(() => show(this.dragRegion), 50)\n      }\n    }\n  }\n\n  private onMenuBarFocusChanged(focused: boolean) {\n    if (isWindows || isLinux || isFreeBSD) {\n      if (focused) hide(this.dragRegion)\n      else show(this.dragRegion)\n    }\n  }\n\n  private onDidChangeMaximized(isMaximized: boolean) {\n    const maximize = this.controls.maximize\n\n    if (maximize) {\n      maximize.title = isMaximized\n        ? this.currentOptions.tooltips?.restoreDown || 'Restore Down'\n        : this.currentOptions.tooltips?.maximize || 'Maximize'\n      maximize.innerHTML = isMaximized\n        ? this.platformIcons?.restore\n        : this.platformIcons?.maximize\n    }\n\n    if (this.resizer) {\n      if (isMaximized) hide(this.resizer.top, this.resizer.left)\n      else show(this.resizer.top, this.resizer.left)\n    }\n  }\n\n  private updateMenu(menu?: Menu) {\n    if (isMacintosh || !menu || this.currentOptions.removeMenuBar) return\n\n    if (this.menuBar) this.menuBar.dispose()\n\n    this.menuBar = new MenuBar(\n      this.menuBarContainer,\n      menuIcons,\n      this.currentOptions,\n      { enableMnemonics: this.currentOptions.enableMnemonics ?? true },\n      this.closeMenu\n    )\n    this.menuBar.push(menu)\n    this.menuBar.update()\n    this.menuBar.onVisibilityChange((e) => this.onMenuBarVisibilityChanged(e))\n    this.menuBar.onFocusStateChange((e) => this.onMenuBarFocusChanged(e))\n\n    this.updateStyles()\n  }\n\n  private async applyThemeConfigFromSource(): Promise<void> {\n    // First, check for inline config (backward compatibility)\n    const inlineConfig = this.currentOptions.themeConfig\n    if (inlineConfig) {\n      this.applyThemeConfig(inlineConfig, 'inline')\n      return\n    }\n\n    // Load pre-configured theme delivered by main process\n    try {\n      const loaded = (await ipcRenderer.invoke(\n        IpcChannels.GET_THEME_CONFIG\n      )) as unknown\n      if (loaded) {\n        const normalized = normalizeThemeConfig(loaded)\n        normalized.warnings.forEach((warning) => {\n          console.warn(`[custom-electron-titlebar] ${warning}`)\n        })\n        if (normalized.config) {\n          this.applyThemeConfig(normalized.config, 'main-process')\n        }\n      }\n    } catch (_) {\n      // Ignore theme loading errors and keep default style.\n    }\n  }\n\n  private applyThemeConfig(\n    themeConfig: TitlebarThemeConfig,\n    source: string\n  ): void {\n    const normalized = normalizeThemeConfig(themeConfig)\n    normalized.warnings.forEach((warning) => {\n      console.warn(`[custom-electron-titlebar] ${warning} (source: ${source})`)\n    })\n\n    if (!normalized.config) {\n      return\n    }\n\n    const cfg = normalized.config\n\n    if (cfg.fontFamily) {\n      this.titlebar.style.setProperty('--cet-font-family', cfg.fontFamily)\n    }\n\n    if (typeof cfg.fontSize === 'number' && Number.isFinite(cfg.fontSize)) {\n      const baseSize = Math.max(10, Math.floor(cfg.fontSize))\n      this.titlebar.style.setProperty('--cet-font-size', getPx(baseSize))\n      this.titlebar.style.setProperty(\n        '--cet-title-font-size',\n        getPx(Math.max(10, baseSize - 1))\n      )\n      this.titlebar.style.setProperty(\n        '--cet-menu-font-size',\n        getPx(Math.max(10, baseSize - 1))\n      )\n    }\n\n    const colors = cfg.colors\n    if (colors) {\n      const titlebarColor = this.parseThemeColor(colors.titlebar)\n      if (titlebarColor) {\n        this.currentOptions.backgroundColor = titlebarColor\n      }\n\n      const menuBarColor = this.parseThemeColor(colors.menuBar)\n      if (menuBarColor) {\n        this.currentOptions.menuBarBackgroundColor = menuBarColor\n      }\n\n      const menuSelectionColor = this.parseThemeColor(colors.menuItemSelection)\n      if (menuSelectionColor) {\n        this.currentOptions.itemBackgroundColor = menuSelectionColor\n      }\n\n      const menuSeparatorColor = this.parseThemeColor(colors.menuSeparator)\n      if (menuSeparatorColor) {\n        this.currentOptions.menuSeparatorColor = menuSeparatorColor\n      }\n\n      const svgColor = this.parseThemeColor(colors.svg)\n      if (svgColor) {\n        this.currentOptions.svgColor = svgColor\n      }\n\n      const titlebarForeground = this.parseThemeColor(colors.titlebarForeground)\n      if (titlebarForeground) {\n        this.forcedForegroundColor = titlebarForeground\n      }\n    }\n\n    this.updateStyles()\n  }\n\n  private parseThemeColor(colorValue?: string): Color | undefined {\n    if (!colorValue || typeof colorValue !== 'string') {\n      return undefined\n    }\n\n    const normalized = colorValue.trim()\n    if (!normalized.startsWith('#')) {\n      return undefined\n    }\n\n    try {\n      return Color.fromHex(normalized)\n    } catch (_) {\n      return undefined\n    }\n  }\n\n  private updateStyles() {\n    if (this.isInactive) {\n      addClass(this.titlebar, 'inactive')\n    } else {\n      removeClass(this.titlebar, 'inactive')\n    }\n\n    const backgroundColor =\n      this.isInactive && this.currentOptions.unfocusEffect\n        ? this.currentOptions.backgroundColor?.lighten(0.12)\n        : this.currentOptions.backgroundColor\n\n    if (backgroundColor) {\n      this.titlebar.style.backgroundColor = backgroundColor?.toString()\n    }\n\n    let foregroundColor: Color\n\n    if (backgroundColor?.isLighter()) {\n      addClass(this.titlebar, 'light')\n\n      foregroundColor =\n        this.isInactive && this.currentOptions.unfocusEffect\n          ? INACTIVE_FOREGROUND_DARK\n          : ACTIVE_FOREGROUND_DARK\n    } else {\n      removeClass(this.titlebar, 'light')\n\n      foregroundColor =\n        this.isInactive && this.currentOptions.unfocusEffect\n          ? INACTIVE_FOREGROUND\n          : ACTIVE_FOREGROUND\n    }\n\n    const effectiveForegroundColor =\n      this.forcedForegroundColor || foregroundColor\n    this.titlebar.style.color = effectiveForegroundColor?.toString()\n\n    show(this.controlsContainer)\n\n    void ipcRenderer\n      .invoke(IpcChannels.UPDATE_WINDOW_CONTROLS, {\n        color: backgroundColor?.toString(),\n        symbolColor: effectiveForegroundColor?.toString(),\n        height: TOP_TITLEBAR_HEIGHT_WIN\n      })\n      .then((updatedWindowControls: boolean) => {\n        if (updatedWindowControls) {\n          hide(this.controlsContainer)\n        } else {\n          show(this.controlsContainer)\n        }\n      })\n      .catch(() => {\n        show(this.controlsContainer)\n      })\n\n    if (this.menuBar) {\n      let fgColor\n      const backgroundColor =\n        this.currentOptions.menuBarBackgroundColor ||\n        this.currentOptions.backgroundColor?.darken(0.12) ||\n        Color.WHITE\n\n      const foregroundColor = backgroundColor?.isLighter()\n        ? INACTIVE_FOREGROUND_DARK\n        : INACTIVE_FOREGROUND\n\n      const bgColor =\n        this.currentOptions.itemBackgroundColor &&\n        !this.currentOptions.itemBackgroundColor.equals(backgroundColor)\n          ? this.currentOptions.itemBackgroundColor\n          : DEFAULT_ITEM_SELECTOR\n\n      if (bgColor?.equals(DEFAULT_ITEM_SELECTOR)) {\n        fgColor = backgroundColor?.isLighter()\n          ? ACTIVE_FOREGROUND_DARK\n          : ACTIVE_FOREGROUND\n      } else {\n        fgColor = bgColor?.isLighter()\n          ? ACTIVE_FOREGROUND_DARK\n          : ACTIVE_FOREGROUND\n      }\n\n      this.menuBar.setStyles({\n        backgroundColor,\n        foregroundColor,\n        selectionBackgroundColor: bgColor,\n        selectionForegroundColor: fgColor,\n        separatorColor:\n          this.currentOptions.menuSeparatorColor ?? foregroundColor,\n        svgColor: this.currentOptions.svgColor\n      })\n    }\n  }\n\n  private canCenterTitle() {\n    const menuBarContainerMargin = 20\n    const menuSpaceLimit =\n      window.innerWidth / 2 -\n      this.menuBarContainer.getBoundingClientRect().right -\n      menuBarContainerMargin\n    return this.title.getBoundingClientRect().width / 2 <= menuSpaceLimit\n  }\n\n  /// Public methods\n\n  /**\n   * Update title bar styles based on focus state.\n   * @param hasFocus focus state of the window\n   */\n  public onWindowFocus(focus: boolean) {\n    if (this.titlebar) {\n      if (focus) {\n        removeClass(this.titlebar, 'inactive')\n        this.onFocus()\n      } else {\n        addClass(this.titlebar, 'inactive')\n        this.menuBar?.blur()\n        this.onBlur()\n      }\n    }\n  }\n\n  /**\n   * Update the full screen state and hide or show the title bar.\n   * @param fullscreen Fullscreen state of the window\n   */\n  public onWindowFullScreen(fullscreen: boolean) {\n    const height = isMacintosh\n      ? TOP_TITLEBAR_HEIGHT_MAC\n      : TOP_TITLEBAR_HEIGHT_WIN\n    const hasShadow = this.currentOptions.shadow\n\n    if (!isMacintosh) {\n      if (fullscreen) {\n        hide(this.titlebar)\n        this.container.style.top = '0px'\n      } else {\n        show(this.titlebar)\n        if (this.currentOptions.menuPosition === 'bottom') {\n          this.container.style.top = getPx(BOTTOM_TITLEBAR_HEIGHT)\n          this.controlsContainer.style.height = getPx(TOP_TITLEBAR_HEIGHT_WIN)\n        } else {\n          this.container.style.top = getPx(height + (hasShadow ? 1 : 0))\n        }\n      }\n    }\n  }\n\n  /**\n   * Update the title of the title bar.\n   * You can use this method if change the content of `<title>` tag on your html.\n   * @param title The title of the title bar and document.\n   */\n  public updateTitle(title: string) {\n    this.title.innerText = title\n    document.title = title\n\n    return this\n  }\n\n  /**\n   * It method set new icon to title-bar-icon of title-bar.\n   * @param path path to icon\n   */\n  public updateIcon(path: string) {\n    if (this.icon && this.icon.firstElementChild) {\n      this.icon.firstElementChild.setAttribute('src', path)\n    }\n\n    return this\n  }\n\n  /**\n   * Horizontal alignment of the title.\n   * @param side `left`, `center` or `right`.\n   */\n  public updateTitleAlignment(side: 'left' | 'center' | 'right') {\n    const order = this.currentOptions.order\n    const menuPosition = this.currentOptions.menuPosition\n\n    if (this.titleResizeListener) {\n      this.titleResizeListener.dispose()\n      this.titleResizeListener = undefined\n    }\n\n    if (side === 'left' || (side === 'right' && order === 'inverted')) {\n      removeClass(this.title, 'cet-title-left')\n      removeClass(this.title, 'cet-title-right')\n      removeClass(this.title, 'cet-title-center')\n      addClass(this.title, 'cet-title-left')\n    }\n\n    if (side === 'right' || (side === 'left' && order === 'inverted')) {\n      if (side !== 'left' && order !== 'inverted') {\n        this.controlsContainer.style.marginLeft = '10px'\n      }\n\n      removeClass(this.title, 'cet-title-left')\n      removeClass(this.title, 'cet-title-right')\n      removeClass(this.title, 'cet-title-center')\n      addClass(this.title, 'cet-title-right')\n    }\n\n    if (side === 'center') {\n      removeClass(this.title, 'cet-title-left')\n      removeClass(this.title, 'cet-title-right')\n      removeClass(this.title, 'cet-title-center')\n\n      if (menuPosition !== 'bottom') {\n        this.titleResizeListener = this._register(\n          addDisposableListener(window, 'resize', () => {\n            if (this.canCenterTitle()) {\n              addClass(this.title, 'cet-title-center')\n            } else {\n              removeClass(this.title, 'cet-title-center')\n            }\n          })\n        )\n        if (this.canCenterTitle()) {\n          addClass(this.title, 'cet-title-center')\n        }\n      }\n\n      if (!isMacintosh && order === 'first-buttons') {\n        this.controlsContainer.style.marginLeft = 'auto'\n      }\n\n      this.title.style.maxWidth = 'calc(100% - 296px)'\n    }\n\n    return this\n  }\n\n  /**\n   * Update the background color of the title bar\n   * @param backgroundColor The color for the background\n   */\n  public updateBackground(backgroundColor: Color) {\n    if (typeof backgroundColor === 'string')\n      backgroundColor = Color.fromHex(backgroundColor)\n    this.currentOptions.backgroundColor = backgroundColor\n    this.updateStyles()\n\n    return this\n  }\n\n  /**\n   * Update the item background color of the menubar\n   * @param itemBGColor The color for the item background\n   */\n  public updateItemBGColor(itemBGColor: Color) {\n    if (typeof itemBGColor === 'string')\n      itemBGColor = Color.fromHex(itemBGColor)\n    this.currentOptions.itemBackgroundColor = itemBGColor\n    this.updateStyles()\n\n    return this\n  }\n\n  /**\n   * Update the menu from Menu.getApplicationMenu()\n   */\n  public async refreshMenu() {\n    if (!isMacintosh) {\n      ipcRenderer\n        .invoke(IpcChannels.REQUEST_APPLICATION_MENU)\n        .then((menu: Menu) => this.updateMenu(menu))\n    }\n\n    return this\n  }\n\n  /**\n   * Update the position of menubar.\n   * @param menuPosition The position of the menu `left` or `bottom`.\n   */\n  public updateMenuPosition(menuPosition: 'left' | 'bottom') {\n    const height = isMacintosh\n      ? TOP_TITLEBAR_HEIGHT_MAC\n      : TOP_TITLEBAR_HEIGHT_WIN\n    const onlyRendererMenuBar = this.currentOptions.onlyShowMenuBar\n    const hasShadow = this.currentOptions.shadow\n\n    this.currentOptions.menuPosition = menuPosition\n\n    if (menuPosition === 'left' || onlyRendererMenuBar) {\n      this.titlebar.style.height = getPx(height + (hasShadow ? 1 : 0))\n      this.container.style.top = getPx(height + (hasShadow ? 1 : 0))\n      removeClass(this.menuBarContainer, 'bottom')\n    } else {\n      this.titlebar.style.height = getPx(BOTTOM_TITLEBAR_HEIGHT)\n      this.container.style.top = getPx(BOTTOM_TITLEBAR_HEIGHT)\n      this.controlsContainer.style.height = getPx(height)\n      addClass(this.menuBarContainer, 'bottom')\n    }\n\n    return this\n  }\n\n  /**\n   * Remove the titlebar, menubar and all methods.\n   */\n  public dispose() {\n    if (this.titleResizeListener) {\n      this.titleResizeListener.dispose()\n      this.titleResizeListener = undefined\n    }\n\n    ipcRenderer.removeListener('window-maximize', this.onWindowMaximizeEvent)\n    ipcRenderer.removeListener(\n      'window-fullscreen',\n      this.onWindowFullscreenEvent\n    )\n    ipcRenderer.removeListener('window-focus', this.onWindowFocusEvent)\n\n    if (this.menuBar) {\n      this.menuBar.dispose()\n      this.menuBar = undefined\n    }\n\n    super.dispose()\n\n    this.titlebar.remove()\n    while (this.container.firstChild)\n      append(document.body, this.container.firstChild)\n    this.container.remove()\n  }\n\n  public get titlebarElement() {\n    return this.titlebar\n  }\n\n  public get menubarElement() {\n    return this.menuBar\n  }\n\n  public get containerElement() {\n    return this.container\n  }\n\n  public get titleElement() {\n    return this.title\n  }\n}\n","/* ---------------------------------------------------------------------------------------------\n *  Copyright (c) Microsoft Corporation. All rights reserved.\n *  Licensed under the MIT License. See License.txt in the project root for license information.\n *-------------------------------------------------------------------------------------------- */\n\n/* eslint-disable no-inner-declarations */\n/* eslint-disable indent */\n\nimport { CharCode } from 'base/common/charCode'\n\nfunction roundFloat(number: number, decimalPoints: number): number {\n\tconst decimal = Math.pow(10, decimalPoints)\n\treturn Math.round(number * decimal) / decimal\n}\n\nexport class RGBA {\n\t/**\n\t * Red: integer in [0-255]\n\t */\n\treadonly r: number\n\n\t/**\n\t * Green: integer in [0-255]\n\t */\n\treadonly g: number\n\n\t/**\n\t * Blue: integer in [0-255]\n\t */\n\treadonly b: number\n\n\t/**\n\t * Alpha: float in [0-1]\n\t */\n\treadonly a: number\n\n\tconstructor(r: number, g: number, b: number, a = 1) {\n\t\tthis.r = Math.min(255, Math.max(0, r)) | 0\n\t\tthis.g = Math.min(255, Math.max(0, g)) | 0\n\t\tthis.b = Math.min(255, Math.max(0, b)) | 0\n\t\tthis.a = roundFloat(Math.max(Math.min(1, a), 0), 3)\n\t}\n\n\tstatic equals(a: RGBA, b: RGBA): boolean {\n\t\treturn a.r === b.r && a.g === b.g && a.b === b.b && a.a === b.a\n\t}\n}\n\nexport class HSLA {\n\t/**\n\t * Hue: integer in [0, 360]\n\t */\n\treadonly h: number\n\n\t/**\n\t * Saturation: float in [0, 1]\n\t */\n\treadonly s: number\n\n\t/**\n\t * Luminosity: float in [0, 1]\n\t */\n\treadonly l: number\n\n\t/**\n\t * Alpha: float in [0, 1]\n\t */\n\treadonly a: number\n\n\tconstructor(h: number, s: number, l: number, a: number) {\n\t\tthis.h = Math.max(Math.min(360, h), 0) | 0\n\t\tthis.s = roundFloat(Math.max(Math.min(1, s), 0), 3)\n\t\tthis.l = roundFloat(Math.max(Math.min(1, l), 0), 3)\n\t\tthis.a = roundFloat(Math.max(Math.min(1, a), 0), 3)\n\t}\n\n\tstatic equals(a: HSLA, b: HSLA): boolean {\n\t\treturn a.h === b.h && a.s === b.s && a.l === b.l && a.a === b.a\n\t}\n\n\t/**\n\t * Converts an RGB color value to HSL. Conversion formula\n\t * adapted from http://en.wikipedia.org/wiki/HSL_color_space.\n\t * Assumes r, g, and b are contained in the set [0, 255] and\n\t * returns h in the set [0, 360], s, and l in the set [0, 1].\n\t */\n\tstatic fromRGBA(rgba: RGBA): HSLA {\n\t\tconst r = rgba.r / 255\n\t\tconst g = rgba.g / 255\n\t\tconst b = rgba.b / 255\n\t\tconst a = rgba.a\n\n\t\tconst max = Math.max(r, g, b)\n\t\tconst min = Math.min(r, g, b)\n\t\tlet h = 0\n\t\tlet s = 0\n\t\tconst l = (min + max) / 2\n\t\tconst chroma = max - min\n\n\t\tif (chroma > 0) {\n\t\t\ts = Math.min((l <= 0.5 ? chroma / (2 * l) : chroma / (2 - (2 * l))), 1)\n\n\t\t\tswitch (max) {\n\t\t\t\tcase r: h = (g - b) / chroma + (g < b ? 6 : 0); break\n\t\t\t\tcase g: h = (b - r) / chroma + 2; break\n\t\t\t\tcase b: h = (r - g) / chroma + 4; break\n\t\t\t}\n\n\t\t\th *= 60\n\t\t\th = Math.round(h)\n\t\t}\n\t\treturn new HSLA(h, s, l, a)\n\t}\n\n\tprivate static _hue2rgb(p: number, q: number, t: number): number {\n\t\tif (t < 0) {\n\t\t\tt += 1\n\t\t}\n\t\tif (t > 1) {\n\t\t\tt -= 1\n\t\t}\n\t\tif (t < 1 / 6) {\n\t\t\treturn p + (q - p) * 6 * t\n\t\t}\n\t\tif (t < 1 / 2) {\n\t\t\treturn q\n\t\t}\n\t\tif (t < 2 / 3) {\n\t\t\treturn p + (q - p) * (2 / 3 - t) * 6\n\t\t}\n\t\treturn p\n\t}\n\n\t/**\n\t * Converts an HSL color value to RGB. Conversion formula\n\t * adapted from http://en.wikipedia.org/wiki/HSL_color_space.\n\t * Assumes h in the set [0, 360] s, and l are contained in the set [0, 1] and\n\t * returns r, g, and b in the set [0, 255].\n\t */\n\tstatic toRGBA(hsla: HSLA): RGBA {\n\t\tconst h = hsla.h / 360\n\t\tconst { s, l, a } = hsla\n\t\tlet r: number, g: number, b: number\n\n\t\tif (s === 0) {\n\t\t\tr = g = b = l // achromatic\n\t\t} else {\n\t\t\tconst q = l < 0.5 ? l * (1 + s) : l + s - l * s\n\t\t\tconst p = 2 * l - q\n\t\t\tr = HSLA._hue2rgb(p, q, h + 1 / 3)\n\t\t\tg = HSLA._hue2rgb(p, q, h)\n\t\t\tb = HSLA._hue2rgb(p, q, h - 1 / 3)\n\t\t}\n\n\t\treturn new RGBA(Math.round(r * 255), Math.round(g * 255), Math.round(b * 255), a)\n\t}\n}\n\nexport class HSVA {\n\t/**\n\t * Hue: integer in [0, 360]\n\t */\n\treadonly h: number\n\n\t/**\n\t * Saturation: float in [0, 1]\n\t */\n\treadonly s: number\n\n\t/**\n\t * Value: float in [0, 1]\n\t */\n\treadonly v: number\n\n\t/**\n\t * Alpha: float in [0, 1]\n\t */\n\treadonly a: number\n\n\tconstructor(h: number, s: number, v: number, a: number) {\n\t\tthis.h = Math.max(Math.min(360, h), 0) | 0\n\t\tthis.s = roundFloat(Math.max(Math.min(1, s), 0), 3)\n\t\tthis.v = roundFloat(Math.max(Math.min(1, v), 0), 3)\n\t\tthis.a = roundFloat(Math.max(Math.min(1, a), 0), 3)\n\t}\n\n\tstatic equals(a: HSVA, b: HSVA): boolean {\n\t\treturn a.h === b.h && a.s === b.s && a.v === b.v && a.a === b.a\n\t}\n\n\t// from http://www.rapidtables.com/convert/color/rgb-to-hsv.htm\n\tstatic fromRGBA(rgba: RGBA): HSVA {\n\t\tconst r = rgba.r / 255\n\t\tconst g = rgba.g / 255\n\t\tconst b = rgba.b / 255\n\t\tconst cmax = Math.max(r, g, b)\n\t\tconst cmin = Math.min(r, g, b)\n\t\tconst delta = cmax - cmin\n\t\tconst s = cmax === 0 ? 0 : (delta / cmax)\n\t\tlet m: number\n\n\t\tif (delta === 0) {\n\t\t\tm = 0\n\t\t} else if (cmax === r) {\n\t\t\tm = ((((g - b) / delta) % 6) + 6) % 6\n\t\t} else if (cmax === g) {\n\t\t\tm = ((b - r) / delta) + 2\n\t\t} else {\n\t\t\tm = ((r - g) / delta) + 4\n\t\t}\n\n\t\treturn new HSVA(Math.round(m * 60), s, cmax, rgba.a)\n\t}\n\n\t// from http://www.rapidtables.com/convert/color/hsv-to-rgb.htm\n\tstatic toRGBA(hsva: HSVA): RGBA {\n\t\tconst { h, s, v, a } = hsva\n\t\tconst c = v * s\n\t\tconst x = c * (1 - Math.abs((h / 60) % 2 - 1))\n\t\tconst m = v - c\n\t\tlet [r, g, b] = [0, 0, 0]\n\n\t\tif (h < 60) {\n\t\t\tr = c\n\t\t\tg = x\n\t\t} else if (h < 120) {\n\t\t\tr = x\n\t\t\tg = c\n\t\t} else if (h < 180) {\n\t\t\tg = c\n\t\t\tb = x\n\t\t} else if (h < 240) {\n\t\t\tg = x\n\t\t\tb = c\n\t\t} else if (h < 300) {\n\t\t\tr = x\n\t\t\tb = c\n\t\t} else if (h < 360) {\n\t\t\tr = c\n\t\t\tb = x\n\t\t}\n\n\t\tr = Math.round((r + m) * 255)\n\t\tg = Math.round((g + m) * 255)\n\t\tb = Math.round((b + m) * 255)\n\n\t\treturn new RGBA(r, g, b, a)\n\t}\n}\n\nexport class Color {\n\tstatic fromHex(hex: string): Color {\n\t\treturn Color.Format.CSS.parseHex(hex) || Color.RED\n\t}\n\n\treadonly rgba: RGBA\n\tprivate _hsla?: HSLA\n\tget hsla(): HSLA {\n\t\tif (this._hsla) {\n\t\t\treturn this._hsla\n\t\t} else {\n\t\t\treturn HSLA.fromRGBA(this.rgba)\n\t\t}\n\t}\n\n\tprivate _hsva?: HSVA\n\tget hsva(): HSVA {\n\t\tif (this._hsva) {\n\t\t\treturn this._hsva\n\t\t}\n\t\treturn HSVA.fromRGBA(this.rgba)\n\t}\n\n\tconstructor(arg: RGBA | HSLA | HSVA) {\n\t\tif (!arg) {\n\t\t\tthrow new Error('Color needs a value')\n\t\t} else if (arg instanceof RGBA) {\n\t\t\tthis.rgba = arg\n\t\t} else if (arg instanceof HSLA) {\n\t\t\tthis._hsla = arg\n\t\t\tthis.rgba = HSLA.toRGBA(arg)\n\t\t} else if (arg instanceof HSVA) {\n\t\t\tthis._hsva = arg\n\t\t\tthis.rgba = HSVA.toRGBA(arg)\n\t\t} else {\n\t\t\tthrow new Error('Invalid color ctor argument')\n\t\t}\n\t}\n\n\tequals(other: Color): boolean {\n\t\treturn !!other && RGBA.equals(this.rgba, other.rgba) && HSLA.equals(this.hsla, other.hsla) && HSVA.equals(this.hsva, other.hsva)\n\t}\n\n\t/**\n\t * http://www.w3.org/TR/WCAG20/#relativeluminancedef\n\t * Returns the number in the set [0, 1]. O => Darkest Black. 1 => Lightest white.\n\t */\n\tgetRelativeLuminance(): number {\n\t\tconst R = Color._relativeLuminanceForComponent(this.rgba.r)\n\t\tconst G = Color._relativeLuminanceForComponent(this.rgba.g)\n\t\tconst B = Color._relativeLuminanceForComponent(this.rgba.b)\n\t\tconst luminance = 0.2126 * R + 0.7152 * G + 0.0722 * B\n\n\t\treturn roundFloat(luminance, 4)\n\t}\n\n\tprivate static _relativeLuminanceForComponent(color: number): number {\n\t\tconst c = color / 255\n\t\treturn (c <= 0.03928) ? c / 12.92 : Math.pow(((c + 0.055) / 1.055), 2.4)\n\t}\n\n\t/**\n\t * http://www.w3.org/TR/WCAG20/#contrast-ratiodef\n\t * Returns the contrast ration number in the set [1, 21].\n\t */\n\tgetContrastRatio(another: Color): number {\n\t\tconst lum1 = this.getRelativeLuminance()\n\t\tconst lum2 = another.getRelativeLuminance()\n\t\treturn lum1 > lum2 ? (lum1 + 0.05) / (lum2 + 0.05) : (lum2 + 0.05) / (lum1 + 0.05)\n\t}\n\n\t/**\n\t *\thttp://24ways.org/2010/calculating-color-contrast\n\t *  Return 'true' if darker color otherwise 'false'\n\t */\n\tisDarker(): boolean {\n\t\tconst yiq = (this.rgba.r * 299 + this.rgba.g * 587 + this.rgba.b * 114) / 1000\n\t\treturn yiq < 128\n\t}\n\n\t/**\n\t *\thttp://24ways.org/2010/calculating-color-contrast\n\t *  Return 'true' if lighter color otherwise 'false'\n\t */\n\tisLighter(): boolean {\n\t\tconst yiq = (this.rgba.r * 299 + this.rgba.g * 587 + this.rgba.b * 114) / 1000\n\t\treturn yiq >= 128\n\t}\n\n\tisLighterThan(another: Color): boolean {\n\t\tconst lum1 = this.getRelativeLuminance()\n\t\tconst lum2 = another.getRelativeLuminance()\n\t\treturn lum1 > lum2\n\t}\n\n\tisDarkerThan(another: Color): boolean {\n\t\tconst lum1 = this.getRelativeLuminance()\n\t\tconst lum2 = another.getRelativeLuminance()\n\t\treturn lum1 < lum2\n\t}\n\n\tlighten(factor: number): Color {\n\t\treturn new Color(new HSLA(this.hsla.h, this.hsla.s, this.hsla.l + this.hsla.l * factor, this.hsla.a))\n\t}\n\n\tdarken(factor: number): Color {\n\t\treturn new Color(new HSLA(this.hsla.h, this.hsla.s, this.hsla.l - this.hsla.l * factor, this.hsla.a))\n\t}\n\n\ttransparent(factor: number): Color {\n\t\tconst { r, g, b, a } = this.rgba\n\t\treturn new Color(new RGBA(r, g, b, a * factor))\n\t}\n\n\tisTransparent(): boolean {\n\t\treturn this.rgba.a === 0\n\t}\n\n\tisOpaque(): boolean {\n\t\treturn this.rgba.a === 1\n\t}\n\n\topposite(): Color {\n\t\treturn new Color(new RGBA(255 - this.rgba.r, 255 - this.rgba.g, 255 - this.rgba.b, this.rgba.a))\n\t}\n\n\tblend(c: Color): Color {\n\t\tconst rgba = c.rgba\n\n\t\t// Convert to 0..1 opacity\n\t\tconst thisA = this.rgba.a\n\t\tconst colorA = rgba.a\n\n\t\tconst a = thisA + colorA * (1 - thisA)\n\t\tif (a < 1e-6) {\n\t\t\treturn Color.TRANSPARENT\n\t\t}\n\n\t\tconst r = this.rgba.r * thisA / a + rgba.r * colorA * (1 - thisA) / a\n\t\tconst g = this.rgba.g * thisA / a + rgba.g * colorA * (1 - thisA) / a\n\t\tconst b = this.rgba.b * thisA / a + rgba.b * colorA * (1 - thisA) / a\n\n\t\treturn new Color(new RGBA(r, g, b, a))\n\t}\n\n\tflatten(...backgrounds: Color[]): Color {\n\t\tconst background = backgrounds.reduceRight((accumulator, color) => {\n\t\t\treturn Color._flatten(color, accumulator)\n\t\t})\n\t\treturn Color._flatten(this, background)\n\t}\n\n\tprivate static _flatten(foreground: Color, background: Color) {\n\t\tconst backgroundAlpha = 1 - foreground.rgba.a\n\t\treturn new Color(new RGBA(\n\t\t\tbackgroundAlpha * background.rgba.r + foreground.rgba.a * foreground.rgba.r,\n\t\t\tbackgroundAlpha * background.rgba.g + foreground.rgba.a * foreground.rgba.g,\n\t\t\tbackgroundAlpha * background.rgba.b + foreground.rgba.a * foreground.rgba.b\n\t\t))\n\t}\n\n\ttoString(): string {\n\t\treturn '' + Color.Format.CSS.format(this)\n\t}\n\n\tstatic getLighterColor(of: Color, relative: Color, factor?: number): Color {\n\t\tif (of.isLighterThan(relative)) {\n\t\t\treturn of\n\t\t}\n\t\tfactor = factor || 0.5\n\t\tconst lum1 = of.getRelativeLuminance()\n\t\tconst lum2 = relative.getRelativeLuminance()\n\t\tfactor = factor * (lum2 - lum1) / lum2\n\t\treturn of.lighten(factor)\n\t}\n\n\tstatic getDarkerColor(of: Color, relative: Color, factor?: number): Color {\n\t\tif (of.isDarkerThan(relative)) {\n\t\t\treturn of\n\t\t}\n\t\tfactor = factor || 0.5\n\t\tconst lum1 = of.getRelativeLuminance()\n\t\tconst lum2 = relative.getRelativeLuminance()\n\t\tfactor = factor * (lum1 - lum2) / lum1\n\t\treturn of.darken(factor)\n\t}\n\n\tstatic readonly WHITE = new Color(new RGBA(255, 255, 255, 1))\n\tstatic readonly BLACK = new Color(new RGBA(0, 0, 0, 1))\n\tstatic readonly RED = new Color(new RGBA(255, 0, 0, 1))\n\tstatic readonly BLUE = new Color(new RGBA(0, 0, 255, 1))\n\tstatic readonly GREEN = new Color(new RGBA(0, 255, 0, 1))\n\tstatic readonly CYAN = new Color(new RGBA(0, 255, 255, 1))\n\tstatic readonly LIGHTGREY = new Color(new RGBA(211, 211, 211, 1))\n\tstatic readonly TRANSPARENT = new Color(new RGBA(0, 0, 0, 0))\n}\n\nexport namespace Color {\n\texport namespace Format {\n\t\texport namespace CSS {\n\n\t\t\texport function formatRGB(color: Color): string {\n\t\t\t\tif (color.rgba.a === 1) {\n\t\t\t\t\treturn `rgb(${color.rgba.r}, ${color.rgba.g}, ${color.rgba.b})`\n\t\t\t\t}\n\n\t\t\t\treturn Color.Format.CSS.formatRGBA(color)\n\t\t\t}\n\n\t\t\texport function formatRGBA(color: Color): string {\n\t\t\t\treturn `rgba(${color.rgba.r}, ${color.rgba.g}, ${color.rgba.b}, ${+(color.rgba.a).toFixed(2)})`\n\t\t\t}\n\n\t\t\texport function formatHSL(color: Color): string {\n\t\t\t\tif (color.hsla.a === 1) {\n\t\t\t\t\treturn `hsl(${color.hsla.h}, ${(color.hsla.s * 100).toFixed(2)}%, ${(color.hsla.l * 100).toFixed(2)}%)`\n\t\t\t\t}\n\n\t\t\t\treturn Color.Format.CSS.formatHSLA(color)\n\t\t\t}\n\n\t\t\texport function formatHSLA(color: Color): string {\n\t\t\t\treturn `hsla(${color.hsla.h}, ${(color.hsla.s * 100).toFixed(2)}%, ${(color.hsla.l * 100).toFixed(2)}%, ${color.hsla.a.toFixed(2)})`\n\t\t\t}\n\n\t\t\tfunction _toTwoDigitHex(n: number): string {\n\t\t\t\tconst r = n.toString(16)\n\t\t\t\treturn r.length !== 2 ? '0' + r : r\n\t\t\t}\n\n\t\t\t/**\n\t\t\t * Formats the color as #RRGGBB\n\t\t\t */\n\t\t\texport function formatHex(color: Color): string {\n\t\t\t\treturn `#${_toTwoDigitHex(color.rgba.r)}${_toTwoDigitHex(color.rgba.g)}${_toTwoDigitHex(color.rgba.b)}`\n\t\t\t}\n\n\t\t\t/**\n\t\t\t * Formats the color as #RRGGBBAA\n\t\t\t * If 'compact' is set, colors without transparancy will be printed as #RRGGBB\n\t\t\t */\n\t\t\texport function formatHexA(color: Color, compact = false): string {\n\t\t\t\tif (compact && color.rgba.a === 1) {\n\t\t\t\t\treturn Color.Format.CSS.formatHex(color)\n\t\t\t\t}\n\n\t\t\t\treturn `#${_toTwoDigitHex(color.rgba.r)}${_toTwoDigitHex(color.rgba.g)}${_toTwoDigitHex(color.rgba.b)}${_toTwoDigitHex(Math.round(color.rgba.a * 255))}`\n\t\t\t}\n\n\t\t\t/**\n\t\t\t * The default format will use HEX if opaque and RGBA otherwise.\n\t\t\t */\n\t\t\texport function format(color: Color): string | null {\n\t\t\t\tif (!color) {\n\t\t\t\t\treturn null\n\t\t\t\t}\n\n\t\t\t\tif (color.isOpaque()) {\n\t\t\t\t\treturn Color.Format.CSS.formatHex(color)\n\t\t\t\t}\n\n\t\t\t\treturn Color.Format.CSS.formatRGBA(color)\n\t\t\t}\n\n\t\t\t/**\n\t\t\t * Converts an Hex color value to a Color.\n\t\t\t * returns r, g, and b are contained in the set [0, 255]\n\t\t\t * @param hex string (#RGB, #RGBA, #RRGGBB or #RRGGBBAA).\n\t\t\t */\n\t\t\texport function parseHex(hex: string): Color | null {\n\t\t\t\tif (!hex) {\n\t\t\t\t\t// Invalid color\n\t\t\t\t\treturn null\n\t\t\t\t}\n\n\t\t\t\tconst length = hex.length\n\n\t\t\t\tif (length === 0) {\n\t\t\t\t\t// Invalid color\n\t\t\t\t\treturn null\n\t\t\t\t}\n\n\t\t\t\tif (hex.charCodeAt(0) !== CharCode.Hash) {\n\t\t\t\t\t// Does not begin with a #\n\t\t\t\t\treturn null\n\t\t\t\t}\n\n\t\t\t\tif (length === 7) {\n\t\t\t\t\t// #RRGGBB format\n\t\t\t\t\tconst r = 16 * _parseHexDigit(hex.charCodeAt(1)) + _parseHexDigit(hex.charCodeAt(2))\n\t\t\t\t\tconst g = 16 * _parseHexDigit(hex.charCodeAt(3)) + _parseHexDigit(hex.charCodeAt(4))\n\t\t\t\t\tconst b = 16 * _parseHexDigit(hex.charCodeAt(5)) + _parseHexDigit(hex.charCodeAt(6))\n\t\t\t\t\treturn new Color(new RGBA(r, g, b, 1))\n\t\t\t\t}\n\n\t\t\t\tif (length === 9) {\n\t\t\t\t\t// #RRGGBBAA format\n\t\t\t\t\tconst r = 16 * _parseHexDigit(hex.charCodeAt(1)) + _parseHexDigit(hex.charCodeAt(2))\n\t\t\t\t\tconst g = 16 * _parseHexDigit(hex.charCodeAt(3)) + _parseHexDigit(hex.charCodeAt(4))\n\t\t\t\t\tconst b = 16 * _parseHexDigit(hex.charCodeAt(5)) + _parseHexDigit(hex.charCodeAt(6))\n\t\t\t\t\tconst a = 16 * _parseHexDigit(hex.charCodeAt(7)) + _parseHexDigit(hex.charCodeAt(8))\n\t\t\t\t\treturn new Color(new RGBA(r, g, b, a / 255))\n\t\t\t\t}\n\n\t\t\t\tif (length === 4) {\n\t\t\t\t\t// #RGB format\n\t\t\t\t\tconst r = _parseHexDigit(hex.charCodeAt(1))\n\t\t\t\t\tconst g = _parseHexDigit(hex.charCodeAt(2))\n\t\t\t\t\tconst b = _parseHexDigit(hex.charCodeAt(3))\n\t\t\t\t\treturn new Color(new RGBA(16 * r + r, 16 * g + g, 16 * b + b))\n\t\t\t\t}\n\n\t\t\t\tif (length === 5) {\n\t\t\t\t\t// #RGBA format\n\t\t\t\t\tconst r = _parseHexDigit(hex.charCodeAt(1))\n\t\t\t\t\tconst g = _parseHexDigit(hex.charCodeAt(2))\n\t\t\t\t\tconst b = _parseHexDigit(hex.charCodeAt(3))\n\t\t\t\t\tconst a = _parseHexDigit(hex.charCodeAt(4))\n\t\t\t\t\treturn new Color(new RGBA(16 * r + r, 16 * g + g, 16 * b + b, (16 * a + a) / 255))\n\t\t\t\t}\n\n\t\t\t\t// Invalid color\n\t\t\t\treturn null\n\t\t\t}\n\n\t\t\tfunction _parseHexDigit(charCode: CharCode): number {\n\t\t\t\tswitch (charCode) {\n\t\t\t\t\tcase CharCode.Digit0: return 0\n\t\t\t\t\tcase CharCode.Digit1: return 1\n\t\t\t\t\tcase CharCode.Digit2: return 2\n\t\t\t\t\tcase CharCode.Digit3: return 3\n\t\t\t\t\tcase CharCode.Digit4: return 4\n\t\t\t\t\tcase CharCode.Digit5: return 5\n\t\t\t\t\tcase CharCode.Digit6: return 6\n\t\t\t\t\tcase CharCode.Digit7: return 7\n\t\t\t\t\tcase CharCode.Digit8: return 8\n\t\t\t\t\tcase CharCode.Digit9: return 9\n\t\t\t\t\tcase CharCode.a: return 10\n\t\t\t\t\tcase CharCode.A: return 10\n\t\t\t\t\tcase CharCode.b: return 11\n\t\t\t\t\tcase CharCode.B: return 11\n\t\t\t\t\tcase CharCode.c: return 12\n\t\t\t\t\tcase CharCode.C: return 12\n\t\t\t\t\tcase CharCode.d: return 13\n\t\t\t\t\tcase CharCode.D: return 13\n\t\t\t\t\tcase CharCode.e: return 14\n\t\t\t\t\tcase CharCode.E: return 14\n\t\t\t\t\tcase CharCode.f: return 15\n\t\t\t\t\tcase CharCode.F: return 15\n\t\t\t\t}\n\t\t\t\treturn 0\n\t\t\t}\n\t\t}\n\t}\n}","/* ---------------------------------------------------------------------------------------------\n *  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\nexport interface IDisposable {\n\tdispose(): void;\n}\n\nexport function isDisposable<E extends object>(thing: E): thing is E & IDisposable {\n\treturn typeof (<IDisposable><any>thing).dispose === 'function' &&\n\t\t(<IDisposable><any>thing).dispose.length === 0\n}\n\nexport function dispose<T extends IDisposable>(disposable: T): T;\nexport function dispose<T extends IDisposable>(...disposables: Array<T | undefined>): T[];\nexport function dispose<T extends IDisposable>(disposables: T[]): T[];\nexport function dispose<T extends IDisposable>(first: T | T[], ...rest: T[]): T | T[] | undefined {\n\tif (Array.isArray(first)) {\n\t\tfirst.forEach(d => d && d.dispose())\n\t\treturn []\n\t} else if (rest.length === 0) {\n\t\tif (first) {\n\t\t\tfirst.dispose()\n\t\t\treturn first\n\t\t}\n\t\treturn undefined\n\t} else {\n\t\tdispose(first)\n\t\tdispose(rest)\n\t\treturn []\n\t}\n}\n\nexport function combinedDisposable(disposables: IDisposable[]): IDisposable {\n\treturn { dispose: () => dispose(disposables) }\n}\n\nexport function toDisposable(fn: () => void): IDisposable {\n\treturn { dispose() { fn() } }\n}\n\nexport abstract class Disposable implements IDisposable {\n\tstatic None = Object.freeze<IDisposable>({ dispose() { } })\n\n\tprotected _toDispose: IDisposable[] = []\n\tprotected get toDispose(): IDisposable[] { return this._toDispose }\n\n\tprivate _lifecycle_disposable_isDisposed = false\n\n\tpublic dispose(): void {\n\t\tthis._lifecycle_disposable_isDisposed = true\n\t\tthis._toDispose = dispose(this._toDispose)\n\t}\n\n\tprotected _register<T extends IDisposable>(t: T): T {\n\t\tif (this._lifecycle_disposable_isDisposed) {\n\t\t\tconsole.warn('Registering disposable on object that has already been disposed.')\n\t\t\tt.dispose()\n\t\t} else {\n\t\t\tthis._toDispose.push(t)\n\t\t}\n\n\t\treturn t\n\t}\n}","/* ---------------------------------------------------------------------------------------------\n *  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\nexport interface IteratorDefinedResult<T> {\n\treadonly done: false;\n\treadonly value: T;\n}\nexport interface IteratorUndefinedResult {\n\treadonly done: true;\n\treadonly value: undefined;\n}\nexport const FIN: IteratorUndefinedResult = { done: true, value: undefined }\nexport type IteratorResult<T> = IteratorDefinedResult<T> | IteratorUndefinedResult;\n\nexport interface Iterator<T> {\n\tnext(): IteratorResult<T>;\n}\n\nexport namespace Iterator {\n\tconst _empty: Iterator<any> = {\n\t\tnext() {\n\t\t\treturn FIN\n\t\t}\n\t}\n\n\texport function empty<T>(): Iterator<T> {\n\t\treturn _empty\n\t}\n\n\texport function fromArray<T>(array: T[], index = 0, length = array.length): Iterator<T> {\n\t\treturn {\n\t\t\tnext(): IteratorResult<T> {\n\t\t\t\tif (index >= length) {\n\t\t\t\t\treturn FIN\n\t\t\t\t}\n\n\t\t\t\treturn { done: false, value: array[index++] }\n\t\t\t}\n\t\t}\n\t}\n\n\texport function from<T>(elements: Iterator<T> | T[] | undefined): Iterator<T> {\n\t\tif (!elements) {\n\t\t\treturn Iterator.empty()\n\t\t} else if (Array.isArray(elements)) {\n\t\t\treturn Iterator.fromArray(elements)\n\t\t} else {\n\t\t\treturn elements\n\t\t}\n\t}\n\n\texport function map<T, R>(iterator: Iterator<T>, fn: (t: T) => R): Iterator<R> {\n\t\treturn {\n\t\t\tnext() {\n\t\t\t\tconst element = iterator.next()\n\t\t\t\tif (element.done) {\n\t\t\t\t\treturn FIN\n\t\t\t\t} else {\n\t\t\t\t\treturn { done: false, value: fn(element.value) }\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\texport function filter<T>(iterator: Iterator<T>, fn: (t: T) => boolean): Iterator<T> {\n\t\treturn {\n\t\t\tnext() {\n\t\t\t\twhile (true) {\n\t\t\t\t\tconst element = iterator.next()\n\t\t\t\t\tif (element.done) {\n\t\t\t\t\t\treturn FIN\n\t\t\t\t\t}\n\t\t\t\t\tif (fn(element.value)) {\n\t\t\t\t\t\treturn { done: false, value: element.value }\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\texport function forEach<T>(iterator: Iterator<T>, fn: (t: T) => void): void {\n\t\tfor (let next = iterator.next(); !next.done; next = iterator.next()) {\n\t\t\tfn(next.value)\n\t\t}\n\t}\n\n\texport function collect<T>(iterator: Iterator<T>): T[] {\n\t\tconst result: T[] = []\n\t\tforEach(iterator, value => result.push(value))\n\t\treturn result\n\t}\n}\n\nexport type ISequence<T> = Iterator<T> | T[];\n\nexport function getSequenceIterator<T>(arg: Iterator<T> | T[]): Iterator<T> {\n\tif (Array.isArray(arg)) {\n\t\treturn Iterator.fromArray(arg)\n\t} else {\n\t\treturn arg\n\t}\n}\n\nexport interface INextIterator<T> {\n\tnext(): T | null;\n}\n\nexport class ArrayIterator<T> implements INextIterator<T> {\n\tprivate items: T[]\n\tprotected start: number\n\tprotected end: number\n\tprotected index: number\n\n\tconstructor(items: T[], start: number = 0, end: number = items.length, index = start - 1) {\n\t\tthis.items = items\n\t\tthis.start = start\n\t\tthis.end = end\n\t\tthis.index = index\n\t}\n\n\tpublic first(): T | null {\n\t\tthis.index = this.start\n\t\treturn this.current()\n\t}\n\n\tpublic next(): T | null {\n\t\tthis.index = Math.min(this.index + 1, this.end)\n\t\treturn this.current()\n\t}\n\n\tprotected current(): T | null {\n\t\tif (this.index === this.start - 1 || this.index === this.end) {\n\t\t\treturn null\n\t\t}\n\n\t\treturn this.items[this.index]\n\t}\n}\n\nexport interface INavigator<T> extends INextIterator<T> {\n\tcurrent(): T | null;\n\tprevious(): T | null;\n\tparent(): T | null;\n\tfirst(): T | null;\n\tlast(): T | null;\n\tnext(): T | null;\n}\n\nexport class ArrayNavigator<T> extends ArrayIterator<T> implements INavigator<T> {\n\tconstructor(items: T[], start: number = 0, end: number = items.length, index = start - 1) {\n\t\tsuper(items, start, end, index)\n\t}\n\n\tpublic current(): T | null {\n\t\treturn super.current()\n\t}\n\n\tpublic previous(): T | null {\n\t\tthis.index = Math.max(this.index - 1, this.start - 1)\n\t\treturn this.current()\n\t}\n\n\tpublic first(): T | null {\n\t\tthis.index = this.start\n\t\treturn this.current()\n\t}\n\n\tpublic last(): T | null {\n\t\tthis.index = this.end - 1\n\t\treturn this.current()\n\t}\n\n\tpublic parent(): T | null {\n\t\treturn null\n\t}\n}\n\nexport class MappedIterator<T, R> implements INextIterator<R> {\n\tconstructor(protected iterator: INextIterator<T>, protected fn: (item: T | null) => R) {\n\t\t// noop\n\t}\n\n\tnext() { return this.fn(this.iterator.next()) }\n}\n\nexport class MappedNavigator<T, R> extends MappedIterator<T, R> implements INavigator<R> {\n\tconstructor(protected navigator: INavigator<T>, fn: (item: T | null) => R) {\n\t\tsuper(navigator, fn)\n\t}\n\n\tcurrent() { return this.fn(this.navigator.current()) }\n\tprevious() { return this.fn(this.navigator.previous()) }\n\tparent() { return this.fn(this.navigator.parent()) }\n\tfirst() { return this.fn(this.navigator.first()) }\n\tlast() { return this.fn(this.navigator.last()) }\n\tnext() { return this.fn(this.navigator.next()) }\n}","/* ---------------------------------------------------------------------------------------------\n *  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 { Iterator, IteratorResult, FIN } from 'base/common/iterator'\n\nclass Node<E> {\n\telement: E\n\t// eslint-disable-next-line no-use-before-define\n\tnext: Node<E> | undefined\n\t// eslint-disable-next-line no-use-before-define\n\tprev: Node<E> | undefined\n\n\tconstructor(element: E) {\n\t\tthis.element = element\n\t}\n}\n\nexport class LinkedList<E> {\n\tprivate _first: Node<E> | undefined\n\tprivate _last: Node<E> | undefined\n\tprivate _size: number = 0\n\n\tget size(): number {\n\t\treturn this._size\n\t}\n\n\tisEmpty(): boolean {\n\t\treturn !this._first\n\t}\n\n\tclear(): void {\n\t\tthis._first = undefined\n\t\tthis._last = undefined\n\t\tthis._size = 0\n\t}\n\n\tunshift(element: E): () => void {\n\t\treturn this._insert(element, false)\n\t}\n\n\tpush(element: E): () => void {\n\t\treturn this._insert(element, true)\n\t}\n\n\tprivate _insert(element: E, atTheEnd: boolean): () => void {\n\t\tconst newNode = new Node(element)\n\t\tif (!this._first) {\n\t\t\tthis._first = newNode\n\t\t\tthis._last = newNode\n\t\t} else if (atTheEnd) {\n\t\t\t// push\n\t\t\tconst oldLast = this._last!\n\t\t\tthis._last = newNode\n\t\t\tnewNode.prev = oldLast\n\t\t\toldLast.next = newNode\n\t\t} else {\n\t\t\t// unshift\n\t\t\tconst oldFirst = this._first\n\t\t\tthis._first = newNode\n\t\t\tnewNode.next = oldFirst\n\t\t\toldFirst.prev = newNode\n\t\t}\n\t\tthis._size += 1\n\t\treturn this._remove.bind(this, newNode)\n\t}\n\n\n\tshift(): E | undefined {\n\t\tif (!this._first) {\n\t\t\treturn undefined\n\t\t} else {\n\t\t\tconst res = this._first.element\n\t\t\tthis._remove(this._first)\n\t\t\treturn res\n\t\t}\n\t}\n\n\tpop(): E | undefined {\n\t\tif (!this._last) {\n\t\t\treturn undefined\n\t\t} else {\n\t\t\tconst res = this._last.element\n\t\t\tthis._remove(this._last)\n\t\t\treturn res\n\t\t}\n\t}\n\n\tprivate _remove(node: Node<E>): void {\n\t\tlet candidate: Node<E> | undefined = this._first\n\t\twhile (candidate instanceof Node) {\n\t\t\tif (candidate !== node) {\n\t\t\t\tcandidate = candidate.next\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tif (candidate.prev && candidate.next) {\n\t\t\t\t// middle\n\t\t\t\tconst anchor = candidate.prev\n\t\t\t\tanchor.next = candidate.next\n\t\t\t\tcandidate.next.prev = anchor\n\t\t\t} else if (!candidate.prev && !candidate.next) {\n\t\t\t\t// only node\n\t\t\t\tthis._first = undefined\n\t\t\t\tthis._last = undefined\n\t\t\t} else if (!candidate.next) {\n\t\t\t\t// last\n\t\t\t\tthis._last = this._last!.prev!\n\t\t\t\tthis._last.next = undefined\n\t\t\t} else if (!candidate.prev) {\n\t\t\t\t// first\n\t\t\t\tthis._first = this._first!.next!\n\t\t\t\tthis._first.prev = undefined\n\t\t\t}\n\n\t\t\t// done\n\t\t\tthis._size -= 1\n\t\t\tbreak\n\t\t}\n\t}\n\n\titerator(): Iterator<E> {\n\t\tlet element: { done: false; value: E; }\n\t\tlet node = this._first\n\t\treturn {\n\t\t\tnext(): IteratorResult<E> {\n\t\t\t\tif (!node) {\n\t\t\t\t\treturn FIN\n\t\t\t\t}\n\n\t\t\t\tif (!element) {\n\t\t\t\t\telement = { done: false, value: node.element }\n\t\t\t\t} else {\n\t\t\t\t\telement.value = node.element\n\t\t\t\t}\n\t\t\t\tnode = node.next\n\t\t\t\treturn element\n\t\t\t}\n\t\t}\n\t}\n\n\ttoArray(): E[] {\n\t\tconst result: E[] = []\n\t\tfor (let node = this._first; node instanceof Node; node = node.next) {\n\t\t\tresult.push(node.element)\n\t\t}\n\t\treturn result\n\t}\n}","/* ---------------------------------------------------------------------------------------------\n *  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 { combinedDisposable, Disposable, IDisposable } from 'base/common/lifecycle'\nimport { LinkedList } from 'base/common/linkedList'\n\n/**\n * To an event a function with one or zero parameters\n * can be subscribed. The event is the subscriber function itself.\n */\nexport interface Event<T> {\n\t(listener: (e: T) => any, thisArgs?: any, disposables?: IDisposable[]): IDisposable;\n}\n\nexport namespace Event {\n\tconst _disposable = { dispose() { } }\n\texport const None: Event<any> = function () { return _disposable }\n\n\t/**\n\t * Given an event, returns another event which only fires once.\n\t */\n\texport function once<T>(event: Event<T>): Event<T> {\n\t\treturn (listener, thisArgs = null, disposables?) => {\n\t\t\t// we need this, in case the event fires during the listener call\n\t\t\tlet didFire = false\n\n\t\t\tconst result = event(e => {\n\t\t\t\tif (didFire) {\n\t\t\t\t\treturn\n\t\t\t\t} else if (result) {\n\t\t\t\t\tresult.dispose()\n\t\t\t\t} else {\n\t\t\t\t\tdidFire = true\n\t\t\t\t}\n\n\t\t\t\treturn listener.call(thisArgs, e)\n\t\t\t}, null, disposables)\n\n\t\t\tif (didFire) {\n\t\t\t\tresult.dispose()\n\t\t\t}\n\n\t\t\treturn result\n\t\t}\n\t}\n\n\t/**\n\t * Given an event and a `map` function, returns another event which maps each element\n\t * throught the mapping function.\n\t */\n\texport function map<I, O>(event: Event<I>, map: (i: I) => O): Event<O> {\n\t\treturn (listener, thisArgs = null, disposables?) => event(i => listener.call(thisArgs, map(i)), null, disposables)\n\t}\n\n\t/**\n\t * Given an event and an `each` function, returns another identical event and calls\n\t * the `each` function per each element.\n\t */\n\texport function forEach<I>(event: Event<I>, each: (i: I) => void): Event<I> {\n\t\treturn (listener, thisArgs = null, disposables?) => event(i => { each(i); listener.call(thisArgs, i) }, null, disposables)\n\t}\n\n\t/**\n\t * Given an event and a `filter` function, returns another event which emits those\n\t * elements for which the `filter` function returns `true`.\n\t */\n\texport function filter<T>(event: Event<T>, filter: (e: T) => boolean): Event<T>;\n\texport function filter<T, R>(event: Event<T | R>, filter: (e: T | R) => e is R): Event<R>;\n\texport function filter<T>(event: Event<T>, filter: (e: T) => boolean): Event<T> {\n\t\treturn (listener, thisArgs = null, disposables?) => event(e => filter(e) && listener.call(thisArgs, e), null, disposables)\n\t}\n\n\t/**\n\t * Given an event, returns the same event but typed as `Event<void>`.\n\t */\n\texport function signal<T>(event: Event<T>): Event<void> {\n\t\treturn event as Event<any> as Event<void>\n\t}\n\n\t/**\n\t * Given a collection of events, returns a single event which emits\n\t * whenever any of the provided events emit.\n\t */\n\texport function any<T>(...events: Event<T>[]): Event<T> {\n\t\treturn (listener, thisArgs = null, disposables?) => combinedDisposable(events.map(event => event(e => listener.call(thisArgs, e), null, disposables)))\n\t}\n\n\t/**\n\t * Given an event and a `merge` function, returns another event which maps each element\n\t * and the cummulative result throught the `merge` function. Similar to `map`, but with memory.\n\t */\n\texport function reduce<I, O>(event: Event<I>, merge: (last: O | undefined, event: I) => O, initial?: O): Event<O> {\n\t\tlet output: O | undefined = initial\n\n\t\treturn map<I, O>(event, e => {\n\t\t\toutput = merge(output, e)\n\t\t\treturn output\n\t\t})\n\t}\n\n\t/**\n\t * Debounces the provided event, given a `merge` function.\n\t *\n\t * @param event The input event.\n\t * @param merge The reducing function.\n\t * @param delay The debouncing delay in millis.\n\t * @param leading Whether the event should fire in the leading phase of the timeout.\n\t * @param leakWarningThreshold The leak warning threshold override.\n\t */\n\texport function debounce<T>(event: Event<T>, merge: (last: T, event: T) => T, delay?: number, leading?: boolean, leakWarningThreshold?: number): Event<T>;\n\texport function debounce<I, O>(event: Event<I>, merge: (last: O | undefined, event: I) => O, delay?: number, leading?: boolean, leakWarningThreshold?: number): Event<O>;\n\texport function debounce<I, O>(event: Event<I>, merge: (last: O | undefined, event: I) => O, delay: number = 100, leading = false, leakWarningThreshold?: number): Event<O> {\n\t\tlet subscription: IDisposable\n\t\tlet output: O | undefined\n\t\tlet handle: any\n\t\tlet numDebouncedCalls = 0\n\n\t\tconst emitter = new Emitter<O>({\n\t\t\tleakWarningThreshold,\n\t\t\tonFirstListenerAdd() {\n\t\t\t\tsubscription = event(cur => {\n\t\t\t\t\tnumDebouncedCalls++\n\t\t\t\t\toutput = merge(output, cur)\n\n\t\t\t\t\tif (leading && !handle) {\n\t\t\t\t\t\temitter.fire(output)\n\t\t\t\t\t}\n\n\t\t\t\t\tclearTimeout(handle)\n\t\t\t\t\thandle = setTimeout(() => {\n\t\t\t\t\t\tconst _output = output\n\t\t\t\t\t\toutput = undefined\n\t\t\t\t\t\thandle = undefined\n\t\t\t\t\t\tif (!leading || numDebouncedCalls > 1) {\n\t\t\t\t\t\t\temitter.fire(_output!)\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tnumDebouncedCalls = 0\n\t\t\t\t\t}, delay)\n\t\t\t\t})\n\t\t\t},\n\t\t\tonLastListenerRemove() {\n\t\t\t\tsubscription.dispose()\n\t\t\t}\n\t\t})\n\n\t\treturn emitter.event\n\t}\n\n\t/**\n\t * Given an event, it returns another event which fires only once and as soon as\n\t * the input event emits. The event data is the number of millis it took for the\n\t * event to fire.\n\t */\n\texport function stopwatch<T>(event: Event<T>): Event<number> {\n\t\tconst start = new Date().getTime()\n\t\treturn map(once(event), _ => new Date().getTime() - start)\n\t}\n\n\t/**\n\t * Given an event, it returns another event which fires only when the event\n\t * element changes.\n\t */\n\texport function latch<T>(event: Event<T>): Event<T> {\n\t\tlet firstCall = true\n\t\tlet cache: T\n\n\t\treturn filter(event, value => {\n\t\t\tconst shouldEmit = firstCall || value !== cache\n\t\t\tfirstCall = false\n\t\t\tcache = value\n\t\t\treturn shouldEmit\n\t\t})\n\t}\n\n\t/**\n\t * Buffers the provided event until a first listener comes\n\t * along, at which point fire all the events at once and\n\t * pipe the event from then on.\n\t *\n\t * ```typescript\n\t * const emitter = new Emitter<number>();\n\t * const event = emitter.event;\n\t * const bufferedEvent = buffer(event);\n\t *\n\t * emitter.fire(1);\n\t * emitter.fire(2);\n\t * emitter.fire(3);\n\t * // nothing...\n\t *\n\t * const listener = bufferedEvent(num => console.log(num));\n\t * // 1, 2, 3\n\t *\n\t * emitter.fire(4);\n\t * // 4\n\t * ```\n\t */\n\texport function buffer<T>(event: Event<T>, nextTick = false, _buffer: T[] = []): Event<T> {\n\t\tlet buffer: T[] | null = _buffer.slice()\n\n\t\tlet listener: IDisposable | null = event(e => {\n\t\t\tif (buffer) {\n\t\t\t\tbuffer.push(e)\n\t\t\t} else {\n\t\t\t\temitter.fire(e)\n\t\t\t}\n\t\t})\n\n\t\tconst flush = () => {\n\t\t\tif (buffer) {\n\t\t\t\tbuffer.forEach(e => emitter.fire(e))\n\t\t\t}\n\t\t\tbuffer = null\n\t\t}\n\n\t\tconst emitter = new Emitter<T>({\n\t\t\tonFirstListenerAdd() {\n\t\t\t\tif (!listener) {\n\t\t\t\t\tlistener = event(e => emitter.fire(e))\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tonFirstListenerDidAdd() {\n\t\t\t\tif (buffer) {\n\t\t\t\t\tif (nextTick) {\n\t\t\t\t\t\tsetTimeout(flush)\n\t\t\t\t\t} else {\n\t\t\t\t\t\tflush()\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tonLastListenerRemove() {\n\t\t\t\tif (listener) {\n\t\t\t\t\tlistener.dispose()\n\t\t\t\t}\n\t\t\t\tlistener = null\n\t\t\t}\n\t\t})\n\n\t\treturn emitter.event\n\t}\n\n\t/**\n\t * Similar to `buffer` but it buffers indefinitely and repeats\n\t * the buffered events to every new listener.\n\t */\n\texport function echo<T>(event: Event<T>, nextTick = false, buffer: T[] = []): Event<T> {\n\t\tbuffer = buffer.slice()\n\n\t\tevent(e => {\n\t\t\tbuffer.push(e)\n\t\t\temitter.fire(e)\n\t\t})\n\n\t\tconst flush = (listener: (e: T) => any, thisArgs?: any) => buffer.forEach(e => listener.call(thisArgs, e))\n\n\t\tconst emitter = new Emitter<T>({\n\t\t\tonListenerDidAdd(emitter: any, listener: (e: T) => any, thisArgs?: any) {\n\t\t\t\tif (nextTick) {\n\t\t\t\t\tsetTimeout(() => flush(listener, thisArgs))\n\t\t\t\t} else {\n\t\t\t\t\tflush(listener, thisArgs)\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\n\t\treturn emitter.event\n\t}\n\n\texport interface IChainableEvent<T> {\n\t\tevent: Event<T>;\n\t\tmap<O>(fn: (i: T) => O): IChainableEvent<O>;\n\t\tforEach(fn: (i: T) => void): IChainableEvent<T>;\n\t\tfilter(fn: (e: T) => boolean): IChainableEvent<T>;\n\t\treduce<R>(merge: (last: R | undefined, event: T) => R, initial?: R): IChainableEvent<R>;\n\t\tlatch(): IChainableEvent<T>;\n\t\ton(listener: (e: T) => any, thisArgs?: any, disposables?: IDisposable[]): IDisposable;\n\t\tonce(listener: (e: T) => any, thisArgs?: any, disposables?: IDisposable[]): IDisposable;\n\t}\n\n\tclass ChainableEvent<T> implements IChainableEvent<T> {\n\t\tget event(): Event<T> { return this._event }\n\n\t\tconstructor(private _event: Event<T>) { }\n\n\t\tmap<O>(fn: (i: T) => O): IChainableEvent<O> {\n\t\t\treturn new ChainableEvent(map(this._event, fn))\n\t\t}\n\n\t\tforEach(fn: (i: T) => void): IChainableEvent<T> {\n\t\t\treturn new ChainableEvent(forEach(this._event, fn))\n\t\t}\n\n\t\tfilter(fn: (e: T) => boolean): IChainableEvent<T> {\n\t\t\treturn new ChainableEvent(filter(this._event, fn))\n\t\t}\n\n\t\treduce<R>(merge: (last: R | undefined, event: T) => R, initial?: R): IChainableEvent<R> {\n\t\t\treturn new ChainableEvent(reduce(this._event, merge, initial))\n\t\t}\n\n\t\tlatch(): IChainableEvent<T> {\n\t\t\treturn new ChainableEvent(latch(this._event))\n\t\t}\n\n\t\ton(listener: (e: T) => any, thisArgs: any, disposables: IDisposable[]) {\n\t\t\treturn this._event(listener, thisArgs, disposables)\n\t\t}\n\n\t\tonce(listener: (e: T) => any, thisArgs: any, disposables: IDisposable[]) {\n\t\t\treturn once(this._event)(listener, thisArgs, disposables)\n\t\t}\n\t}\n\n\texport function chain<T>(event: Event<T>): IChainableEvent<T> {\n\t\treturn new ChainableEvent(event)\n\t}\n\n\texport interface NodeEventEmitter {\n\t\ton(event: string | symbol, listener: Function): this;\n\t\tremoveListener(event: string | symbol, listener: Function): this;\n\t}\n\n\texport function fromNodeEventEmitter<T>(emitter: NodeEventEmitter, eventName: string, map: (...args: any[]) => T = id => id): Event<T> {\n\t\tconst fn = (...args: any[]) => result.fire(map(...args))\n\t\tconst onFirstListenerAdd = () => emitter.on(eventName, fn)\n\t\tconst onLastListenerRemove = () => emitter.removeListener(eventName, fn)\n\t\tconst result = new Emitter<T>({ onFirstListenerAdd, onLastListenerRemove })\n\n\t\treturn result.event\n\t}\n\n\texport function fromPromise<T = any>(promise: Promise<T>): Event<undefined> {\n\t\tconst emitter = new Emitter<undefined>()\n\t\tlet shouldEmit = false\n\n\t\tpromise\n\t\t\t.then(undefined, () => null)\n\t\t\t.then(() => {\n\t\t\t\tif (!shouldEmit) {\n\t\t\t\t\tsetTimeout(() => emitter.fire(undefined), 0)\n\t\t\t\t} else {\n\t\t\t\t\temitter.fire(undefined)\n\t\t\t\t}\n\t\t\t})\n\n\t\tshouldEmit = true\n\t\treturn emitter.event\n\t}\n\n\texport function toPromise<T>(event: Event<T>): Promise<T> {\n\t\t// eslint-disable-next-line promise/param-names\n\t\treturn new Promise(c => once(event)(c))\n\t}\n}\n\ntype Listener<T> = [(e: T) => void, any] | ((e: T) => void);\n\nexport interface EmitterOptions {\n\tonFirstListenerAdd?: Function;\n\tonFirstListenerDidAdd?: Function;\n\tonListenerDidAdd?: Function;\n\tonLastListenerRemove?: Function;\n\tleakWarningThreshold?: number;\n}\n\nlet _globalLeakWarningThreshold = -1\nexport function setGlobalLeakWarningThreshold(n: number): IDisposable {\n\tconst oldValue = _globalLeakWarningThreshold\n\t_globalLeakWarningThreshold = n\n\treturn {\n\t\tdispose() {\n\t\t\t_globalLeakWarningThreshold = oldValue\n\t\t}\n\t}\n}\n\nclass LeakageMonitor {\n\tprivate _stacks: Map<string, number> | undefined\n\tprivate _warnCountdown: number = 0\n\n\tconstructor(\n\t\treadonly customThreshold?: number,\n\t\treadonly name: string = Math.random().toString(18).slice(2, 5)\n\t) { }\n\n\tdispose(): void {\n\t\tif (this._stacks) {\n\t\t\tthis._stacks.clear()\n\t\t}\n\t}\n\n\tcheck(listenerCount: number): undefined | (() => void) {\n\t\tlet threshold = _globalLeakWarningThreshold\n\t\tif (typeof this.customThreshold === 'number') {\n\t\t\tthreshold = this.customThreshold\n\t\t}\n\n\t\tif (threshold <= 0 || listenerCount < threshold) {\n\t\t\treturn undefined\n\t\t}\n\n\t\tif (!this._stacks) {\n\t\t\tthis._stacks = new Map()\n\t\t}\n\t\tconst stack = new Error().stack!.split('\\n').slice(3).join('\\n')\n\t\tconst count = (this._stacks.get(stack) || 0)\n\t\tthis._stacks.set(stack, count + 1)\n\t\tthis._warnCountdown -= 1\n\n\t\tif (this._warnCountdown <= 0) {\n\t\t\t// only warn on first exceed and then every time the limit\n\t\t\t// is exceeded by 50% again\n\t\t\tthis._warnCountdown = threshold * 0.5\n\n\t\t\t// find most frequent listener and print warning\n\t\t\tlet topStack: string\n\t\t\tlet topCount: number = 0\n\t\t\tthis._stacks.forEach((count, stack) => {\n\t\t\t\tif (!topStack || topCount < count) {\n\t\t\t\t\ttopStack = stack\n\t\t\t\t\ttopCount = count\n\t\t\t\t}\n\t\t\t})\n\n\t\t\tconsole.warn(`[${this.name}] potential listener LEAK detected, having ${listenerCount} listeners already. MOST frequent listener (${topCount}):`)\n\t\t\tconsole.warn(topStack!)\n\t\t}\n\n\t\treturn () => {\n\t\t\tconst count = (this._stacks!.get(stack) || 0)\n\t\t\tthis._stacks!.set(stack, count - 1)\n\t\t}\n\t}\n}\n\n/**\n * The Emitter can be used to expose an Event to the public\n * to fire it from the insides.\n * Sample:\n\tclass Document {\n\n\t\tprivate _onDidChange = new Emitter<(value:string)=>any>();\n\n\t\tpublic onDidChange = this._onDidChange.event;\n\n\t\t// getter-style\n\t\t// get onDidChange(): Event<(value:string)=>any> {\n\t\t// \treturn this._onDidChange.event;\n\t\t// }\n\n\t\tprivate _doIt() {\n\t\t\t//...\n\t\t\tthis._onDidChange.fire(value);\n\t\t}\n\t}\n */\nexport class Emitter<T> {\n\tprivate static readonly _noop = function () { }\n\n\tprivate readonly _options?: EmitterOptions\n\tprivate readonly _leakageMon?: LeakageMonitor\n\tprivate _disposed: boolean = false\n\tprivate _event?: Event<T>\n\tprivate _deliveryQueue?: [Listener<T>, T][]\n\tprotected _listeners?: LinkedList<Listener<T>>\n\n\tconstructor(options?: EmitterOptions) {\n\t\tthis._options = options\n\t\tthis._leakageMon = _globalLeakWarningThreshold > 0\n\t\t\t? new LeakageMonitor(this._options && this._options.leakWarningThreshold)\n\t\t\t: undefined\n\t}\n\n\t/**\n\t * For the public to allow to subscribe\n\t * to events from this Emitter\n\t */\n\tget event(): Event<T> {\n\t\tif (!this._event) {\n\t\t\tthis._event = (listener: (e: T) => any, thisArgs?: any, disposables?: IDisposable[]) => {\n\t\t\t\tif (!this._listeners) {\n\t\t\t\t\tthis._listeners = new LinkedList()\n\t\t\t\t}\n\n\t\t\t\tconst firstListener = this._listeners.isEmpty()\n\n\t\t\t\tif (firstListener && this._options && this._options.onFirstListenerAdd) {\n\t\t\t\t\tthis._options.onFirstListenerAdd(this)\n\t\t\t\t}\n\n\t\t\t\tconst remove = this._listeners.push(!thisArgs ? listener : [listener, thisArgs])\n\n\t\t\t\tif (firstListener && this._options && this._options.onFirstListenerDidAdd) {\n\t\t\t\t\tthis._options.onFirstListenerDidAdd(this)\n\t\t\t\t}\n\n\t\t\t\tif (this._options && this._options.onListenerDidAdd) {\n\t\t\t\t\tthis._options.onListenerDidAdd(this, listener, thisArgs)\n\t\t\t\t}\n\n\t\t\t\t// check and record this emitter for potential leakage\n\t\t\t\tlet removeMonitor: (() => void) | undefined\n\t\t\t\tif (this._leakageMon) {\n\t\t\t\t\tremoveMonitor = this._leakageMon.check(this._listeners.size)\n\t\t\t\t}\n\n\t\t\t\tconst result: IDisposable = {\n\t\t\t\t\tdispose: () => {\n\t\t\t\t\t\tif (removeMonitor) {\n\t\t\t\t\t\t\tremoveMonitor()\n\t\t\t\t\t\t}\n\t\t\t\t\t\tresult.dispose = Emitter._noop\n\t\t\t\t\t\tif (!this._disposed) {\n\t\t\t\t\t\t\tremove()\n\t\t\t\t\t\t\tif (this._options && this._options.onLastListenerRemove) {\n\t\t\t\t\t\t\t\tconst hasListeners = (this._listeners && !this._listeners.isEmpty())\n\t\t\t\t\t\t\t\tif (!hasListeners) {\n\t\t\t\t\t\t\t\t\tthis._options.onLastListenerRemove(this)\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (Array.isArray(disposables)) {\n\t\t\t\t\tdisposables.push(result)\n\t\t\t\t}\n\n\t\t\t\treturn result\n\t\t\t}\n\t\t}\n\t\treturn this._event\n\t}\n\n\t/**\n\t * To be kept private to fire an event to\n\t * subscribers\n\t */\n\tfire(event: T): void {\n\t\tif (this._listeners) {\n\t\t\t// put all [listener,event]-pairs into delivery queue\n\t\t\t// then emit all event. an inner/nested event might be\n\t\t\t// the driver of this\n\n\t\t\tif (!this._deliveryQueue) {\n\t\t\t\tthis._deliveryQueue = []\n\t\t\t}\n\n\t\t\tfor (let iter = this._listeners.iterator(), e = iter.next(); !e.done; e = iter.next()) {\n\t\t\t\tthis._deliveryQueue.push([e.value, event])\n\t\t\t}\n\n\t\t\twhile (this._deliveryQueue.length > 0) {\n\t\t\t\tconst [listener, event] = this._deliveryQueue.shift()!\n\t\t\t\ttry {\n\t\t\t\t\tif (typeof listener === 'function') {\n\t\t\t\t\t\t// eslint-disable-next-line no-useless-call\n\t\t\t\t\t\tlistener.call(undefined, event)\n\t\t\t\t\t} else {\n\t\t\t\t\t\tlistener[0].call(listener[1], event)\n\t\t\t\t\t}\n\t\t\t\t} catch (e) {\n\t\t\t\t\tconsole.error(e)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tdispose() {\n\t\tif (this._listeners) {\n\t\t\tthis._listeners = undefined\n\t\t}\n\t\tif (this._deliveryQueue) {\n\t\t\tthis._deliveryQueue.length = 0\n\t\t}\n\t\tif (this._leakageMon) {\n\t\t\tthis._leakageMon.dispose()\n\t\t}\n\t\tthis._disposed = true\n\t}\n}\n\nexport interface IWaitUntil {\n\twaitUntil(thenable: Promise<any>): void;\n}\n\nexport class AsyncEmitter<T extends IWaitUntil> extends Emitter<T> {\n\tprivate _asyncDeliveryQueue?: [Listener<T>, T, Promise<any>[]][]\n\n\tasync fireAsync(eventFn: (thenables: Promise<any>[], listener: Function) => T): Promise<void> {\n\t\tif (!this._listeners) {\n\t\t\treturn\n\t\t}\n\n\t\t// put all [listener,event]-pairs into delivery queue\n\t\t// then emit all event. an inner/nested event might be\n\t\t// the driver of this\n\t\tif (!this._asyncDeliveryQueue) {\n\t\t\tthis._asyncDeliveryQueue = []\n\t\t}\n\n\t\tfor (let iter = this._listeners.iterator(), e = iter.next(); !e.done; e = iter.next()) {\n\t\t\tconst thenables: Promise<void>[] = []\n\t\t\tthis._asyncDeliveryQueue.push([e.value, eventFn(thenables, typeof e.value === 'function' ? e.value : e.value[0]), thenables])\n\t\t}\n\n\t\twhile (this._asyncDeliveryQueue.length > 0) {\n\t\t\tconst [listener, event, thenables] = this._asyncDeliveryQueue.shift()!\n\t\t\ttry {\n\t\t\t\tif (typeof listener === 'function') {\n\t\t\t\t\t// eslint-disable-next-line no-useless-call\n\t\t\t\t\tlistener.call(undefined, event)\n\t\t\t\t} else {\n\t\t\t\t\tlistener[0].call(listener[1], event)\n\t\t\t\t}\n\t\t\t} catch (e) {\n\t\t\t\tconsole.error(e)\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\t// freeze thenables-collection to enforce sync-calls to\n\t\t\t// wait until and then wait for all thenables to resolve\n\t\t\tObject.freeze(thenables)\n\t\t\tawait Promise.all(thenables)\n\t\t}\n\t}\n}\n\n/**\n * The EventBufferer is useful in situations in which you want\n * to delay firing your events during some code.\n * You can wrap that code and be sure that the event will not\n * be fired during that wrap.\n *\n * ```\n * const emitter: Emitter;\n * const delayer = new EventDelayer();\n * const delayedEvent = delayer.wrapEvent(emitter.event);\n *\n * delayedEvent(console.log);\n *\n * delayer.bufferEvents(() => {\n *   emitter.fire(); // event will not be fired yet\n * });\n *\n * // event will only be fired at this point\n * ```\n */\nexport class EventBufferer {\n\tprivate buffers: Function[][] = []\n\n\twrapEvent<T>(event: Event<T>): Event<T> {\n\t\treturn (listener, thisArgs?, disposables?) => {\n\t\t\treturn event(i => {\n\t\t\t\tconst buffer = this.buffers[this.buffers.length - 1]\n\n\t\t\t\tif (buffer) {\n\t\t\t\t\tbuffer.push(() => listener.call(thisArgs, i))\n\t\t\t\t} else {\n\t\t\t\t\tlistener.call(thisArgs, i)\n\t\t\t\t}\n\t\t\t}, undefined, disposables)\n\t\t}\n\t}\n\n\tbufferEvents<R = void>(fn: () => R): R {\n\t\tconst buffer: Array<() => R> = []\n\t\tthis.buffers.push(buffer)\n\t\tconst r = fn()\n\t\tthis.buffers.pop()\n\t\tbuffer.forEach(flush => flush())\n\t\treturn r\n\t}\n}\n\n/**\n * A Relay is an event forwarder which functions as a replugabble event pipe.\n * Once created, you can connect an input event to it and it will simply forward\n * events from that input event through its own `event` property. The `input`\n * can be changed at any point in time.\n */\nexport class Relay<T> implements IDisposable {\n\tprivate listening = false\n\tprivate inputEvent: Event<T> = Event.None\n\tprivate inputEventListener: IDisposable = Disposable.None\n\n\tprivate emitter = new Emitter<T>({\n\t\tonFirstListenerDidAdd: () => {\n\t\t\tthis.listening = true\n\t\t\tthis.inputEventListener = this.inputEvent(this.emitter.fire, this.emitter)\n\t\t},\n\t\tonLastListenerRemove: () => {\n\t\t\tthis.listening = false\n\t\t\tthis.inputEventListener.dispose()\n\t\t}\n\t})\n\n\treadonly event: Event<T> = this.emitter.event\n\n\t// eslint-disable-next-line accessor-pairs\n\tset input(event: Event<T>) {\n\t\tthis.inputEvent = event\n\n\t\tif (this.listening) {\n\t\t\tthis.inputEventListener.dispose()\n\t\t\tthis.inputEventListener = event(this.emitter.fire, this.emitter)\n\t\t}\n\t}\n\n\tdispose() {\n\t\tthis.inputEventListener.dispose()\n\t\tthis.emitter.dispose()\n\t}\n}","/* ---------------------------------------------------------------------------------------------\n *  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 { Emitter, Event } from 'base/common/event'\nimport { IDisposable } from 'base/common/lifecycle'\n\nclass WindowManager {\n\tpublic static readonly INSTANCE = new WindowManager()\n\n\tprivate _zoomLevel = 0\n\tprivate _lastZoomLevelChangeTime = 0\n\tprivate readonly _onDidChangeZoomLevel = new Emitter<number>()\n\n\tpublic readonly onDidChangeZoomLevel: Event<number> = this._onDidChangeZoomLevel.event\n\tpublic getZoomLevel(): number {\n\t\treturn this._zoomLevel\n\t}\n\n\tpublic getTimeSinceLastZoomLevelChanged(): number {\n\t\treturn Date.now() - this._lastZoomLevelChangeTime\n\t}\n\n\tpublic setZoomLevel(zoomLevel: number, isTrusted: boolean): void {\n\t\tif (this._zoomLevel === zoomLevel) {\n\t\t\treturn\n\t\t}\n\n\t\tthis._zoomLevel = zoomLevel\n\t\t// See https://github.com/Microsoft/vscode/issues/26151\n\t\tthis._lastZoomLevelChangeTime = isTrusted ? 0 : Date.now()\n\t\tthis._onDidChangeZoomLevel.fire(this._zoomLevel)\n\t}\n\n\t// --- Zoom Factor\n\tprivate _zoomFactor = 0\n\n\tpublic getZoomFactor(): number {\n\t\treturn this._zoomFactor\n\t}\n\n\tpublic setZoomFactor(zoomFactor: number): void {\n\t\tthis._zoomFactor = zoomFactor\n\t}\n\n\t// --- Pixel Ratio\n\tpublic getPixelRatio(): number {\n\t\tconst ctx = document.createElement('canvas').getContext('2d')\n\t\tconst dpr = window.devicePixelRatio || 1\n\t\tconst bsr = (<any>ctx).webkitBackingStorePixelRatio ||\n\t\t\t(<any>ctx).mozBackingStorePixelRatio ||\n\t\t\t(<any>ctx).msBackingStorePixelRatio ||\n\t\t\t(<any>ctx).oBackingStorePixelRatio ||\n\t\t\t(<any>ctx).backingStorePixelRatio || 1\n\t\treturn dpr / bsr\n\t}\n\n\t// --- Fullscreen\n\tprivate _fullscreen = false\n\tprivate readonly _onDidChangeFullscreen = new Emitter<void>()\n\n\tpublic readonly onDidChangeFullscreen: Event<void> = this._onDidChangeFullscreen.event\n\tpublic setFullscreen(fullscreen: boolean): void {\n\t\tif (this._fullscreen === fullscreen) {\n\t\t\treturn\n\t\t}\n\n\t\tthis._fullscreen = fullscreen\n\t\tthis._onDidChangeFullscreen.fire()\n\t}\n\n\tpublic isFullscreen(): boolean {\n\t\treturn this._fullscreen\n\t}\n}\n\n/** A zoom index, e.g. 1, 2, 3 */\nexport function setZoomLevel(zoomLevel: number, isTrusted: boolean): void {\n\tWindowManager.INSTANCE.setZoomLevel(zoomLevel, isTrusted)\n}\nexport function getZoomLevel(): number {\n\treturn WindowManager.INSTANCE.getZoomLevel()\n}\n/** Returns the time (in ms) since the zoom level was changed */\nexport function getTimeSinceLastZoomLevelChanged(): number {\n\treturn WindowManager.INSTANCE.getTimeSinceLastZoomLevelChanged()\n}\nexport function onDidChangeZoomLevel(callback: (zoomLevel: number) => void): IDisposable {\n\treturn WindowManager.INSTANCE.onDidChangeZoomLevel(callback)\n}\n\n/** The zoom scale for an index, e.g. 1, 1.2, 1.4 */\nexport function getZoomFactor(): number {\n\treturn WindowManager.INSTANCE.getZoomFactor()\n}\nexport function setZoomFactor(zoomFactor: number): void {\n\tWindowManager.INSTANCE.setZoomFactor(zoomFactor)\n}\n\nexport function getPixelRatio(): number {\n\treturn WindowManager.INSTANCE.getPixelRatio()\n}\n\nexport function setFullscreen(fullscreen: boolean): void {\n\tWindowManager.INSTANCE.setFullscreen(fullscreen)\n}\nexport function isFullscreen(): boolean {\n\treturn WindowManager.INSTANCE.isFullscreen()\n}\nexport const onDidChangeFullscreen = WindowManager.INSTANCE.onDidChangeFullscreen\n\nconst userAgent = navigator.userAgent\n\nexport const isIE = (userAgent.indexOf('Trident') >= 0)\nexport const isEdge = (userAgent.indexOf('Edge/') >= 0)\nexport const isEdgeOrIE = isIE || isEdge\n\nexport const isOpera = (userAgent.indexOf('Opera') >= 0)\nexport const isFirefox = (userAgent.indexOf('Firefox') >= 0)\nexport const isWebKit = (userAgent.indexOf('AppleWebKit') >= 0)\nexport const isChrome = (userAgent.indexOf('Chrome') >= 0)\nexport const isSafari = (!isChrome && (userAgent.indexOf('Safari') >= 0))\nexport const isWebkitWebView = (!isChrome && !isSafari && isWebKit)\nexport const isIPad = (userAgent.indexOf('iPad') >= 0)\nexport const isEdgeWebView = isEdge && (userAgent.indexOf('WebView/') >= 0)\n","/* eslint-disable indent */\n/* ---------------------------------------------------------------------------------------------\n *  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\nlet _isWindows = false\nlet _isMacintosh = false\nlet _isLinux = false\nlet _isFreeBSD = false\nlet _isNative = false\nlet _isWeb = false\n\nexport interface IProcessEnvironment {\n\t[key: string]: string;\n}\n\ninterface INodeProcess {\n\tplatform: string;\n\tenv: IProcessEnvironment;\n\tgetuid(): number;\n\tnextTick: Function;\n\tversions?: {\n\t\telectron?: string;\n\t};\n\ttype?: string;\n\n}\ndeclare let process: INodeProcess\ndeclare let global: any\n\ninterface INavigator {\n\tuserAgent: string;\n\tlanguage: string;\n}\ndeclare let navigator: INavigator\ndeclare let self: any\n\nconst isElectronRenderer = (typeof process !== 'undefined' && typeof process.versions !== 'undefined' && typeof process.versions.electron !== 'undefined' && process.type === 'renderer')\n\n// OS detection\nif (typeof navigator === 'object' && !isElectronRenderer) {\n\tconst userAgent = navigator.userAgent\n\t_isWindows = userAgent.indexOf('Windows') >= 0\n\t_isMacintosh = userAgent.indexOf('Macintosh') >= 0\n\t_isLinux = userAgent.indexOf('Linux') >= 0\n\t_isFreeBSD = userAgent.indexOf('FreeBSD') >= 0\n\t_isWeb = true\n} else if (typeof process === 'object') {\n\t_isWindows = (process.platform === 'win32')\n\t_isMacintosh = (process.platform === 'darwin')\n\t_isLinux = (process.platform === 'linux')\n\t_isFreeBSD = (process.platform === 'freebsd')\n\t_isNative = true\n}\n\nexport const enum Platform {\n\tWeb,\n\tMac,\n\tLinux,\n\tFreeBSD,\n\tWindows\n}\nexport function PlatformToString(platform: Platform) {\n\tswitch (platform) {\n\t\tcase Platform.Web: return 'Web'\n\t\tcase Platform.Mac: return 'Mac'\n\t\tcase Platform.Linux: return 'Linux'\n\t\tcase Platform.FreeBSD: return 'FreeBSD'\n\t\tcase Platform.Windows: return 'Windows'\n\t}\n}\n\nlet _platform: Platform = Platform.Web\nif (_isNative) {\n\tif (_isMacintosh) {\n\t\t_platform = Platform.Mac\n\t} else if (_isWindows) {\n\t\t_platform = Platform.Windows\n\t} else if (_isLinux) {\n\t\t_platform = Platform.Linux\n\t} else if (_isFreeBSD) {\n\t\t_platform = Platform.FreeBSD\n\t}\n}\n\nexport const isWindows = _isWindows\nexport const isMacintosh = _isMacintosh\nexport const isLinux = _isLinux\nexport const isFreeBSD = _isFreeBSD\nexport const isNative = _isNative\nexport const isWeb = _isWeb\nexport const platform = _platform\n\nexport function isRootUser(): boolean {\n\treturn _isNative && !_isWindows && (process.getuid() === 0)\n}\n\nconst g = typeof global === 'object' ? global : {} as any\nconst _globals = (typeof self === 'object' ? self : g)\nexport const globals: any = _globals\n\nlet _setImmediate: ((callback: (...args: any[]) => void) => number) | null = null\nexport function setImmediate(callback: (...args: any[]) => void): number {\n\tif (_setImmediate === null) {\n\t\tif (globals.setImmediate) {\n\t\t\t_setImmediate = globals.setImmediate.bind(globals)\n\t\t} else if (typeof process !== 'undefined' && typeof process.nextTick === 'function') {\n\t\t\t_setImmediate = process.nextTick.bind(process)\n\t\t} else {\n\t\t\t_setImmediate = globals.setTimeout.bind(globals)\n\t\t}\n\t}\n\treturn _setImmediate!(callback)\n}\n\nexport const enum OperatingSystem {\n\tWindows = 1,\n\tMacintosh = 2,\n\tLinux = 3,\n\tFreeBSD = 4\n}\n\nconst _wl = _isWindows ? OperatingSystem.Windows : OperatingSystem.Linux | OperatingSystem.FreeBSD\nexport const OS = (_isMacintosh ? OperatingSystem.Macintosh : _wl)\n\nexport const enum AccessibilitySupport {\n\t/**\n\t * This should be the browser case where it is not known if a screen reader is attached or no.\n\t */\n\tUnknown = 0,\n\tDisabled = 1,\n\tEnabled = 2\n}","/* ---------------------------------------------------------------------------------------------\n *  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 { OperatingSystem } from 'base/common/platform'\n\n/**\n * Virtual Key Codes, the value does not hold any inherent meaning.\n * Inspired somewhat from https://msdn.microsoft.com/en-us/library/windows/desktop/dd375731(v=vs.85).aspx\n * But these are \"more general\", as they should work across browsers & OS`s.\n */\nexport const enum KeyCode {\n\t/**\n\t * Placed first to cover the 0 value of the enum.\n\t */\n\tUnknown = 0,\n\n\tBackspace = 1,\n\tTab = 2,\n\tEnter = 3,\n\tShift = 4,\n\tCtrl = 5,\n\tAlt = 6,\n\tPauseBreak = 7,\n\tCapsLock = 8,\n\tEscape = 9,\n\tSpace = 10,\n\tPageUp = 11,\n\tPageDown = 12,\n\tEnd = 13,\n\tHome = 14,\n\tLeftArrow = 15,\n\tUpArrow = 16,\n\tRightArrow = 17,\n\tDownArrow = 18,\n\tInsert = 19,\n\tDelete = 20,\n\n\tKEY_0 = 21,\n\tKEY_1 = 22,\n\tKEY_2 = 23,\n\tKEY_3 = 24,\n\tKEY_4 = 25,\n\tKEY_5 = 26,\n\tKEY_6 = 27,\n\tKEY_7 = 28,\n\tKEY_8 = 29,\n\tKEY_9 = 30,\n\n\tKEY_A = 31,\n\tKEY_B = 32,\n\tKEY_C = 33,\n\tKEY_D = 34,\n\tKEY_E = 35,\n\tKEY_F = 36,\n\tKEY_G = 37,\n\tKEY_H = 38,\n\tKEY_I = 39,\n\tKEY_J = 40,\n\tKEY_K = 41,\n\tKEY_L = 42,\n\tKEY_M = 43,\n\tKEY_N = 44,\n\tKEY_O = 45,\n\tKEY_P = 46,\n\tKEY_Q = 47,\n\tKEY_R = 48,\n\tKEY_S = 49,\n\tKEY_T = 50,\n\tKEY_U = 51,\n\tKEY_V = 52,\n\tKEY_W = 53,\n\tKEY_X = 54,\n\tKEY_Y = 55,\n\tKEY_Z = 56,\n\n\tMeta = 57,\n\tContextMenu = 58,\n\n\tF1 = 59,\n\tF2 = 60,\n\tF3 = 61,\n\tF4 = 62,\n\tF5 = 63,\n\tF6 = 64,\n\tF7 = 65,\n\tF8 = 66,\n\tF9 = 67,\n\tF10 = 68,\n\tF11 = 69,\n\tF12 = 70,\n\tF13 = 71,\n\tF14 = 72,\n\tF15 = 73,\n\tF16 = 74,\n\tF17 = 75,\n\tF18 = 76,\n\tF19 = 77,\n\n\tNumLock = 78,\n\tScrollLock = 79,\n\n\t/**\n\t * Used for miscellaneous characters; it can vary by keyboard.\n\t * For the US standard keyboard, the ';:' key\n\t */\n\tUS_SEMICOLON = 80,\n\t/**\n\t * For any country/region, the '+' key\n\t * For the US standard keyboard, the '=+' key\n\t */\n\tUS_EQUAL = 81,\n\t/**\n\t * For any country/region, the ',' key\n\t * For the US standard keyboard, the ',<' key\n\t */\n\tUS_COMMA = 82,\n\t/**\n\t * For any country/region, the '-' key\n\t * For the US standard keyboard, the '-_' key\n\t */\n\tUS_MINUS = 83,\n\t/**\n\t * For any country/region, the '.' key\n\t * For the US standard keyboard, the '.>' key\n\t */\n\tUS_DOT = 84,\n\t/**\n\t * Used for miscellaneous characters; it can vary by keyboard.\n\t * For the US standard keyboard, the '/?' key\n\t */\n\tUS_SLASH = 85,\n\t/**\n\t * Used for miscellaneous characters; it can vary by keyboard.\n\t * For the US standard keyboard, the '`~' key\n\t */\n\tUS_BACKTICK = 86,\n\t/**\n\t * Used for miscellaneous characters; it can vary by keyboard.\n\t * For the US standard keyboard, the '[{' key\n\t */\n\tUS_OPEN_SQUARE_BRACKET = 87,\n\t/**\n\t * Used for miscellaneous characters; it can vary by keyboard.\n\t * For the US standard keyboard, the '\\|' key\n\t */\n\tUS_BACKSLASH = 88,\n\t/**\n\t * Used for miscellaneous characters; it can vary by keyboard.\n\t * For the US standard keyboard, the ']}' key\n\t */\n\tUS_CLOSE_SQUARE_BRACKET = 89,\n\t/**\n\t * Used for miscellaneous characters; it can vary by keyboard.\n\t * For the US standard keyboard, the ''\"' key\n\t */\n\tUS_QUOTE = 90,\n\t/**\n\t * Used for miscellaneous characters; it can vary by keyboard.\n\t */\n\tOEM_8 = 91,\n\t/**\n\t * Either the angle bracket key or the backslash key on the RT 102-key keyboard.\n\t */\n\tOEM_102 = 92,\n\n\tNUMPAD_0 = 93, // VK_NUMPAD0, 0x60, Numeric keypad 0 key\n\tNUMPAD_1 = 94, // VK_NUMPAD1, 0x61, Numeric keypad 1 key\n\tNUMPAD_2 = 95, // VK_NUMPAD2, 0x62, Numeric keypad 2 key\n\tNUMPAD_3 = 96, // VK_NUMPAD3, 0x63, Numeric keypad 3 key\n\tNUMPAD_4 = 97, // VK_NUMPAD4, 0x64, Numeric keypad 4 key\n\tNUMPAD_5 = 98, // VK_NUMPAD5, 0x65, Numeric keypad 5 key\n\tNUMPAD_6 = 99, // VK_NUMPAD6, 0x66, Numeric keypad 6 key\n\tNUMPAD_7 = 100, // VK_NUMPAD7, 0x67, Numeric keypad 7 key\n\tNUMPAD_8 = 101, // VK_NUMPAD8, 0x68, Numeric keypad 8 key\n\tNUMPAD_9 = 102, // VK_NUMPAD9, 0x69, Numeric keypad 9 key\n\n\tNUMPAD_MULTIPLY = 103,\t// VK_MULTIPLY, 0x6A, Multiply key\n\tNUMPAD_ADD = 104,\t\t// VK_ADD, 0x6B, Add key\n\tNUMPAD_SEPARATOR = 105,\t// VK_SEPARATOR, 0x6C, Separator key\n\tNUMPAD_SUBTRACT = 106,\t// VK_SUBTRACT, 0x6D, Subtract key\n\tNUMPAD_DECIMAL = 107,\t// VK_DECIMAL, 0x6E, Decimal key\n\tNUMPAD_DIVIDE = 108,\t// VK_DIVIDE, 0x6F,\n\n\t/**\n\t * Cover all key codes when IME is processing input.\n\t */\n\tKEY_IN_COMPOSITION = 109,\n\n\tABNT_C1 = 110, // Brazilian (ABNT) Keyboard\n\tABNT_C2 = 111, // Brazilian (ABNT) Keyboard\n\n\t/**\n\t * Placed last to cover the length of the enum.\n\t * Please do not depend on this value!\n\t */\n\tMAX_VALUE\n}\n\n/**\n * keyboardEvent.code\n */\nexport const enum ScanCode {\n\tDependsOnKbLayout = -1,\n\tNone,\n\tHyper,\n\tSuper,\n\tFn,\n\tFnLock,\n\tSuspend,\n\tResume,\n\tTurbo,\n\tSleep,\n\tWakeUp,\n\tKeyA,\n\tKeyB,\n\tKeyC,\n\tKeyD,\n\tKeyE,\n\tKeyF,\n\tKeyG,\n\tKeyH,\n\tKeyI,\n\tKeyJ,\n\tKeyK,\n\tKeyL,\n\tKeyM,\n\tKeyN,\n\tKeyO,\n\tKeyP,\n\tKeyQ,\n\tKeyR,\n\tKeyS,\n\tKeyT,\n\tKeyU,\n\tKeyV,\n\tKeyW,\n\tKeyX,\n\tKeyY,\n\tKeyZ,\n\tDigit1,\n\tDigit2,\n\tDigit3,\n\tDigit4,\n\tDigit5,\n\tDigit6,\n\tDigit7,\n\tDigit8,\n\tDigit9,\n\tDigit0,\n\tEnter,\n\tEscape,\n\tBackspace,\n\tTab,\n\tSpace,\n\tMinus,\n\tEqual,\n\tBracketLeft,\n\tBracketRight,\n\tBackslash,\n\tIntlHash,\n\tSemicolon,\n\tQuote,\n\tBackquote,\n\tComma,\n\tPeriod,\n\tSlash,\n\tCapsLock,\n\tF1,\n\tF2,\n\tF3,\n\tF4,\n\tF5,\n\tF6,\n\tF7,\n\tF8,\n\tF9,\n\tF10,\n\tF11,\n\tF12,\n\tPrintScreen,\n\tScrollLock,\n\tPause,\n\tInsert,\n\tHome,\n\tPageUp,\n\tDelete,\n\tEnd,\n\tPageDown,\n\tArrowRight,\n\tArrowLeft,\n\tArrowDown,\n\tArrowUp,\n\tNumLock,\n\tNumpadDivide,\n\tNumpadMultiply,\n\tNumpadSubtract,\n\tNumpadAdd,\n\tNumpadEnter,\n\tNumpad1,\n\tNumpad2,\n\tNumpad3,\n\tNumpad4,\n\tNumpad5,\n\tNumpad6,\n\tNumpad7,\n\tNumpad8,\n\tNumpad9,\n\tNumpad0,\n\tNumpadDecimal,\n\tIntlBackslash,\n\tContextMenu,\n\tPower,\n\tNumpadEqual,\n\tF13,\n\tF14,\n\tF15,\n\tF16,\n\tF17,\n\tF18,\n\tF19,\n\tF20,\n\tF21,\n\tF22,\n\tF23,\n\tF24,\n\tOpen,\n\tHelp,\n\tSelect,\n\tAgain,\n\tUndo,\n\tCut,\n\tCopy,\n\tPaste,\n\tFind,\n\tAudioVolumeMute,\n\tAudioVolumeUp,\n\tAudioVolumeDown,\n\tNumpadComma,\n\tIntlRo,\n\tKanaMode,\n\tIntlYen,\n\tConvert,\n\tNonConvert,\n\tLang1,\n\tLang2,\n\tLang3,\n\tLang4,\n\tLang5,\n\tAbort,\n\tProps,\n\tNumpadParenLeft,\n\tNumpadParenRight,\n\tNumpadBackspace,\n\tNumpadMemoryStore,\n\tNumpadMemoryRecall,\n\tNumpadMemoryClear,\n\tNumpadMemoryAdd,\n\tNumpadMemorySubtract,\n\tNumpadClear,\n\tNumpadClearEntry,\n\tControlLeft,\n\tShiftLeft,\n\tAltLeft,\n\tMetaLeft,\n\tControlRight,\n\tShiftRight,\n\tAltRight,\n\tMetaRight,\n\tBrightnessUp,\n\tBrightnessDown,\n\tMediaPlay,\n\tMediaRecord,\n\tMediaFastForward,\n\tMediaRewind,\n\tMediaTrackNext,\n\tMediaTrackPrevious,\n\tMediaStop,\n\tEject,\n\tMediaPlayPause,\n\tMediaSelect,\n\tLaunchMail,\n\tLaunchApp2,\n\tLaunchApp1,\n\tSelectTask,\n\tLaunchScreenSaver,\n\tBrowserSearch,\n\tBrowserHome,\n\tBrowserBack,\n\tBrowserForward,\n\tBrowserStop,\n\tBrowserRefresh,\n\tBrowserFavorites,\n\tZoomToggle,\n\tMailReply,\n\tMailForward,\n\tMailSend,\n\n\tMAX_VALUE\n}\n\nclass KeyCodeStrMap {\n\tprivate _keyCodeToStr: string[]\n\tprivate _strToKeyCode: { [str: string]: KeyCode; }\n\n\tconstructor() {\n\t\tthis._keyCodeToStr = []\n\t\tthis._strToKeyCode = Object.create(null)\n\t}\n\n\tdefine(keyCode: KeyCode, str: string): void {\n\t\tthis._keyCodeToStr[keyCode] = str\n\t\tthis._strToKeyCode[str.toLowerCase()] = keyCode\n\t}\n\n\tkeyCodeToStr(keyCode: KeyCode): string {\n\t\treturn this._keyCodeToStr[keyCode]\n\t}\n\n\tstrToKeyCode(str: string): KeyCode {\n\t\treturn this._strToKeyCode[str.toLowerCase()] || KeyCode.Unknown\n\t}\n}\n\nconst scanCodeIntToStr: string[] = [];\nconst scanCodeStrToInt: { [code: string]: number } = Object.create(null);\nconst scanCodeLowerCaseStrToInt: { [code: string]: number } = Object.create(null);\n\nexport const ScanCodeUtils = {\n\tlowerCaseToEnum: (scanCode: string) => scanCodeLowerCaseStrToInt[scanCode] || ScanCode.None,\n\ttoEnum: (scanCode: string) => scanCodeStrToInt[scanCode] || ScanCode.None,\n\ttoString: (scanCode: ScanCode) => scanCodeIntToStr[scanCode] || 'None'\n};\n\nconst uiMap = new KeyCodeStrMap()\nconst userSettingsUSMap = new KeyCodeStrMap()\nconst userSettingsGeneralMap = new KeyCodeStrMap();\n\n(function () {\n\tfunction define(keyCode: KeyCode, uiLabel: string, usUserSettingsLabel: string = uiLabel, generalUserSettingsLabel: string = usUserSettingsLabel): void {\n\t\tuiMap.define(keyCode, uiLabel)\n\t\tuserSettingsUSMap.define(keyCode, usUserSettingsLabel)\n\t\tuserSettingsGeneralMap.define(keyCode, generalUserSettingsLabel)\n\t}\n\n\tdefine(KeyCode.Unknown, 'unknown')\n\n\tdefine(KeyCode.Backspace, 'Backspace')\n\tdefine(KeyCode.Tab, 'Tab')\n\tdefine(KeyCode.Enter, 'Enter')\n\tdefine(KeyCode.Shift, 'Shift')\n\tdefine(KeyCode.Ctrl, 'Ctrl')\n\tdefine(KeyCode.Alt, 'Alt')\n\tdefine(KeyCode.PauseBreak, 'PauseBreak')\n\tdefine(KeyCode.CapsLock, 'CapsLock')\n\tdefine(KeyCode.Escape, 'Escape')\n\tdefine(KeyCode.Space, 'Space')\n\tdefine(KeyCode.PageUp, 'PageUp')\n\tdefine(KeyCode.PageDown, 'PageDown')\n\tdefine(KeyCode.End, 'End')\n\tdefine(KeyCode.Home, 'Home')\n\n\tdefine(KeyCode.LeftArrow, 'LeftArrow', 'Left')\n\tdefine(KeyCode.UpArrow, 'UpArrow', 'Up')\n\tdefine(KeyCode.RightArrow, 'RightArrow', 'Right')\n\tdefine(KeyCode.DownArrow, 'DownArrow', 'Down')\n\tdefine(KeyCode.Insert, 'Insert')\n\tdefine(KeyCode.Delete, 'Delete')\n\n\tdefine(KeyCode.KEY_0, '0')\n\tdefine(KeyCode.KEY_1, '1')\n\tdefine(KeyCode.KEY_2, '2')\n\tdefine(KeyCode.KEY_3, '3')\n\tdefine(KeyCode.KEY_4, '4')\n\tdefine(KeyCode.KEY_5, '5')\n\tdefine(KeyCode.KEY_6, '6')\n\tdefine(KeyCode.KEY_7, '7')\n\tdefine(KeyCode.KEY_8, '8')\n\tdefine(KeyCode.KEY_9, '9')\n\n\tdefine(KeyCode.KEY_A, 'A')\n\tdefine(KeyCode.KEY_B, 'B')\n\tdefine(KeyCode.KEY_C, 'C')\n\tdefine(KeyCode.KEY_D, 'D')\n\tdefine(KeyCode.KEY_E, 'E')\n\tdefine(KeyCode.KEY_F, 'F')\n\tdefine(KeyCode.KEY_G, 'G')\n\tdefine(KeyCode.KEY_H, 'H')\n\tdefine(KeyCode.KEY_I, 'I')\n\tdefine(KeyCode.KEY_J, 'J')\n\tdefine(KeyCode.KEY_K, 'K')\n\tdefine(KeyCode.KEY_L, 'L')\n\tdefine(KeyCode.KEY_M, 'M')\n\tdefine(KeyCode.KEY_N, 'N')\n\tdefine(KeyCode.KEY_O, 'O')\n\tdefine(KeyCode.KEY_P, 'P')\n\tdefine(KeyCode.KEY_Q, 'Q')\n\tdefine(KeyCode.KEY_R, 'R')\n\tdefine(KeyCode.KEY_S, 'S')\n\tdefine(KeyCode.KEY_T, 'T')\n\tdefine(KeyCode.KEY_U, 'U')\n\tdefine(KeyCode.KEY_V, 'V')\n\tdefine(KeyCode.KEY_W, 'W')\n\tdefine(KeyCode.KEY_X, 'X')\n\tdefine(KeyCode.KEY_Y, 'Y')\n\tdefine(KeyCode.KEY_Z, 'Z')\n\n\tdefine(KeyCode.Meta, 'Meta')\n\tdefine(KeyCode.ContextMenu, 'ContextMenu')\n\n\tdefine(KeyCode.F1, 'F1')\n\tdefine(KeyCode.F2, 'F2')\n\tdefine(KeyCode.F3, 'F3')\n\tdefine(KeyCode.F4, 'F4')\n\tdefine(KeyCode.F5, 'F5')\n\tdefine(KeyCode.F6, 'F6')\n\tdefine(KeyCode.F7, 'F7')\n\tdefine(KeyCode.F8, 'F8')\n\tdefine(KeyCode.F9, 'F9')\n\tdefine(KeyCode.F10, 'F10')\n\tdefine(KeyCode.F11, 'F11')\n\tdefine(KeyCode.F12, 'F12')\n\tdefine(KeyCode.F13, 'F13')\n\tdefine(KeyCode.F14, 'F14')\n\tdefine(KeyCode.F15, 'F15')\n\tdefine(KeyCode.F16, 'F16')\n\tdefine(KeyCode.F17, 'F17')\n\tdefine(KeyCode.F18, 'F18')\n\tdefine(KeyCode.F19, 'F19')\n\n\tdefine(KeyCode.NumLock, 'NumLock')\n\tdefine(KeyCode.ScrollLock, 'ScrollLock')\n\n\tdefine(KeyCode.US_SEMICOLON, ';', ';', 'OEM_1')\n\tdefine(KeyCode.US_EQUAL, '=', '=', 'OEM_PLUS')\n\tdefine(KeyCode.US_COMMA, ',', ',', 'OEM_COMMA')\n\tdefine(KeyCode.US_MINUS, '-', '-', 'OEM_MINUS')\n\tdefine(KeyCode.US_DOT, '.', '.', 'OEM_PERIOD')\n\tdefine(KeyCode.US_SLASH, '/', '/', 'OEM_2')\n\tdefine(KeyCode.US_BACKTICK, '`', '`', 'OEM_3')\n\tdefine(KeyCode.ABNT_C1, 'ABNT_C1')\n\tdefine(KeyCode.ABNT_C2, 'ABNT_C2')\n\tdefine(KeyCode.US_OPEN_SQUARE_BRACKET, '[', '[', 'OEM_4')\n\tdefine(KeyCode.US_BACKSLASH, '\\\\', '\\\\', 'OEM_5')\n\tdefine(KeyCode.US_CLOSE_SQUARE_BRACKET, ']', ']', 'OEM_6')\n\tdefine(KeyCode.US_QUOTE, '\\'', '\\'', 'OEM_7')\n\tdefine(KeyCode.OEM_8, 'OEM_8')\n\tdefine(KeyCode.OEM_102, 'OEM_102')\n\n\tdefine(KeyCode.NUMPAD_0, 'NumPad0')\n\tdefine(KeyCode.NUMPAD_1, 'NumPad1')\n\tdefine(KeyCode.NUMPAD_2, 'NumPad2')\n\tdefine(KeyCode.NUMPAD_3, 'NumPad3')\n\tdefine(KeyCode.NUMPAD_4, 'NumPad4')\n\tdefine(KeyCode.NUMPAD_5, 'NumPad5')\n\tdefine(KeyCode.NUMPAD_6, 'NumPad6')\n\tdefine(KeyCode.NUMPAD_7, 'NumPad7')\n\tdefine(KeyCode.NUMPAD_8, 'NumPad8')\n\tdefine(KeyCode.NUMPAD_9, 'NumPad9')\n\n\tdefine(KeyCode.NUMPAD_MULTIPLY, 'NumPad_Multiply')\n\tdefine(KeyCode.NUMPAD_ADD, 'NumPad_Add')\n\tdefine(KeyCode.NUMPAD_SEPARATOR, 'NumPad_Separator')\n\tdefine(KeyCode.NUMPAD_SUBTRACT, 'NumPad_Subtract')\n\tdefine(KeyCode.NUMPAD_DECIMAL, 'NumPad_Decimal')\n\tdefine(KeyCode.NUMPAD_DIVIDE, 'NumPad_Divide')\n})()\n\nexport namespace KeyCodeUtils {\n\texport function toString(keyCode: KeyCode): string {\n\t\treturn uiMap.keyCodeToStr(keyCode)\n\t}\n\texport function fromString(key: string): KeyCode {\n\t\treturn uiMap.strToKeyCode(key)\n\t}\n\n\texport function toUserSettingsUS(keyCode: KeyCode): string {\n\t\treturn userSettingsUSMap.keyCodeToStr(keyCode)\n\t}\n\texport function toUserSettingsGeneral(keyCode: KeyCode): string {\n\t\treturn userSettingsGeneralMap.keyCodeToStr(keyCode)\n\t}\n\texport function fromUserSettings(key: string): KeyCode {\n\t\treturn userSettingsUSMap.strToKeyCode(key) || userSettingsGeneralMap.strToKeyCode(key)\n\t}\n}\n\n/**\n * Binary encoding strategy:\n * ```\n *    1111 11\n *    5432 1098 7654 3210\n *    ---- CSAW KKKK KKKK\n *  C = bit 11 = ctrlCmd flag\n *  S = bit 10 = shift flag\n *  A = bit 9 = alt flag\n *  W = bit 8 = winCtrl flag\n *  K = bits 0-7 = key code\n * ```\n */\nconst enum BinaryKeybindingsMask {\n\tCtrlCmd = (1 << 11) >>> 0,\n\tShift = (1 << 10) >>> 0,\n\tAlt = (1 << 9) >>> 0,\n\tWinCtrl = (1 << 8) >>> 0,\n\tKeyCode = 0x000000FF\n}\n\nexport const enum KeyMod {\n\tCtrlCmd = (1 << 11) >>> 0,\n\tShift = (1 << 10) >>> 0,\n\tAlt = (1 << 9) >>> 0,\n\tWinCtrl = (1 << 8) >>> 0,\n}\n\nexport function KeyChord(firstPart: number, secondPart: number): number {\n\tconst chordPart = ((secondPart & 0x0000FFFF) << 16) >>> 0\n\treturn (firstPart | chordPart) >>> 0\n}\n\nexport const enum KeybindingType {\n\tSimple = 1,\n\tChord = 2\n}\n\nexport class SimpleKeybinding {\n\tpublic readonly type = KeybindingType.Simple\n\n\tpublic readonly ctrlKey: boolean\n\tpublic readonly shiftKey: boolean\n\tpublic readonly altKey: boolean\n\tpublic readonly metaKey: boolean\n\tpublic readonly keyCode: KeyCode\n\n\tconstructor(ctrlKey: boolean, shiftKey: boolean, altKey: boolean, metaKey: boolean, keyCode: KeyCode) {\n\t\tthis.ctrlKey = ctrlKey\n\t\tthis.shiftKey = shiftKey\n\t\tthis.altKey = altKey\n\t\tthis.metaKey = metaKey\n\t\tthis.keyCode = keyCode\n\t}\n\n\t// eslint-disable-next-line no-use-before-define\n\tpublic equals(other: Keybinding): boolean {\n\t\tif (other.type !== KeybindingType.Simple) {\n\t\t\treturn false\n\t\t}\n\t\treturn (\n\t\t\tthis.ctrlKey === other.ctrlKey &&\n\t\t\tthis.shiftKey === other.shiftKey &&\n\t\t\tthis.altKey === other.altKey &&\n\t\t\tthis.metaKey === other.metaKey &&\n\t\t\tthis.keyCode === other.keyCode\n\t\t)\n\t}\n\n\tpublic getHashCode(): string {\n\t\tconst ctrl = this.ctrlKey ? '1' : '0'\n\t\tconst shift = this.shiftKey ? '1' : '0'\n\t\tconst alt = this.altKey ? '1' : '0'\n\t\tconst meta = this.metaKey ? '1' : '0'\n\t\treturn `${ctrl}${shift}${alt}${meta}${this.keyCode}`\n\t}\n\n\tpublic isModifierKey(): boolean {\n\t\treturn (\n\t\t\tthis.keyCode === KeyCode.Unknown ||\n\t\t\tthis.keyCode === KeyCode.Ctrl ||\n\t\t\tthis.keyCode === KeyCode.Meta ||\n\t\t\tthis.keyCode === KeyCode.Alt ||\n\t\t\tthis.keyCode === KeyCode.Shift\n\t\t)\n\t}\n\n\t/**\n\t * Does this keybinding refer to the key code of a modifier and it also has the modifier flag?\n\t */\n\tpublic isDuplicateModifierCase(): boolean {\n\t\treturn (\n\t\t\t(this.ctrlKey && this.keyCode === KeyCode.Ctrl) ||\n\t\t\t(this.shiftKey && this.keyCode === KeyCode.Shift) ||\n\t\t\t(this.altKey && this.keyCode === KeyCode.Alt) ||\n\t\t\t(this.metaKey && this.keyCode === KeyCode.Meta)\n\t\t)\n\t}\n}\n\nexport class ChordKeybinding {\n\tpublic readonly type = KeybindingType.Chord\n\n\tpublic readonly firstPart: SimpleKeybinding\n\tpublic readonly chordPart: SimpleKeybinding\n\n\tconstructor(firstPart: SimpleKeybinding, chordPart: SimpleKeybinding) {\n\t\tthis.firstPart = firstPart\n\t\tthis.chordPart = chordPart\n\t}\n\n\tpublic getHashCode(): string {\n\t\treturn `${this.firstPart.getHashCode()};${this.chordPart.getHashCode()}`\n\t}\n}\n\nexport type Keybinding = SimpleKeybinding | ChordKeybinding;\n\nexport function createKeybinding(keybinding: number, OS: OperatingSystem): Keybinding | null {\n\tif (keybinding === 0) {\n\t\treturn null\n\t}\n\tconst firstPart = (keybinding & 0x0000FFFF) >>> 0\n\tconst chordPart = (keybinding & 0xFFFF0000) >>> 16\n\tif (chordPart !== 0) {\n\t\treturn new ChordKeybinding(\n\t\t\tcreateSimpleKeybinding(firstPart, OS),\n\t\t\tcreateSimpleKeybinding(chordPart, OS)\n\t\t)\n\t}\n\treturn createSimpleKeybinding(firstPart, OS)\n}\n\nexport function createSimpleKeybinding(keybinding: number, OS: OperatingSystem): SimpleKeybinding {\n\tconst ctrlCmd = (!!(keybinding & BinaryKeybindingsMask.CtrlCmd))\n\tconst winCtrl = (!!(keybinding & BinaryKeybindingsMask.WinCtrl))\n\n\tconst ctrlKey = (OS === OperatingSystem.Macintosh ? winCtrl : ctrlCmd)\n\tconst shiftKey = (!!(keybinding & BinaryKeybindingsMask.Shift))\n\tconst altKey = (!!(keybinding & BinaryKeybindingsMask.Alt))\n\tconst metaKey = (OS === OperatingSystem.Macintosh ? ctrlCmd : winCtrl)\n\tconst keyCode = (keybinding & BinaryKeybindingsMask.KeyCode)\n\n\treturn new SimpleKeybinding(ctrlKey, shiftKey, altKey, metaKey, keyCode)\n}\n\nexport class ResolvedKeybindingPart {\n\treadonly ctrlKey: boolean\n\treadonly shiftKey: boolean\n\treadonly altKey: boolean\n\treadonly metaKey: boolean\n\n\treadonly keyLabel: string | null\n\treadonly keyAriaLabel: string | null\n\n\tconstructor(ctrlKey: boolean, shiftKey: boolean, altKey: boolean, metaKey: boolean, kbLabel: string | null, kbAriaLabel: string | null) {\n\t\tthis.ctrlKey = ctrlKey\n\t\tthis.shiftKey = shiftKey\n\t\tthis.altKey = altKey\n\t\tthis.metaKey = metaKey\n\t\tthis.keyLabel = kbLabel\n\t\tthis.keyAriaLabel = kbAriaLabel\n\t}\n}\n\n/**\n * A resolved keybinding. Can be a simple keybinding or a chord keybinding.\n */\nexport abstract class ResolvedKeybinding {\n\t/**\n\t * This prints the binding in a format suitable for displaying in the UI.\n\t */\n\tpublic abstract getLabel(): string | null;\n\t/**\n * This prints the binding in a format suitable for ARIA.\n */\n\tpublic abstract getAriaLabel(): string | null;\n\t/**\n * This prints the binding in a format suitable for electron's accelerators.\n * See https://github.com/electron/electron/blob/master/docs/api/accelerator.md\n */\n\tpublic abstract getElectronAccelerator(): string | null;\n\t/**\n * This prints the binding in a format suitable for user settings.\n */\n\tpublic abstract getUserSettingsLabel(): string | null;\n\t/**\n * Is the user settings label reflecting the label?\n */\n\tpublic abstract isWYSIWYG(): boolean;\n\n\t/**\n * Is the binding a chord?\n */\n\tpublic abstract isChord(): boolean;\n\n\t/**\n * Returns the firstPart, chordPart that should be used for dispatching.\n */\n\tpublic abstract getDispatchParts(): [string | null, string | null];\n\t/**\n * Returns the firstPart, chordPart of the keybinding.\n * For simple keybindings, the second element will be null.\n */\n\tpublic abstract getParts(): [ResolvedKeybindingPart, ResolvedKeybindingPart | null];\n}","/* ---------------------------------------------------------------------------------------------\n *  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 { KeyCode, KeyCodeUtils, KeyMod, SimpleKeybinding } from 'base/common/keyCodes'\nimport * as platform from 'base/common/platform'\n\nconst KEY_CODE_MAP: { [keyCode: number]: KeyCode } = new Array(230)\nconst INVERSE_KEY_CODE_MAP: KeyCode[] = new Array(KeyCode.MAX_VALUE);\n\n(function () {\n\tfor (let i = 0; i < INVERSE_KEY_CODE_MAP.length; i++) {\n\t\tINVERSE_KEY_CODE_MAP[i] = 0\n\t}\n\n\tfunction define(code: number, keyCode: KeyCode): void {\n\t\tKEY_CODE_MAP[code] = keyCode\n\t\tINVERSE_KEY_CODE_MAP[keyCode] = code\n\t}\n\n\tdefine(3, KeyCode.PauseBreak) // VK_CANCEL 0x03 Control-break processing\n\tdefine(8, KeyCode.Backspace)\n\tdefine(9, KeyCode.Tab)\n\tdefine(13, KeyCode.Enter)\n\tdefine(16, KeyCode.Shift)\n\tdefine(17, KeyCode.Ctrl)\n\tdefine(18, KeyCode.Alt)\n\tdefine(19, KeyCode.PauseBreak)\n\tdefine(20, KeyCode.CapsLock)\n\tdefine(27, KeyCode.Escape)\n\tdefine(32, KeyCode.Space)\n\tdefine(33, KeyCode.PageUp)\n\tdefine(34, KeyCode.PageDown)\n\tdefine(35, KeyCode.End)\n\tdefine(36, KeyCode.Home)\n\tdefine(37, KeyCode.LeftArrow)\n\tdefine(38, KeyCode.UpArrow)\n\tdefine(39, KeyCode.RightArrow)\n\tdefine(40, KeyCode.DownArrow)\n\tdefine(45, KeyCode.Insert)\n\tdefine(46, KeyCode.Delete)\n\n\tdefine(48, KeyCode.KEY_0)\n\tdefine(49, KeyCode.KEY_1)\n\tdefine(50, KeyCode.KEY_2)\n\tdefine(51, KeyCode.KEY_3)\n\tdefine(52, KeyCode.KEY_4)\n\tdefine(53, KeyCode.KEY_5)\n\tdefine(54, KeyCode.KEY_6)\n\tdefine(55, KeyCode.KEY_7)\n\tdefine(56, KeyCode.KEY_8)\n\tdefine(57, KeyCode.KEY_9)\n\n\tdefine(65, KeyCode.KEY_A)\n\tdefine(66, KeyCode.KEY_B)\n\tdefine(67, KeyCode.KEY_C)\n\tdefine(68, KeyCode.KEY_D)\n\tdefine(69, KeyCode.KEY_E)\n\tdefine(70, KeyCode.KEY_F)\n\tdefine(71, KeyCode.KEY_G)\n\tdefine(72, KeyCode.KEY_H)\n\tdefine(73, KeyCode.KEY_I)\n\tdefine(74, KeyCode.KEY_J)\n\tdefine(75, KeyCode.KEY_K)\n\tdefine(76, KeyCode.KEY_L)\n\tdefine(77, KeyCode.KEY_M)\n\tdefine(78, KeyCode.KEY_N)\n\tdefine(79, KeyCode.KEY_O)\n\tdefine(80, KeyCode.KEY_P)\n\tdefine(81, KeyCode.KEY_Q)\n\tdefine(82, KeyCode.KEY_R)\n\tdefine(83, KeyCode.KEY_S)\n\tdefine(84, KeyCode.KEY_T)\n\tdefine(85, KeyCode.KEY_U)\n\tdefine(86, KeyCode.KEY_V)\n\tdefine(87, KeyCode.KEY_W)\n\tdefine(88, KeyCode.KEY_X)\n\tdefine(89, KeyCode.KEY_Y)\n\tdefine(90, KeyCode.KEY_Z)\n\n\tdefine(93, KeyCode.ContextMenu)\n\n\tdefine(96, KeyCode.NUMPAD_0)\n\tdefine(97, KeyCode.NUMPAD_1)\n\tdefine(98, KeyCode.NUMPAD_2)\n\tdefine(99, KeyCode.NUMPAD_3)\n\tdefine(100, KeyCode.NUMPAD_4)\n\tdefine(101, KeyCode.NUMPAD_5)\n\tdefine(102, KeyCode.NUMPAD_6)\n\tdefine(103, KeyCode.NUMPAD_7)\n\tdefine(104, KeyCode.NUMPAD_8)\n\tdefine(105, KeyCode.NUMPAD_9)\n\tdefine(106, KeyCode.NUMPAD_MULTIPLY)\n\tdefine(107, KeyCode.NUMPAD_ADD)\n\tdefine(108, KeyCode.NUMPAD_SEPARATOR)\n\tdefine(109, KeyCode.NUMPAD_SUBTRACT)\n\tdefine(110, KeyCode.NUMPAD_DECIMAL)\n\tdefine(111, KeyCode.NUMPAD_DIVIDE)\n\n\tdefine(112, KeyCode.F1)\n\tdefine(113, KeyCode.F2)\n\tdefine(114, KeyCode.F3)\n\tdefine(115, KeyCode.F4)\n\tdefine(116, KeyCode.F5)\n\tdefine(117, KeyCode.F6)\n\tdefine(118, KeyCode.F7)\n\tdefine(119, KeyCode.F8)\n\tdefine(120, KeyCode.F9)\n\tdefine(121, KeyCode.F10)\n\tdefine(122, KeyCode.F11)\n\tdefine(123, KeyCode.F12)\n\tdefine(124, KeyCode.F13)\n\tdefine(125, KeyCode.F14)\n\tdefine(126, KeyCode.F15)\n\tdefine(127, KeyCode.F16)\n\tdefine(128, KeyCode.F17)\n\tdefine(129, KeyCode.F18)\n\tdefine(130, KeyCode.F19)\n\n\tdefine(144, KeyCode.NumLock)\n\tdefine(145, KeyCode.ScrollLock)\n\n\tdefine(186, KeyCode.US_SEMICOLON)\n\tdefine(187, KeyCode.US_EQUAL)\n\tdefine(188, KeyCode.US_COMMA)\n\tdefine(189, KeyCode.US_MINUS)\n\tdefine(190, KeyCode.US_DOT)\n\tdefine(191, KeyCode.US_SLASH)\n\tdefine(192, KeyCode.US_BACKTICK)\n\tdefine(193, KeyCode.ABNT_C1)\n\tdefine(194, KeyCode.ABNT_C2)\n\tdefine(219, KeyCode.US_OPEN_SQUARE_BRACKET)\n\tdefine(220, KeyCode.US_BACKSLASH)\n\tdefine(221, KeyCode.US_CLOSE_SQUARE_BRACKET)\n\tdefine(222, KeyCode.US_QUOTE)\n\tdefine(223, KeyCode.OEM_8)\n\n\tdefine(226, KeyCode.OEM_102)\n\n\t/**\n\t * https://lists.w3.org/Archives/Public/www-dom/2010JulSep/att-0182/keyCode-spec.html\n\t * If an Input Method Editor is processing key input and the event is keydown, return 229.\n\t */\n\tdefine(229, KeyCode.KEY_IN_COMPOSITION)\n\n\tdefine(91, KeyCode.Meta)\n\tif (platform.isMacintosh) {\n\t\t// the two meta keys in the Mac have different key codes (91 and 93)\n\t\tdefine(93, KeyCode.Meta)\n\t} else {\n\t\tdefine(92, KeyCode.Meta)\n\t}\n})()\n\nfunction extractKeyCode(e: KeyboardEvent): KeyCode {\n\tif (e.charCode) {\n\t\t// \"keypress\" events mostly\n\t\tconst char = String.fromCharCode(e.charCode).toUpperCase()\n\t\treturn KeyCodeUtils.fromString(char)\n\t}\n\treturn KEY_CODE_MAP[e.keyCode] || KeyCode.Unknown\n}\n\nexport function getCodeForKeyCode(keyCode: KeyCode): number {\n\treturn INVERSE_KEY_CODE_MAP[keyCode]\n}\n\nexport interface IKeyboardEvent {\n\treadonly browserEvent: KeyboardEvent;\n\treadonly target: HTMLElement;\n\n\treadonly ctrlKey: boolean;\n\treadonly shiftKey: boolean;\n\treadonly altKey: boolean;\n\treadonly metaKey: boolean;\n\treadonly keyCode: KeyCode;\n\treadonly code: string;\n\n\t/**\n\t * @internal\n\t */\n\ttoKeybinding(): SimpleKeybinding;\n\tequals(keybinding: number): boolean;\n\n\tpreventDefault(): void;\n\tstopPropagation(): void;\n}\n\nconst ctrlKeyMod = (platform.isMacintosh ? KeyMod.WinCtrl : KeyMod.CtrlCmd)\nconst altKeyMod = KeyMod.Alt\nconst shiftKeyMod = KeyMod.Shift\nconst metaKeyMod = (platform.isMacintosh ? KeyMod.CtrlCmd : KeyMod.WinCtrl)\n\nexport class StandardKeyboardEvent implements IKeyboardEvent {\n\tpublic readonly browserEvent: KeyboardEvent\n\tpublic readonly target: HTMLElement\n\n\tpublic readonly ctrlKey: boolean\n\tpublic readonly shiftKey: boolean\n\tpublic readonly altKey: boolean\n\tpublic readonly metaKey: boolean\n\tpublic readonly keyCode: KeyCode\n\tpublic readonly code: string\n\n\tprivate _asKeybinding: number\n\tprivate _asRuntimeKeybinding: SimpleKeybinding\n\n\tconstructor(source: KeyboardEvent) {\n\t\tconst e = source\n\n\t\tthis.browserEvent = e\n\t\tthis.target = <HTMLElement>e.target\n\n\t\tthis.ctrlKey = e.ctrlKey\n\t\tthis.shiftKey = e.shiftKey\n\t\tthis.altKey = e.altKey\n\t\tthis.metaKey = e.metaKey\n\t\tthis.keyCode = extractKeyCode(e)\n\t\tthis.code = e.code\n\n\t\t// console.info(e.type + \": keyCode: \" + e.keyCode + \", which: \" + e.which + \", charCode: \" + e.charCode + \", detail: \" + e.detail + \" ====> \" + this.keyCode + ' -- ' + KeyCode[this.keyCode]);\n\n\t\tthis.ctrlKey = this.ctrlKey || this.keyCode === KeyCode.Ctrl\n\t\tthis.altKey = this.altKey || this.keyCode === KeyCode.Alt\n\t\tthis.shiftKey = this.shiftKey || this.keyCode === KeyCode.Shift\n\t\tthis.metaKey = this.metaKey || this.keyCode === KeyCode.Meta\n\n\t\tthis._asKeybinding = this._computeKeybinding()\n\t\tthis._asRuntimeKeybinding = this._computeRuntimeKeybinding()\n\t}\n\n\tpublic preventDefault(): void {\n\t\tif (this.browserEvent && this.browserEvent.preventDefault) {\n\t\t\tthis.browserEvent.preventDefault()\n\t\t}\n\t}\n\n\tpublic stopPropagation(): void {\n\t\tif (this.browserEvent && this.browserEvent.stopPropagation) {\n\t\t\tthis.browserEvent.stopPropagation()\n\t\t}\n\t}\n\n\tpublic toKeybinding(): SimpleKeybinding {\n\t\treturn this._asRuntimeKeybinding\n\t}\n\n\tpublic equals(other: number): boolean {\n\t\treturn this._asKeybinding === other\n\t}\n\n\tprivate _computeKeybinding(): number {\n\t\tlet key = KeyCode.Unknown\n\t\tif (this.keyCode !== KeyCode.Ctrl && this.keyCode !== KeyCode.Shift && this.keyCode !== KeyCode.Alt && this.keyCode !== KeyCode.Meta) {\n\t\t\tkey = this.keyCode\n\t\t}\n\n\t\tlet result = 0\n\t\tif (this.ctrlKey) {\n\t\t\tresult |= ctrlKeyMod\n\t\t}\n\t\tif (this.altKey) {\n\t\t\tresult |= altKeyMod\n\t\t}\n\t\tif (this.shiftKey) {\n\t\t\tresult |= shiftKeyMod\n\t\t}\n\t\tif (this.metaKey) {\n\t\t\tresult |= metaKeyMod\n\t\t}\n\t\tresult |= key\n\n\t\treturn result\n\t}\n\n\tprivate _computeRuntimeKeybinding(): SimpleKeybinding {\n\t\tlet key = KeyCode.Unknown\n\t\tif (this.keyCode !== KeyCode.Ctrl && this.keyCode !== KeyCode.Shift && this.keyCode !== KeyCode.Alt && this.keyCode !== KeyCode.Meta) {\n\t\t\tkey = this.keyCode\n\t\t}\n\t\treturn new SimpleKeybinding(this.ctrlKey, this.shiftKey, this.altKey, this.metaKey, key)\n\t}\n}","/* ---------------------------------------------------------------------------------------------\n *  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 * as browser from 'base/browser/browser'\nimport * as platform from 'base/common/platform'\n\nexport interface IMouseEvent {\n\treadonly browserEvent: MouseEvent;\n\treadonly leftButton: boolean;\n\treadonly middleButton: boolean;\n\treadonly rightButton: boolean;\n\treadonly target: HTMLElement;\n\treadonly detail: number;\n\treadonly posx: number;\n\treadonly posy: number;\n\treadonly ctrlKey: boolean;\n\treadonly shiftKey: boolean;\n\treadonly altKey: boolean;\n\treadonly metaKey: boolean;\n\treadonly timestamp: number;\n\n\tpreventDefault(): void;\n\tstopPropagation(): void;\n}\n\nexport class StandardMouseEvent implements IMouseEvent {\n\tpublic readonly browserEvent: MouseEvent\n\n\tpublic readonly leftButton: boolean\n\tpublic readonly middleButton: boolean\n\tpublic readonly rightButton: boolean\n\tpublic readonly target: HTMLElement\n\tpublic detail: number\n\tpublic readonly posx: number\n\tpublic readonly posy: number\n\tpublic readonly ctrlKey: boolean\n\tpublic readonly shiftKey: boolean\n\tpublic readonly altKey: boolean\n\tpublic readonly metaKey: boolean\n\tpublic readonly timestamp: number\n\n\tconstructor(e: MouseEvent) {\n\t\tthis.timestamp = Date.now()\n\t\tthis.browserEvent = e\n\t\tthis.leftButton = e.button === 0\n\t\tthis.middleButton = e.button === 1\n\t\tthis.rightButton = e.button === 2\n\n\t\tthis.target = <HTMLElement>e.target\n\n\t\tthis.detail = e.detail || 1\n\t\tif (e.type === 'dblclick') {\n\t\t\tthis.detail = 2\n\t\t}\n\t\tthis.ctrlKey = e.ctrlKey\n\t\tthis.shiftKey = e.shiftKey\n\t\tthis.altKey = e.altKey\n\t\tthis.metaKey = e.metaKey\n\n\t\tif (typeof e.pageX === 'number') {\n\t\t\tthis.posx = e.pageX\n\t\t\tthis.posy = e.pageY\n\t\t} else {\n\t\t\t// Probably hit by MSGestureEvent\n\t\t\tthis.posx = e.clientX + document.body.scrollLeft + document.documentElement?.scrollLeft\n\t\t\tthis.posy = e.clientY + document.body.scrollTop + document.documentElement?.scrollTop\n\t\t}\n\t}\n\n\tpublic preventDefault(): void {\n\t\tif (this.browserEvent.preventDefault) {\n\t\t\tthis.browserEvent.preventDefault()\n\t\t}\n\t}\n\n\tpublic stopPropagation(): void {\n\t\tif (this.browserEvent.stopPropagation) {\n\t\t\tthis.browserEvent.stopPropagation()\n\t\t}\n\t}\n}\n\nexport interface IDataTransfer {\n\tdropEffect: string;\n\teffectAllowed: string;\n\ttypes: any[];\n\tfiles: any[];\n\n\tsetData(type: string, data: string): void;\n\tsetDragImage(image: any, x: number, y: number): void;\n\n\tgetData(type: string): string;\n\tclearData(types?: string[]): void;\n}\n\nexport class DragMouseEvent extends StandardMouseEvent {\n\tpublic readonly dataTransfer: IDataTransfer\n\n\tconstructor(e: MouseEvent) {\n\t\tsuper(e)\n\t\tthis.dataTransfer = (<any>e).dataTransfer\n\t}\n}\n\nexport interface IMouseWheelEvent extends MouseEvent {\n\treadonly wheelDelta: number;\n}\n\ninterface IWebKitMouseWheelEvent {\n\twheelDeltaY: number;\n\twheelDeltaX: number;\n}\n\ninterface IGeckoMouseWheelEvent {\n\tHORIZONTAL_AXIS: number;\n\tVERTICAL_AXIS: number;\n\taxis: number;\n\tdetail: number;\n}\n\nexport class StandardWheelEvent {\n\tpublic readonly browserEvent: IMouseWheelEvent | null\n\tpublic readonly deltaY: number\n\tpublic readonly deltaX: number\n\tpublic readonly target: Node\n\n\tconstructor(e: IMouseWheelEvent | null, deltaX = 0, deltaY = 0) {\n\t\tthis.browserEvent = e || null\n\t\tthis.target = e ? (e.target || (<any>e).targetNode || e.srcElement) : null\n\n\t\tthis.deltaY = deltaY\n\t\tthis.deltaX = deltaX\n\n\t\tif (e) {\n\t\t\tconst e1 = <IWebKitMouseWheelEvent><any>e\n\t\t\tconst e2 = <IGeckoMouseWheelEvent><any>e\n\n\t\t\t// vertical delta scroll\n\t\t\tif (typeof e1.wheelDeltaY !== 'undefined') {\n\t\t\t\tthis.deltaY = e1.wheelDeltaY / 120\n\t\t\t} else if (typeof e2.VERTICAL_AXIS !== 'undefined' && e2.axis === e2.VERTICAL_AXIS) {\n\t\t\t\tthis.deltaY = -e2.detail / 3\n\t\t\t}\n\n\t\t\t// horizontal delta scroll\n\t\t\tif (typeof e1.wheelDeltaX !== 'undefined') {\n\t\t\t\tif (browser.isSafari && platform.isWindows) {\n\t\t\t\t\tthis.deltaX = -(e1.wheelDeltaX / 120)\n\t\t\t\t} else {\n\t\t\t\t\tthis.deltaX = e1.wheelDeltaX / 120\n\t\t\t\t}\n\t\t\t} else if (typeof e2.HORIZONTAL_AXIS !== 'undefined' && e2.axis === e2.HORIZONTAL_AXIS) {\n\t\t\t\tthis.deltaX = -e.detail / 3\n\t\t\t}\n\n\t\t\t// Assume a vertical scroll if nothing else worked\n\t\t\tif (this.deltaY === 0 && this.deltaX === 0 && e.wheelDelta) {\n\t\t\t\tthis.deltaY = e.wheelDelta / 120\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic preventDefault(): void {\n\t\tif (this.browserEvent) {\n\t\t\tif (this.browserEvent.preventDefault) {\n\t\t\t\tthis.browserEvent.preventDefault()\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic stopPropagation(): void {\n\t\tif (this.browserEvent) {\n\t\t\tif (this.browserEvent.stopPropagation) {\n\t\t\t\tthis.browserEvent.stopPropagation()\n\t\t\t}\n\t\t}\n\t}\n}","/* ---------------------------------------------------------------------------------------------\n *  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 { Disposable } from 'base/common/lifecycle'\n\nexport class TimeoutTimer extends Disposable {\n\tprivate _token: any\n\n\tconstructor();\n\tconstructor(runner: () => void, timeout: number);\n\tconstructor(runner?: () => void, timeout?: number) {\n\t\tsuper()\n\t\tthis._token = -1\n\n\t\tif (typeof runner === 'function' && typeof timeout === 'number') {\n\t\t\tthis.setIfNotSet(runner, timeout)\n\t\t}\n\t}\n\n\tdispose(): void {\n\t\tthis.cancel()\n\t\tsuper.dispose()\n\t}\n\n\tcancel(): void {\n\t\tif (this._token !== -1) {\n\t\t\tclearTimeout(this._token)\n\t\t\tthis._token = -1\n\t\t}\n\t}\n\n\tcancelAndSet(runner: () => void, timeout: number): void {\n\t\tthis.cancel()\n\t\tthis._token = setTimeout(() => {\n\t\t\tthis._token = -1\n\t\t\trunner()\n\t\t}, timeout)\n\t}\n\n\tsetIfNotSet(runner: () => void, timeout: number): void {\n\t\tif (this._token !== -1) {\n\t\t\t// timer is already set\n\t\t\treturn\n\t\t}\n\t\tthis._token = setTimeout(() => {\n\t\t\tthis._token = -1\n\t\t\trunner()\n\t\t}, timeout)\n\t}\n}\n\nexport class RunOnceScheduler {\n\tprotected runner: ((...args: any[]) => void) | null\n\n\tprivate timeoutToken: any\n\tprivate timeout: number\n\tprivate timeoutHandler: () => void\n\n\tconstructor(runner: (...args: any[]) => void, timeout: number) {\n\t\tthis.timeoutToken = -1\n\t\tthis.runner = runner\n\t\tthis.timeout = timeout\n\t\tthis.timeoutHandler = this.onTimeout.bind(this)\n\t}\n\n\t/**\n\t * Dispose RunOnceScheduler\n\t */\n\tdispose(): void {\n\t\tthis.cancel()\n\t\tthis.runner = null\n\t}\n\n\t/**\n\t * Cancel current scheduled runner (if any).\n\t */\n\tcancel(): void {\n\t\tif (this.isScheduled()) {\n\t\t\tclearTimeout(this.timeoutToken)\n\t\t\tthis.timeoutToken = -1\n\t\t}\n\t}\n\n\t/**\n\t * Cancel previous runner (if any) & schedule a new runner.\n\t */\n\tschedule(delay = this.timeout): void {\n\t\tthis.cancel()\n\t\tthis.timeoutToken = setTimeout(this.timeoutHandler, delay)\n\t}\n\n\t/**\n\t * Returns true if scheduled.\n\t */\n\tisScheduled(): boolean {\n\t\treturn this.timeoutToken !== -1\n\t}\n\n\tprivate onTimeout() {\n\t\tthis.timeoutToken = -1\n\t\tif (this.runner) {\n\t\t\tthis.doRun()\n\t\t}\n\t}\n\n\tprotected doRun(): void {\n\t\tif (this.runner) {\n\t\t\tthis.runner()\n\t\t}\n\t}\n}","/* ---------------------------------------------------------------------------------------------\n *  Copyright (c) Microsoft Corporation. All rights reserved.\n *  Licensed under the MIT License. See License.txt in the project root for license information.\n *-------------------------------------------------------------------------------------------- */\n\n/**\n * Returns the last element of an array.\n * @param array The array.\n * @param n Which element from the end (default is zero).\n */\nexport function tail<T>(array: ArrayLike<T>, n: number = 0): T {\n\treturn array[array.length - (1 + n)];\n}\n\n/**\n * @returns a new array with all falsy values removed. The original array IS NOT modified.\n */\nexport function coalesce<T>(array: Array<T | undefined | null>): T[] {\n\tif (!array) {\n\t\treturn array\n\t}\n\treturn <T[]>array.filter(e => !!e)\n}","/* ---------------------------------------------------------------------------------------------\n *  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 * as browser from 'base/browser/browser'\nimport { domEvent } from 'base/browser/event'\nimport { IKeyboardEvent, StandardKeyboardEvent } from 'base/browser/keyboardEvent'\nimport { IMouseEvent, StandardMouseEvent } from 'base/browser/mouseEvent'\nimport { TimeoutTimer } from 'base/common/async'\nimport { CharCode } from 'base/common/charCode'\nimport { Emitter, Event } from 'base/common/event'\nimport { Disposable, IDisposable, dispose, toDisposable } from 'base/common/lifecycle'\nimport * as platform from 'base/common/platform'\nimport { coalesce } from 'base/common/arrays'\nimport { KeyCode } from 'base/common/keyCodes'\n\nexport function clearNode(node: HTMLElement): void {\n\twhile (node.firstChild) {\n\t\tnode.removeChild(node.firstChild)\n\t}\n}\n\nexport function removeNode(node: HTMLElement): void {\n\tif (node.parentNode) {\n\t\tnode.parentNode.removeChild(node)\n\t}\n}\n\nexport function isInDOM(node: Node | null): boolean {\n\twhile (node) {\n\t\tif (node === document.body) {\n\t\t\treturn true\n\t\t}\n\t\tnode = node.parentNode\n\t}\n\treturn false\n}\n\ninterface IDomClassList {\n\thasClass(node: HTMLElement, className: string): boolean;\n\taddClass(node: HTMLElement, className: string): void;\n\taddClasses(node: HTMLElement, ...classNames: string[]): void;\n\tremoveClass(node: HTMLElement, className: string): void;\n\tremoveClasses(node: HTMLElement, ...classNames: string[]): void;\n\ttoggleClass(node: HTMLElement, className: string, shouldHaveIt?: boolean): void;\n}\n\ntype ModifierKey = 'alt' | 'ctrl' | 'shift' | 'meta';\n\nexport interface IModifierKeyStatus {\n\taltKey: boolean;\n\tshiftKey: boolean;\n\tctrlKey: boolean;\n\tmetaKey: boolean;\n\tlastKeyPressed?: ModifierKey;\n\tlastKeyReleased?: ModifierKey;\n\tevent?: KeyboardEvent;\n}\n\nexport class ModifierKeyEmitter extends Emitter<IModifierKeyStatus> {\n\n\tprivate _keyStatus: IModifierKeyStatus;\n\tprivate static instance: ModifierKeyEmitter;\n\n\tprivate constructor() {\n\t\tsuper();\n\n\t\tthis._keyStatus = {\n\t\t\taltKey: false,\n\t\t\tshiftKey: false,\n\t\t\tctrlKey: false,\n\t\t\tmetaKey: false\n\t\t};\n\n\t\taddDisposableListener(window, 'keydown', e => {\n\t\t\tif (e.defaultPrevented) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst event = new StandardKeyboardEvent(e);\n\t\t\t// If Alt-key keydown event is repeated, ignore it #112347\n\t\t\t// Only known to be necessary for Alt-Key at the moment #115810\n\t\t\tif (event.keyCode === KeyCode.Alt && e.repeat) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (e.altKey && !this._keyStatus.altKey) {\n\t\t\t\tthis._keyStatus.lastKeyPressed = 'alt';\n\t\t\t} else if (e.ctrlKey && !this._keyStatus.ctrlKey) {\n\t\t\t\tthis._keyStatus.lastKeyPressed = 'ctrl';\n\t\t\t} else if (e.metaKey && !this._keyStatus.metaKey) {\n\t\t\t\tthis._keyStatus.lastKeyPressed = 'meta';\n\t\t\t} else if (e.shiftKey && !this._keyStatus.shiftKey) {\n\t\t\t\tthis._keyStatus.lastKeyPressed = 'shift';\n\t\t\t} else if (event.keyCode !== KeyCode.Alt) {\n\t\t\t\tthis._keyStatus.lastKeyPressed = undefined;\n\t\t\t} else {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis._keyStatus.altKey = e.altKey;\n\t\t\tthis._keyStatus.ctrlKey = e.ctrlKey;\n\t\t\tthis._keyStatus.metaKey = e.metaKey;\n\t\t\tthis._keyStatus.shiftKey = e.shiftKey;\n\n\t\t\tif (this._keyStatus.lastKeyPressed) {\n\t\t\t\tthis._keyStatus.event = e;\n\t\t\t\tthis.fire(this._keyStatus);\n\t\t\t}\n\t\t}, true);\n\n\t\taddDisposableListener(window, 'keyup', e => {\n\t\t\tif (e.defaultPrevented) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (!e.altKey && this._keyStatus.altKey) {\n\t\t\t\tthis._keyStatus.lastKeyReleased = 'alt';\n\t\t\t} else if (!e.ctrlKey && this._keyStatus.ctrlKey) {\n\t\t\t\tthis._keyStatus.lastKeyReleased = 'ctrl';\n\t\t\t} else if (!e.metaKey && this._keyStatus.metaKey) {\n\t\t\t\tthis._keyStatus.lastKeyReleased = 'meta';\n\t\t\t} else if (!e.shiftKey && this._keyStatus.shiftKey) {\n\t\t\t\tthis._keyStatus.lastKeyReleased = 'shift';\n\t\t\t} else {\n\t\t\t\tthis._keyStatus.lastKeyReleased = undefined;\n\t\t\t}\n\n\t\t\tif (this._keyStatus.lastKeyPressed !== this._keyStatus.lastKeyReleased) {\n\t\t\t\tthis._keyStatus.lastKeyPressed = undefined;\n\t\t\t}\n\n\t\t\tthis._keyStatus.altKey = e.altKey;\n\t\t\tthis._keyStatus.ctrlKey = e.ctrlKey;\n\t\t\tthis._keyStatus.metaKey = e.metaKey;\n\t\t\tthis._keyStatus.shiftKey = e.shiftKey;\n\n\t\t\tif (this._keyStatus.lastKeyReleased) {\n\t\t\t\tthis._keyStatus.event = e;\n\t\t\t\tthis.fire(this._keyStatus);\n\t\t\t}\n\t\t}, true);\n\n\t\taddDisposableListener(document.body, 'mousedown', () => {\n\t\t\tthis._keyStatus.lastKeyPressed = undefined;\n\t\t}, true);\n\n\t\taddDisposableListener(document.body, 'mouseup', () => {\n\t\t\tthis._keyStatus.lastKeyPressed = undefined;\n\t\t}, true);\n\n\t\taddDisposableListener(document.body, 'mousemove', e => {\n\t\t\tif (e.buttons) {\n\t\t\t\tthis._keyStatus.lastKeyPressed = undefined;\n\t\t\t}\n\t\t}, true);\n\n\t\taddDisposableListener(window, 'blur', () => {\n\t\t\tthis.resetKeyStatus();\n\t\t});\n\t}\n\n\tget keyStatus(): IModifierKeyStatus {\n\t\treturn this._keyStatus;\n\t}\n\n\tget isModifierPressed(): boolean {\n\t\treturn this._keyStatus.altKey || this._keyStatus.ctrlKey || this._keyStatus.metaKey || this._keyStatus.shiftKey;\n\t}\n\n\t/**\n\t * Allows to explicitly reset the key status based on more knowledge (#109062)\n\t */\n\tresetKeyStatus(): void {\n\t\tthis.doResetKeyStatus();\n\t\tthis.fire(this._keyStatus);\n\t}\n\n\tprivate doResetKeyStatus(): void {\n\t\tthis._keyStatus = {\n\t\t\taltKey: false,\n\t\t\tshiftKey: false,\n\t\t\tctrlKey: false,\n\t\t\tmetaKey: false\n\t\t};\n\t}\n\n\tstatic getInstance() {\n\t\tif (!ModifierKeyEmitter.instance) {\n\t\t\tModifierKeyEmitter.instance = new ModifierKeyEmitter();\n\t\t}\n\n\t\treturn ModifierKeyEmitter.instance;\n\t}\n\n\toverride dispose() {\n\t\tsuper.dispose();\n\t}\n}\n\nconst _manualClassList = new class implements IDomClassList {\n\tprivate _lastStart?: number\n\tprivate _lastEnd?: number\n\n\tprivate _findClassName(node: HTMLElement, className: string): void {\n\t\tconst classes = node.className\n\t\tif (!classes) {\n\t\t\tthis._lastStart = -1\n\t\t\treturn\n\t\t}\n\n\t\tclassName = className.trim()\n\n\t\tconst classesLen = classes.length\n\t\tconst classLen = className.length\n\n\t\tif (classLen === 0) {\n\t\t\tthis._lastStart = -1\n\t\t\treturn\n\t\t}\n\n\t\tif (classesLen < classLen) {\n\t\t\tthis._lastStart = -1\n\t\t\treturn\n\t\t}\n\n\t\tif (classes === className) {\n\t\t\tthis._lastStart = 0\n\t\t\tthis._lastEnd = classesLen\n\t\t\treturn\n\t\t}\n\n\t\tlet idx = -1\n\t\tlet idxEnd: number\n\n\t\twhile ((idx = classes.indexOf(className, idx + 1)) >= 0) {\n\t\t\tidxEnd = idx + classLen\n\n\t\t\t// a class that is followed by another class\n\t\t\tif ((idx === 0 || classes.charCodeAt(idx - 1) === CharCode.Space) && classes.charCodeAt(idxEnd) === CharCode.Space) {\n\t\t\t\tthis._lastStart = idx\n\t\t\t\tthis._lastEnd = idxEnd + 1\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\t// last class\n\t\t\tif (idx > 0 && classes.charCodeAt(idx - 1) === CharCode.Space && idxEnd === classesLen) {\n\t\t\t\tthis._lastStart = idx - 1\n\t\t\t\tthis._lastEnd = idxEnd\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\t// equal - duplicate of cmp above\n\t\t\tif (idx === 0 && idxEnd === classesLen) {\n\t\t\t\tthis._lastStart = 0\n\t\t\t\tthis._lastEnd = idxEnd\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\n\t\tthis._lastStart = -1\n\t}\n\n\thasClass(node: HTMLElement, className: string): boolean {\n\t\tthis._findClassName(node, className)\n\t\treturn this._lastStart !== -1\n\t}\n\n\taddClasses(node: HTMLElement, ...classNames: string[]): void {\n\t\tclassNames.forEach(nameValue => nameValue.split(' ').forEach(name => this.addClass(node, name)))\n\t}\n\n\taddClass(node: HTMLElement, className: string): void {\n\t\tif (!node.className) { // doesn't have it for sure\n\t\t\tnode.className = className\n\t\t} else {\n\t\t\tthis._findClassName(node, className) // see if it's already there\n\t\t\tif (this._lastStart === -1) {\n\t\t\t\tnode.className = node.className + ' ' + className\n\t\t\t}\n\t\t}\n\t}\n\n\tremoveClass(node: HTMLElement, className: string): void {\n\t\tthis._findClassName(node, className)\n\t\tif (this._lastStart === -1) {\n\t\t\t// Prevent styles invalidation if not necessary\n\t\t} else {\n\t\t\tnode.className = node.className.substring(0, this._lastStart) + node.className.substring(this._lastEnd || 0)\n\t\t}\n\t}\n\n\tremoveClasses(node: HTMLElement, ...classNames: string[]): void {\n\t\tclassNames.forEach(nameValue => nameValue.split(' ').forEach(name => this.removeClass(node, name)))\n\t}\n\n\ttoggleClass(node: HTMLElement, className: string, shouldHaveIt?: boolean): void {\n\t\tthis._findClassName(node, className)\n\t\tif (this._lastStart !== -1 && (shouldHaveIt === undefined || !shouldHaveIt)) {\n\t\t\tthis.removeClass(node, className)\n\t\t}\n\t\tif (this._lastStart === -1 && (shouldHaveIt === undefined || shouldHaveIt)) {\n\t\t\tthis.addClass(node, className)\n\t\t}\n\t}\n}()\n\nconst _nativeClassList = new class implements IDomClassList {\n\thasClass(node: HTMLElement, className: string): boolean {\n\t\treturn Boolean(className) && node.classList && node.classList.contains(className)\n\t}\n\n\taddClasses(node: HTMLElement, ...classNames: string[]): void {\n\t\tclassNames.forEach(nameValue => nameValue.split(' ').forEach(name => this.addClass(node, name)))\n\t}\n\n\taddClass(node: HTMLElement, className: string): void {\n\t\tif (className && node.classList) {\n\t\t\tnode.classList.add(className)\n\t\t}\n\t}\n\n\tremoveClass(node: HTMLElement, className: string): void {\n\t\tif (className && node.classList) {\n\t\t\tnode.classList.remove(className)\n\t\t}\n\t}\n\n\tremoveClasses(node: HTMLElement, ...classNames: string[]): void {\n\t\tclassNames.forEach(nameValue => nameValue.split(' ').forEach(name => this.removeClass(node, name)))\n\t}\n\n\ttoggleClass(node: HTMLElement, className: string, shouldHaveIt?: boolean): void {\n\t\tif (node.classList) {\n\t\t\tnode.classList.toggle(className, shouldHaveIt)\n\t\t}\n\t}\n}()\n\n// In IE11 there is only partial support for `classList` which makes us keep our\n// custom implementation. Otherwise use the native implementation, see: http://caniuse.com/#search=classlist\nconst _classList: IDomClassList = browser.isIE ? _manualClassList : _nativeClassList\nexport const hasClass: (node: HTMLElement, className: string) => boolean = _classList.hasClass.bind(_classList)\nexport const addClass: (node: HTMLElement, className: string) => void = _classList.addClass.bind(_classList)\nexport const addClasses: (node: HTMLElement, ...classNames: string[]) => void = _classList.addClasses.bind(_classList)\nexport const removeClass: (node: HTMLElement, className: string) => void = _classList.removeClass.bind(_classList)\nexport const removeClasses: (node: HTMLElement, ...classNames: string[]) => void = _classList.removeClasses.bind(_classList)\nexport const toggleClass: (node: HTMLElement, className: string, shouldHaveIt?: boolean) => void = _classList.toggleClass.bind(_classList)\n\nclass DomListener implements IDisposable {\n\n\tprivate _handler: (e: any) => void;\n\tprivate _node: EventTarget;\n\tprivate readonly _type: string;\n\tprivate readonly _options: boolean | AddEventListenerOptions;\n\n\tconstructor(node: EventTarget, type: string, handler: (e: any) => void, options?: boolean | AddEventListenerOptions) {\n\t\tthis._node = node;\n\t\tthis._type = type;\n\t\tthis._handler = handler;\n\t\tthis._options = (options || false);\n\t\tthis._node.addEventListener(this._type, this._handler, this._options);\n\t}\n\n\tpublic dispose(): void {\n\t\tif (!this._handler) {\n\t\t\t// Already disposed\n\t\t\treturn;\n\t\t}\n\n\t\tthis._node.removeEventListener(this._type, this._handler, this._options);\n\n\t\t// Prevent leakers from holding on to the dom or handler func\n\t\tthis._node = null!;\n\t\tthis._handler = null!;\n\t}\n}\n\nexport function addDisposableListener<K extends keyof GlobalEventHandlersEventMap>(node: EventTarget, type: K, handler: (event: GlobalEventHandlersEventMap[K]) => void, useCapture?: boolean): IDisposable;\nexport function addDisposableListener(node: EventTarget, type: string, handler: (event: any) => void, useCapture?: boolean): IDisposable;\nexport function addDisposableListener(node: EventTarget, type: string, handler: (event: any) => void, options: AddEventListenerOptions): IDisposable;\nexport function addDisposableListener(node: EventTarget, type: string, handler: (event: any) => void, useCaptureOrOptions?: boolean | AddEventListenerOptions): IDisposable {\n\treturn new DomListener(node, type, handler, useCaptureOrOptions);\n}\n\nexport interface IAddStandardDisposableListenerSignature {\n\t(node: HTMLElement, type: 'click', handler: (event: IMouseEvent) => void, useCapture?: boolean): IDisposable;\n\t(node: HTMLElement, type: 'mousedown', handler: (event: IMouseEvent) => void, useCapture?: boolean): IDisposable;\n\t(node: HTMLElement, type: 'keydown', handler: (event: IKeyboardEvent) => void, useCapture?: boolean): IDisposable;\n\t(node: HTMLElement, type: 'keypress', handler: (event: IKeyboardEvent) => void, useCapture?: boolean): IDisposable;\n\t(node: HTMLElement, type: 'keyup', handler: (event: IKeyboardEvent) => void, useCapture?: boolean): IDisposable;\n\t(node: HTMLElement, type: string, handler: (event: any) => void, useCapture?: boolean): IDisposable;\n}\nfunction _wrapAsStandardMouseEvent(handler: (e: IMouseEvent) => void): (e: MouseEvent) => void {\n\treturn function (e: MouseEvent) {\n\t\treturn handler(new StandardMouseEvent(e))\n\t}\n}\nfunction _wrapAsStandardKeyboardEvent(handler: (e: IKeyboardEvent) => void): (e: KeyboardEvent) => void {\n\treturn function (e: KeyboardEvent) {\n\t\treturn handler(new StandardKeyboardEvent(e))\n\t}\n}\nexport const addStandardDisposableListener: IAddStandardDisposableListenerSignature = function addStandardDisposableListener(node: HTMLElement, type: string, handler: (event: any) => void, useCapture?: boolean): IDisposable {\n\tlet wrapHandler = handler\n\n\tif (type === 'click' || type === 'mousedown') {\n\t\twrapHandler = _wrapAsStandardMouseEvent(handler)\n\t} else if (type === 'keydown' || type === 'keypress' || type === 'keyup') {\n\t\twrapHandler = _wrapAsStandardKeyboardEvent(handler)\n\t}\n\n\treturn addDisposableListener(node, type, wrapHandler, useCapture)\n}\n\nexport function addDisposableNonBubblingMouseOutListener(node: Element, handler: (event: MouseEvent) => void): IDisposable {\n\treturn addDisposableListener(node, 'mouseout', (e: MouseEvent) => {\n\t\t// Mouse out bubbles, so this is an attempt to ignore faux mouse outs coming from children elements\n\t\tlet toElement: Node | null = <Node>(e.relatedTarget || e.target)\n\t\twhile (toElement && toElement !== node) {\n\t\t\ttoElement = toElement.parentNode\n\t\t}\n\t\tif (toElement === node) {\n\t\t\treturn\n\t\t}\n\n\t\thandler(e)\n\t})\n}\n\ninterface IRequestAnimationFrame {\n\t(callback: (time: number) => void): number;\n}\nlet _animationFrame: IRequestAnimationFrame | null = null\nfunction doRequestAnimationFrame(callback: (time: number) => void): number {\n\tif (!_animationFrame) {\n\t\tconst emulatedRequestAnimationFrame = (callback: (time: number) => void): any => {\n\t\t\treturn setTimeout(() => callback(new Date().getTime()), 0)\n\t\t}\n\t\t_animationFrame = (\n\t\t\tself.requestAnimationFrame ||\n\t\t\t(<any>self).msRequestAnimationFrame ||\n\t\t\t(<any>self).webkitRequestAnimationFrame ||\n\t\t\t(<any>self).mozRequestAnimationFrame ||\n\t\t\t(<any>self).oRequestAnimationFrame ||\n\t\t\temulatedRequestAnimationFrame\n\t\t)\n\t}\n\treturn _animationFrame.call(self, callback)\n}\n\n/**\n * Schedule a callback to be run at the next animation frame.\n * This allows multiple parties to register callbacks that should run at the next animation frame.\n * If currently in an animation frame, `runner` will be executed immediately.\n * @return token that can be used to cancel the scheduled runner (only if `runner` was not executed immediately).\n */\nexport let runAtThisOrScheduleAtNextAnimationFrame: (runner: () => void, priority?: number) => IDisposable\n/**\n * Schedule a callback to be run at the next animation frame.\n * This allows multiple parties to register callbacks that should run at the next animation frame.\n * If currently in an animation frame, `runner` will be executed at the next animation frame.\n * @return token that can be used to cancel the scheduled runner.\n */\nexport let scheduleAtNextAnimationFrame: (runner: () => void, priority?: number) => IDisposable\n\nclass AnimationFrameQueueItem implements IDisposable {\n\tprivate _runner: () => void\n\tpublic priority: number\n\tprivate _canceled: boolean\n\n\tconstructor(runner: () => void, priority = 0) {\n\t\tthis._runner = runner\n\t\tthis.priority = priority\n\t\tthis._canceled = false\n\t}\n\n\tpublic dispose(): void {\n\t\tthis._canceled = true\n\t}\n\n\tpublic execute(): void {\n\t\tif (this._canceled) {\n\t\t\treturn\n\t\t}\n\n\t\ttry {\n\t\t\tthis._runner()\n\t\t} catch (e) {\n\t\t\tconsole.error(e)\n\t\t}\n\t}\n\n\t// Sort by priority (largest to lowest)\n\tpublic static sort(a: AnimationFrameQueueItem, b: AnimationFrameQueueItem): number {\n\t\treturn b.priority - a.priority\n\t}\n}\n\n(function () {\n\t/**\n\t * The runners scheduled at the next animation frame\n\t */\n\tlet NEXT_QUEUE: AnimationFrameQueueItem[] = []\n\t/**\n\t * The runners scheduled at the current animation frame\n\t */\n\tlet CURRENT_QUEUE: AnimationFrameQueueItem[] | null = null\n\t/**\n\t * A flag to keep track if the native requestAnimationFrame was already called\n\t */\n\tlet animFrameRequested = false\n\t/**\n\t * A flag to indicate if currently handling a native requestAnimationFrame callback\n\t */\n\tlet inAnimationFrameRunner = false\n\n\tconst animationFrameRunner = () => {\n\t\tanimFrameRequested = false\n\n\t\tCURRENT_QUEUE = NEXT_QUEUE\n\t\tNEXT_QUEUE = []\n\n\t\tinAnimationFrameRunner = true\n\t\twhile (CURRENT_QUEUE.length > 0) {\n\t\t\tCURRENT_QUEUE.sort(AnimationFrameQueueItem.sort)\n\t\t\tconst top = CURRENT_QUEUE.shift()!\n\t\t\ttop.execute()\n\t\t}\n\t\tinAnimationFrameRunner = false\n\t}\n\n\tscheduleAtNextAnimationFrame = (runner: () => void, priority = 0) => {\n\t\tconst item = new AnimationFrameQueueItem(runner, priority)\n\t\tNEXT_QUEUE.push(item)\n\n\t\tif (!animFrameRequested) {\n\t\t\tanimFrameRequested = true\n\t\t\tdoRequestAnimationFrame(animationFrameRunner)\n\t\t}\n\n\t\treturn item\n\t}\n\n\trunAtThisOrScheduleAtNextAnimationFrame = (runner: () => void, priority?: number) => {\n\t\tif (inAnimationFrameRunner) {\n\t\t\tconst item = new AnimationFrameQueueItem(runner, priority)\n\t\t\tCURRENT_QUEUE!.push(item)\n\t\t\treturn item\n\t\t} else {\n\t\t\treturn scheduleAtNextAnimationFrame(runner, priority)\n\t\t}\n\t}\n})()\n\nexport function measure(callback: () => void): IDisposable {\n\treturn scheduleAtNextAnimationFrame(callback, 10000 /* must be early */)\n}\n\nexport function modify(callback: () => void): IDisposable {\n\treturn scheduleAtNextAnimationFrame(callback, -10000 /* must be late */)\n}\n\n/**\n * Add a throttled listener. `handler` is fired at most every 16ms or with the next animation frame (if browser supports it).\n */\nexport interface IEventMerger<R, E> {\n\t(lastEvent: R | null, currentEvent: E): R;\n}\n\nexport interface DOMEvent {\n\tpreventDefault(): void;\n\tstopPropagation(): void;\n}\n\nconst MINIMUM_TIME_MS = 16\nconst DEFAULT_EVENT_MERGER: any = function (lastEvent: DOMEvent, currentEvent: DOMEvent) {\n\treturn currentEvent\n}\n\nclass TimeoutThrottledDomListener<R, E extends DOMEvent> extends Disposable {\n\tconstructor(node: any, type: string, handler: (event: R) => void, eventMerger: IEventMerger<R, E> = <any>DEFAULT_EVENT_MERGER, minimumTimeMs: number = MINIMUM_TIME_MS) {\n\t\tsuper()\n\n\t\tlet lastEvent: R | null = null\n\t\tlet lastHandlerTime = 0\n\t\tconst timeout = this._register(new TimeoutTimer())\n\n\t\tconst invokeHandler = () => {\n\t\t\tlastHandlerTime = (new Date()).getTime()\n\t\t\thandler(<R>lastEvent)\n\t\t\tlastEvent = null\n\t\t}\n\n\t\tthis._register(addDisposableListener(node, type, (e) => {\n\t\t\tlastEvent = eventMerger(lastEvent, e)\n\t\t\tconst elapsedTime = (new Date()).getTime() - lastHandlerTime\n\n\t\t\tif (elapsedTime >= minimumTimeMs) {\n\t\t\t\ttimeout.cancel()\n\t\t\t\tinvokeHandler()\n\t\t\t} else {\n\t\t\t\ttimeout.setIfNotSet(invokeHandler, minimumTimeMs - elapsedTime)\n\t\t\t}\n\t\t}))\n\t}\n}\n\nexport function addDisposableThrottledListener<R, E extends DOMEvent = DOMEvent>(node: any, type: string, handler: (event: R) => void, eventMerger?: IEventMerger<R, E>, minimumTimeMs?: number): IDisposable {\n\treturn new TimeoutThrottledDomListener<R, E>(node, type, handler, eventMerger, minimumTimeMs)\n}\n\nexport function getComputedStyle(el: HTMLElement): CSSStyleDeclaration {\n\treturn document.defaultView!.getComputedStyle(el, null)\n}\n\n// Adapted from WinJS\n// Converts a CSS positioning string for the specified element to pixels.\nconst convertToPixels: (element: HTMLElement, value: string) => number = (function () {\n\treturn function (element: HTMLElement, value: string): number {\n\t\treturn parseFloat(value) || 0\n\t}\n})()\n\nfunction getDimension(element: HTMLElement, cssPropertyName: string, jsPropertyName: string): number {\n\tconst computedStyle: CSSStyleDeclaration = getComputedStyle(element)\n\tlet value = '0'\n\tif (computedStyle) {\n\t\tif (computedStyle.getPropertyValue) {\n\t\t\tvalue = computedStyle.getPropertyValue(cssPropertyName)\n\t\t} else {\n\t\t\t// IE8\n\t\t\tvalue = (<any>computedStyle).getAttribute(jsPropertyName)\n\t\t}\n\t}\n\treturn convertToPixels(element, value)\n}\n\nexport function getClientArea(element: HTMLElement): Dimension {\n\t// Try with DOM clientWidth / clientHeight\n\tif (element !== document.body) {\n\t\treturn new Dimension(element.clientWidth, element.clientHeight)\n\t}\n\n\t// Try innerWidth / innerHeight\n\tif (window.innerWidth && window.innerHeight) {\n\t\treturn new Dimension(window.innerWidth, window.innerHeight)\n\t}\n\n\t// Try with document.body.clientWidth / document.body.clientHeight\n\tif (document.body && document.body.clientWidth && document.body.clientHeight) {\n\t\treturn new Dimension(document.body.clientWidth, document.body.clientHeight)\n\t}\n\n\t// Try with document.documentElement.clientWidth / document.documentElement.clientHeight\n\tif (document.documentElement && document.documentElement.clientWidth && document.documentElement.clientHeight) {\n\t\treturn new Dimension(document.documentElement.clientWidth, document.documentElement.clientHeight)\n\t}\n\n\tthrow new Error('Unable to figure out browser width and height')\n}\n\n/**\n * Returns the effective zoom on a given element before window zoom level is applied\n */\nexport function getDomNodeZoomLevel(domNode: HTMLElement): number {\n\tlet testElement: HTMLElement | null = domNode;\n\tlet zoom = 1.0;\n\tdo {\n\t\tconst elementZoomLevel = (getComputedStyle(testElement) as any).zoom;\n\t\tif (elementZoomLevel !== null && elementZoomLevel !== undefined && elementZoomLevel !== '1') {\n\t\t\tzoom *= elementZoomLevel;\n\t\t}\n\n\t\ttestElement = testElement.parentElement;\n\t} while (testElement !== null && testElement !== document.documentElement);\n\n\treturn zoom;\n}\n\nconst sizeUtils = {\n\n\tgetBorderLeftWidth: function (element: HTMLElement): number {\n\t\treturn getDimension(element, 'border-left-width', 'borderLeftWidth')\n\t},\n\tgetBorderRightWidth: function (element: HTMLElement): number {\n\t\treturn getDimension(element, 'border-right-width', 'borderRightWidth')\n\t},\n\tgetBorderTopWidth: function (element: HTMLElement): number {\n\t\treturn getDimension(element, 'border-top-width', 'borderTopWidth')\n\t},\n\tgetBorderBottomWidth: function (element: HTMLElement): number {\n\t\treturn getDimension(element, 'border-bottom-width', 'borderBottomWidth')\n\t},\n\n\tgetPaddingLeft: function (element: HTMLElement): number {\n\t\treturn getDimension(element, 'padding-left', 'paddingLeft')\n\t},\n\tgetPaddingRight: function (element: HTMLElement): number {\n\t\treturn getDimension(element, 'padding-right', 'paddingRight')\n\t},\n\tgetPaddingTop: function (element: HTMLElement): number {\n\t\treturn getDimension(element, 'padding-top', 'paddingTop')\n\t},\n\tgetPaddingBottom: function (element: HTMLElement): number {\n\t\treturn getDimension(element, 'padding-bottom', 'paddingBottom')\n\t},\n\n\tgetMarginLeft: function (element: HTMLElement): number {\n\t\treturn getDimension(element, 'margin-left', 'marginLeft')\n\t},\n\tgetMarginTop: function (element: HTMLElement): number {\n\t\treturn getDimension(element, 'margin-top', 'marginTop')\n\t},\n\tgetMarginRight: function (element: HTMLElement): number {\n\t\treturn getDimension(element, 'margin-right', 'marginRight')\n\t},\n\tgetMarginBottom: function (element: HTMLElement): number {\n\t\treturn getDimension(element, 'margin-bottom', 'marginBottom')\n\t},\n\t__commaSentinel: false\n}\n\n// ----------------------------------------------------------------------------------------\n// Position & Dimension\n\nexport class Dimension {\n\tpublic width: number\n\tpublic height: number\n\n\tconstructor(width: number, height: number) {\n\t\tthis.width = width\n\t\tthis.height = height\n\t}\n\n\tstatic equals(a: Dimension | undefined, b: Dimension | undefined): boolean {\n\t\tif (a === b) {\n\t\t\treturn true\n\t\t}\n\t\tif (!a || !b) {\n\t\t\treturn false\n\t\t}\n\t\treturn a.width === b.width && a.height === b.height\n\t}\n}\n\nexport function getTopLeftOffset(element: HTMLElement): { left: number; top: number; } {\n\t// Adapted from WinJS.Utilities.getPosition\n\t// and added borders to the mix\n\n\tlet offsetParent = element.offsetParent; let top = element.offsetTop; let left = element.offsetLeft\n\n\twhile ((element = <HTMLElement>element.parentNode) !== null && element !== document.body && element !== document.documentElement) {\n\t\ttop -= element.scrollTop\n\t\tconst c = getComputedStyle(element)\n\t\tif (c) {\n\t\t\tleft -= c.direction !== 'rtl' ? element.scrollLeft : -element.scrollLeft\n\t\t}\n\n\t\tif (element === offsetParent) {\n\t\t\tleft += sizeUtils.getBorderLeftWidth(element)\n\t\t\ttop += sizeUtils.getBorderTopWidth(element)\n\t\t\ttop += element.offsetTop\n\t\t\tleft += element.offsetLeft\n\t\t\toffsetParent = element.offsetParent\n\t\t}\n\t}\n\n\treturn {\n\t\tleft,\n\t\ttop\n\t}\n}\n\nexport interface IDomNodePagePosition {\n\tleft: number;\n\ttop: number;\n\twidth: number;\n\theight: number;\n}\n\nexport function size(element: HTMLElement, width: number, height: number): void {\n\tif (typeof width === 'number') {\n\t\telement.style.width = `${width}px`\n\t}\n\n\tif (typeof height === 'number') {\n\t\telement.style.height = `${height}px`\n\t}\n}\n\nexport function position(element: HTMLElement, top: number, right?: number, bottom?: number, left?: number, position = 'absolute'): void {\n\tif (typeof top === 'number') {\n\t\telement.style.top = `${top}px`\n\t}\n\n\tif (typeof right === 'number') {\n\t\telement.style.right = `${right}px`\n\t}\n\n\tif (typeof bottom === 'number') {\n\t\telement.style.bottom = `${bottom}px`\n\t}\n\n\tif (typeof left === 'number') {\n\t\telement.style.left = `${left}px`\n\t}\n\n\telement.style.position = position\n}\n\n/**\n * Returns the position of a dom node relative to the entire page.\n */\nexport function getDomNodePagePosition(domNode: HTMLElement): IDomNodePagePosition {\n\tconst bb = domNode.getBoundingClientRect()\n\treturn {\n\t\tleft: bb.left + StandardWindow.scrollX,\n\t\ttop: bb.top + StandardWindow.scrollY,\n\t\twidth: bb.width,\n\t\theight: bb.height\n\t}\n}\n\nexport interface IStandardWindow {\n\treadonly scrollX: number;\n\treadonly scrollY: number;\n}\n\nexport const StandardWindow: IStandardWindow = new class implements IStandardWindow {\n\tget scrollX(): number {\n\t\tif (typeof window.scrollX === 'number') {\n\t\t\t// modern browsers\n\t\t\treturn window.scrollX\n\t\t} else {\n\t\t\treturn document.body.scrollLeft + document.documentElement!.scrollLeft\n\t\t}\n\t}\n\n\tget scrollY(): number {\n\t\tif (typeof window.scrollY === 'number') {\n\t\t\t// modern browsers\n\t\t\treturn window.scrollY\n\t\t} else {\n\t\t\treturn document.body.scrollTop + document.documentElement!.scrollTop\n\t\t}\n\t}\n}()\n\n// Adapted from WinJS\n// Gets the width of the element, including margins.\nexport function getTotalWidth(element: HTMLElement): number {\n\tconst margin = sizeUtils.getMarginLeft(element) + sizeUtils.getMarginRight(element)\n\treturn element.offsetWidth + margin\n}\n\nexport function getContentWidth(element: HTMLElement): number {\n\tconst border = sizeUtils.getBorderLeftWidth(element) + sizeUtils.getBorderRightWidth(element)\n\tconst padding = sizeUtils.getPaddingLeft(element) + sizeUtils.getPaddingRight(element)\n\treturn element.offsetWidth - border - padding\n}\n\nexport function getTotalScrollWidth(element: HTMLElement): number {\n\tconst margin = sizeUtils.getMarginLeft(element) + sizeUtils.getMarginRight(element)\n\treturn element.scrollWidth + margin\n}\n\n// Adapted from WinJS\n// Gets the height of the content of the specified element. The content height does not include borders or padding.\nexport function getContentHeight(element: HTMLElement): number {\n\tconst border = sizeUtils.getBorderTopWidth(element) + sizeUtils.getBorderBottomWidth(element)\n\tconst padding = sizeUtils.getPaddingTop(element) + sizeUtils.getPaddingBottom(element)\n\treturn element.offsetHeight - border - padding\n}\n\n// Adapted from WinJS\n// Gets the height of the element, including its margins.\nexport function getTotalHeight(element: HTMLElement): number {\n\tconst margin = sizeUtils.getMarginTop(element) + sizeUtils.getMarginBottom(element)\n\treturn element.offsetHeight + margin\n}\n\n// Gets the left coordinate of the specified element relative to the specified parent.\nfunction getRelativeLeft(element: HTMLElement, parent: HTMLElement): number {\n\tif (element === null) {\n\t\treturn 0\n\t}\n\n\tconst elementPosition = getTopLeftOffset(element)\n\tconst parentPosition = getTopLeftOffset(parent)\n\treturn elementPosition.left - parentPosition.left\n}\n\nexport function getLargestChildWidth(parent: HTMLElement, children: HTMLElement[]): number {\n\tconst childWidths = children.map((child) => {\n\t\treturn Math.max(getTotalScrollWidth(child), getTotalWidth(child)) + getRelativeLeft(child, parent) || 0\n\t})\n\tconst maxWidth = Math.max(...childWidths)\n\treturn maxWidth\n}\n\n// ----------------------------------------------------------------------------------------\n\nexport function isAncestor(testChild: Node | null, testAncestor: Node | null): boolean {\n\twhile (testChild) {\n\t\tif (testChild === testAncestor) {\n\t\t\treturn true\n\t\t}\n\t\ttestChild = testChild.parentNode\n\t}\n\n\treturn false\n}\n\nexport function findParentWithClass(node: HTMLElement, clazz: string, stopAtClazzOrNode?: string | HTMLElement): HTMLElement | null {\n\twhile (node) {\n\t\tif (hasClass(node, clazz)) {\n\t\t\treturn node\n\t\t}\n\n\t\tif (stopAtClazzOrNode) {\n\t\t\tif (typeof stopAtClazzOrNode === 'string') {\n\t\t\t\tif (hasClass(node, stopAtClazzOrNode)) {\n\t\t\t\t\treturn null\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (node === stopAtClazzOrNode) {\n\t\t\t\t\treturn null\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tnode = <HTMLElement>node.parentNode\n\t}\n\n\treturn null\n}\n\nexport function createStyleSheet(container: HTMLElement = document.getElementsByTagName('head')[0]): HTMLStyleElement {\n\tconst style = document.createElement('style')\n\tstyle.type = 'text/css'\n\tstyle.media = 'screen'\n\tcontainer.appendChild(style)\n\treturn style\n}\n\nlet _sharedStyleSheet: HTMLStyleElement | null = null\nfunction getSharedStyleSheet(): HTMLStyleElement {\n\tif (!_sharedStyleSheet) {\n\t\t_sharedStyleSheet = createStyleSheet()\n\t}\n\treturn _sharedStyleSheet\n}\n\nfunction getDynamicStyleSheetRules(style: any) {\n\tif (style && style.sheet && style.sheet.rules) {\n\t\t// Chrome, IE\n\t\treturn style.sheet.rules\n\t}\n\tif (style && style.sheet && style.sheet.cssRules) {\n\t\t// FF\n\t\treturn style.sheet.cssRules\n\t}\n\treturn []\n}\n\nexport function createCSSRule(selector: string, cssText: string, style: HTMLStyleElement = getSharedStyleSheet()): void {\n\tif (!style || !cssText) {\n\t\treturn\n\t}\n\n\t(<CSSStyleSheet>style.sheet).insertRule(selector + '{' + cssText + '}', 0)\n}\n\nexport function removeCSSRulesContainingSelector(ruleName: string, style: HTMLStyleElement = getSharedStyleSheet()): void {\n\tif (!style) {\n\t\treturn\n\t}\n\n\tconst rules = getDynamicStyleSheetRules(style)\n\tconst toDelete: number[] = []\n\tfor (let i = 0; i < rules.length; i++) {\n\t\tconst rule = rules[i]\n\t\tif (rule.selectorText.indexOf(ruleName) !== -1) {\n\t\t\ttoDelete.push(i)\n\t\t}\n\t}\n\n\tfor (let i = toDelete.length - 1; i >= 0; i--) {\n\t\t(<any>style.sheet).deleteRule(toDelete[i])\n\t}\n}\n\nexport function isHTMLElement(o: any): o is HTMLElement {\n\tif (typeof HTMLElement === 'object') {\n\t\treturn o instanceof HTMLElement\n\t}\n\treturn o && typeof o === 'object' && o.nodeType === 1 && typeof o.nodeName === 'string'\n}\nexport const EventType = {\n\t// Mouse\n\tCLICK: 'click',\n\tAUXCLICK: 'auxclick',\n\tDBLCLICK: 'dblclick',\n\tMOUSE_UP: 'mouseup',\n\tMOUSE_DOWN: 'mousedown',\n\tMOUSE_OVER: 'mouseover',\n\tMOUSE_MOVE: 'mousemove',\n\tMOUSE_OUT: 'mouseout',\n\tMOUSE_ENTER: 'mouseenter',\n\tMOUSE_LEAVE: 'mouseleave',\n\tMOUSE_WHEEL: 'wheel',\n\tPOINTER_UP: 'pointerup',\n\tPOINTER_DOWN: 'pointerdown',\n\tPOINTER_MOVE: 'pointermove',\n\tPOINTER_LEAVE: 'pointerleave',\n\tCONTEXT_MENU: 'contextmenu',\n\tWHEEL: 'wheel',\n\t// Keyboard\n\tKEY_DOWN: 'keydown',\n\tKEY_PRESS: 'keypress',\n\tKEY_UP: 'keyup',\n\t// HTML Document\n\tLOAD: 'load',\n\tBEFORE_UNLOAD: 'beforeunload',\n\tUNLOAD: 'unload',\n\tPAGE_SHOW: 'pageshow',\n\tPAGE_HIDE: 'pagehide',\n\tABORT: 'abort',\n\tERROR: 'error',\n\tRESIZE: 'resize',\n\tSCROLL: 'scroll',\n\tFULLSCREEN_CHANGE: 'fullscreenchange',\n\tWK_FULLSCREEN_CHANGE: 'webkitfullscreenchange',\n\t// Form\n\tSELECT: 'select',\n\tCHANGE: 'change',\n\tSUBMIT: 'submit',\n\tRESET: 'reset',\n\tFOCUS: 'focus',\n\tFOCUS_IN: 'focusin',\n\tFOCUS_OUT: 'focusout',\n\tBLUR: 'blur',\n\tINPUT: 'input',\n\t// Local Storage\n\tSTORAGE: 'storage',\n\t// Drag\n\tDRAG_START: 'dragstart',\n\tDRAG: 'drag',\n\tDRAG_ENTER: 'dragenter',\n\tDRAG_LEAVE: 'dragleave',\n\tDRAG_OVER: 'dragover',\n\tDROP: 'drop',\n\tDRAG_END: 'dragend',\n\t// Animation\n\tANIMATION_START: browser.isWebKit ? 'webkitAnimationStart' : 'animationstart',\n\tANIMATION_END: browser.isWebKit ? 'webkitAnimationEnd' : 'animationend',\n\tANIMATION_ITERATION: browser.isWebKit ? 'webkitAnimationIteration' : 'animationiteration'\n} as const;\n\nexport interface EventLike {\n\tpreventDefault(): void;\n\tstopPropagation(): void;\n}\n\nexport const EventHelper = {\n\tstop: function (e: EventLike, cancelBubble?: boolean) {\n\t\tif (e.preventDefault) {\n\t\t\te.preventDefault()\n\t\t} else {\n\t\t\t// IE8\n\t\t\t(<any>e).returnValue = false\n\t\t}\n\n\t\tif (cancelBubble) {\n\t\t\tif (e.stopPropagation) {\n\t\t\t\te.stopPropagation()\n\t\t\t} else {\n\t\t\t\t// IE8\n\t\t\t\t(<any>e).cancelBubble = true\n\t\t\t}\n\t\t}\n\t}\n}\n\nexport interface IFocusTracker {\n\tonDidFocus: Event<void>;\n\tonDidBlur: Event<void>;\n\tdispose(): void;\n}\n\nexport function saveParentsScrollTop(node: Element): number[] {\n\tconst r: number[] = []\n\tfor (let i = 0; node && node.nodeType === node.ELEMENT_NODE; i++) {\n\t\tr[i] = node.scrollTop\n\t\tnode = <Element>node.parentNode\n\t}\n\treturn r\n}\n\nexport function restoreParentsScrollTop(node: Element, state: number[]): void {\n\tfor (let i = 0; node && node.nodeType === node.ELEMENT_NODE; i++) {\n\t\tif (node.scrollTop !== state[i]) {\n\t\t\tnode.scrollTop = state[i]\n\t\t}\n\t\tnode = <Element>node.parentNode\n\t}\n}\n\nclass FocusTracker implements IFocusTracker {\n\tprivate _onDidFocus = new Emitter<void>()\n\treadonly onDidFocus: Event<void> = this._onDidFocus.event\n\n\tprivate _onDidBlur = new Emitter<void>()\n\treadonly onDidBlur: Event<void> = this._onDidBlur.event\n\n\tprivate disposables: IDisposable[] = []\n\n\tconstructor(element: HTMLElement | Window) {\n\t\tlet hasFocus = isAncestor(document.activeElement, <HTMLElement>element)\n\t\tlet loosingFocus = false\n\n\t\tconst onFocus = () => {\n\t\t\tloosingFocus = false\n\t\t\tif (!hasFocus) {\n\t\t\t\thasFocus = true\n\t\t\t\tthis._onDidFocus.fire()\n\t\t\t}\n\t\t}\n\n\t\tconst onBlur = () => {\n\t\t\tif (hasFocus) {\n\t\t\t\tloosingFocus = true\n\t\t\t\twindow.setTimeout(() => {\n\t\t\t\t\tif (loosingFocus) {\n\t\t\t\t\t\tloosingFocus = false\n\t\t\t\t\t\thasFocus = false\n\t\t\t\t\t\tthis._onDidBlur.fire()\n\t\t\t\t\t}\n\t\t\t\t}, 0)\n\t\t\t}\n\t\t}\n\n\t\tdomEvent(element, EventType.FOCUS, true)(onFocus, null, this.disposables)\n\t\tdomEvent(element, EventType.BLUR, true)(onBlur, null, this.disposables)\n\t}\n\n\tdispose(): void {\n\t\tthis.disposables = dispose(this.disposables)\n\t\tthis._onDidFocus.dispose()\n\t\tthis._onDidBlur.dispose()\n\t}\n}\n\nexport function trackFocus(element: HTMLElement | Window): IFocusTracker {\n\treturn new FocusTracker(element)\n}\n\nexport function append<T extends Node>(parent: HTMLElement, ...children: T[]): T {\n\tchildren.forEach(child => parent.appendChild(child))\n\treturn children[children.length - 1]\n}\n\nexport function prepend<T extends Node>(parent: HTMLElement, child: T): T {\n\tparent.insertBefore(child, parent.firstChild)\n\treturn child\n}\n\nconst SELECTOR_REGEX = /([\\w\\\\-]+)?(#([\\w\\\\-]+))?((.([\\w\\\\-]+))*)/\n\nexport function $<T extends HTMLElement>(description: string, attrs?: { [key: string]: any; }, ...children: Array<Node | string>): T {\n\tconst match = SELECTOR_REGEX.exec(description)\n\n\tif (!match) {\n\t\tthrow new Error('Bad use of emmet')\n\t}\n\n\tconst result = document.createElement(match[1] || 'div')\n\n\tif (match[3]) {\n\t\tresult.id = match[3]\n\t}\n\tif (match[4]) {\n\t\tresult.className = match[4].replace(/\\./g, ' ').trim()\n\t}\n\n\tattrs = attrs || {}\n\tObject.keys(attrs).forEach(name => {\n\t\tconst value = attrs![name]\n\t\tif (/^on\\w+$/.test(name)) {\n\t\t\t(<any>result)[name] = value\n\t\t} else if (name === 'selected') {\n\t\t\tif (value) {\n\t\t\t\tresult.setAttribute(name, 'true')\n\t\t\t}\n\t\t} else {\n\t\t\tresult.setAttribute(name, value)\n\t\t}\n\t})\n\n\tcoalesce(children)\n\t\t.forEach(child => {\n\t\t\tif (child instanceof Node) {\n\t\t\t\tresult.appendChild(child)\n\t\t\t} else {\n\t\t\t\tresult.appendChild(document.createTextNode(child as string))\n\t\t\t}\n\t\t})\n\n\treturn result as T\n}\n\nexport function join(nodes: Node[], separator: Node | string): Node[] {\n\tconst result: Node[] = []\n\n\tnodes.forEach((node, index) => {\n\t\tif (index > 0) {\n\t\t\tif (separator instanceof Node) {\n\t\t\t\tresult.push(separator.cloneNode())\n\t\t\t} else {\n\t\t\t\tresult.push(document.createTextNode(separator))\n\t\t\t}\n\t\t}\n\n\t\tresult.push(node)\n\t})\n\n\treturn result\n}\n\nexport function show(...elements: HTMLElement[]): void {\n\tfor (const element of elements) {\n\t\tif (element) {\n\t\t\telement.style.display = ''\n\t\t\telement.removeAttribute('aria-hidden')\n\t\t}\n\t}\n}\n\nexport function hide(...elements: HTMLElement[]): void {\n\tfor (const element of elements) {\n\t\tif (element) {\n\t\t\telement.style.display = 'none'\n\t\t\telement.setAttribute('aria-hidden', 'true')\n\t\t}\n\t}\n}\n\nfunction findParentWithAttribute(node: Node | null, attribute: string): HTMLElement | null {\n\twhile (node) {\n\t\tif (node instanceof HTMLElement && node.hasAttribute(attribute)) {\n\t\t\treturn node\n\t\t}\n\n\t\tnode = node.parentNode\n\t}\n\n\treturn null\n}\n\nexport function removeTabIndexAndUpdateFocus(node: HTMLElement): void {\n\tif (!node || !node.hasAttribute('tabIndex')) {\n\t\treturn\n\t}\n\n\t// If we are the currently focused element and tabIndex is removed,\n\t// standard DOM behavior is to move focus to the <body> element. We\n\t// typically never want that, rather put focus to the closest element\n\t// in the hierarchy of the parent DOM nodes.\n\tif (document.activeElement === node) {\n\t\tconst parentFocusable = findParentWithAttribute(node.parentElement, 'tabIndex')\n\t\tif (parentFocusable) {\n\t\t\tparentFocusable.focus()\n\t\t}\n\t}\n\n\tnode.removeAttribute('tabindex')\n}\n\nexport function getElementsByTagName(tag: string): HTMLElement[] {\n\treturn Array.prototype.slice.call(document.getElementsByTagName(tag), 0)\n}\n\nexport function finalHandler<T extends DOMEvent>(fn: (event: T) => any): (event: T) => any {\n\treturn e => {\n\t\te.preventDefault()\n\t\te.stopPropagation()\n\t\tfn(e)\n\t}\n}\n\nexport function domContentLoaded(): Promise<any> {\n\treturn new Promise<any>(resolve => {\n\t\tconst readyState = document.readyState\n\t\tif (readyState === 'complete' || (document && document.body !== null)) {\n\t\t\tplatform.setImmediate(resolve)\n\t\t} else {\n\t\t\twindow.addEventListener('DOMContentLoaded', resolve, false)\n\t\t}\n\t})\n}\n\n/**\n * Find a value usable for a dom node size such that the likelihood that it would be\n * displayed with constant screen pixels size is as high as possible.\n *\n * e.g. We would desire for the cursors to be 2px (CSS px) wide. Under a devicePixelRatio\n * of 1.25, the cursor will be 2.5 screen pixels wide. Depending on how the dom node aligns/\"snaps\"\n * with the screen pixels, it will sometimes be rendered with 2 screen pixels, and sometimes with 3 screen pixels.\n */\nexport function computeScreenAwareSize(cssPx: number): number {\n\tconst screenPx = window.devicePixelRatio * cssPx\n\treturn Math.max(1, Math.floor(screenPx)) / window.devicePixelRatio\n}\n\n/**\n * See https://github.com/Microsoft/monaco-editor/issues/601\n * To protect against malicious code in the linked site, particularly phishing attempts,\n * the window.opener should be set to null to prevent the linked site from having access\n * to change the location of the current page.\n * See https://mathiasbynens.github.io/rel-noopener/\n */\nexport function windowOpenNoOpener(url: string): void {\n\tif (platform.isNative || browser.isEdgeWebView) {\n\t\t// In VSCode, window.open() always returns null...\n\t\t// The same is true for a WebView (see https://github.com/Microsoft/monaco-editor/issues/628)\n\t\twindow.open(url)\n\t} else {\n\t\tconst newTab = window.open()\n\t\tif (newTab) {\n\t\t\t(newTab as any).opener = null\n\t\t\tnewTab.location.href = url\n\t\t}\n\t}\n}\n\nexport function animate(fn: () => void): IDisposable {\n\tconst step = () => {\n\t\tfn()\n\t\tstepDisposable = scheduleAtNextAnimationFrame(step)\n\t}\n\n\tlet stepDisposable = scheduleAtNextAnimationFrame(step)\n\treturn toDisposable(() => stepDisposable.dispose())\n}","/* ---------------------------------------------------------------------------------------------\n *  Copyright (c) AlexTorresDev. All rights reserved.\n *  Licensed under the MIT License. See License.txt in the project root for license information.\n *-------------------------------------------------------------------------------------------- */\n\nimport { Menu, MenuItem, ipcRenderer } from 'electron'\nimport * as DOM from 'base/common/dom'\nimport { Emitter, Event } from 'base/common/event'\nimport { Disposable, IDisposable, dispose } from 'base/common/lifecycle'\nimport { isMacintosh } from 'base/common/platform'\nimport { MenuBarOptions } from './menubar-options'\nimport { StandardKeyboardEvent } from 'base/browser/keyboardEvent'\nimport { KeyCode, KeyMod, ScanCode, ScanCodeUtils } from 'base/common/keyCodes'\nimport {\n  MENU_ESCAPED_MNEMONIC_REGEX,\n  MENU_MNEMONIC_REGEX,\n  cleanMnemonic\n} from 'consts'\nimport { CETMenu, Direction, IMenuOptions } from './menu'\nimport { IMenuStyle } from './menu/item'\nimport { RunOnceScheduler } from 'base/common/async'\nimport { StandardMouseEvent } from 'base/browser/mouseEvent'\nimport { EventType, Gesture, GestureEvent } from 'base/browser/touch'\nimport * as strings from 'base/common/strings'\nimport { IpcChannels } from 'types/ipc-contract'\n\nconst $ = DOM.$\n\nexport interface IMenuIcons {\n  readonly submenuIndicator: string\n  readonly checkbox: string\n  readonly radioChecked: string\n  readonly radioUnchecked: string\n}\n\nexport interface IMenuBarOptions {\n  enableMnemonics?: boolean\n  disableAltFocus?: boolean\n  visibility?: string\n  // getKeybinding?: (action: IAction) => ResolvedKeybinding | undefined\n  alwaysOnMnemonics?: boolean\n  compactMode?: Direction\n  // actionRunner?: IActionRunner\n  // getCompactMenuActions?: () => IAction[]\n}\n\ninterface MenuBarMenuWithElements extends MenuItem {\n  titleElement?: HTMLElement\n  buttonElement?: HTMLElement\n}\n\nenum MenubarState {\n  HIDDEN,\n  VISIBLE,\n  FOCUSED,\n  OPEN\n}\nexport class MenuBar extends Disposable {\n  static readonly OVERFLOW_INDEX: number = -1\n\n  private menus: MenuBarMenuWithElements[]\n\n  private overflowMenu!: MenuBarMenuWithElements & {\n    titleElement: HTMLElement\n    buttonElement: HTMLElement\n  }\n\n  private focusedMenu:\n    | {\n        index: number\n        holder?: HTMLElement\n        widget?: CETMenu\n      }\n    | undefined\n\n  private focusToReturn: HTMLElement | undefined\n  private menuUpdater: RunOnceScheduler\n\n  // Input-related\n  private _mnemonicsInUse: boolean = false\n  private openedViaKeyboard: boolean = false\n  private awaitingAltRelease: boolean = false\n  private ignoreNextMouseUp: boolean = false\n  private mnemonics: Map<string, number>\n\n  private updatePending: boolean = false\n  private _focusState: MenubarState\n  // private actionRunner: IActionRunner\n\n  private readonly _onVisibilityChange: Emitter<boolean>\n  private readonly _onFocusStateChange: Emitter<boolean>\n\n  private numMenusShown: number = 0\n  private overflowLayoutScheduled: IDisposable | undefined = undefined\n  private overflowLayoutPasses: number = 0\n\n  private menuStyle: IMenuStyle = {}\n\n  constructor(\n    private container: HTMLElement,\n    private menuIcons: IMenuIcons,\n    private currentOptions: MenuBarOptions,\n    private options: IMenuBarOptions,\n    private closeMenu = () => {}\n  ) {\n    super()\n\n    this.container.setAttribute('role', 'menubar')\n    if (this.isCompact) {\n      this.container.classList.add('compact')\n    }\n\n    this.menus = []\n    this.mnemonics = new Map<string, number>()\n\n    this._focusState = MenubarState.VISIBLE\n\n    this._onVisibilityChange = this._register(new Emitter<boolean>())\n    this._onFocusStateChange = this._register(new Emitter<boolean>())\n\n    this.createOverflowMenu()\n\n    this.menuUpdater = this._register(\n      new RunOnceScheduler(() => this.update(), 200)\n    )\n\n    this.registerListeners()\n    this.setUnfocusedState()\n  }\n\n  private registerListeners(): void {\n    if (!isMacintosh) {\n      this._register(\n        DOM.addDisposableListener(window, DOM.EventType.RESIZE, () => {\n          this.updateOverflowAction()\n          this.blur()\n        })\n      )\n    }\n\n    this._register(\n      DOM.ModifierKeyEmitter.getInstance().event(\n        this.onModifierKeyToggled,\n        this\n      )\n    )\n\n    this._register(\n      DOM.addDisposableListener(this.container, DOM.EventType.KEY_DOWN, (e) => {\n        const event = new StandardKeyboardEvent(e as KeyboardEvent)\n        let eventHandled = true\n        const key = !!e.key ? e.key.toLocaleLowerCase() : ''\n\n        const tabNav = isMacintosh && !this.isCompact\n\n        if (\n          event.equals(KeyCode.LeftArrow) ||\n          (tabNav && event.equals(KeyCode.Tab | KeyMod.Shift))\n        ) {\n          this.focusPrevious()\n        } else if (\n          event.equals(KeyCode.RightArrow) ||\n          (tabNav && event.equals(KeyCode.Tab))\n        ) {\n          this.focusNext()\n        } else if (\n          event.equals(KeyCode.Escape) &&\n          this.isFocused &&\n          !this.isOpen\n        ) {\n          this.setUnfocusedState()\n        } else if (\n          !this.isOpen &&\n          !event.ctrlKey &&\n          this.options.enableMnemonics &&\n          this.mnemonicsInUse &&\n          this.mnemonics.has(key)\n        ) {\n          const menuIndex = this.mnemonics.get(key)!\n          this.onMenuTriggered(menuIndex, false)\n        } else {\n          eventHandled = false\n        }\n\n        // Never allow default tab behavior when not compact\n        if (\n          !this.isCompact &&\n          (event.equals(KeyCode.Tab | KeyMod.Shift) ||\n            event.equals(KeyCode.Tab))\n        ) {\n          event.preventDefault()\n        }\n\n        if (eventHandled) {\n          event.preventDefault()\n          event.stopPropagation()\n        }\n      })\n    )\n\n    this._register(\n      DOM.addDisposableListener(window, DOM.EventType.MOUSE_DOWN, () => {\n        // This mouse event is outside the menubar so it counts as a focus out\n        if (this.isFocused) {\n          this.setUnfocusedState()\n        }\n      })\n    )\n\n    this._register(\n      DOM.addDisposableListener(this.container, DOM.EventType.FOCUS_IN, (e) => {\n        const event = e as FocusEvent\n\n        if (event.relatedTarget) {\n          if (!this.container.contains(event.relatedTarget as HTMLElement)) {\n            this.focusToReturn = event.relatedTarget as HTMLElement\n          }\n        }\n      })\n    )\n\n    this._register(\n      DOM.addDisposableListener(\n        this.container,\n        DOM.EventType.FOCUS_OUT,\n        (e) => {\n          const event = e as FocusEvent\n\n          // We are losing focus and there is a target, reset focusToReturn value as not to redirect\n          if (\n            event.relatedTarget &&\n            !this.container.contains(event.relatedTarget as HTMLElement)\n          ) {\n            this.focusToReturn = undefined\n            this.setUnfocusedState()\n          }\n        }\n      )\n    )\n\n    this._register(\n      DOM.addDisposableListener(\n        window,\n        DOM.EventType.KEY_DOWN,\n        (e: KeyboardEvent) => {\n          if (\n            !this.options.enableMnemonics ||\n            !e.altKey ||\n            e.ctrlKey ||\n            e.defaultPrevented\n          ) {\n            return\n          }\n\n          const key = e.key.toLocaleLowerCase()\n          if (!this.mnemonics.has(key)) {\n            return\n          }\n\n          this.mnemonicsInUse = true\n          this.updateMnemonicVisibility(true)\n\n          const menuIndex = this.mnemonics.get(key)!\n          this.onMenuTriggered(menuIndex, false)\n        }\n      )\n    )\n  }\n\n  push(menu: Menu): void {\n    const topLevelMenus = menu.items\n\n    topLevelMenus.forEach((menuBarMenu) => {\n      const menuIndex = this.menus.length\n      const cleanMenuLabel = cleanMnemonic(menuBarMenu.label)\n\n      const mnemonicMatches = MENU_MNEMONIC_REGEX.exec(menuBarMenu.label)\n\n      // Register mnemonics\n      if (mnemonicMatches) {\n        const mnemonic = !!mnemonicMatches[1]\n          ? mnemonicMatches[1]\n          : mnemonicMatches[3]\n\n        this.registerMnemonic(this.menus.length, mnemonic)\n      }\n\n      if (this.isCompact) {\n        this.menus.push({\n          ...menuBarMenu,\n          label: ''\n        })\n      } else {\n        const buttonElement = $('.cet-menubar-menu-button', {\n          role: 'menuitem',\n          tabindex: -1,\n          'aria-label': cleanMenuLabel,\n          'aria-haspopup': true\n        })\n        const titleElement = $('.cet-menubar-menu-title', {\n          role: 'none',\n          'aria-hidden': true\n        })\n\n        buttonElement.appendChild(titleElement)\n        this.container.insertBefore(\n          buttonElement,\n          this.overflowMenu.buttonElement\n        )\n\n        this.updateLabels(titleElement, buttonElement, menuBarMenu.label)\n\n        this._register(\n          DOM.addDisposableListener(\n            buttonElement,\n            DOM.EventType.KEY_UP,\n            (e) => {\n              const event = new StandardKeyboardEvent(e as KeyboardEvent)\n              let eventHandled = true\n\n              if (\n                (event.equals(KeyCode.DownArrow) ||\n                  event.equals(KeyCode.Enter)) &&\n                !this.isOpen\n              ) {\n                this.focusedMenu = { index: menuIndex }\n                this.openedViaKeyboard = true\n                this.focusState = MenubarState.OPEN\n              } else {\n                eventHandled = false\n              }\n\n              if (eventHandled) {\n                event.preventDefault()\n                event.stopPropagation()\n              }\n            }\n          )\n        )\n\n        this._register(Gesture.addTarget(buttonElement))\n        this._register(\n          DOM.addDisposableListener(\n            buttonElement,\n            EventType.Tap,\n            (e: GestureEvent) => {\n              // Ignore this touch if the menu is touched\n              if (\n                this.isOpen &&\n                this.focusedMenu &&\n                this.focusedMenu.holder &&\n                DOM.isAncestor(\n                  e.initialTarget as HTMLElement,\n                  this.focusedMenu.holder\n                )\n              ) {\n                return\n              }\n\n              this.ignoreNextMouseUp = false\n              this.onMenuTriggered(menuIndex, true)\n\n              e.preventDefault()\n              e.stopPropagation()\n            }\n          )\n        )\n\n        this._register(\n          DOM.addDisposableListener(\n            buttonElement,\n            DOM.EventType.MOUSE_DOWN,\n            (e: MouseEvent) => {\n              // Ignore non-left-click\n              const mouseEvent = new StandardMouseEvent(e)\n              if (!mouseEvent.leftButton) {\n                e.preventDefault()\n                return\n              }\n\n              if (!this.isOpen) {\n                // Open the menu with mouse down and ignore the following mouse up event\n                this.ignoreNextMouseUp = true\n                this.onMenuTriggered(menuIndex, true)\n              } else {\n                this.ignoreNextMouseUp = false\n              }\n\n              e.preventDefault()\n              e.stopPropagation()\n            }\n          )\n        )\n\n        this._register(\n          DOM.addDisposableListener(\n            buttonElement,\n            DOM.EventType.MOUSE_UP,\n            (e) => {\n              if (e.defaultPrevented) {\n                return\n              }\n\n              if (!this.ignoreNextMouseUp) {\n                if (this.isFocused) {\n                  this.onMenuTriggered(menuIndex, true)\n                }\n              } else {\n                this.ignoreNextMouseUp = false\n              }\n            }\n          )\n        )\n\n        this._register(\n          DOM.addDisposableListener(\n            buttonElement,\n            DOM.EventType.MOUSE_ENTER,\n            () => {\n              if (this.isOpen && !this.isCurrentMenu(menuIndex)) {\n                buttonElement.focus()\n                this.cleanupMenu()\n                this.showMenu(menuIndex, false)\n              } else if (this.isFocused && !this.isOpen) {\n                this.focusedMenu = { index: menuIndex }\n                buttonElement.focus()\n              }\n            }\n          )\n        )\n\n        this.menus.push({\n          ...menuBarMenu,\n          buttonElement,\n          titleElement\n        })\n      }\n    })\n\n    // Recompute overflow after adding all top-level menus so initial render has the right state.\n    this.updateOverflowAction()\n  }\n\n  createOverflowMenu(): void {\n    const label = this.isCompact ? 'Compact' : 'More'\n    const buttonElement = $('.cet-menubar-menu-button', {\n      role: 'menuitem',\n      tabindex: this.isCompact ? 0 : -1,\n      'aria-label': label,\n      'aria-haspopup': true\n    })\n    const titleElement = $('.cet-menubar-menu-title.cet-toggle-more', {\n      role: 'none',\n      'aria-hidden': true\n    })\n    titleElement.textContent = '...'\n\n    buttonElement.appendChild(titleElement)\n    this.container.appendChild(buttonElement)\n    buttonElement.style.display = 'none'\n\n    this._register(\n      DOM.addDisposableListener(buttonElement, DOM.EventType.KEY_UP, (e) => {\n        const event = new StandardKeyboardEvent(e as KeyboardEvent)\n        let eventHandled = true\n\n        const triggerKeys = [KeyCode.Enter]\n        if (!this.isCompact) {\n          triggerKeys.push(KeyCode.DownArrow)\n        } else {\n          triggerKeys.push(KeyCode.Space)\n\n          if (this.options.compactMode === Direction.Right) {\n            triggerKeys.push(KeyCode.RightArrow)\n          } else if (this.options.compactMode === Direction.Left) {\n            triggerKeys.push(KeyCode.LeftArrow)\n          }\n        }\n\n        if (triggerKeys.some((k) => event.equals(k)) && !this.isOpen) {\n          this.focusedMenu = { index: MenuBar.OVERFLOW_INDEX }\n          this.openedViaKeyboard = true\n          this.focusState = MenubarState.OPEN\n        } else {\n          eventHandled = false\n        }\n\n        if (eventHandled) {\n          event.preventDefault()\n          event.stopPropagation()\n        }\n      })\n    )\n\n    this._register(Gesture.addTarget(buttonElement))\n    this._register(\n      DOM.addDisposableListener(\n        buttonElement,\n        EventType.Tap,\n        (e: GestureEvent) => {\n          // Ignore this touch if the menu is touched\n          if (\n            this.isOpen &&\n            this.focusedMenu &&\n            this.focusedMenu.holder &&\n            DOM.isAncestor(\n              e.initialTarget as HTMLElement,\n              this.focusedMenu.holder\n            )\n          ) {\n            return\n          }\n\n          this.ignoreNextMouseUp = false\n          this.onMenuTriggered(MenuBar.OVERFLOW_INDEX, true)\n\n          e.preventDefault()\n          e.stopPropagation()\n        }\n      )\n    )\n\n    this._register(\n      DOM.addDisposableListener(\n        buttonElement,\n        DOM.EventType.MOUSE_DOWN,\n        (e) => {\n          // Ignore non-left-click\n          const mouseEvent = new StandardMouseEvent(e)\n          if (!mouseEvent.leftButton) {\n            e.preventDefault()\n            return\n          }\n\n          if (!this.isOpen) {\n            // Open the menu with mouse down and ignore the following mouse up event\n            this.ignoreNextMouseUp = true\n            this.onMenuTriggered(MenuBar.OVERFLOW_INDEX, true)\n          } else {\n            this.ignoreNextMouseUp = false\n          }\n\n          e.preventDefault()\n          e.stopPropagation()\n        }\n      )\n    )\n\n    this._register(\n      DOM.addDisposableListener(buttonElement, DOM.EventType.MOUSE_UP, (e) => {\n        if (e.defaultPrevented) {\n          return\n        }\n\n        if (!this.ignoreNextMouseUp) {\n          if (this.isFocused) {\n            this.onMenuTriggered(MenuBar.OVERFLOW_INDEX, true)\n          }\n        } else {\n          this.ignoreNextMouseUp = false\n        }\n      })\n    )\n\n    this._register(\n      DOM.addDisposableListener(\n        buttonElement,\n        DOM.EventType.MOUSE_ENTER,\n        () => {\n          if (this.isOpen && !this.isCurrentMenu(MenuBar.OVERFLOW_INDEX)) {\n            this.overflowMenu.buttonElement.focus()\n            this.cleanupMenu()\n            this.showMenu(MenuBar.OVERFLOW_INDEX, false)\n          } else if (this.isFocused && !this.isOpen) {\n            this.focusedMenu = { index: MenuBar.OVERFLOW_INDEX }\n            buttonElement.focus()\n          }\n        }\n      )\n    )\n\n    this.overflowMenu = {\n      type: 'submenu',\n      toolTip: '',\n      visible: true,\n      sublabel: '',\n      registerAccelerator: false,\n      buttonElement,\n      titleElement,\n      label: 'More',\n      submenu: undefined,\n      checked: false,\n      click: () => {},\n      commandId: 0,\n      enabled: true,\n      id: '',\n      menu: {} as any,\n      sharingItem: {},\n      accelerator: null,\n      userAccelerator: null\n    }\n  }\n\n  setStyles(style: IMenuStyle) {\n    this.menuStyle = style\n  }\n\n  updateMenu(menu: MenuItem): void {\n    const menuToUpdate = this.menus.filter(\n      (menuBarMenu) => menuBarMenu.label === menu.label\n    )\n    if (menuToUpdate && menuToUpdate.length) {\n      // menuToUpdate[0].actions = menu.actions;\n    }\n  }\n\n  override dispose(): void {\n    super.dispose()\n\n    this.menus.forEach((menuBarMenu) => {\n      menuBarMenu.titleElement?.remove()\n      menuBarMenu.buttonElement?.remove()\n    })\n\n    this.overflowMenu.titleElement.remove()\n    this.overflowMenu.buttonElement.remove()\n\n    dispose(this.overflowLayoutScheduled)\n    this.overflowLayoutScheduled = undefined\n  }\n\n  blur(): void {\n    this.setUnfocusedState()\n  }\n\n  getWidth(): number {\n    if (!this.isCompact && this.menus) {\n      const left = this.menus[0].buttonElement!.getBoundingClientRect().left\n      const right = this.hasOverflow\n        ? this.overflowMenu.buttonElement.getBoundingClientRect().right\n        : this.menus[\n            this.menus.length - 1\n          ].buttonElement!.getBoundingClientRect().right\n      return right - left\n    }\n\n    return 0\n  }\n\n  getHeight(): number {\n    return this.container.clientHeight\n  }\n\n  toggleFocus(): void {\n    if (!this.isFocused && this.options.visibility !== 'hidden') {\n      this.mnemonicsInUse = true\n      this.focusedMenu = {\n        index: this.numMenusShown > 0 ? 0 : MenuBar.OVERFLOW_INDEX\n      }\n      this.focusState = MenubarState.FOCUSED\n    } else if (!this.isOpen) {\n      this.setUnfocusedState()\n    }\n  }\n\n  private updateOverflowAction(scheduleStabilizationPass = false): void {\n    if (!this.menus || !this.menus.length) {\n      return\n    }\n\n    const overflowMenuOnlyClass = 'overflow-menu-only'\n    this.container.classList.toggle(overflowMenuOnlyClass, false)\n\n    const containerRect = this.container.getBoundingClientRect()\n\n    // The title is centered with position:absolute at 50% of the titlebar.\n    // The menubar can use the space up to where the title starts, i.e. half\n    // the titlebar width minus half the title width minus a small margin.\n    const titleEl = this.container.parentElement?.querySelector(\n      '.cet-title'\n    ) as HTMLElement | null\n    const titlebarWidth =\n      this.container.parentElement?.offsetWidth ?? window.innerWidth\n    const titleWidth = titleEl?.offsetWidth ?? 0\n    const menuBarMargin = 20 // matches the CSS margin-right on .cet-menubar\n\n    // Space from the start of the menubar container to just before the centered title\n    const sizeAvailable =\n      titlebarWidth / 2 - titleWidth / 2 - menuBarMargin - containerRect.left\n\n    let currentSize = 0\n    let full = this.isCompact\n    const prevNumMenusShown = this.numMenusShown\n    this.numMenusShown = 0\n\n    const showableMenus = this.menus.filter(\n      (menu) =>\n        menu.buttonElement !== undefined && menu.titleElement !== undefined\n    ) as (MenuBarMenuWithElements & {\n      titleElement: HTMLElement\n      buttonElement: HTMLElement\n    })[]\n\n    // Temporarily show overflow button to measure its width reliably\n    const wasOverflowHidden =\n      this.overflowMenu.buttonElement.style.display === 'none'\n    if (wasOverflowHidden) {\n      this.overflowMenu.buttonElement.style.display = ''\n    }\n    const overflowButtonWidth =\n      this.overflowMenu.buttonElement.getBoundingClientRect().width ||\n      this.overflowMenu.buttonElement.offsetWidth ||\n      28\n    if (wasOverflowHidden) {\n      this.overflowMenu.buttonElement.style.display = 'none'\n    }\n\n    // Reset: show all menus so getBoundingClientRect() returns real widths.\n    // This also fixes menus not reappearing when the window grows back.\n    for (const menuBarMenu of showableMenus) {\n      menuBarMenu.buttonElement.style.display = ''\n    }\n\n    for (const menuBarMenu of showableMenus) {\n      if (!full) {\n        const size = menuBarMenu.buttonElement.getBoundingClientRect().width\n        const reserveOverflowButton =\n          !this.isCompact && this.numMenusShown < showableMenus.length - 1\n        const requiredSize =\n          currentSize + size + (reserveOverflowButton ? overflowButtonWidth : 0)\n\n        if (requiredSize > sizeAvailable) {\n          full = true\n        } else {\n          currentSize += size\n          this.numMenusShown++\n        }\n      }\n\n      if (full) {\n        menuBarMenu.buttonElement.style.display = 'none'\n      }\n    }\n\n    // Overflow\n    if (this.isCompact) {\n      this.rebuildOverflowMenu(showableMenus, this.numMenusShown)\n\n      this.overflowMenu.buttonElement.remove()\n      if (this.numMenusShown < showableMenus.length) {\n        this.container.insertBefore(\n          this.overflowMenu.buttonElement,\n          showableMenus[this.numMenusShown].buttonElement\n        )\n      } else {\n        this.container.appendChild(this.overflowMenu.buttonElement)\n      }\n\n      this.overflowMenu.buttonElement.style.display = ''\n    } else if (full) {\n      this.rebuildOverflowMenu(showableMenus, this.numMenusShown)\n      this.overflowMenu.buttonElement.remove()\n      if (this.numMenusShown < showableMenus.length) {\n        this.container.insertBefore(\n          this.overflowMenu.buttonElement,\n          showableMenus[this.numMenusShown].buttonElement\n        )\n      } else {\n        this.container.appendChild(this.overflowMenu.buttonElement)\n      }\n\n      this.overflowMenu.buttonElement.style.display = ''\n    } else {\n      this.overflowMenu.submenu = undefined\n      this.overflowMenu.buttonElement.remove()\n      this.container.appendChild(this.overflowMenu.buttonElement)\n      this.overflowMenu.buttonElement.style.display = 'none'\n    }\n\n    this.container.classList.toggle(\n      overflowMenuOnlyClass,\n      this.numMenusShown === 0\n    )\n  }\n\n  private updateLabels(\n    titleElement: HTMLElement,\n    buttonElement: HTMLElement,\n    label: string\n  ): void {\n    const cleanMenuLabel = cleanMnemonic(label)\n\n    // Update the button label to reflect mnemonics\n    if (this.options.enableMnemonics) {\n      const cleanLabel = strings.escape(label)\n\n      // This is global so reset it\n      MENU_ESCAPED_MNEMONIC_REGEX.lastIndex = 0\n      let escMatch = MENU_ESCAPED_MNEMONIC_REGEX.exec(cleanLabel)\n\n      // We can't use negative lookbehind so we match our negative and skip\n      while (escMatch && escMatch[1]) {\n        escMatch = MENU_ESCAPED_MNEMONIC_REGEX.exec(cleanLabel)\n      }\n\n      const replaceDoubleEscapes = (str: string) =>\n        str.replace(/&amp;&amp;/g, '&amp;')\n\n      if (escMatch) {\n        titleElement.innerText = ''\n        titleElement.append(\n          strings.ltrim(\n            replaceDoubleEscapes(cleanLabel.substring(0, escMatch.index)),\n            ' '\n          ),\n          $('mnemonic', { 'aria-hidden': 'true' }, escMatch[3]),\n          strings.rtrim(\n            replaceDoubleEscapes(\n              cleanLabel.substring(escMatch.index + escMatch[0].length)\n            ),\n            ' '\n          )\n        )\n      } else {\n        titleElement.innerText = replaceDoubleEscapes(cleanLabel).trim()\n      }\n    } else {\n      titleElement.innerText = cleanMenuLabel.replace(/&&/g, '&')\n    }\n\n    const mnemonicMatches = MENU_MNEMONIC_REGEX.exec(label)\n\n    // Register mnemonics\n    if (mnemonicMatches) {\n      const mnemonic = !!mnemonicMatches[1]\n        ? mnemonicMatches[1]\n        : mnemonicMatches[3]\n\n      if (this.options.enableMnemonics) {\n        buttonElement.setAttribute(\n          'aria-keyshortcuts',\n          'Alt+' + mnemonic.toLocaleLowerCase()\n        )\n      } else {\n        buttonElement.removeAttribute('aria-keyshortcuts')\n      }\n    }\n  }\n\n  update(options?: IMenuBarOptions): void {\n    if (options) {\n      this.options = options\n    }\n\n    // Don't update while using the menu\n    if (this.isFocused) {\n      this.updatePending = true\n      return\n    }\n\n    this.menus.forEach((menuBarMenu) => {\n      if (!menuBarMenu.buttonElement || !menuBarMenu.titleElement) {\n        return\n      }\n\n      this.updateLabels(\n        menuBarMenu.titleElement,\n        menuBarMenu.buttonElement,\n        menuBarMenu.label\n      )\n    })\n\n    if (!this.overflowLayoutScheduled) {\n      this.overflowLayoutPasses = 0\n      this.overflowLayoutScheduled = DOM.scheduleAtNextAnimationFrame(() => {\n        this.updateOverflowAction(true)\n        this.overflowLayoutScheduled = undefined\n      })\n    }\n\n    this.setUnfocusedState()\n  }\n\n  private registerMnemonic(menuIndex: number, mnemonic: string): void {\n    this.mnemonics.set(mnemonic.toLocaleLowerCase(), menuIndex)\n  }\n\n  private hideMenubar(): void {\n    if (this.container.style.display !== 'none') {\n      this.container.style.display = 'none'\n      this._onVisibilityChange.fire(false)\n    }\n  }\n\n  private showMenubar(): void {\n    if (this.container.style.display !== 'flex') {\n      this.container.style.display = 'flex'\n      this._onVisibilityChange.fire(true)\n\n      this.updateOverflowAction()\n    }\n  }\n\n  private get focusState(): MenubarState {\n    return this._focusState\n  }\n\n  private set focusState(value: MenubarState) {\n    if (\n      this._focusState >= MenubarState.FOCUSED &&\n      value < MenubarState.FOCUSED\n    ) {\n      // Losing focus, update the menu if needed\n\n      if (this.updatePending) {\n        this.menuUpdater.schedule()\n        this.updatePending = false\n      }\n    }\n\n    if (value === this._focusState) {\n      return\n    }\n\n    const isVisible = this.isVisible\n    const isOpen = this.isOpen\n    const isFocused = this.isFocused\n\n    this._focusState = value\n\n    switch (value) {\n      case MenubarState.HIDDEN:\n        if (isVisible) {\n          this.hideMenubar()\n        }\n\n        if (isOpen) {\n          this.cleanupMenu()\n        }\n\n        if (isFocused) {\n          this.focusedMenu = undefined\n\n          if (this.focusToReturn) {\n            this.focusToReturn.focus()\n            this.focusToReturn = undefined\n          }\n        }\n\n        break\n      case MenubarState.VISIBLE:\n        if (!isVisible) {\n          this.showMenubar()\n        }\n\n        if (isOpen) {\n          this.cleanupMenu()\n        }\n\n        if (isFocused) {\n          if (this.focusedMenu) {\n            if (this.focusedMenu.index === MenuBar.OVERFLOW_INDEX) {\n              this.overflowMenu.buttonElement.blur()\n            } else {\n              this.menus[this.focusedMenu.index].buttonElement?.blur()\n            }\n          }\n\n          this.focusedMenu = undefined\n\n          if (this.focusToReturn) {\n            this.focusToReturn.focus()\n            this.focusToReturn = undefined\n          }\n        }\n\n        break\n      case MenubarState.FOCUSED:\n        if (!isVisible) {\n          this.showMenubar()\n        }\n\n        if (isOpen) {\n          this.cleanupMenu()\n        }\n\n        if (this.focusedMenu) {\n          if (this.focusedMenu.index === MenuBar.OVERFLOW_INDEX) {\n            this.overflowMenu.buttonElement.focus()\n          } else {\n            this.menus[this.focusedMenu.index].buttonElement?.focus()\n          }\n        }\n        break\n      case MenubarState.OPEN:\n        if (!isVisible) {\n          this.showMenubar()\n        }\n\n        if (this.focusedMenu) {\n          this.showMenu(this.focusedMenu.index, this.openedViaKeyboard)\n        }\n        break\n    }\n\n    this._focusState = value\n    this._onFocusStateChange.fire(this.focusState >= MenubarState.FOCUSED)\n  }\n\n  get isVisible(): boolean {\n    return this.focusState >= MenubarState.VISIBLE\n  }\n\n  private get isFocused(): boolean {\n    return this.focusState >= MenubarState.FOCUSED\n  }\n\n  private get isOpen(): boolean {\n    return this.focusState >= MenubarState.OPEN\n  }\n\n  private get hasOverflow(): boolean {\n    return this.isCompact || this.numMenusShown < this.menus.length\n  }\n\n  private get isCompact(): boolean {\n    return this.options.compactMode !== undefined\n  }\n\n  private setUnfocusedState(): void {\n    if (\n      this.options.visibility === 'toggle' ||\n      this.options.visibility === 'hidden'\n    ) {\n      this.focusState = MenubarState.HIDDEN\n    } else if (this.options.visibility === 'classic') {\n      this.focusState = MenubarState.HIDDEN\n    } else {\n      this.focusState = MenubarState.VISIBLE\n    }\n\n    this.ignoreNextMouseUp = false\n    this.mnemonicsInUse = false\n    this.updateMnemonicVisibility(false)\n  }\n\n  private focusPrevious(): void {\n    if (!this.focusedMenu || this.numMenusShown === 0) {\n      return\n    }\n\n    let newFocusedIndex =\n      (this.focusedMenu.index - 1 + this.numMenusShown) % this.numMenusShown\n    if (this.focusedMenu.index === MenuBar.OVERFLOW_INDEX) {\n      newFocusedIndex = this.numMenusShown - 1\n    } else if (this.focusedMenu.index === 0 && this.hasOverflow) {\n      newFocusedIndex = MenuBar.OVERFLOW_INDEX\n    }\n\n    if (newFocusedIndex === this.focusedMenu.index) {\n      return\n    }\n\n    if (this.isOpen) {\n      this.cleanupMenu()\n      this.showMenu(newFocusedIndex)\n    } else if (this.isFocused) {\n      this.focusedMenu.index = newFocusedIndex\n      if (newFocusedIndex === MenuBar.OVERFLOW_INDEX) {\n        this.overflowMenu.buttonElement.focus()\n      } else {\n        this.menus[newFocusedIndex].buttonElement?.focus()\n      }\n    }\n  }\n\n  private focusNext(): void {\n    if (!this.focusedMenu || this.numMenusShown === 0) {\n      return\n    }\n\n    let newFocusedIndex = (this.focusedMenu.index + 1) % this.numMenusShown\n    if (this.focusedMenu.index === MenuBar.OVERFLOW_INDEX) {\n      newFocusedIndex = 0\n    } else if (this.focusedMenu.index === this.numMenusShown - 1) {\n      newFocusedIndex = MenuBar.OVERFLOW_INDEX\n    }\n\n    if (newFocusedIndex === this.focusedMenu.index) {\n      return\n    }\n\n    if (this.isOpen) {\n      this.cleanupMenu()\n      this.showMenu(newFocusedIndex)\n    } else if (this.isFocused) {\n      this.focusedMenu.index = newFocusedIndex\n      if (newFocusedIndex === MenuBar.OVERFLOW_INDEX) {\n        this.overflowMenu.buttonElement.focus()\n      } else {\n        this.menus[newFocusedIndex].buttonElement?.focus()\n      }\n    }\n  }\n\n  private updateMnemonicVisibility(visible: boolean): void {\n    if (this.menus) {\n      this.menus.forEach((menuBarMenu) => {\n        if (\n          menuBarMenu.titleElement &&\n          menuBarMenu.titleElement.children.length\n        ) {\n          const child = menuBarMenu.titleElement.children.item(0) as HTMLElement\n          if (child) {\n            child.style.textDecoration =\n              this.options.alwaysOnMnemonics || visible ? 'underline' : ''\n          }\n        }\n      })\n    }\n  }\n\n  private get mnemonicsInUse(): boolean {\n    return this._mnemonicsInUse\n  }\n\n  private set mnemonicsInUse(value: boolean) {\n    this._mnemonicsInUse = value\n  }\n\n  private get shouldAltKeyFocus(): boolean {\n    if (isMacintosh) {\n      return false\n    }\n\n    if (!this.options.disableAltFocus) {\n      return true\n    }\n\n    if (this.options.visibility === 'toggle') {\n      return true\n    }\n\n    return false\n  }\n\n  public get onVisibilityChange(): Event<boolean> {\n    return this._onVisibilityChange.event\n  }\n\n  public get onFocusStateChange(): Event<boolean> {\n    return this._onFocusStateChange.event\n  }\n\n  private onMenuTriggered(menuIndex: number, clicked: boolean) {\n    const menu = this.menus[menuIndex]\n    if (menuIndex !== MenuBar.OVERFLOW_INDEX && !menu?.submenu) {\n      ipcRenderer.send(IpcChannels.MENU_EVENT, menu.commandId)\n      return\n    }\n\n    if (this.isOpen) {\n      if (this.isCurrentMenu(menuIndex)) {\n        this.setUnfocusedState()\n      } else {\n        this.cleanupMenu()\n        this.showMenu(menuIndex, this.openedViaKeyboard)\n      }\n    } else {\n      this.focusedMenu = { index: menuIndex }\n      this.openedViaKeyboard = !clicked\n      this.focusState = MenubarState.OPEN\n    }\n  }\n\n  private onModifierKeyToggled(\n    modifierKeyStatus: DOM.IModifierKeyStatus\n  ): void {\n    const allModifiersReleased =\n      !modifierKeyStatus.altKey &&\n      !modifierKeyStatus.ctrlKey &&\n      !modifierKeyStatus.shiftKey &&\n      !modifierKeyStatus.metaKey\n\n    if (this.options.visibility === 'hidden') {\n      return\n    }\n\n    // Prevent alt-key default if the menu is not hidden and we use alt to focus\n    if (modifierKeyStatus.event && this.shouldAltKeyFocus) {\n      if (\n        ScanCodeUtils.toEnum(modifierKeyStatus.event.code) === ScanCode.AltLeft\n      ) {\n        modifierKeyStatus.event.preventDefault()\n      }\n    }\n\n    // Alt key pressed while menu is focused. This should return focus away from the menubar\n    if (\n      this.isFocused &&\n      modifierKeyStatus.lastKeyPressed === 'alt' &&\n      modifierKeyStatus.altKey\n    ) {\n      this.setUnfocusedState()\n      this.mnemonicsInUse = false\n      this.awaitingAltRelease = true\n    }\n\n    // Clean alt key press and release\n    if (\n      allModifiersReleased &&\n      modifierKeyStatus.lastKeyPressed === 'alt' &&\n      modifierKeyStatus.lastKeyReleased === 'alt'\n    ) {\n      if (!this.awaitingAltRelease) {\n        if (!this.isFocused && this.shouldAltKeyFocus) {\n          this.mnemonicsInUse = true\n          this.focusedMenu = {\n            index: this.numMenusShown > 0 ? 0 : MenuBar.OVERFLOW_INDEX\n          }\n          this.focusState = MenubarState.FOCUSED\n        } else if (!this.isOpen) {\n          this.setUnfocusedState()\n        }\n      }\n    }\n\n    // Alt key released\n    if (\n      !modifierKeyStatus.altKey &&\n      modifierKeyStatus.lastKeyReleased === 'alt'\n    ) {\n      this.awaitingAltRelease = false\n    }\n\n    if (this.options.enableMnemonics && this.menus && !this.isOpen) {\n      this.updateMnemonicVisibility(\n        (!this.awaitingAltRelease && modifierKeyStatus.altKey) ||\n          this.mnemonicsInUse\n      )\n    }\n  }\n\n  private isCurrentMenu(menuIndex: number): boolean {\n    if (!this.focusedMenu) {\n      return false\n    }\n\n    return this.focusedMenu.index === menuIndex\n  }\n\n  private cleanupMenu(): void {\n    if (this.focusedMenu) {\n      // Remove focus from the menus first\n      if (this.focusedMenu.index === MenuBar.OVERFLOW_INDEX) {\n        this.overflowMenu.buttonElement.focus()\n      } else {\n        this.menus[this.focusedMenu.index].buttonElement?.focus()\n      }\n\n      if (this.focusedMenu.holder) {\n        this.focusedMenu.holder.parentElement?.classList.remove('open')\n\n        this.focusedMenu.holder.remove()\n      }\n\n      this.focusedMenu.widget?.dispose()\n\n      this.focusedMenu = { index: this.focusedMenu.index }\n    }\n  }\n\n  private showMenu(menuIndex: number, selectFirst = true): void {\n    const actualMenuIndex =\n      menuIndex >= this.numMenusShown ? MenuBar.OVERFLOW_INDEX : menuIndex\n    const customMenu =\n      actualMenuIndex === MenuBar.OVERFLOW_INDEX\n        ? this.overflowMenu\n        : this.menus[actualMenuIndex]\n\n    if (!customMenu.submenu || !customMenu.buttonElement) {\n      return\n    }\n\n    const menuHolder = $('.cet-menubar-menu-container', { title: '' })\n    customMenu.buttonElement.classList.add('open')\n\n    const titleBoundingRect = customMenu.buttonElement.getBoundingClientRect()\n    const titleBoundingRectZoom = DOM.getDomNodeZoomLevel(\n      customMenu.buttonElement\n    )\n\n    if (this.options.compactMode === Direction.Right) {\n      menuHolder.style.top = `${titleBoundingRect.top}px`\n      menuHolder.style.left = `${titleBoundingRect.left + this.container.clientWidth}px`\n    } else if (this.options.compactMode === Direction.Left) {\n      menuHolder.style.top = `${titleBoundingRect.top}px`\n      menuHolder.style.right = `${this.container.clientWidth}px`\n      menuHolder.style.left = 'auto'\n    } else {\n      menuHolder.style.top = `${titleBoundingRect.bottom * titleBoundingRectZoom}px`\n      menuHolder.style.left = `${titleBoundingRect.left * titleBoundingRectZoom}px`\n    }\n\n    customMenu.buttonElement.appendChild(menuHolder)\n\n    const menuOptions: IMenuOptions = {\n      // getKeyBinding: this.options.getKeybinding,\n      // actionRunner: this.actionRunner,\n      enableMnemonics:\n        this.options.alwaysOnMnemonics ||\n        (this.mnemonicsInUse && this.options.enableMnemonics),\n      ariaLabel:\n        customMenu.buttonElement.getAttribute('aria-label') ?? undefined\n      // expandDirection: this.isCompact ? this.options.compactMode : Direction.Right,\n      // useEventAsContext: true\n    }\n\n    const menuWidget = this._register(\n      new CETMenu(\n        menuHolder,\n        this.menuIcons,\n        this.currentOptions,\n        menuOptions,\n        this.closeMenu\n      )\n    )\n    menuWidget.createMenu(customMenu.submenu?.items ?? [])\n    menuWidget.applyStyle(this.menuStyle)\n\n    this._register(\n      menuWidget.onDidCancel(() => {\n        this.focusState = MenubarState.FOCUSED\n      })\n    )\n\n    if (actualMenuIndex !== menuIndex) {\n      menuWidget.trigger(menuIndex - this.numMenusShown)\n    } else {\n      menuWidget.focus(selectFirst)\n    }\n\n    this.focusedMenu = {\n      index: actualMenuIndex,\n      holder: menuHolder,\n      widget: menuWidget\n    }\n  }\n\n  private rebuildOverflowMenu(\n    showableMenus: Array<\n      MenuBarMenuWithElements & {\n        titleElement: HTMLElement\n        buttonElement: HTMLElement\n      }\n    >,\n    fromIndex: number\n  ): void {\n    const hiddenMenus = showableMenus.slice(fromIndex)\n\n    if (!hiddenMenus.length) {\n      this.overflowMenu.submenu = undefined\n      return\n    }\n\n    this.overflowMenu.submenu = {\n      items: hiddenMenus.map((menu) => {\n        if (!menu.submenu) {\n          return {\n            ...menu,\n            label: cleanMnemonic(menu.label),\n            type: menu.type\n          }\n        }\n\n        return {\n          ...menu,\n          label: cleanMnemonic(menu.label),\n          submenu: menu.submenu,\n          type: 'submenu'\n        }\n      })\n    } as any\n  }\n}\n","/* ---------------------------------------------------------------------------------------------\n *  Copyright (c) AlexTorresDev. All rights reserved.\n *  Licensed under the MIT License. See License.txt in the project root for license information.\n *-------------------------------------------------------------------------------------------- */\n\nimport { Color } from 'base/common/color'\nimport { PlatformToString, isMacintosh, isWindows, platform } from 'base/common/platform'\nimport { IMenuIcons } from 'menubar'\n\nexport const INACTIVE_FOREGROUND_DARK = Color.fromHex('#222222')\nexport const ACTIVE_FOREGROUND_DARK = Color.fromHex('#333333')\nexport const INACTIVE_FOREGROUND = Color.fromHex('#EEEEEE')\nexport const ACTIVE_FOREGROUND = Color.fromHex('#FFFFFF')\nexport const DEFAULT_ITEM_SELECTOR = Color.fromHex('#0000001F')\n\nexport const IS_MAC_BIGSUR_OR_LATER = isMacintosh && parseInt(process.getSystemVersion().split('.')[0]) >= 11\nexport const BOTTOM_TITLEBAR_HEIGHT = 60\nexport const TOP_TITLEBAR_HEIGHT_MAC = IS_MAC_BIGSUR_OR_LATER ? 28 : 22\nexport const TOP_TITLEBAR_HEIGHT_WIN = 30\n\nexport const WINDOW_MIN_WIDTH = 400\nexport const WINDOW_MIN_HEIGHT = 270\n\nexport const MENU_MNEMONIC_REGEX = /\\(&([^\\s&])\\)|(^|[^&])&([^\\s&])/\nexport const MENU_ESCAPED_MNEMONIC_REGEX = /(&amp;)?(&amp;)([^\\s&])/g\n\ninterface ITitlebarIcons extends IMenuIcons {\n\tlinux: {\n\t\tminimize: string\n\t\tmaximize: string\n\t\trestore: string\n\t\tclose: string\n\t},\n\tfreebsd: {\n\t\tminimize: string\n\t\tmaximize: string\n\t\trestore: string\n\t\tclose: string\n\t},\n\twindows: {\n\t\tminimize: string\n\t\tmaximize: string\n\t\trestore: string\n\t\tclose: string\n\t}\n}\n\nexport const menuIcons: ITitlebarIcons = {\n\tsubmenuIndicator: '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" stroke-width=\"1.5\" stroke=\"currentColor\" fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\" /><polyline points=\"9 6 15 12 9 18\" /></svg>',\n\tcheckbox: '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" stroke-width=\"1.5\" stroke=\"currentColor\" fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\"/><path d=\"M5 12l5 5l10 -10\" /></svg>',\n\tradioChecked: '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 20 20\"><path fill=\"currentColor\" d=\"M10,5 C7.2,5 5,7.2 5,10 C5,12.8 7.2,15 10,15 C12.8,15 15,12.8 15,10 C15,7.2 12.8,5 10,5 L10,5 Z M10,0 C4.5,0 0,4.5 0,10 C0,15.5 4.5,20 10,20 C15.5,20 20,15.5 20,10 C20,4.5 15.5,0 10,0 L10,0 Z M10,18 C5.6,18 2,14.4 2,10 C2,5.6 5.6,2 10,2 C14.4,2 18,5.6 18,10 C18,14.4 14.4,18 10,18 L10,18 Z\" /></svg>',\n\tradioUnchecked: '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 20 20\"><path fill=\"currentColor\" d=\"M10,0 C4.5,0 0,4.5 0,10 C0,15.5 4.5,20 10,20 C15.5,20 20,15.5 20,10 C20,4.5 15.5,0 10,0 L10,0 Z M10,18 C5.6,18 2,14.4 2,10 C2,5.6 5.6,2 10,2 C14.4,2 18,5.6 18,10 C18,14.4 14.4,18 10,18 L10,18 Z\" /></svg>',\n\tlinux: {\n\t\tminimize: '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 11 11\"><path d=\"M11,4.9v1.1H0V4.399h11z\"/></svg>',\n\t\tmaximize: '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 11 11\"><path d=\"M0,1.7v7.6C0,10.2,0.8,11,1.7,11h7.6c0.9,0,1.7-0.8,1.7-1.7V1.7C11,0.8,10.2,0,9.3,0H1.7C0.8,0,0,0.8,0,1.7z M8.8,9.9H2.2c-0.6,0-1.1-0.5-1.1-1.1V2.2c0-0.6,0.5-1.1,1.1-1.1h6.7c0.6,0,1.1,0.5,1.1,1.1v6.7C9.9,9.4,9.4,9.9,8.8,9.9z\"/></svg>',\n\t\trestore: '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 11 11\"><path d=\"M7.9,2.2h-7C0.4,2.2,0,2.6,0,3.1v7C0,10.6,0.4,11,0.9,11h7c0.5,0,0.9-0.4,0.9-0.9v-7C8.8,2.6,8.4,2.2,7.9,2.2z M7.7,9.6 c0,0.2-0.1,0.3-0.3,0.3h-6c-0.2,0-0.3-0.1-0.3-0.3v-6c0-0.2,0.1-0.3,0.3-0.3h6c0.2,0,0.3,0.1,0.3,0.3V9.6z M10,0.9 c0,0.5-0.4,0.9-0.9,0.9h-2.1 c-0.5,0-0.9-0.4-0.9-0.9V0.9c0-0.5,0.4-0.9,0.9-0.9h2.1C9.6,0,10,0.4,10,0.9z\"/></svg>',\n\t\tclose: '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 11 11\"><path d=\"M6.279 5.5L11 10.221l-.779.779L5.5 6.279.779 11 0 10.221 4.721 5.5 0 .779.779 0 5.5 4.721 10.221 0 11 .779 6.279 5.5z\"/></svg>'\n\t},\n\tfreebsd: {\n\t\tminimize: '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 11 11\"><path d=\"M11,4.9v1.1H0V4.399h11z\"/></svg>',\n\t\tmaximize: '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 11 11\"><path d=\"M0,1.7v7.6C0,10.2,0.8,11,1.7,11h7.6c0.9,0,1.7-0.8,1.7-1.7V1.7C11,0.8,10.2,0,9.3,0H1.7C0.8,0,0,0.8,0,1.7z M8.8,9.9H2.2c-0.6,0-1.1-0.5-1.1-1.1V2.2c0-0.6,0.5-1.1,1.1-1.1h6.7c0.6,0,1.1,0.5,1.1,1.1v6.7C9.9,9.4,9.4,9.9,8.8,9.9z\"/></svg>',\n\t\trestore: '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 11 11\"><path d=\"M7.9,2.2h-7C0.4,2.2,0,2.6,0,3.1v7C0,10.6,0.4,11,0.9,11h7c0.5,0,0.9-0.4,0.9-0.9v-7C8.8,2.6,8.4,2.2,7.9,2.2z M7.7,9.6 c0,0.2-0.1,0.3-0.3,0.3h-6c-0.2,0-0.3-0.1-0.3-0.3v-6c0-0.2,0.1-0.3,0.3-0.3h6c0.2,0,0.3,0.1,0.3,0.3V9.6z M10,0.9 c0,0.5-0.4,0.9-0.9,0.9h-2.1 c-0.5,0-0.9-0.4-0.9-0.9V0.9c0-0.5,0.4-0.9,0.9-0.9h2.1C9.6,0,10,0.4,10,0.9z\"/></svg>',\n\t\tclose: '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 11 11\"><path d=\"M6.279 5.5L11 10.221l-.779.779L5.5 6.279.779 11 0 10.221 4.721 5.5 0 .779.779 0 5.5 4.721 10.221 0 11 .779 6.279 5.5z\"/></svg>'\n\t},\n\twindows: {\n\t\tminimize: '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 11 11\"><path d=\"M11,4.9v1.1H0V4.399h11z\"/></svg>',\n\t\tmaximize: '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 11 11\"><path d=\"M0,1.7v7.6C0,10.2,0.8,11,1.7,11h7.6c0.9,0,1.7-0.8,1.7-1.7V1.7C11,0.8,10.2,0,9.3,0H1.7C0.8,0,0,0.8,0,1.7z M8.8,9.9H2.2c-0.6,0-1.1-0.5-1.1-1.1V2.2c0-0.6,0.5-1.1,1.1-1.1h6.7c0.6,0,1.1,0.5,1.1,1.1v6.7C9.9,9.4,9.4,9.9,8.8,9.9z\"/></svg>',\n\t\trestore: '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 11 11\"><path d=\"M7.9,2.2h-7C0.4,2.2,0,2.6,0,3.1v7C0,10.6,0.4,11,0.9,11h7c0.5,0,0.9-0.4,0.9-0.9v-7C8.8,2.6,8.4,2.2,7.9,2.2z M7.7,9.6 c0,0.2-0.1,0.3-0.3,0.3h-6c-0.2,0-0.3-0.1-0.3-0.3v-6c0-0.2,0.1-0.3,0.3-0.3h6c0.2,0,0.3,0.1,0.3,0.3V9.6z\"/><path d=\"M10,0H3.5v1.1h6.1c0.2,0,0.3,0.1,0.3,0.3v6.1H11V1C11,0.4,10.6,0,10,0z\"/></svg>',\n\t\tclose: '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 11 11\"><path d=\"M6.279 5.5L11 10.221l-.779.779L5.5 6.279.779 11 0 10.221 4.721 5.5 0 .779.779 0 5.5 4.721 10.221 0 11 .779 6.279 5.5z\"/></svg>'\n\t}\n}\n\nexport function getPx(value: number): string {\n\treturn `${value}px`\n}\n\n/**\n * Handles mnemonics for menu items. Depending on OS:\n * - Windows: Supported via & character (replace && with &)\n * - Linux: Supported via & character (replace && with &)\n * - FreeBSD: Supported via & character (replace && with &)\n * - macOS: Unsupported (replace && with empty string)\n */\nexport function mnemonicMenuLabel(label: string, forceDisableMnemonics?: boolean): string {\n\tif (isMacintosh || forceDisableMnemonics) {\n\t\treturn label.replace(/\\(&&\\w\\)|&&/g, '').replace(/&/g, isMacintosh ? '&' : '&&')\n\t}\n\n\treturn label.replace(/&&|&/g, m => m === '&' ? '&&' : '&')\n}\n\n/**\n * Handles mnemonics for buttons. Depending on OS:\n * - Windows: Supported via & character (replace && with & and & with && for escaping)\n * - Linux: Supported via _ character (replace && with _)\n * - FreeBSD: Supported via _ character (replace && with _)\n * - macOS: Unsupported (replace && with empty string)\n */\nexport function mnemonicButtonLabel(label: string, forceDisableMnemonics?: boolean): string {\n\tif (isMacintosh || forceDisableMnemonics) {\n\t\treturn label.replace(/\\(&&\\w\\)|&&/g, '')\n\t}\n\n\tif (isWindows) {\n\t\treturn label.replace(/&&|&/g, m => m === '&' ? '&&' : '&')\n\t}\n\n\treturn label.replace(/&&/g, '_')\n}\n\nexport function cleanMnemonic(label: string): string {\n\tconst regex = MENU_MNEMONIC_REGEX\n\n\tconst matches = regex.exec(label)\n\tif (!matches) {\n\t\treturn label\n\t}\n\n\tconst mnemonicInText = !matches[1]\n\n\treturn label.replace(regex, mnemonicInText ? '$2$3' : '').trim()\n}\n\nexport function parseAccelerator(accelerator: Electron.Accelerator | string): string {\n\tlet acc = accelerator.toString()\n\n\tif (!isMacintosh) {\n\t\tacc = acc.replace(/(Cmd)|(Command)/gi, '')\n\t} else {\n\t\tacc = acc.replace(/(Ctrl)|(Control)/gi, '')\n\t}\n\n\tacc = acc.replace(/(Or)/gi, '')\n\n\treturn acc\n}\n\nexport function applyFill(element: HTMLElement | undefined | null, svgColor: Color | undefined, fgColor: Color | undefined, color = true) {\n\tlet fillColor = ''\n\n\tif (svgColor) fillColor = svgColor.toString()\n\telse if (fgColor) fillColor = fgColor.toString()\n\n\tif (element && element !== null) {\n\t\tif (color) element.style.color = fillColor\n\t\telse element.style.backgroundColor = fillColor\n\t}\n}\n\nexport function loadWindowIcons(icons: string | undefined): any {\n\tif (!icons) return\n\n\tconst jWindowsIcons = require(icons)\n\n\treturn {\n\t\ticons: jWindowsIcons,\n\t\tplatformIcons: jWindowsIcons[PlatformToString(platform).toLocaleLowerCase()]\n\t}\n}\n","/* ---------------------------------------------------------------------------------------------\n *  Copyright (c) AlexTorresDev. All rights reserved.\n *  Licensed under the MIT License. See License.txt in the project root for license information.\n *-------------------------------------------------------------------------------------------- */\n\nimport { MenuItem, ipcRenderer, nativeImage } from 'electron'\nimport { Color } from 'base/common/color'\nimport { $, EventHelper, EventLike, EventType, addClass, addDisposableListener, append, hasClass, removeClass, removeNode } from 'base/common/dom'\nimport { KeyCode, KeyCodeUtils } from 'base/common/keyCodes'\nimport { Disposable } from 'base/common/lifecycle'\nimport { MENU_ESCAPED_MNEMONIC_REGEX, MENU_MNEMONIC_REGEX, applyFill, parseAccelerator, cleanMnemonic, loadWindowIcons } from 'consts'\nimport { MenuBarOptions } from '../menubar-options'\nimport { IMenuOptions } from './index'\nimport * as strings from 'base/common/strings'\nimport { IMenuIcons } from 'menubar'\nimport { IpcChannels } from 'types/ipc-contract'\n\nexport interface IMenuStyle {\n\tforegroundColor?: Color\n\tbackgroundColor?: Color\n\tselectionForegroundColor?: Color\n\tselectionBackgroundColor?: Color\n\tseparatorColor?: Color\n\tsvgColor?: Color\n}\n\nexport interface IMenuItem {\n\trender(element: HTMLElement): void\n\tupdateStyle(style: IMenuStyle): void\n\tonClick(event: EventLike): void\n\tdispose(): void\n\tisEnabled(): boolean\n\tisSeparator(): boolean\n\tfocus(): void\n\tblur(): void\n}\n\nexport class CETMenuItem extends Disposable implements IMenuItem {\n\tprivate _mnemonic?: KeyCode\n\tprivate _currentElement?: HTMLElement\n\n\tprivate labelElement?: HTMLElement\n\tprivate iconElement?: HTMLElement\n\n\tprotected itemElement?: HTMLElement\n\tprotected menuStyle?: IMenuStyle\n\n\tprivate radioGroup?: { start: number, end: number } // used only if item.type === \"radio\"\n\n\tconstructor(private _item: MenuItem, private menuIcons: IMenuIcons, private parentOptions: MenuBarOptions, private options: IMenuOptions, private menuItems?: IMenuItem[], private closeSubMenu = () => { }) {\n\t\tsuper()\n\n\t\t// Set mnemonic\n\t\tif (this._item.label && options.enableMnemonics) {\n\t\t\tconst label = this._item.label\n\t\t\tif (label) {\n\t\t\t\tconst matches = MENU_MNEMONIC_REGEX.exec(label)\n\t\t\t\tif (matches) {\n\t\t\t\t\tthis._mnemonic = KeyCodeUtils.fromString((!!matches[1] ? matches[1] : matches[2]).toLocaleUpperCase())\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\trender(el: HTMLElement): void {\n\t\tthis._currentElement = el\n\n\t\tthis._register(addDisposableListener(this.element!, EventType.MOUSE_DOWN, e => {\n\t\t\tif (this.item.enabled && e.button === 0 && this.element) {\n\t\t\t\taddClass(this.element, 'active')\n\t\t\t}\n\t\t}))\n\n\t\tthis._register(addDisposableListener(this.element!, EventType.CLICK, e => {\n\t\t\tif (this.item.enabled) {\n\t\t\t\tthis.onClick(e)\n\t\t\t}\n\t\t}))\n\n\t\tthis._register(addDisposableListener(this.element!, EventType.DBLCLICK, e => {\n\t\t\tEventHelper.stop(e, true)\n\t\t}));\n\n\n\t\t[EventType.MOUSE_UP, EventType.MOUSE_OUT].forEach(event => {\n\t\t\tthis._register(addDisposableListener(this.element!, event, e => {\n\t\t\t\tEventHelper.stop(e)\n\t\t\t\tremoveClass(this.element!, 'active')\n\t\t\t}))\n\t\t})\n\n\t\tthis.itemElement = append(this.element!, $('a.cet-action-menu-item'))\n\n\t\tif (this.mnemonic) {\n\t\t\tthis.itemElement.setAttribute('aria-keyshortcuts', `${this.mnemonic}`)\n\t\t}\n\n\t\tthis.iconElement = append(this.itemElement, $('span.cet-menu-item-icon'))\n\t\tthis.iconElement.setAttribute('role', 'none')\n\n\t\tthis.labelElement = append(this.itemElement, $('span.cet-action-label'))\n\n\t\tthis.updateLabel()\n\t\tthis.setAccelerator()\n\t\tthis.updateIcon()\n\t\tthis.updateTooltip()\n\t\tthis.updateEnabled()\n\t\tthis.updateChecked()\n\t\tthis.updateVisibility()\n\t}\n\n\tonClick(event: EventLike) {\n\t\tEventHelper.stop(event, true)\n\t\tipcRenderer.send(IpcChannels.MENU_EVENT, this.item.commandId)\n\n\t\tif (this.item.type === 'checkbox') {\n\t\t\tthis.item.checked = !this.item.checked\n\t\t\tthis.updateChecked()\n\t\t} else if (this.item.type === 'radio') {\n\t\t\tthis.updateRadioGroup()\n\t\t}\n\n\t\tthis.closeSubMenu()\n\t}\n\n\tprotected applyStyle(): void {\n\t\tif (!this.menuStyle) {\n\t\t\treturn\n\t\t}\n\n\t\tconst isSelected = this.element && hasClass(this.element, 'focused')\n\t\tconst fgColor = isSelected && this.menuStyle.selectionForegroundColor ? this.menuStyle.selectionForegroundColor : this.menuStyle.foregroundColor\n\t\tconst bgColor = isSelected && this.menuStyle.selectionBackgroundColor ? this.menuStyle.selectionBackgroundColor : null\n\n\t\tif (this.itemElement) {\n\t\t\tthis.itemElement.style.color = fgColor ? fgColor.toString() : ''\n\t\t\tthis.itemElement.style.backgroundColor = bgColor ? bgColor.toString() : ''\n\n\t\t\tif (this.iconElement) {\n\t\t\t\tif (this.iconElement.firstElementChild?.className === 'icon') {\n\t\t\t\t\tapplyFill(this.iconElement.firstElementChild as HTMLElement, this.parentOptions?.svgColor, fgColor, false)\n\t\t\t\t} else {\n\t\t\t\t\tapplyFill(this.iconElement, this.parentOptions?.svgColor, fgColor)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tupdateStyle(style: IMenuStyle): void {\n\t\tthis.menuStyle = style\n\t\tthis.applyStyle()\n\t}\n\n\tfocus(): void {\n\t\tif (this.element) {\n\t\t\tthis.element.focus()\n\t\t\taddClass(this.element, 'focused')\n\t\t}\n\n\t\tthis.applyStyle()\n\t}\n\n\tblur(): void {\n\t\tif (this.element) {\n\t\t\tthis.element.blur()\n\t\t\tremoveClass(this.element, 'focused')\n\t\t}\n\n\t\tthis.applyStyle()\n\t}\n\n\tsetAccelerator(): void {\n\t\tlet accelerator = null\n\n\t\tif (this.item.role) {\n\t\t\tswitch (this.item.role.toLocaleLowerCase()) {\n\t\t\t\tcase 'undo':\n\t\t\t\t\taccelerator = 'CtrlOrCmd+Z'\n\t\t\t\t\tbreak\n\t\t\t\tcase 'redo':\n\t\t\t\t\taccelerator = 'CtrlOrCmd+Y'\n\t\t\t\t\tbreak\n\t\t\t\tcase 'cut':\n\t\t\t\t\taccelerator = 'CtrlOrCmd+X'\n\t\t\t\t\tbreak\n\t\t\t\tcase 'copy':\n\t\t\t\t\taccelerator = 'CtrlOrCmd+C'\n\t\t\t\t\tbreak\n\t\t\t\tcase 'paste':\n\t\t\t\t\taccelerator = 'CtrlOrCmd+V'\n\t\t\t\t\tbreak\n\t\t\t\tcase 'selectall':\n\t\t\t\t\taccelerator = 'CtrlOrCmd+A'\n\t\t\t\t\tbreak\n\t\t\t\tcase 'minimize':\n\t\t\t\t\taccelerator = 'CtrlOrCmd+M'\n\t\t\t\t\tbreak\n\t\t\t\tcase 'close':\n\t\t\t\t\taccelerator = 'CtrlOrCmd+W'\n\t\t\t\t\tbreak\n\t\t\t\tcase 'reload':\n\t\t\t\t\taccelerator = 'CtrlOrCmd+R'\n\t\t\t\t\tbreak\n\t\t\t\tcase 'forcereload':\n\t\t\t\t\taccelerator = 'CtrlOrCmd+Shift+R'\n\t\t\t\t\tbreak\n\t\t\t\tcase 'toggledevtools':\n\t\t\t\t\taccelerator = 'CtrlOrCmd+Shift+I'\n\t\t\t\t\tbreak\n\t\t\t\tcase 'togglefullscreen':\n\t\t\t\t\taccelerator = 'F11'\n\t\t\t\t\tbreak\n\t\t\t\tcase 'resetzoom':\n\t\t\t\t\taccelerator = 'CtrlOrCmd+0'\n\t\t\t\t\tbreak\n\t\t\t\tcase 'zoomin':\n\t\t\t\t\taccelerator = 'CtrlOrCmd++'\n\t\t\t\t\tbreak\n\t\t\t\tcase 'zoomout':\n\t\t\t\t\taccelerator = 'CtrlOrCmd+-'\n\t\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\n\t\tif (this.item.label && this.item.accelerator) {\n\t\t\taccelerator = this.item.accelerator\n\t\t}\n\n\t\tif (this.itemElement && accelerator !== null) {\n\t\t\tappend(this.itemElement, $('span.keybinding')).textContent = parseAccelerator(accelerator)\n\t\t}\n\t}\n\n\tupdateLabel(): void {\n\t\tconst label = this.item.label || ''\n\t\tconst cleanMenuLabel = cleanMnemonic(label)\n\n\t\t// Update the button label to reflect mnemonics\n\n\t\tif (this.options.enableMnemonics) {\n\t\t\tconst cleanLabel = strings.escape(label)\n\n\t\t\t// This is global so reset it\n\t\t\tMENU_ESCAPED_MNEMONIC_REGEX.lastIndex = 0\n\t\t\tlet escMatch = MENU_ESCAPED_MNEMONIC_REGEX.exec(cleanLabel)\n\n\t\t\t// We can't use negative lookbehind so we match our negative and skip\n\t\t\twhile (escMatch && escMatch[1]) {\n\t\t\t\tescMatch = MENU_ESCAPED_MNEMONIC_REGEX.exec(cleanLabel)\n\t\t\t}\n\n\t\t\tconst replaceDoubleEscapes = (str: string) => str.replace(/&amp;&amp;/g, '&amp;')\n\n\t\t\tif (escMatch) {\n\t\t\t\tthis.labelElement!.innerText = ''\n\t\t\t\tthis.labelElement!.append(\n\t\t\t\t\tstrings.ltrim(replaceDoubleEscapes(cleanLabel.substring(0, escMatch.index)), ' '),\n\t\t\t\t\t$('mnemonic', { 'aria-hidden': 'true' }, escMatch[3]),\n\t\t\t\t\tstrings.rtrim(replaceDoubleEscapes(cleanLabel.substring(escMatch.index + escMatch[0].length)), ' ')\n\t\t\t\t)\n\t\t\t} else {\n\t\t\t\tthis.labelElement!.innerText = replaceDoubleEscapes(cleanLabel).trim()\n\t\t\t}\n\t\t} else {\n\t\t\tthis.labelElement!.innerText = cleanMenuLabel.replace(/&&/g, '&')\n\t\t}\n\n\t\tconst mnemonicMatches = MENU_MNEMONIC_REGEX.exec(label)\n\n\t\t// Register mnemonics\n\t\tif (mnemonicMatches) {\n\t\t\tconst mnemonic = !!mnemonicMatches[1] ? mnemonicMatches[1] : mnemonicMatches[3]\n\n\t\t\tif (this.options.enableMnemonics) {\n\t\t\t\tthis.itemElement?.setAttribute('aria-keyshortcuts', 'Alt+' + mnemonic.toLocaleLowerCase())\n\t\t\t} else {\n\t\t\t\tthis.itemElement?.removeAttribute('aria-keyshortcuts')\n\t\t\t}\n\t\t}\n\t}\n\n\tupdateIcon(): void {\n\t\tif (this.item.icon) {\n\t\t\tconst icon = this.item.icon\n\n\t\t\tif (this.iconElement && icon) {\n\t\t\t\tconst iconE = append(this.iconElement, $('.icon'))\n\n\t\t\t\tif (typeof this.item.icon !== 'string') {\n\t\t\t\t\t// Request icon data asynchronously from main process\n\t\t\t\t\tvoid ipcRenderer.invoke(IpcChannels.REQUEST_MENU_ICON, this.item.commandId).then((iconData: string | null) => {\n\t\t\t\t\t\tif (iconData) {\n\t\t\t\t\t\t\ticonE.style.maskImage = `url(${iconData})`\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t\t} else {\n\t\t\t\t\tconst iconPath = this.item.icon\n\t\t\t\t\tconst iconData = nativeImage.createFromPath(iconPath).toDataURL()\n\t\t\t\t\tif (iconData) iconE.style.maskImage = `url(${iconData})`\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (this.iconElement && this.item.type === 'checkbox') {\n\t\t\taddClass(this.iconElement, 'checkbox')\n\t\t\tthis.iconElement.innerHTML = this.menuIcons.checkbox\n\t\t} else if (this.item.type === 'radio') {\n\t\t\taddClass(this.iconElement!, 'radio')\n\t\t\tthis.iconElement!.innerHTML = this.item.checked ? this.menuIcons.radioChecked : this.menuIcons.radioUnchecked\n\t\t}\n\n\t\tapplyFill(this.iconElement, this.parentOptions?.svgColor, this.menuStyle?.foregroundColor)\n\t}\n\n\tupdateTooltip(): void {\n\t\tlet title: string | null = null\n\n\t\tif (this.item.sublabel) {\n\t\t\ttitle = this.item.sublabel\n\t\t} else if (!this.item.label && this.item.label && this.item.icon) {\n\t\t\ttitle = this.item.label\n\n\t\t\tif (this.item.accelerator) {\n\t\t\t\ttitle = parseAccelerator(this.item.accelerator)\n\t\t\t}\n\t\t}\n\n\t\tif (this.itemElement && title) {\n\t\t\tthis.itemElement.title = title\n\t\t}\n\t}\n\n\tupdateEnabled(): void {\n\t\tif (this.element) {\n\t\t\tif (this.item.enabled && this.item.type !== 'separator') {\n\t\t\t\tremoveClass(this.element, 'disabled')\n\t\t\t\tthis.element.tabIndex = 0\n\t\t\t} else {\n\t\t\t\taddClass(this.element, 'disabled')\n\t\t\t}\n\t\t}\n\t}\n\n\tupdateVisibility(): void {\n\t\tif (this.item.visible === false && this.itemElement) {\n\t\t\tthis.itemElement.remove()\n\t\t}\n\t}\n\n\tupdateChecked(): void {\n\t\tif (this.itemElement) {\n\t\t\tif (this.item.checked) {\n\t\t\t\taddClass(this.itemElement, 'checked')\n\t\t\t\tthis.itemElement.setAttribute('aria-checked', 'true')\n\t\t\t} else {\n\t\t\t\tremoveClass(this.itemElement, 'checked')\n\t\t\t\tthis.itemElement.setAttribute('aria-checked', 'false')\n\t\t\t}\n\t\t}\n\t}\n\n\tupdateRadioGroup(): void {\n\t\tif (this.radioGroup === undefined) {\n\t\t\tthis.radioGroup = this.getRadioGroup()\n\t\t}\n\n\t\tif (this.menuItems) {\n\t\t\tfor (let i = this.radioGroup.start; i < this.radioGroup.end; i++) {\n\t\t\t\tconst menuItem = this.menuItems[i]\n\t\t\t\tif (menuItem instanceof CETMenuItem && menuItem.item.type === 'radio') {\n\t\t\t\t\t// update item.checked for each radio button in group\n\t\t\t\t\tmenuItem.item.checked = menuItem === this\n\t\t\t\t\tmenuItem.updateIcon()\n\t\t\t\t\t// updateChecked() *all* radio buttons in group\n\t\t\t\t\tmenuItem.updateChecked()\n\t\t\t\t\t// set the radioGroup property of all the other radio buttons since it was already calculated\n\t\t\t\t\tif (menuItem !== this) {\n\t\t\t\t\t\tmenuItem.radioGroup = this.radioGroup\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t/** radioGroup index's starts with (previous separator +1 OR menuItems[0]) and ends with (next separator OR menuItems[length]) */\n\tgetRadioGroup(): { start: number, end: number } {\n\t\tlet startIndex = 0\n\t\tlet endIndex = this.menuItems ? this.menuItems.length : 0\n\t\tlet found = false\n\n\t\tif (this.menuItems) {\n\t\t\tfor (const index in this.menuItems) {\n\t\t\t\tconst menuItem = this.menuItems[index]\n\t\t\t\tif (menuItem === this) {\n\t\t\t\t\tfound = true\n\t\t\t\t} else if (menuItem instanceof CETMenuItem && menuItem.isSeparator()) {\n\t\t\t\t\tif (found) {\n\t\t\t\t\t\tendIndex = Number.parseInt(index)\n\t\t\t\t\t\tbreak\n\t\t\t\t\t} else {\n\t\t\t\t\t\tstartIndex = Number.parseInt(index) + 1\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn { start: startIndex, end: endIndex }\n\t}\n\n\tget element() {\n\t\treturn this._currentElement\n\t}\n\n\tget item(): MenuItem {\n\t\treturn this._item\n\t}\n\n\tisEnabled(): boolean {\n\t\treturn this.item.enabled\n\t}\n\n\tisSeparator(): boolean {\n\t\treturn this.item.type === 'separator'\n\t}\n\n\tget mnemonic(): KeyCode | undefined {\n\t\treturn this._mnemonic\n\t}\n\n\tdispose(): void {\n\t\tif (this.itemElement) {\n\t\t\tremoveNode(this.itemElement)\n\t\t\tthis.itemElement = undefined\n\t\t}\n\n\t\tsuper.dispose()\n\t}\n}","/*---------------------------------------------------------------------------------------------\n *  Copyright (c) Microsoft Corporation. All rights reserved.\n *  Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\n/**\n * Converts HTML characters inside the string to use entities instead. Makes the string safe from\n * being used e.g. in HTMLElement.innerHTML.\n */\nexport function escape(html: string): string {\n\treturn html.replace(/[<>&]/g, function (match) {\n\t\tswitch (match) {\n\t\t\tcase '<': return '&lt;';\n\t\t\tcase '>': return '&gt;';\n\t\t\tcase '&': return '&amp;';\n\t\t\tdefault: return match;\n\t\t}\n\t});\n}\n\n/**\n * Removes all occurrences of needle from the beginning and end of haystack.\n * @param haystack string to trim\n * @param needle the thing to trim (default is a blank)\n */\nexport function trim(haystack: string, needle: string = ' '): string {\n\tconst trimmed = ltrim(haystack, needle);\n\treturn rtrim(trimmed, needle);\n}\n\n/**\n * Removes all occurrences of needle from the beginning of haystack.\n * @param haystack string to trim\n * @param needle the thing to trim\n */\nexport function ltrim(haystack: string, needle: string): string {\n\tif (!haystack || !needle) {\n\t\treturn haystack;\n\t}\n\n\tconst needleLen = needle.length;\n\tif (needleLen === 0 || haystack.length === 0) {\n\t\treturn haystack;\n\t}\n\n\tlet offset = 0;\n\n\twhile (haystack.indexOf(needle, offset) === offset) {\n\t\toffset = offset + needleLen;\n\t}\n\treturn haystack.substring(offset);\n}\n\n/**\n * Removes all occurrences of needle from the end of haystack.\n * @param haystack string to trim\n * @param needle the thing to trim\n */\nexport function rtrim(haystack: string, needle: string): string {\n\tif (!haystack || !needle) {\n\t\treturn haystack;\n\t}\n\n\tconst needleLen = needle.length,\n\t\thaystackLen = haystack.length;\n\n\tif (needleLen === 0 || haystackLen === 0) {\n\t\treturn haystack;\n\t}\n\n\tlet offset = haystackLen,\n\t\tidx = -1;\n\n\twhile (true) {\n\t\tidx = haystack.lastIndexOf(needle, offset - 1);\n\t\tif (idx === -1 || idx + needleLen !== offset) {\n\t\t\tbreak;\n\t\t}\n\t\tif (idx === 0) {\n\t\t\treturn '';\n\t\t}\n\t\toffset = idx;\n\t}\n\n\treturn haystack.substring(0, offset);\n}\n","/* ---------------------------------------------------------------------------------------------\n *  Copyright (c) AlexTorresDev. All rights reserved.\n *  Licensed under the MIT License. See License.txt in the project root for license information.\n *-------------------------------------------------------------------------------------------- */\n\nimport { TitleBarOverlay } from 'electron'\n\n/**\n * Central IPC contract defining all channels and their payloads\n * Ensures type-safe communication between main and renderer processes\n */\n\n// Window event names\nexport type WindowEventName = 'window-minimize' | 'window-maximize' | 'window-close'\n\n// IPC Channel definitions with Request/Response types\nexport interface IpcContract {\n\t// Window state queries (async - use invoke)\n\t'window-event:is-maximized': {\n\t\trequest: void\n\t\tresponse: boolean\n\t}\n\n\t// Title bar overlay update (async - use invoke)\n\t'update-window-controls': {\n\t\trequest: TitleBarOverlay\n\t\tresponse: boolean\n\t}\n\n\t// Menu icon request (async - use invoke)\n\t'menu-icon:request': {\n\t\trequest: number // commandId\n\t\tresponse: string | null // dataURL or null\n\t}\n\n\t// Application menu request (async - use invoke)\n\t'request-application-menu': {\n\t\trequest: void\n\t\tresponse: Electron.Menu\n\t}\n\n\t// Theme configuration delivery (async - use invoke)\n\t'theme-config:get': {\n\t\trequest: void\n\t\tresponse: Record<string, unknown> | null // normalized theme config\n\t}\n}\n\n// Fire-and-forget channels (use send/on)\nexport interface IpcFireAndForgetContract {\n\t// Window control events\n\t'window-event': {\n\t\tpayload: WindowEventName\n\t}\n\t// Menu item click events\n\t'menu-event': {\n\t\tpayload: number // commandId\n\t}\n\t// Minimum size setter\n\t'window-set-minimumSize': {\n\t\tpayload: [number, number] // [width, height]\n\t}\n\t// Title bar overlay update (sync alternative)\n\t'update-window-controls': {\n\t\tpayload: TitleBarOverlay\n\t}\n}\n\n/**\n * Type-safe channel name extractors\n */\nexport const IpcChannels = {\n\t// Async (invoke/handle)\n\tGET_WINDOW_MAXIMIZED: 'window-event:is-maximized' as const,\n\tUPDATE_WINDOW_CONTROLS: 'update-window-controls' as const,\n\tREQUEST_MENU_ICON: 'menu-icon:request' as const,\n\tREQUEST_APPLICATION_MENU: 'request-application-menu' as const,\n\n\t// Fire-and-forget (send/on)\n\tWINDOW_EVENT: 'window-event' as const,\n\tMENU_EVENT: 'menu-event' as const,\n\tSET_MINIMUM_SIZE: 'window-set-minimumSize' as const,\n\tGET_THEME_CONFIG: 'theme-config:get' as const,\n} as const\n\n/**\n * Extract response type for a given channel\n */\nexport type IpcResponse<C extends keyof IpcContract> = IpcContract[C]['response']\nexport type IpcRequest<C extends keyof IpcContract> = IpcContract[C]['request']\n","/* ---------------------------------------------------------------------------------------------\n *  Copyright (c) AlexTorresDev. All rights reserved.\n *  Licensed under the MIT License. See License.txt in the project root for license information.\n *-------------------------------------------------------------------------------------------- */\n\nimport { MenuItem } from 'electron'\nimport { CETMenuItem, IMenuStyle } from './item'\nimport { IMenuOptions } from './index'\nimport { $, append } from 'base/common/dom'\nimport { MenuBarOptions } from 'menubar/menubar-options'\nimport { IMenuIcons } from 'menubar'\n\nexport class CETSeparator extends CETMenuItem {\n\tprivate separatorElement?: HTMLElement\n\n\tconstructor(item: MenuItem, submenuIcons: IMenuIcons, submenuParentOptions: MenuBarOptions, submenuOptions: IMenuOptions) {\n\t\tsuper(item, submenuIcons, submenuParentOptions, submenuOptions)\n\t}\n\n\trender(container: HTMLElement) {\n\t\tif (container) {\n\t\t\tthis.separatorElement = append(container, $('a.cet-action-label.separator', { role: 'presentation' }))\n\t\t}\n\t}\n\n\tupdateStyle(style: IMenuStyle) {\n\t\tif (this.separatorElement && style.separatorColor) {\n\t\t\tthis.separatorElement.style.borderBottomColor = style.separatorColor.toString()\n\t\t}\n\t}\n}\n","/* ---------------------------------------------------------------------------------------------\n *  Copyright (c) AlexTorresDev. All rights reserved.\n *  Licensed under the MIT License. See License.txt in the project root for license information.\n *-------------------------------------------------------------------------------------------- */\n\nimport { MenuItem } from 'electron'\nimport { applyFill } from 'consts'\nimport { CETMenuItem } from './item'\nimport { IDisposable, dispose } from 'base/common/lifecycle'\nimport { $, EventHelper, EventLike, EventType, addClass, addClasses, addDisposableListener, append, hasClass, isAncestor } from 'base/common/dom'\nimport { StandardKeyboardEvent } from 'base/browser/keyboardEvent'\nimport { CETMenu, IMenuOptions } from './index'\nimport { RunOnceScheduler } from 'base/common/async'\nimport { MenuBarOptions } from 'menubar/menubar-options'\nimport { KeyCode } from 'base/common/keyCodes'\nimport { IMenuIcons } from 'menubar'\n\nexport interface ISubMenuData {\n\tparent: CETMenu;\n\tsubmenu?: CETMenu;\n}\n\nexport class CETSubMenu extends CETMenuItem {\n\tprivate mySubmenu?: CETMenu | null\n\tprivate submenuContainer?: HTMLElement\n\tprivate submenuIndicator?: HTMLElement\n\tprivate submenuDisposables: IDisposable[] = []\n\tprivate mouseOver = false\n\tprivate showScheduler: RunOnceScheduler\n\tprivate hideScheduler: RunOnceScheduler\n\tprivate _closeSubMenu = () => { }\n\n\tconstructor(item: MenuItem, private submenuIcons: IMenuIcons, private submenuItems: MenuItem[], private parentData: ISubMenuData, private submenuParentOptions: MenuBarOptions, private submenuOptions: IMenuOptions, closeSubMenu = () => { }) {\n\t\tsuper(item, submenuIcons, submenuParentOptions, submenuOptions)\n\n\t\tthis._closeSubMenu = closeSubMenu\n\n\t\tthis.showScheduler = new RunOnceScheduler(() => {\n\t\t\tif (this.mouseOver) {\n\t\t\t\tthis.cleanupExistingSubmenu(false)\n\t\t\t\tthis.createSubmenu(false)\n\t\t\t}\n\t\t}, 250)\n\n\t\tthis.hideScheduler = new RunOnceScheduler(() => {\n\t\t\tif (this.element && (!isAncestor(document.activeElement, this.element) && this.parentData.submenu === this.mySubmenu)) {\n\t\t\t\tthis.parentData.parent.focus(false)\n\t\t\t\tthis.cleanupExistingSubmenu(true)\n\t\t\t}\n\t\t}, 750)\n\t}\n\n\trender(el: HTMLElement): void {\n\t\tsuper.render(el)\n\n\t\tif (!this.itemElement) {\n\t\t\treturn\n\t\t}\n\n\t\taddClass(this.itemElement, 'cet-submenu-item')\n\t\tthis.itemElement.setAttribute('aria-haspopup', 'true')\n\n\t\tthis.submenuIndicator = append(this.itemElement, $('span.cet-submenu-indicator'))\n\t\tthis.submenuIndicator.innerHTML = this.submenuIcons.submenuIndicator\n\t\tthis.submenuIndicator.setAttribute('aria-hidden', 'true')\n\n\t\tapplyFill(this.submenuIndicator, this.menuStyle?.svgColor, this.menuStyle?.foregroundColor)\n\n\t\tif (this.element) {\n\t\t\taddDisposableListener(this.element, EventType.KEY_UP, e => {\n\t\t\t\tconst event = new StandardKeyboardEvent(e)\n\t\t\t\tif (event.equals(KeyCode.RightArrow) || event.equals(KeyCode.Enter)) {\n\t\t\t\t\tEventHelper.stop(e, true)\n\n\t\t\t\t\tthis.createSubmenu(true)\n\t\t\t\t}\n\t\t\t})\n\n\t\t\taddDisposableListener(this.element, EventType.KEY_DOWN, e => {\n\t\t\t\tconst event = new StandardKeyboardEvent(e)\n\t\t\t\tif (event.equals(KeyCode.RightArrow) || event.equals(KeyCode.Enter)) {\n\t\t\t\t\tEventHelper.stop(e, true)\n\t\t\t\t}\n\t\t\t})\n\n\t\t\taddDisposableListener(this.element, EventType.MOUSE_OVER, e => {\n\t\t\t\tif (!this.mouseOver) {\n\t\t\t\t\tthis.mouseOver = true\n\n\t\t\t\t\tthis.showScheduler.schedule()\n\t\t\t\t}\n\t\t\t})\n\n\t\t\taddDisposableListener(this.element, EventType.MOUSE_LEAVE, e => {\n\t\t\t\tthis.mouseOver = false\n\t\t\t})\n\n\t\t\taddDisposableListener(this.element, EventType.FOCUS_OUT, e => {\n\t\t\t\tif (this.element && !isAncestor(document.activeElement, this.element)) {\n\t\t\t\t\tthis.hideScheduler.schedule()\n\t\t\t\t}\n\t\t\t})\n\t\t}\n\t}\n\n\tprivate cleanupExistingSubmenu(force: boolean): void {\n\t\tif (this.parentData.submenu && (force || (this.parentData.submenu !== this.mySubmenu))) {\n\t\t\tthis.parentData.submenu.dispose()\n\t\t\tthis.parentData.submenu = undefined\n\n\t\t\tif (this.submenuContainer) {\n\t\t\t\tthis.submenuContainer = undefined\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate createSubmenu(selectFirstItem = true): void {\n\t\tif (!this.itemElement) {\n\t\t\treturn\n\t\t}\n\n\t\tif (this.element) {\n\t\t\tif (!this.parentData.submenu) {\n\t\t\t\tthis.submenuContainer = append(this.element, $('.cet-submenu'))\n\t\t\t\taddClasses(this.submenuContainer, 'cet-menubar-menu-container')\n\n\t\t\t\tthis.parentData.submenu = new CETMenu(this.submenuContainer, this.submenuIcons, this.submenuParentOptions, this.submenuOptions, this._closeSubMenu)\n\t\t\t\tthis.parentData.submenu.createMenu(this.submenuItems)\n\n\t\t\t\tif (this.menuStyle) {\n\t\t\t\t\tthis.parentData.submenu.applyStyle(this.menuStyle)\n\t\t\t\t}\n\n\t\t\t\tconst boundingRect = this.element.getBoundingClientRect()\n\t\t\t\tconst childBoundingRect = this.submenuContainer.getBoundingClientRect()\n\t\t\t\tconst computedStyles = getComputedStyle(this.parentData.parent.container)\n\t\t\t\tconst paddingTop = parseFloat(computedStyles.paddingTop || '0') || 0\n\n\t\t\t\tif (window.innerWidth <= boundingRect.right + childBoundingRect.width) {\n\t\t\t\t\tthis.submenuContainer.style.left = '10px'\n\t\t\t\t\tthis.submenuContainer.style.top = `${this.element.offsetTop + boundingRect.height}px`\n\t\t\t\t} else {\n\t\t\t\t\tthis.submenuContainer.style.left = `${this.element.offsetWidth}px`\n\t\t\t\t\tthis.submenuContainer.style.top = `${this.element.offsetTop - paddingTop}px`\n\t\t\t\t}\n\n\t\t\t\tthis.submenuDisposables.push(addDisposableListener(this.submenuContainer, EventType.KEY_UP, e => {\n\t\t\t\t\tconst event = new StandardKeyboardEvent(e)\n\t\t\t\t\tif (event.equals(KeyCode.LeftArrow)) {\n\t\t\t\t\t\tEventHelper.stop(e, true)\n\n\t\t\t\t\t\tthis.parentData.parent.focus()\n\n\t\t\t\t\t\tif (this.parentData.submenu) {\n\t\t\t\t\t\t\tthis.parentData.submenu.dispose()\n\t\t\t\t\t\t\tthis.parentData.submenu = undefined\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tthis.submenuDisposables = dispose(this.submenuDisposables)\n\t\t\t\t\t\tthis.submenuContainer = undefined\n\t\t\t\t\t}\n\t\t\t\t}))\n\n\t\t\t\tthis.submenuDisposables.push(addDisposableListener(this.submenuContainer, EventType.KEY_DOWN, e => {\n\t\t\t\t\tconst event = new StandardKeyboardEvent(e)\n\t\t\t\t\tif (event.equals(KeyCode.LeftArrow)) {\n\t\t\t\t\t\tEventHelper.stop(e, true)\n\t\t\t\t\t}\n\t\t\t\t}))\n\n\t\t\t\tthis.submenuDisposables.push(this.parentData.submenu.onDidCancel(() => {\n\t\t\t\t\tthis.parentData.parent.focus()\n\n\t\t\t\t\tif (this.parentData.submenu) {\n\t\t\t\t\t\tthis.parentData.submenu.dispose()\n\t\t\t\t\t\tthis.parentData.submenu = undefined\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.submenuDisposables = dispose(this.submenuDisposables)\n\t\t\t\t\tthis.submenuContainer = undefined\n\t\t\t\t}))\n\n\t\t\t\tthis.parentData.submenu.focus(selectFirstItem)\n\n\t\t\t\tthis.mySubmenu = this.parentData.submenu\n\t\t\t} else {\n\t\t\t\tthis.parentData.submenu.focus(false)\n\t\t\t}\n\t\t}\n\t}\n\n\tprotected applyStyle(): void {\n\t\tsuper.applyStyle()\n\n\t\tif (!this.menuStyle) return\n\n\t\tconst isSelected = this.element && hasClass(this.element, 'focused')\n\t\tconst fgColor = isSelected && this.menuStyle.selectionForegroundColor ? this.menuStyle.selectionForegroundColor : this.menuStyle.foregroundColor\n\t\tapplyFill(this.submenuIndicator, this.submenuParentOptions.svgColor, fgColor)\n\n\t\tif (this.parentData.submenu) this.parentData.submenu.applyStyle(this.menuStyle)\n\t}\n\n\tonClick(e: EventLike): void {\n\t\t// stop clicking from trying to run an action\n\t\tEventHelper.stop(e, true)\n\n\t\tthis.cleanupExistingSubmenu(false)\n\t\tthis.createSubmenu(false)\n\t}\n\n\tdispose(): void {\n\t\tsuper.dispose()\n\n\t\tthis.hideScheduler.dispose()\n\n\t\tif (this.mySubmenu) {\n\t\t\tthis.mySubmenu.dispose()\n\t\t\tthis.mySubmenu = null\n\t\t}\n\n\t\tif (this.submenuContainer) {\n\t\t\tthis.submenuDisposables = dispose(this.submenuDisposables)\n\t\t\tthis.submenuContainer = undefined\n\t\t}\n\t}\n}","/* ---------------------------------------------------------------------------------------------\n *  Copyright (c) AlexTorresDev. All rights reserved.\n *  Licensed under the MIT License. See License.txt in the project root for license information.\n *-------------------------------------------------------------------------------------------- */\n\nimport { Menu, MenuItem } from 'electron'\nimport { $, EventHelper, EventLike, EventType, addDisposableListener, append, hasClass, isAncestor, removeNode } from 'base/common/dom'\nimport { Disposable, dispose } from 'base/common/lifecycle'\nimport { CETMenuItem, IMenuItem, IMenuStyle } from './item'\nimport { KeyCode, KeyCodeUtils, KeyMod } from 'base/common/keyCodes'\nimport { StandardKeyboardEvent } from 'base/browser/keyboardEvent'\nimport { Color, RGBA } from 'base/common/color'\nimport { Emitter, Event } from 'base/common/event'\nimport { MenuBarOptions } from '../menubar-options'\nimport { CETSeparator } from './separator'\nimport { CETSubMenu, ISubMenuData } from './submenu'\nimport { isLinux, isFreeBSD } from 'base/common/platform'\nimport { IMenuIcons } from 'menubar'\n\nexport enum Direction {\n\tRight,\n\tLeft\n}\n\nexport interface IMenuOptions {\n\tariaLabel?: string\n\tenableMnemonics?: boolean\n}\n\ninterface ActionTrigger {\n\tkeys: KeyCode[]\n\tkeyDown: boolean\n}\n\nexport class CETMenu extends Disposable {\n\tprivate focusedItem?: number = undefined\n\tprivate items: IMenuItem[] = []\n\n\tprivate mnemonics: Map<KeyCode, Array<CETMenuItem>>\n\n\tprivate triggerKeys: ActionTrigger = {\n\t\tkeys: [KeyCode.Enter, KeyCode.Space],\n\t\tkeyDown: true\n\t}\n\n\tparentData: ISubMenuData = {\n\t\tparent: this\n\t}\n\n\tprivate _onDidCancel = this._register(new Emitter<void>())\n\n\tconstructor(private menuContainer: HTMLElement, private menuIcons: IMenuIcons, private parentOptions: MenuBarOptions, private currentOptions: IMenuOptions, private closeSubMenu = () => { }) {\n\t\tsuper()\n\n\t\tthis.mnemonics = new Map<KeyCode, Array<CETMenuItem>>()\n\n\t\tthis._register(addDisposableListener(this.menuContainer, EventType.KEY_DOWN, e => {\n\t\t\tconst event = new StandardKeyboardEvent(e)\n\t\t\tlet eventHandled = true\n\n\t\t\tif (event.equals(KeyCode.UpArrow)) {\n\t\t\t\tthis.focusPrevious()\n\t\t\t} else if (event.equals(KeyCode.DownArrow)) {\n\t\t\t\tthis.focusNext()\n\t\t\t} else if (event.equals(KeyCode.Escape)) {\n\t\t\t\tthis.cancel()\n\t\t\t} else if (this.isTriggerKeyEvent(event)) {\n\t\t\t\t// Staying out of the else branch even if not triggered\n\t\t\t\tif (this.triggerKeys && this.triggerKeys.keyDown) {\n\t\t\t\t\tthis.doTrigger(event)\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\teventHandled = false\n\t\t\t}\n\n\t\t\tif (eventHandled) {\n\t\t\t\tevent.preventDefault()\n\t\t\t\tevent.stopPropagation()\n\t\t\t}\n\t\t}))\n\n\t\tthis._register(addDisposableListener(this.menuContainer, EventType.KEY_UP, e => {\n\t\t\tconst event = new StandardKeyboardEvent(e)\n\n\t\t\t// Run action on Enter/Space\n\t\t\tif (this.isTriggerKeyEvent(event)) {\n\t\t\t\tif (this.triggerKeys && !this.triggerKeys.keyDown) {\n\t\t\t\t\tthis.doTrigger(event)\n\t\t\t\t}\n\n\t\t\t\tevent.preventDefault()\n\t\t\t\tevent.stopPropagation()\n\t\t\t\t// Recompute focused item\n\t\t\t} else if (event.equals(KeyCode.Tab) || event.equals(KeyMod.Shift | KeyCode.Tab)) {\n\t\t\t\tthis.updateFocusedItem()\n\t\t\t}\n\t\t}))\n\n\t\tif (this.currentOptions.enableMnemonics) {\n\t\t\tthis._register(addDisposableListener(this.menuContainer, EventType.KEY_DOWN, (e) => {\n\t\t\t\tconst key = KeyCodeUtils.fromString(e.key)\n\t\t\t\tif (this.mnemonics.has(key)) {\n\t\t\t\t\tconst items = this.mnemonics.get(key)!\n\n\t\t\t\t\tif (items.length === 1) {\n\t\t\t\t\t\tif (items[0] instanceof CETSubMenu) {\n\t\t\t\t\t\t\tthis.focusItemByElement(items[0].element)\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\titems[0].onClick(e)\n\t\t\t\t\t}\n\n\t\t\t\t\tif (items.length > 1) {\n\t\t\t\t\t\tconst item = items.shift()\n\t\t\t\t\t\tif (item) {\n\t\t\t\t\t\t\tthis.focusItemByElement(item.element)\n\t\t\t\t\t\t\titems.push(item)\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tthis.mnemonics.set(key, items)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}))\n\t\t}\n\n\t\tif (isLinux) {\n\t\t\tthis._register(addDisposableListener(this.menuContainer, EventType.KEY_DOWN, e => {\n\t\t\t\tconst event = new StandardKeyboardEvent(e)\n\n\t\t\t\tif (event.equals(KeyCode.Home) || event.equals(KeyCode.PageUp)) {\n\t\t\t\t\tthis.focusedItem = this.items.length - 1\n\t\t\t\t\tthis.focusNext()\n\t\t\t\t\tEventHelper.stop(e, true)\n\t\t\t\t} else if (event.equals(KeyCode.End) || event.equals(KeyCode.PageDown)) {\n\t\t\t\t\tthis.focusedItem = 0\n\t\t\t\t\tthis.focusPrevious()\n\t\t\t\t\tEventHelper.stop(e, true)\n\t\t\t\t}\n\t\t\t}))\n\t\t}\n\n\t\tif (isFreeBSD) {\n\t\t\tthis._register(addDisposableListener(this.menuContainer, EventType.KEY_DOWN, e => {\n\t\t\t\tconst event = new StandardKeyboardEvent(e)\n\n\t\t\t\tif (event.equals(KeyCode.Home) || event.equals(KeyCode.PageUp)) {\n\t\t\t\t\tthis.focusedItem = this.items.length - 1\n\t\t\t\t\tthis.focusNext()\n\t\t\t\t\tEventHelper.stop(e, true)\n\t\t\t\t} else if (event.equals(KeyCode.End) || event.equals(KeyCode.PageDown)) {\n\t\t\t\t\tthis.focusedItem = 0\n\t\t\t\t\tthis.focusPrevious()\n\t\t\t\t\tEventHelper.stop(e, true)\n\t\t\t\t}\n\t\t\t}))\n\t\t}\n\n\t\tthis._register(addDisposableListener(this.menuContainer, EventType.MOUSE_OUT, e => {\n\t\t\tconst relatedTarget = e.relatedTarget as HTMLElement\n\t\t\tif (!isAncestor(relatedTarget, this.menuContainer)) {\n\t\t\t\tthis.focusedItem = undefined\n\t\t\t\tthis.updateFocus()\n\t\t\t\te.stopPropagation()\n\t\t\t}\n\t\t}))\n\n\t\tthis._register(addDisposableListener(this.menuContainer, EventType.MOUSE_UP, e => {\n\t\t\t// Absorb clicks in menu dead space https://github.com/Microsoft/vscode/issues/63575\n\t\t\tEventHelper.stop(e, true)\n\t\t}))\n\n\t\tthis._register(addDisposableListener(this.menuContainer, EventType.MOUSE_OVER, e => {\n\t\t\tlet target = e.target as HTMLElement\n\n\t\t\tif (!target || !isAncestor(target, this.menuContainer) || target === this.menuContainer) {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\twhile (target.parentElement !== this.menuContainer && target.parentElement !== null) {\n\t\t\t\ttarget = target.parentElement\n\t\t\t}\n\n\t\t\tif (hasClass(target, 'cet-action-item')) {\n\t\t\t\tconst lastFocusedItem = this.focusedItem\n\t\t\t\tthis.setFocusedItem(target)\n\n\t\t\t\tif (lastFocusedItem !== this.focusedItem) {\n\t\t\t\t\tthis.updateFocus()\n\t\t\t\t}\n\t\t\t}\n\t\t}))\n\n\t\tif (this.currentOptions.ariaLabel) {\n\t\t\tthis.menuContainer.setAttribute('aria-label', this.currentOptions.ariaLabel)\n\t\t}\n\t}\n\n\ttrigger(index: number): void {\n\t\tif (index <= this.items.length && index >= 0) {\n\t\t\tconst item = this.items[index]\n\n\t\t\tif (item instanceof CETSubMenu) {\n\t\t\t\tthis.focus(index)\n\t\t\t}\n\t\t}\n\t}\n\n\tcreateMenu(menuItems: MenuItem[] | undefined) {\n\t\tif (!menuItems) return\n\n\t\tmenuItems.forEach((menuItem: MenuItem) => {\n\t\t\tif (!menuItem) return\n\n\t\t\tconst itemElement = $('li.cet-action-item', { role: 'presentation' })\n\n\t\t\t// Prevent native context menu on actions\n\t\t\tthis._register(addDisposableListener(itemElement, EventType.CONTEXT_MENU, (e: EventLike) => {\n\t\t\t\te.preventDefault()\n\t\t\t\te.stopPropagation()\n\t\t\t}))\n\n\t\t\tlet item: CETMenuItem\n\n\t\t\tif (menuItem.type === 'separator') {\n\t\t\t\titem = new CETSeparator(menuItem, this.menuIcons, this.parentOptions, this.currentOptions)\n\t\t\t} else if (menuItem.type === 'submenu' || menuItem.submenu) {\n\t\t\t\tconst submenuItems = (menuItem.submenu as Menu).items\n\t\t\t\titem = new CETSubMenu(menuItem, this.menuIcons, submenuItems, this.parentData, this.parentOptions, this.currentOptions, this.closeSubMenu)\n\n\t\t\t\tif (this.currentOptions.enableMnemonics) {\n\t\t\t\t\tconst mnemonic = item.mnemonic\n\n\t\t\t\t\tif (mnemonic && item.isEnabled()) {\n\t\t\t\t\t\tlet actionItems: CETMenuItem[] = []\n\t\t\t\t\t\tif (this.mnemonics.has(mnemonic)) {\n\t\t\t\t\t\t\tactionItems = this.mnemonics.get(mnemonic)!\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tactionItems.push(item)\n\n\t\t\t\t\t\tthis.mnemonics.set(mnemonic, actionItems)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\titem = new CETMenuItem(menuItem, this.menuIcons, this.parentOptions, this.currentOptions, this.items, this.closeSubMenu)\n\n\t\t\t\tif (this.currentOptions.enableMnemonics) {\n\t\t\t\t\tconst mnemonic = item.mnemonic\n\n\t\t\t\t\tif (mnemonic && item.isEnabled()) {\n\t\t\t\t\t\tlet actionItems: CETMenuItem[] = []\n\n\t\t\t\t\t\tif (this.mnemonics.has(mnemonic)) {\n\t\t\t\t\t\t\tactionItems = this.mnemonics.get(mnemonic)!\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tactionItems.push(item)\n\n\t\t\t\t\t\tthis.mnemonics.set(mnemonic, actionItems)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\titem.render(itemElement)\n\t\t\tthis.items.push(item)\n\t\t\tappend(this.menuContainer, itemElement)\n\t\t})\n\t}\n\n\tprivate isTriggerKeyEvent(event: StandardKeyboardEvent): boolean {\n\t\tlet ret = false\n\t\tif (this.triggerKeys) {\n\t\t\tthis.triggerKeys.keys.forEach(keyCode => {\n\t\t\t\tret = ret || event.equals(keyCode)\n\t\t\t})\n\t\t}\n\n\t\treturn ret\n\t}\n\n\tprivate updateFocusedItem(): void {\n\t\tfor (let i = 0; i < this.menuContainer.children.length; i++) {\n\t\t\tconst elem = this.menuContainer.children[i]\n\t\t\tif (isAncestor(document.activeElement, elem)) {\n\t\t\t\tthis.focusedItem = i\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}\n\n\tfocus(index?: number): void\n\tfocus(selectFirst?: boolean): void\n\tfocus(arg?: any): void {\n\t\tlet selectFirst: boolean = false\n\t\tlet index: number | undefined\n\n\t\tif (arg === undefined) {\n\t\t\tselectFirst = true\n\t\t} else if (typeof arg === 'number') {\n\t\t\tindex = arg\n\t\t} else if (typeof arg === 'boolean') {\n\t\t\tselectFirst = arg\n\t\t}\n\n\t\tif (selectFirst && typeof this.focusedItem === 'undefined') {\n\t\t\t// Focus the first enabled item\n\t\t\tthis.focusedItem = this.items.length - 1\n\t\t\tthis.focusNext()\n\t\t} else {\n\t\t\tif (index !== undefined) {\n\t\t\t\tthis.focusedItem = index\n\t\t\t}\n\n\t\t\tthis.updateFocus()\n\t\t}\n\t}\n\n\tprivate focusNext(): void {\n\t\tif (typeof this.focusedItem === 'undefined') {\n\t\t\tthis.focusedItem = this.items.length - 1\n\t\t}\n\n\t\tconst startIndex = this.focusedItem\n\t\tlet item: IMenuItem\n\n\t\tdo {\n\t\t\tthis.focusedItem = (this.focusedItem + 1) % this.items.length\n\t\t\titem = this.items[this.focusedItem]\n\t\t} while ((this.focusedItem !== startIndex && !item.isEnabled()) || item.isSeparator())\n\n\t\tif ((this.focusedItem === startIndex && !item.isEnabled()) || item.isSeparator()) {\n\t\t\tthis.focusedItem = undefined\n\t\t}\n\n\t\tthis.updateFocus()\n\t}\n\n\tprivate focusPrevious(): void {\n\t\tif (typeof this.focusedItem === 'undefined') {\n\t\t\tthis.focusedItem = 0\n\t\t}\n\n\t\tconst startIndex = this.focusedItem\n\t\tlet item: IMenuItem\n\n\t\tdo {\n\t\t\tthis.focusedItem = this.focusedItem - 1\n\n\t\t\tif (this.focusedItem < 0) {\n\t\t\t\tthis.focusedItem = this.items.length - 1\n\t\t\t}\n\n\t\t\titem = this.items[this.focusedItem]\n\t\t} while ((this.focusedItem !== startIndex && !item.isEnabled()) || item.isSeparator())\n\n\t\tif ((this.focusedItem === startIndex && !item.isEnabled()) || item.isSeparator()) {\n\t\t\tthis.focusedItem = undefined\n\t\t}\n\n\t\tthis.updateFocus()\n\t}\n\n\tprivate updateFocus() {\n\t\tif (typeof this.focusedItem === 'undefined') {\n\t\t\tthis.menuContainer.focus()\n\t\t}\n\n\t\tfor (let i = 0; i < this.items.length; i++) {\n\t\t\tconst item = this.items[i]\n\n\t\t\tif (i === this.focusedItem) {\n\t\t\t\tif (item.isEnabled()) {\n\t\t\t\t\titem.focus()\n\t\t\t\t} else {\n\t\t\t\t\tthis.menuContainer.focus()\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\titem.blur()\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate doTrigger(event: StandardKeyboardEvent): void {\n\t\tif (typeof this.focusedItem === 'undefined') {\n\t\t\treturn // nothing to focus\n\t\t}\n\n\t\t// trigger action\n\t\tconst item = this.items[this.focusedItem]\n\t\tif (item instanceof CETMenuItem) {\n\t\t\titem.onClick(event)\n\t\t}\n\t}\n\n\tprivate cancel(): void {\n\t\tif (document.activeElement instanceof HTMLElement) {\n\t\t\t(<HTMLElement>document.activeElement).blur() // remove focus from focused action\n\t\t}\n\n\t\tthis._onDidCancel.fire()\n\t}\n\n\tprivate focusItemByElement(element: HTMLElement | undefined) {\n\t\tconst lastFocusedItem = this.focusedItem\n\t\tif (element) this.setFocusedItem(element)\n\n\t\tif (lastFocusedItem !== this.focusedItem) {\n\t\t\tthis.updateFocus()\n\t\t}\n\t}\n\n\tprivate setFocusedItem(element: HTMLElement) {\n\t\tthis.focusedItem = Array.prototype.findIndex.call(this.container.children, (elem) => elem === element)\n\t}\n\n\tapplyStyle(style: IMenuStyle) {\n\t\tconst container = this.menuContainer\n\n\t\tif (style?.backgroundColor) {\n\t\t\tlet transparency = this.parentOptions?.menuTransparency!\n\n\t\t\tif (transparency < 0) transparency = 0\n\t\t\tif (transparency > 1) transparency = 1\n\t\t\tconst rgba = style.backgroundColor?.rgba\n\t\t\tcontainer.style.backgroundColor = `rgb(${rgba.r} ${rgba.g} ${rgba.b} / ${1 - transparency})`\n\t\t}\n\n\t\tif (this.items) {\n\t\t\tthis.items.forEach(item => {\n\t\t\t\tif (item instanceof CETMenuItem || item instanceof CETSeparator) {\n\t\t\t\t\titem.updateStyle(style)\n\t\t\t\t}\n\t\t\t})\n\t\t}\n\t}\n\n\tget container(): HTMLElement {\n\t\treturn this.menuContainer\n\t}\n\n\tget onDidCancel(): Event<void> {\n\t\treturn this._onDidCancel.event\n\t}\n\n\tdispose() {\n\t\tdispose(this.items)\n\t\tthis.items = []\n\n\t\tremoveNode(this.container)\n\n\t\tsuper.dispose()\n\t}\n}","/*---------------------------------------------------------------------------------------------\n *  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 * as DomUtils from 'base/common/dom';\nimport * as arrays from 'base/common/arrays';\nimport { memoize } from 'base/common/decorators';\nimport { Disposable, IDisposable, toDisposable } from 'base/common/lifecycle';\nimport { LinkedList } from 'base/common/linkedList';\n\nexport namespace EventType {\n\texport const Tap = '-monaco-gesturetap';\n\texport const Change = '-monaco-gesturechange';\n\texport const Start = '-monaco-gesturestart';\n\texport const End = '-monaco-gesturesend';\n\texport const Contextmenu = '-monaco-gesturecontextmenu';\n}\n\ninterface TouchData {\n\tid: number;\n\tinitialTarget: EventTarget;\n\tinitialTimeStamp: number;\n\tinitialPageX: number;\n\tinitialPageY: number;\n\trollingTimestamps: number[];\n\trollingPageX: number[];\n\trollingPageY: number[];\n}\n\nexport interface GestureEvent extends MouseEvent {\n\tinitialTarget: EventTarget | undefined;\n\ttranslationX: number;\n\ttranslationY: number;\n\tpageX: number;\n\tpageY: number;\n\ttapCount: number;\n}\n\ninterface Touch {\n\tidentifier: number;\n\tscreenX: number;\n\tscreenY: number;\n\tclientX: number;\n\tclientY: number;\n\tpageX: number;\n\tpageY: number;\n\tradiusX: number;\n\tradiusY: number;\n\trotationAngle: number;\n\tforce: number;\n\ttarget: Element;\n}\n\ninterface TouchList {\n\t[i: number]: Touch;\n\tlength: number;\n\titem(index: number): Touch;\n\tidentifiedTouch(id: number): Touch;\n}\n\ninterface TouchEvent extends Event {\n\ttouches: TouchList;\n\ttargetTouches: TouchList;\n\tchangedTouches: TouchList;\n}\n\nexport class Gesture extends Disposable {\n\n\tprivate static readonly SCROLL_FRICTION = -0.005;\n\tprivate static INSTANCE: Gesture;\n\tprivate static readonly HOLD_DELAY = 700;\n\n\tprivate dispatched = false;\n\tprivate readonly targets = new LinkedList<HTMLElement>();\n\tprivate readonly ignoreTargets = new LinkedList<HTMLElement>();\n\tprivate handle: IDisposable | null;\n\n\tprivate readonly activeTouches: { [id: number]: TouchData };\n\n\tprivate _lastSetTapCountTime: number;\n\n\tprivate static readonly CLEAR_TAP_COUNT_TIME = 400; // ms\n\n\n\tprivate constructor() {\n\t\tsuper();\n\n\t\tthis.activeTouches = {};\n\t\tthis.handle = null;\n\t\tthis._lastSetTapCountTime = 0;\n\t\tthis._register(DomUtils.addDisposableListener(document, 'touchstart', (e: TouchEvent) => this.onTouchStart(e), { passive: false }));\n\t\tthis._register(DomUtils.addDisposableListener(document, 'touchend', (e: TouchEvent) => this.onTouchEnd(e)));\n\t\tthis._register(DomUtils.addDisposableListener(document, 'touchmove', (e: TouchEvent) => this.onTouchMove(e), { passive: false }));\n\t}\n\n\tpublic static addTarget(element: HTMLElement): IDisposable {\n\t\tif (!Gesture.isTouchDevice()) {\n\t\t\treturn Disposable.None;\n\t\t}\n\t\tif (!Gesture.INSTANCE) {\n\t\t\tGesture.INSTANCE = new Gesture();\n\t\t}\n\n\t\tconst remove = Gesture.INSTANCE.targets.push(element);\n\t\treturn toDisposable(remove);\n\t}\n\n\tpublic static ignoreTarget(element: HTMLElement): IDisposable {\n\t\tif (!Gesture.isTouchDevice()) {\n\t\t\treturn Disposable.None;\n\t\t}\n\t\tif (!Gesture.INSTANCE) {\n\t\t\tGesture.INSTANCE = new Gesture();\n\t\t}\n\n\t\tconst remove = Gesture.INSTANCE.ignoreTargets.push(element);\n\t\treturn toDisposable(remove);\n\t}\n\n\tstatic isTouchDevice(): boolean {\n\t\t// `'ontouchstart' in window` always evaluates to true with typescript's modern typings. This causes `window` to be\n\t\t// `never` later in `window.navigator`. That's why we need the explicit `window as Window` cast\n\t\treturn 'ontouchstart' in window || navigator.maxTouchPoints > 0;\n\t}\n\n\tpublic override dispose(): void {\n\t\tif (this.handle) {\n\t\t\tthis.handle.dispose();\n\t\t\tthis.handle = null;\n\t\t}\n\n\t\tsuper.dispose();\n\t}\n\n\tprivate onTouchStart(e: TouchEvent): void {\n\t\tconst timestamp = Date.now(); // use Date.now() because on FF e.timeStamp is not epoch based.\n\n\t\tif (this.handle) {\n\t\t\tthis.handle.dispose();\n\t\t\tthis.handle = null;\n\t\t}\n\n\t\tfor (let i = 0, len = e.targetTouches.length; i < len; i++) {\n\t\t\tconst touch = e.targetTouches.item(i);\n\n\t\t\tthis.activeTouches[touch.identifier] = {\n\t\t\t\tid: touch.identifier,\n\t\t\t\tinitialTarget: touch.target,\n\t\t\t\tinitialTimeStamp: timestamp,\n\t\t\t\tinitialPageX: touch.pageX,\n\t\t\t\tinitialPageY: touch.pageY,\n\t\t\t\trollingTimestamps: [timestamp],\n\t\t\t\trollingPageX: [touch.pageX],\n\t\t\t\trollingPageY: [touch.pageY]\n\t\t\t};\n\n\t\t\tconst evt = this.newGestureEvent(EventType.Start, touch.target);\n\t\t\tevt.pageX = touch.pageX;\n\t\t\tevt.pageY = touch.pageY;\n\t\t\tthis.dispatchEvent(evt);\n\t\t}\n\n\t\tif (this.dispatched) {\n\t\t\te.preventDefault();\n\t\t\te.stopPropagation();\n\t\t\tthis.dispatched = false;\n\t\t}\n\t}\n\n\tprivate onTouchEnd(e: TouchEvent): void {\n\t\tconst timestamp = Date.now(); // use Date.now() because on FF e.timeStamp is not epoch based.\n\n\t\tconst activeTouchCount = Object.keys(this.activeTouches).length;\n\n\t\tfor (let i = 0, len = e.changedTouches.length; i < len; i++) {\n\n\t\t\tconst touch = e.changedTouches.item(i);\n\n\t\t\tif (!this.activeTouches.hasOwnProperty(String(touch.identifier))) {\n\t\t\t\tconsole.warn('move of an UNKNOWN touch', touch);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst data = this.activeTouches[touch.identifier],\n\t\t\t\tholdTime = Date.now() - data.initialTimeStamp;\n\n\t\t\tif (holdTime < Gesture.HOLD_DELAY\n\t\t\t\t&& Math.abs(data.initialPageX - arrays.tail(data.rollingPageX)) < 30\n\t\t\t\t&& Math.abs(data.initialPageY - arrays.tail(data.rollingPageY)) < 30) {\n\n\t\t\t\tconst evt = this.newGestureEvent(EventType.Tap, data.initialTarget);\n\t\t\t\tevt.pageX = arrays.tail(data.rollingPageX);\n\t\t\t\tevt.pageY = arrays.tail(data.rollingPageY);\n\t\t\t\tthis.dispatchEvent(evt);\n\n\t\t\t} else if (holdTime >= Gesture.HOLD_DELAY\n\t\t\t\t&& Math.abs(data.initialPageX - arrays.tail(data.rollingPageX)) < 30\n\t\t\t\t&& Math.abs(data.initialPageY - arrays.tail(data.rollingPageY)) < 30) {\n\n\t\t\t\tconst evt = this.newGestureEvent(EventType.Contextmenu, data.initialTarget);\n\t\t\t\tevt.pageX = arrays.tail(data.rollingPageX);\n\t\t\t\tevt.pageY = arrays.tail(data.rollingPageY);\n\t\t\t\tthis.dispatchEvent(evt);\n\n\t\t\t} else if (activeTouchCount === 1) {\n\t\t\t\tconst finalX = arrays.tail(data.rollingPageX);\n\t\t\t\tconst finalY = arrays.tail(data.rollingPageY);\n\n\t\t\t\tconst deltaT = arrays.tail(data.rollingTimestamps) - data.rollingTimestamps[0];\n\t\t\t\tconst deltaX = finalX - data.rollingPageX[0];\n\t\t\t\tconst deltaY = finalY - data.rollingPageY[0];\n\t\t\t}\n\n\n\t\t\tthis.dispatchEvent(this.newGestureEvent(EventType.End, data.initialTarget));\n\t\t\t// forget about this touch\n\t\t\tdelete this.activeTouches[touch.identifier];\n\t\t}\n\n\t\tif (this.dispatched) {\n\t\t\te.preventDefault();\n\t\t\te.stopPropagation();\n\t\t\tthis.dispatched = false;\n\t\t}\n\t}\n\n\tprivate newGestureEvent(type: string, initialTarget?: EventTarget): GestureEvent {\n\t\tconst event = document.createEvent('CustomEvent') as unknown as GestureEvent;\n\t\tevent.initEvent(type, false, true);\n\t\tevent.initialTarget = initialTarget;\n\t\tevent.tapCount = 0;\n\t\treturn event;\n\t}\n\n\tprivate dispatchEvent(event: GestureEvent): void {\n\t\tif (event.type === EventType.Tap) {\n\t\t\tconst currentTime = (new Date()).getTime();\n\t\t\tlet setTapCount = 0;\n\t\t\tif (currentTime - this._lastSetTapCountTime > Gesture.CLEAR_TAP_COUNT_TIME) {\n\t\t\t\tsetTapCount = 1;\n\t\t\t} else {\n\t\t\t\tsetTapCount = 2;\n\t\t\t}\n\n\t\t\tthis._lastSetTapCountTime = currentTime;\n\t\t\tevent.tapCount = setTapCount;\n\t\t} else if (event.type === EventType.Change || event.type === EventType.Contextmenu) {\n\t\t\t// tap is canceled by scrolling or context menu\n\t\t\tthis._lastSetTapCountTime = 0;\n\t\t}\n\t}\n\n\tprivate inertia(dispatchTo: readonly EventTarget[], t1: number, vX: number, dirX: number, x: number, vY: number, dirY: number, y: number): void {\n\t\tthis.handle = DomUtils.scheduleAtNextAnimationFrame(() => {\n\t\t\tconst now = Date.now();\n\n\t\t\t// velocity: old speed + accel_over_time\n\t\t\tconst deltaT = now - t1;\n\t\t\tlet delta_pos_x = 0, delta_pos_y = 0;\n\t\t\tlet stopped = true;\n\n\t\t\tvX += Gesture.SCROLL_FRICTION * deltaT;\n\t\t\tvY += Gesture.SCROLL_FRICTION * deltaT;\n\n\t\t\tif (vX > 0) {\n\t\t\t\tstopped = false;\n\t\t\t\tdelta_pos_x = dirX * vX * deltaT;\n\t\t\t}\n\n\t\t\tif (vY > 0) {\n\t\t\t\tstopped = false;\n\t\t\t\tdelta_pos_y = dirY * vY * deltaT;\n\t\t\t}\n\n\t\t\t// dispatch translation event\n\t\t\tconst evt = this.newGestureEvent(EventType.Change);\n\t\t\tevt.translationX = delta_pos_x;\n\t\t\tevt.translationY = delta_pos_y;\n\t\t\tdispatchTo.forEach(d => d.dispatchEvent(evt));\n\n\t\t\tif (!stopped) {\n\t\t\t\tthis.inertia(dispatchTo, now, vX, dirX, x + delta_pos_x, vY, dirY, y + delta_pos_y);\n\t\t\t}\n\t\t});\n\t}\n\n\tprivate onTouchMove(e: TouchEvent): void {\n\t\tconst timestamp = Date.now(); // use Date.now() because on FF e.timeStamp is not epoch based.\n\n\t\tfor (let i = 0, len = e.changedTouches.length; i < len; i++) {\n\n\t\t\tconst touch = e.changedTouches.item(i);\n\n\t\t\tif (!this.activeTouches.hasOwnProperty(String(touch.identifier))) {\n\t\t\t\tconsole.warn('end of an UNKNOWN touch', touch);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst data = this.activeTouches[touch.identifier];\n\n\t\t\tconst evt = this.newGestureEvent(EventType.Change, data.initialTarget);\n\t\t\tevt.translationX = touch.pageX - arrays.tail(data.rollingPageX);\n\t\t\tevt.translationY = touch.pageY - arrays.tail(data.rollingPageY);\n\t\t\tevt.pageX = touch.pageX;\n\t\t\tevt.pageY = touch.pageY;\n\t\t\tthis.dispatchEvent(evt);\n\n\t\t\t// only keep a few data points, to average the final speed\n\t\t\tif (data.rollingPageX.length > 3) {\n\t\t\t\tdata.rollingPageX.shift();\n\t\t\t\tdata.rollingPageY.shift();\n\t\t\t\tdata.rollingTimestamps.shift();\n\t\t\t}\n\n\t\t\tdata.rollingPageX.push(touch.pageX);\n\t\t\tdata.rollingPageY.push(touch.pageY);\n\t\t\tdata.rollingTimestamps.push(timestamp);\n\t\t}\n\n\t\tif (this.dispatched) {\n\t\t\te.preventDefault();\n\t\t\te.stopPropagation();\n\t\t\tthis.dispatched = false;\n\t\t}\n\t}\n}","body {\n  margin: 0 !important;\n  overflow: hidden !important;\n}\n\n/* Titlebar */\n.cet-titlebar {\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  flex-shrink: 0;\n  flex-wrap: wrap;\n  position: absolute;\n  top: 0;\n  left: 0;\n  right: 0;\n  font-size: var(--cet-font-size, 13px);\n  font-family: var(--cet-font-family, Arial, Helvetica, sans-serif);\n  box-sizing: border-box;\n  padding: 0 16px;\n  overflow: hidden;\n  -webkit-user-select: none;\n  -ms-user-select: none;\n  user-select: none;\n  zoom: 1;\n  width: 100%;\n  height: 31px;\n  line-height: 31px;\n  z-index: 99999;\n}\n\n.cet-titlebar *,\n.cet-titlebar *:before,\n.cet-titlebar *:after {\n  box-sizing: border-box;\n}\n\n.cet-titlebar.cet-windows,\n.cet-titlebar.cet-linux,\n.cet-titlebar.cet-freebsd {\n  padding: 0;\n  height: 30px;\n  line-height: 30px;\n  justify-content: left;\n  overflow: visible;\n}\n\n/* Inverted */\n.cet-titlebar.cet-inverted {\n  flex-direction: row-reverse;\n}\n\n.cet-titlebar.cet-inverted .cet-menubar,\n.cet-titlebar.cet-inverted .cet-window-controls {\n  flex-direction: row-reverse;\n  margin-left: 20px;\n  margin-right: 0;\n}\n\n/* First buttons */\n.cet-titlebar.cet-first-buttons .cet-window-controls {\n  order: -1;\n  margin: 0 5px 0 0;\n}\n\n.cet-titlebar.cet-inverted .cet-window-controls {\n  margin: 0 5px 0 0;\n}\n\n/* Shadow */\n.cet-titlebar.cet-shadow {\n  box-shadow: 0 2px 1px -1px rgba(0, 0, 0, 0.2), 0 1px 1px 0 rgba(0, 0, 0, 0.14), 0 1px 3px 0 rgba(0, 0, 0, 0.12);\n}\n\n/* Drag region */\n.cet-drag-region {\n  top: 0;\n  left: 0;\n  display: block;\n  position: absolute;\n  width: 100%;\n  height: 100%;\n  z-index: -1;\n  -webkit-app-region: drag;\n}\n\n/* Icon */\n.cet-icon {\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  width: 34px;\n  height: 30px;\n  z-index: 99;\n  overflow: hidden;\n}\n\n/* Title */\n.cet-title {\n  flex: 0 1 auto;\n  font-size: var(--cet-title-font-size, 12px);\n  overflow: hidden;\n  white-space: nowrap;\n  text-overflow: ellipsis;\n  zoom: 1;\n}\n\n/* Title alignment */\n.cet-title.cet-title-left {\n  margin-left: 8px;\n  margin-right: auto;\n}\n\n.cet-title.cet-title-right {\n  margin-left: auto;\n  margin-right: 8px;\n}\n\n.cet-title.cet-title-center {\n  position: absolute;\n  left: 50%;\n  transform: translateX(-50%);\n}\n\n.cet-title.cet-bigsur {\n  font-size: 13px;\n  font-weight: 600;\n}\n\n/* Window controls */\n.cet-window-controls {\n  display: flex;\n  flex-grow: 0;\n  flex-shrink: 0;\n  text-align: center;\n  position: relative;\n  z-index: 99;\n  -webkit-app-region: no-drag;\n  height: 30px;\n  font-family: initial !important;\n  margin-left: auto;\n}\n\n.cet-control-icon {\n  width: 2.85rem;\n}\n\n.cet-control-icon:not(.inactive):hover {\n  background-color: rgb(255 255 255 / 12%);\n}\n\n.light .cet-control-icon:not(.inactive):hover {\n  background-color: rgb(0 0 0 / 12%);\n}\n\n.cet-control-icon.inactive svg {\n  opacity: 0.4;\n}\n\n.cet-control-icon svg {\n  width: 10px;\n  height: -webkit-fill-available;\n  fill: #fff;\n  display: initial !important;\n  vertical-align: unset !important;\n}\n\n.cet-titlebar.light .cet-control-icon svg {\n  fill: #222222 !important;\n}\n\n.cet-control-close:not(.inactive):hover {\n  background-color: rgb(232 17 35 / 90%) !important;\n}\n\n.cet-control-close:not(.inactive):hover svg {\n  fill: #fff !important;\n}\n\n/* Resizer */\n.cet-resizer {\n  -webkit-app-region: no-drag;\n  position: absolute;\n}\n\n.cet-resizer.left {\n  top: 0;\n  left: 0;\n  width: 6px;\n  height: 100%;\n}\n\n.cet-resizer.top {\n  top: 0;\n  width: 100%;\n  height: 6px;\n}\n\n/* Container */\n.cet-container {\n  position: absolute;\n  left: 0;\n  right: 0;\n  bottom: 0;\n  overflow: auto;\n  z-index: 1;\n}\n\n/* MenuBar */\n.cet-menubar {\n  min-width: 0;\n  display: flex;\n  flex-shrink: 1;\n  flex-grow: 0;\n  box-sizing: border-box;\n  overflow: hidden;\n  flex-wrap: nowrap;\n  margin-right: 20px;\n}\n\n.cet-menubar.bottom {\n  order: 1;\n  width: 100%;\n  padding: 0 5px 5px;\n  margin-right: 0;\n}\n\n.cet-menubar.bottom .cet-menubar-menu-button {\n  border-radius: 4px;\n}\n\n.cet-menubar.bottom .cet-menubar-menu-button .cet-menubar-menu-title {\n  line-height: 26px;\n}\n\n.cet-menubar .cet-menubar-menu-button {\n  box-sizing: border-box;\n  padding: 0px 8px;\n  height: 100%;\n  cursor: default;\n  zoom: 1;\n  white-space: nowrap;\n  -webkit-app-region: no-drag;\n  outline: 0;\n}\n\n.cet-menubar .cet-menubar-menu-button .cet-menubar-menu-title {\n  font-size: var(--cet-menu-font-size, 12px);\n}\n\n.cet-menubar .cet-menubar-menu-title.cet-toggle-more {\n  font-weight: 700;\n  letter-spacing: 1px;\n}\n\n.cet-menubar .cet-menubar-menu-button.disabled {\n  opacity: 0.4;\n}\n\n.cet-menubar .cet-menubar-menu-button:not(.disabled):hover,\n.cet-menubar .cet-menubar-menu-button:not(.disabled).open {\n  background-color: rgb(255 255 255 / 12%);\n}\n\n.cet-titlebar.light .cet-menubar .cet-menubar-menu-button:not(.disabled):hover,\n.cet-titlebar.light .cet-menubar .cet-menubar-menu-button:not(.disabled).open {\n  background-color: rgb(0 0 0 / 12%);\n}\n\n.cet-menubar-menu-container {\n  position: absolute;\n  display: block;\n  left: 0px;\n  opacity: 1;\n  outline: 0;\n  border: none;\n  text-align: left;\n  margin: 0 auto;\n  margin-left: 0;\n  font-size: inherit;\n  overflow-x: visible;\n  overflow-y: visible;\n  -webkit-overflow-scrolling: touch;\n  justify-content: flex-end;\n  white-space: nowrap;\n  border-radius: 7px;\n  backdrop-filter: blur(10px);\n  box-shadow: 0 5px 5px -3px rgba(0, 0, 0, 0.2), 0 8px 10px 1px rgba(0, 0, 0, 0.14), 0 3px 14px 2px rgba(0, 0, 0, 0.12);\n  z-index: 99999;\n}\n\n.cet-menubar-menu-container::-webkit-scrollbar {\n  width: 8px;\n  height: 4px;\n  cursor: pointer;\n  background-color: rgba(0, 0, 0, 0);\n}\n\n.cet-menubar-menu-container::-webkit-scrollbar-track {\n  border: none;\n  background-color: rgba(0, 0, 0, 0);\n}\n\n.cet-menubar-menu-container::-webkit-scrollbar-thumb {\n  border-radius: 10px;\n  background-color: rgba(110, 110, 110, 0.2);\n}\n\n.cet-menubar-menu-container:focus {\n  outline: 0;\n}\n\n.cet-menubar-menu-container .cet-action-item {\n  padding: 0;\n  margin: 0;\n  transform: none;\n  display: -ms-flexbox;\n  display: flex;\n  outline: none;\n}\n\n.cet-menubar-menu-container .cet-action-item.active {\n  transform: none;\n}\n\n.cet-menubar-menu-container .cet-action-item.disabled .cet-action-menu-item {\n  opacity: 0.4;\n}\n\n.cet-menubar-menu-container .cet-action-item .cet-submenu {\n  position: absolute;\n}\n\n.cet-menubar-menu-container .cet-action-menu-item {\n  -ms-flex: 1 1 auto;\n  flex: 1 1 auto;\n  display: -ms-flexbox;\n  display: flex;\n  height: 2.231em;\n  margin: 4px 3px;\n  align-items: center;\n  position: relative;\n  border-radius: 4px;\n  text-decoration: none;\n}\n\n.cet-menubar-menu-container .cet-action-label {\n  -ms-flex: 1 1 auto;\n  flex: 1 1 auto;\n  text-decoration: none;\n  padding: 0 1em;\n  background: none;\n  font-size: 12px;\n  line-height: 1;\n}\n\n.cet-menubar-menu-container .cet-action-label:not(.separator) {\n  display: inline-block;\n  -webkit-box-sizing: border-box;\n  -o-box-sizing: border-box;\n  -moz-box-sizing: border-box;\n  -ms-box-sizing: border-box;\n  box-sizing: border-box;\n  margin: 0;\n  padding: 0 2em 0 0.8em;\n}\n\n.cet-menubar-menu-container .cet-action-label.separator {\n  opacity: 0.1;\n  font-size: inherit;\n  width: 100%;\n  border-bottom: 1px solid transparent;\n}\n\n.cet-menubar-menu-container .cet-action-label.separator.text {\n  padding: 0.7em 1em 0.1em 1em;\n  font-weight: bold;\n  opacity: 1;\n}\n\n.cet-menubar-menu-container .cet-action-label:hover {\n  color: inherit;\n}\n\n.cet-menubar-menu-container .keybinding,\n.cet-menubar-menu-container .cet-submenu-indicator {\n  display: inline-block;\n  -ms-flex: 2 1 auto;\n  flex: 2 1 auto;\n  padding: 0 2em 0 1em;\n  text-align: right;\n  font-size: 11px;\n  line-height: 1;\n}\n\n.cet-menubar-menu-container .cet-submenu-indicator {\n  position: absolute;\n  right: 4px;\n  height: 12px;\n  width: 12px;\n  padding: 0;\n}\n\n.cet-menubar-menu-container .cet-submenu-indicator img,\n.cet-menubar-menu-container .cet-menu-item-icon .icon,\n.cet-menubar-menu-container .cet-submenu-indicator svg,\n.cet-menubar-menu-container .cet-menu-item-icon svg {\n  display: inherit;\n  width: 100%;\n  height: 100%;\n}\n\n.cet-menubar-menu-container .cet-action-menu-item.checked>.cet-menu-item-icon.checkbox {\n  visibility: visible;\n}\n\n.cet-menubar-menu-container .cet-menu-item-icon {\n  width: 14px;\n  height: 14px;\n  margin: 0 0 0 12px;\n}\n\n.cet-menubar-menu-container .cet-menu-item-icon.checkbox {\n  visibility: hidden;\n}","","","/* ---------------------------------------------------------------------------------------------\n *  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 { toDisposable, IDisposable, Disposable } from 'base/common/lifecycle'\nimport baseTheme from '../../static/theme/base.css?raw'\nimport macTheme from '../../static/theme/mac.css?raw'\nimport winTheme from '../../static/theme/win.css?raw'\n\nexport interface CssStyle {\n  addRule(rule: string): void\n}\n\nexport interface Theme {\n  (collector: CssStyle): void\n}\n\nclass ThemingRegistry extends Disposable {\n  private readonly theming: Theme[] = []\n\n  constructor() {\n    super()\n  }\n\n  protected onThemeChange(theme: Theme): IDisposable {\n    this.theming.push(theme)\n    return toDisposable(() => {\n      const idx = this.theming.indexOf(theme)\n      this.theming.splice(idx, 1)\n    })\n  }\n\n  protected getTheming(): Theme[] {\n    return this.theming\n  }\n}\n\nexport class ThemeBar extends ThemingRegistry {\n  constructor() {\n    super()\n\t\t\n    this.registerTheme((collector: CssStyle) => {\n      collector.addRule(baseTheme)\n    })\n  }\n\n  protected registerTheme(theme: Theme) {\n    this.onThemeChange(theme)\n\n    const cssRules: string[] = []\n    const hasRule: { [rule: string]: boolean } = {}\n    const ruleCollector = {\n      addRule: (rule: string) => {\n        if (!hasRule[rule]) {\n          cssRules.push(rule)\n          hasRule[rule] = true\n        }\n      }\n    }\n\n    this.getTheming().forEach((p) => p(ruleCollector))\n\n    _applyRules(cssRules.join('\\n'), 'titlebar-style')\n  }\n\n  static get win(): Theme {\n    return (collector: CssStyle) => {\n      collector.addRule(winTheme)\n    }\n  }\n\n  static get mac(): Theme {\n    return (collector: CssStyle) => {\n      collector.addRule(macTheme)\n    }\n  }\n}\n\nfunction _applyRules(styleSheetContent: string, rulesClassName: string) {\n  const themeStyles = document.head.getElementsByClassName(rulesClassName)\n\n  if (themeStyles.length === 0) {\n    const styleElement = document.createElement('style')\n    styleElement.className = rulesClassName\n    styleElement.innerHTML = styleSheetContent\n    document.head.appendChild(styleElement)\n  } else {\n    ;(<HTMLStyleElement>themeStyles[0]).innerHTML = styleSheetContent\n  }\n}\n","/* ---------------------------------------------------------------------------------------------\n *  Copyright (c) AlexTorresDev. All rights reserved.\n *  Licensed under the MIT License. See License.txt in the project root for license information.\n *-------------------------------------------------------------------------------------------- */\n\nimport { TitlebarThemeConfig, TitlebarThemeColors } from './options'\n\nexport const TITLEBAR_THEME_CONFIG_VERSION = 1 as const\n\ntype UnknownRecord = Record<string, unknown>\n\nexport interface VersionedTitlebarThemeConfig extends TitlebarThemeConfig {\n\tversion?: number\n}\n\nexport interface ThemeConfigNormalizationResult {\n\tconfig: TitlebarThemeConfig | null\n\twarnings: string[]\n}\n\nfunction asRecord(input: unknown): UnknownRecord | null {\n\tif (!input || typeof input !== 'object' || Array.isArray(input)) {\n\t\treturn null\n\t}\n\n\treturn input as UnknownRecord\n}\n\nfunction asString(input: unknown): string | undefined {\n\tif (typeof input !== 'string') {\n\t\treturn undefined\n\t}\n\n\tconst value = input.trim()\n\treturn value.length ? value : undefined\n}\n\nfunction asFiniteNumber(input: unknown): number | undefined {\n\tif (typeof input !== 'number' || !Number.isFinite(input)) {\n\t\treturn undefined\n\t}\n\n\treturn input\n}\n\nfunction sanitizeColors(input: unknown): TitlebarThemeColors | undefined {\n\tconst source = asRecord(input)\n\tif (!source) {\n\t\treturn undefined\n\t}\n\n\tconst colors: TitlebarThemeColors = {\n\t\ttitlebar: asString(source.titlebar),\n\t\ttitlebarForeground: asString(source.titlebarForeground),\n\t\tmenuBar: asString(source.menuBar),\n\t\tmenuItemSelection: asString(source.menuItemSelection),\n\t\tmenuSeparator: asString(source.menuSeparator),\n\t\tsvg: asString(source.svg)\n\t}\n\n\tconst hasAnyColor = !!(\n\t\tcolors.titlebar ||\n\t\tcolors.titlebarForeground ||\n\t\tcolors.menuBar ||\n\t\tcolors.menuItemSelection ||\n\t\tcolors.menuSeparator ||\n\t\tcolors.svg\n\t)\n\n\treturn hasAnyColor ? colors : undefined\n}\n\nexport function normalizeThemeConfig(input: unknown): ThemeConfigNormalizationResult {\n\tconst warnings: string[] = []\n\tconst source = asRecord(input)\n\tif (!source) {\n\t\treturn { config: null, warnings: ['Theme config must be a JSON object.'] }\n\t}\n\n\tconst requestedVersion = asFiniteNumber(source.version)\n\tif (requestedVersion !== undefined && requestedVersion !== TITLEBAR_THEME_CONFIG_VERSION) {\n\t\twarnings.push(`Theme config version ${requestedVersion} is not fully supported. Falling back to v${TITLEBAR_THEME_CONFIG_VERSION} compatible fields.`)\n\t}\n\n\tconst config: VersionedTitlebarThemeConfig = {\n\t\tfontFamily: asString(source.fontFamily),\n\t\tfontSize: asFiniteNumber(source.fontSize),\n\t\tcolors: sanitizeColors(source.colors)\n\t}\n\n\tconst hasConfig = !!(config.fontFamily || config.fontSize !== undefined || config.colors)\n\tif (!hasConfig) {\n\t\treturn { config: null, warnings: warnings.concat('No supported theme fields found in config.') }\n\t}\n\n\treturn { config, warnings }\n}\n","/* ---------------------------------------------------------------------------------------------\n *  Copyright (c) AlexTorresDev. All rights reserved.\n *  Licensed under the MIT License. See License.txt in the project root for license information.\n *-------------------------------------------------------------------------------------------- */\n\nimport { CustomTitlebar } from './titlebar'\nimport { Color } from 'base/common/color'\nimport type { TitleBarOptions, TitlebarThemeConfig } from './titlebar/options'\n\nexport const createTitlebar = (options: TitleBarOptions = {}) => new CustomTitlebar(options)\n\nexport const createTitlebarOnDOMContentLoaded = (options: TitleBarOptions = {}) => {\n\tif (document.readyState === 'loading') {\n\t\treturn new Promise<CustomTitlebar>((resolve) => {\n\t\t\twindow.addEventListener('DOMContentLoaded', () => resolve(new CustomTitlebar(options)), { once: true })\n\t\t})\n\t}\n\n\treturn Promise.resolve(new CustomTitlebar(options))\n}\n\nexport {\n\tCustomTitlebar,\n\tCustomTitlebar as Titlebar,\n\tColor as TitlebarColor\n}\n\nexport type {\n\tTitleBarOptions,\n\tTitlebarThemeConfig\n}\n"],"mappings":"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","names":["ipcRenderer","Color","Format","CSS","Iterator","Node","Event","map","filter","buffer","emitter","count","stack","event","userAgent","platform","KeyCodeUtils","callback","getComputedStyle","getComputedStyle","ipcRenderer","menuIcons","menuIcons","EventType","$","menuIcons","$","EventType","ipcRenderer","ipcRenderer","backgroundColor","foregroundColor"]}