{"version":3,"sources":["jsdelivr-header.js","/npm/hotkeys-js@3.13.11/dist/hotkeys.esm.js"],"names":[],"mappings":"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","file":"/npm/hotkeys-js@3.13.11/dist/hotkeys.esm.js/+esm","sourceRoot":"","sourcesContent":["/**\n * Bundled by jsDelivr using Rollup v2.79.2 and Terser v5.39.0.\n * Original file: /npm/hotkeys-js@3.13.11/dist/hotkeys.esm.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","/**! \n * hotkeys-js v3.13.11 \n * A simple micro-library for defining and dispatching keyboard shortcuts. It has no dependencies. \n * \n * Copyright (c) 2025 kenny wong <wowohoo@qq.com> \n * https://github.com/jaywcjlove/hotkeys-js.git \n * \n * @website: https://jaywcjlove.github.io/hotkeys-js\n \n * Licensed under the MIT license \n */\n\nconst isff = typeof navigator !== 'undefined' ? navigator.userAgent.toLowerCase().indexOf('firefox') > 0 : false;\n\n// 绑定事件\nfunction addEvent(object, event, method, useCapture) {\n  if (object.addEventListener) {\n    object.addEventListener(event, method, useCapture);\n  } else if (object.attachEvent) {\n    object.attachEvent(\"on\".concat(event), method);\n  }\n}\nfunction removeEvent(object, event, method, useCapture) {\n  if (object.removeEventListener) {\n    object.removeEventListener(event, method, useCapture);\n  } else if (object.detachEvent) {\n    object.detachEvent(\"on\".concat(event), method);\n  }\n}\n\n// 修饰键转换成对应的键码\nfunction getMods(modifier, key) {\n  const mods = key.slice(0, key.length - 1);\n  for (let i = 0; i < mods.length; i++) mods[i] = modifier[mods[i].toLowerCase()];\n  return mods;\n}\n\n// 处理传的key字符串转换成数组\nfunction getKeys(key) {\n  if (typeof key !== 'string') key = '';\n  key = key.replace(/\\s/g, ''); // 匹配任何空白字符,包括空格、制表符、换页符等等\n  const keys = key.split(','); // 同时设置多个快捷键，以','分割\n  let index = keys.lastIndexOf('');\n\n  // 快捷键可能包含','，需特殊处理\n  for (; index >= 0;) {\n    keys[index - 1] += ',';\n    keys.splice(index, 1);\n    index = keys.lastIndexOf('');\n  }\n  return keys;\n}\n\n// 比较修饰键的数组\nfunction compareArray(a1, a2) {\n  const arr1 = a1.length >= a2.length ? a1 : a2;\n  const arr2 = a1.length >= a2.length ? a2 : a1;\n  let isIndex = true;\n  for (let i = 0; i < arr1.length; i++) {\n    if (arr2.indexOf(arr1[i]) === -1) isIndex = false;\n  }\n  return isIndex;\n}\n\n// Special Keys\nconst _keyMap = {\n  backspace: 8,\n  '⌫': 8,\n  tab: 9,\n  clear: 12,\n  enter: 13,\n  '↩': 13,\n  return: 13,\n  esc: 27,\n  escape: 27,\n  space: 32,\n  left: 37,\n  up: 38,\n  right: 39,\n  down: 40,\n  del: 46,\n  delete: 46,\n  ins: 45,\n  insert: 45,\n  home: 36,\n  end: 35,\n  pageup: 33,\n  pagedown: 34,\n  capslock: 20,\n  num_0: 96,\n  num_1: 97,\n  num_2: 98,\n  num_3: 99,\n  num_4: 100,\n  num_5: 101,\n  num_6: 102,\n  num_7: 103,\n  num_8: 104,\n  num_9: 105,\n  num_multiply: 106,\n  num_add: 107,\n  num_enter: 108,\n  num_subtract: 109,\n  num_decimal: 110,\n  num_divide: 111,\n  '⇪': 20,\n  ',': 188,\n  '.': 190,\n  '/': 191,\n  '`': 192,\n  '-': isff ? 173 : 189,\n  '=': isff ? 61 : 187,\n  ';': isff ? 59 : 186,\n  '\\'': 222,\n  '[': 219,\n  ']': 221,\n  '\\\\': 220\n};\n\n// Modifier Keys\nconst _modifier = {\n  // shiftKey\n  '⇧': 16,\n  shift: 16,\n  // altKey\n  '⌥': 18,\n  alt: 18,\n  option: 18,\n  // ctrlKey\n  '⌃': 17,\n  ctrl: 17,\n  control: 17,\n  // metaKey\n  '⌘': 91,\n  cmd: 91,\n  command: 91\n};\nconst modifierMap = {\n  16: 'shiftKey',\n  18: 'altKey',\n  17: 'ctrlKey',\n  91: 'metaKey',\n  shiftKey: 16,\n  ctrlKey: 17,\n  altKey: 18,\n  metaKey: 91\n};\nconst _mods = {\n  16: false,\n  18: false,\n  17: false,\n  91: false\n};\nconst _handlers = {};\n\n// F1~F12 special key\nfor (let k = 1; k < 20; k++) {\n  _keyMap[\"f\".concat(k)] = 111 + k;\n}\n\nlet _downKeys = []; // 记录摁下的绑定键\nlet winListendFocus = null; // window是否已经监听了focus事件\nlet _scope = 'all'; // 默认热键范围\nconst elementEventMap = new Map(); // 已绑定事件的节点记录\n\n// 返回键码\nconst code = x => _keyMap[x.toLowerCase()] || _modifier[x.toLowerCase()] || x.toUpperCase().charCodeAt(0);\nconst getKey = x => Object.keys(_keyMap).find(k => _keyMap[k] === x);\nconst getModifier = x => Object.keys(_modifier).find(k => _modifier[k] === x);\n\n// 设置获取当前范围（默认为'所有'）\nfunction setScope(scope) {\n  _scope = scope || 'all';\n}\n// 获取当前范围\nfunction getScope() {\n  return _scope || 'all';\n}\n// 获取摁下绑定键的键值\nfunction getPressedKeyCodes() {\n  return _downKeys.slice(0);\n}\nfunction getPressedKeyString() {\n  return _downKeys.map(c => getKey(c) || getModifier(c) || String.fromCharCode(c));\n}\nfunction getAllKeyCodes() {\n  const result = [];\n  Object.keys(_handlers).forEach(k => {\n    _handlers[k].forEach(_ref => {\n      let {\n        key,\n        scope,\n        mods,\n        shortcut\n      } = _ref;\n      result.push({\n        scope,\n        shortcut,\n        mods,\n        keys: key.split('+').map(v => code(v))\n      });\n    });\n  });\n  return result;\n}\n\n// 表单控件控件判断 返回 Boolean\n// hotkey is effective only when filter return true\nfunction filter(event) {\n  const target = event.target || event.srcElement;\n  const {\n    tagName\n  } = target;\n  let flag = true;\n  const isInput = tagName === 'INPUT' && !['checkbox', 'radio', 'range', 'button', 'file', 'reset', 'submit', 'color'].includes(target.type);\n  // ignore: isContentEditable === 'true', <input> and <textarea> when readOnly state is false, <select>\n  if (target.isContentEditable || (isInput || tagName === 'TEXTAREA' || tagName === 'SELECT') && !target.readOnly) {\n    flag = false;\n  }\n  return flag;\n}\n\n// 判断摁下的键是否为某个键，返回true或者false\nfunction isPressed(keyCode) {\n  if (typeof keyCode === 'string') {\n    keyCode = code(keyCode); // 转换成键码\n  }\n  return _downKeys.indexOf(keyCode) !== -1;\n}\n\n// 循环删除handlers中的所有 scope(范围)\nfunction deleteScope(scope, newScope) {\n  let handlers;\n  let i;\n\n  // 没有指定scope，获取scope\n  if (!scope) scope = getScope();\n  for (const key in _handlers) {\n    if (Object.prototype.hasOwnProperty.call(_handlers, key)) {\n      handlers = _handlers[key];\n      for (i = 0; i < handlers.length;) {\n        if (handlers[i].scope === scope) {\n          const deleteItems = handlers.splice(i, 1);\n          deleteItems.forEach(_ref2 => {\n            let {\n              element\n            } = _ref2;\n            return removeKeyEvent(element);\n          });\n        } else {\n          i++;\n        }\n      }\n    }\n  }\n\n  // 如果scope被删除，将scope重置为all\n  if (getScope() === scope) setScope(newScope || 'all');\n}\n\n// 清除修饰键\nfunction clearModifier(event) {\n  let key = event.keyCode || event.which || event.charCode;\n  if (event.key) {\n    // Ensure that when capturing keystrokes in modern browsers,\n    // uppercase and lowercase letters (such as R and r) return the same key value.\n    // https://github.com/jaywcjlove/hotkeys-js/pull/514\n    // https://developer.mozilla.org/zh-CN/docs/Web/API/KeyboardEvent/key\n    key = code(event.key);\n  }\n  const i = _downKeys.indexOf(key);\n\n  // 从列表中清除按压过的键\n  if (i >= 0) {\n    _downKeys.splice(i, 1);\n  }\n  // 特殊处理 cmmand 键，在 cmmand 组合快捷键 keyup 只执行一次的问题\n  if (event.key && event.key.toLowerCase() === 'meta') {\n    _downKeys.splice(0, _downKeys.length);\n  }\n\n  // 修饰键 shiftKey altKey ctrlKey (command||metaKey) 清除\n  if (key === 93 || key === 224) key = 91;\n  if (key in _mods) {\n    _mods[key] = false;\n\n    // 将修饰键重置为false\n    for (const k in _modifier) if (_modifier[k] === key) hotkeys[k] = false;\n  }\n}\nfunction unbind(keysInfo) {\n  // unbind(), unbind all keys\n  if (typeof keysInfo === 'undefined') {\n    Object.keys(_handlers).forEach(key => {\n      Array.isArray(_handlers[key]) && _handlers[key].forEach(info => eachUnbind(info));\n      delete _handlers[key];\n    });\n    removeKeyEvent(null);\n  } else if (Array.isArray(keysInfo)) {\n    // support like : unbind([{key: 'ctrl+a', scope: 's1'}, {key: 'ctrl-a', scope: 's2', splitKey: '-'}])\n    keysInfo.forEach(info => {\n      if (info.key) eachUnbind(info);\n    });\n  } else if (typeof keysInfo === 'object') {\n    // support like unbind({key: 'ctrl+a, ctrl+b', scope:'abc'})\n    if (keysInfo.key) eachUnbind(keysInfo);\n  } else if (typeof keysInfo === 'string') {\n    for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n      args[_key - 1] = arguments[_key];\n    }\n    // support old method\n    // eslint-disable-line\n    let [scope, method] = args;\n    if (typeof scope === 'function') {\n      method = scope;\n      scope = '';\n    }\n    eachUnbind({\n      key: keysInfo,\n      scope,\n      method,\n      splitKey: '+'\n    });\n  }\n}\n\n// 解除绑定某个范围的快捷键\nconst eachUnbind = _ref3 => {\n  let {\n    key,\n    scope,\n    method,\n    splitKey = '+'\n  } = _ref3;\n  const multipleKeys = getKeys(key);\n  multipleKeys.forEach(originKey => {\n    const unbindKeys = originKey.split(splitKey);\n    const len = unbindKeys.length;\n    const lastKey = unbindKeys[len - 1];\n    const keyCode = lastKey === '*' ? '*' : code(lastKey);\n    if (!_handlers[keyCode]) return;\n    // 判断是否传入范围，没有就获取范围\n    if (!scope) scope = getScope();\n    const mods = len > 1 ? getMods(_modifier, unbindKeys) : [];\n    const unbindElements = [];\n    _handlers[keyCode] = _handlers[keyCode].filter(record => {\n      // 通过函数判断，是否解除绑定，函数相等直接返回\n      const isMatchingMethod = method ? record.method === method : true;\n      const isUnbind = isMatchingMethod && record.scope === scope && compareArray(record.mods, mods);\n      if (isUnbind) unbindElements.push(record.element);\n      return !isUnbind;\n    });\n    unbindElements.forEach(element => removeKeyEvent(element));\n  });\n};\n\n// 对监听对应快捷键的回调函数进行处理\nfunction eventHandler(event, handler, scope, element) {\n  if (handler.element !== element) {\n    return;\n  }\n  let modifiersMatch;\n\n  // 看它是否在当前范围\n  if (handler.scope === scope || handler.scope === 'all') {\n    // 检查是否匹配修饰符（如果有返回true）\n    modifiersMatch = handler.mods.length > 0;\n    for (const y in _mods) {\n      if (Object.prototype.hasOwnProperty.call(_mods, y)) {\n        if (!_mods[y] && handler.mods.indexOf(+y) > -1 || _mods[y] && handler.mods.indexOf(+y) === -1) {\n          modifiersMatch = false;\n        }\n      }\n    }\n\n    // 调用处理程序，如果是修饰键不做处理\n    if (handler.mods.length === 0 && !_mods[16] && !_mods[18] && !_mods[17] && !_mods[91] || modifiersMatch || handler.shortcut === '*') {\n      handler.keys = [];\n      handler.keys = handler.keys.concat(_downKeys);\n      if (handler.method(event, handler) === false) {\n        if (event.preventDefault) event.preventDefault();else event.returnValue = false;\n        if (event.stopPropagation) event.stopPropagation();\n        if (event.cancelBubble) event.cancelBubble = true;\n      }\n    }\n  }\n}\n\n// 处理keydown事件\nfunction dispatch(event, element) {\n  const asterisk = _handlers['*'];\n  let key = event.keyCode || event.which || event.charCode;\n\n  // Ensure that when capturing keystrokes in modern browsers,\n  // uppercase and lowercase letters (such as R and r) return the same key value.\n  // https://github.com/jaywcjlove/hotkeys-js/pull/514\n  // https://developer.mozilla.org/zh-CN/docs/Web/API/KeyboardEvent/key\n  if (event.key) {\n    key = code(event.key);\n  }\n  // CapsLock key\n  // There's an issue where `keydown` and `keyup` events are not triggered after CapsLock is enabled to activate uppercase.\n  // https://github.com/jaywcjlove/hotkeys-js/pull/514\n  // https://developer.mozilla.org/zh-CN/docs/Web/API/KeyboardEvent/key\n  if (key === _keyMap.capslock) {\n    return;\n  }\n\n  // 表单控件过滤 默认表单控件不触发快捷键\n  if (!hotkeys.filter.call(this, event)) return;\n\n  // Gecko(Firefox)的command键值224，在Webkit(Chrome)中保持一致\n  // Webkit左右 command 键值不一样\n  if (key === 93 || key === 224) key = 91;\n\n  /**\n   * Collect bound keys\n   * If an Input Method Editor is processing key input and the event is keydown, return 229.\n   * https://stackoverflow.com/questions/25043934/is-it-ok-to-ignore-keydown-events-with-keycode-229\n   * http://lists.w3.org/Archives/Public/www-dom/2010JulSep/att-0182/keyCode-spec.html\n   */\n  if (_downKeys.indexOf(key) === -1 && key !== 229) _downKeys.push(key);\n  /**\n   * Jest test cases are required.\n   * ===============================\n   */\n  ['metaKey', 'ctrlKey', 'altKey', 'shiftKey'].forEach(keyName => {\n    const keyNum = modifierMap[keyName];\n    if (event[keyName] && _downKeys.indexOf(keyNum) === -1) {\n      _downKeys.push(keyNum);\n    } else if (!event[keyName] && _downKeys.indexOf(keyNum) > -1) {\n      _downKeys.splice(_downKeys.indexOf(keyNum), 1);\n    } else if (keyName === 'metaKey' && event[keyName]) {\n      // 如果command被按下，那就清空所有除event按键外的非装饰键。\n      // 因为command被按下的情况下非装饰键的keyup永远都不会触发。这是已知的浏览器限制。\n      // If command key is pressed, clear all non-decorating keys except for key in event.\n      // This is because keyup for a non-decorating key will NEVER be triggered when command is pressed.\n      // This is a known browser limitation.\n      _downKeys = _downKeys.filter(k => k in modifierMap || k === key);\n    }\n  });\n  /**\n   * -------------------------------\n   */\n  if (key in _mods) {\n    _mods[key] = true;\n    // 将特殊字符的key注册到 hotkeys 上\n    for (const k in _modifier) {\n      if (Object.prototype.hasOwnProperty.call(_modifier, k)) {\n        const eventKey = modifierMap[_modifier[k]];\n        hotkeys[k] = event[eventKey];\n      }\n    }\n    if (!asterisk) return;\n  }\n\n  // 将 modifierMap 里面的修饰键绑定到 event 中\n  for (const e in _mods) {\n    if (Object.prototype.hasOwnProperty.call(_mods, e)) {\n      _mods[e] = event[modifierMap[e]];\n    }\n  }\n  /**\n   * https://github.com/jaywcjlove/hotkeys/pull/129\n   * This solves the issue in Firefox on Windows where hotkeys corresponding to special characters would not trigger.\n   * An example of this is ctrl+alt+m on a Swedish keyboard which is used to type μ.\n   * Browser support: https://caniuse.com/#feat=keyboardevent-getmodifierstate\n   */\n  if (event.getModifierState && !(event.altKey && !event.ctrlKey) && event.getModifierState('AltGraph')) {\n    if (_downKeys.indexOf(17) === -1) {\n      _downKeys.push(17);\n    }\n    if (_downKeys.indexOf(18) === -1) {\n      _downKeys.push(18);\n    }\n    _mods[17] = true;\n    _mods[18] = true;\n  }\n\n  // 获取范围 默认为 `all`\n  const scope = getScope();\n  // 对任何快捷键都需要做的处理\n  if (asterisk) {\n    for (let i = 0; i < asterisk.length; i++) {\n      if (asterisk[i].scope === scope && (event.type === 'keydown' && asterisk[i].keydown || event.type === 'keyup' && asterisk[i].keyup)) {\n        eventHandler(event, asterisk[i], scope, element);\n      }\n    }\n  }\n  // key 不在 _handlers 中返回\n  if (!(key in _handlers)) return;\n  const handlerKey = _handlers[key];\n  const keyLen = handlerKey.length;\n  for (let i = 0; i < keyLen; i++) {\n    if (event.type === 'keydown' && handlerKey[i].keydown || event.type === 'keyup' && handlerKey[i].keyup) {\n      if (handlerKey[i].key) {\n        const record = handlerKey[i];\n        const {\n          splitKey\n        } = record;\n        const keyShortcut = record.key.split(splitKey);\n        const _downKeysCurrent = []; // 记录当前按键键值\n        for (let a = 0; a < keyShortcut.length; a++) {\n          _downKeysCurrent.push(code(keyShortcut[a]));\n        }\n        if (_downKeysCurrent.sort().join('') === _downKeys.sort().join('')) {\n          // 找到处理内容\n          eventHandler(event, record, scope, element);\n        }\n      }\n    }\n  }\n}\nfunction hotkeys(key, option, method) {\n  _downKeys = [];\n  const keys = getKeys(key); // 需要处理的快捷键列表\n  let mods = [];\n  let scope = 'all'; // scope默认为all，所有范围都有效\n  let element = document; // 快捷键事件绑定节点\n  let i = 0;\n  let keyup = false;\n  let keydown = true;\n  let splitKey = '+';\n  let capture = false;\n  let single = false; // 单个callback\n\n  // 对为设定范围的判断\n  if (method === undefined && typeof option === 'function') {\n    method = option;\n  }\n  if (Object.prototype.toString.call(option) === '[object Object]') {\n    if (option.scope) scope = option.scope; // eslint-disable-line\n    if (option.element) element = option.element; // eslint-disable-line\n    if (option.keyup) keyup = option.keyup; // eslint-disable-line\n    if (option.keydown !== undefined) keydown = option.keydown; // eslint-disable-line\n    if (option.capture !== undefined) capture = option.capture; // eslint-disable-line\n    if (typeof option.splitKey === 'string') splitKey = option.splitKey; // eslint-disable-line\n    if (option.single === true) single = true; // eslint-disable-line\n  }\n  if (typeof option === 'string') scope = option;\n\n  // 如果只允许单个callback，先unbind\n  if (single) unbind(key, scope);\n\n  // 对于每个快捷键进行处理\n  for (; i < keys.length; i++) {\n    key = keys[i].split(splitKey); // 按键列表\n    mods = [];\n\n    // 如果是组合快捷键取得组合快捷键\n    if (key.length > 1) mods = getMods(_modifier, key);\n\n    // 将非修饰键转化为键码\n    key = key[key.length - 1];\n    key = key === '*' ? '*' : code(key); // *表示匹配所有快捷键\n\n    // 判断key是否在_handlers中，不在就赋一个空数组\n    if (!(key in _handlers)) _handlers[key] = [];\n    _handlers[key].push({\n      keyup,\n      keydown,\n      scope,\n      mods,\n      shortcut: keys[i],\n      method,\n      key: keys[i],\n      splitKey,\n      element\n    });\n  }\n  // 在全局document上设置快捷键\n  if (typeof element !== 'undefined' && window) {\n    if (!elementEventMap.has(element)) {\n      const keydownListener = function () {\n        let event = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : window.event;\n        return dispatch(event, element);\n      };\n      const keyupListenr = function () {\n        let event = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : window.event;\n        dispatch(event, element);\n        clearModifier(event);\n      };\n      elementEventMap.set(element, {\n        keydownListener,\n        keyupListenr,\n        capture\n      });\n      addEvent(element, 'keydown', keydownListener, capture);\n      addEvent(element, 'keyup', keyupListenr, capture);\n    }\n    if (!winListendFocus) {\n      const listener = () => {\n        _downKeys = [];\n      };\n      winListendFocus = {\n        listener,\n        capture\n      };\n      addEvent(window, 'focus', listener, capture);\n    }\n  }\n}\nfunction trigger(shortcut) {\n  let scope = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'all';\n  Object.keys(_handlers).forEach(key => {\n    const dataList = _handlers[key].filter(item => item.scope === scope && item.shortcut === shortcut);\n    dataList.forEach(data => {\n      if (data && data.method) {\n        data.method();\n      }\n    });\n  });\n}\n\n// 销毁事件,unbind之后判断element上是否还有键盘快捷键，如果没有移除监听\nfunction removeKeyEvent(element) {\n  const values = Object.values(_handlers).flat();\n  const findindex = values.findIndex(_ref4 => {\n    let {\n      element: el\n    } = _ref4;\n    return el === element;\n  });\n  if (findindex < 0) {\n    const {\n      keydownListener,\n      keyupListenr,\n      capture\n    } = elementEventMap.get(element) || {};\n    if (keydownListener && keyupListenr) {\n      removeEvent(element, 'keyup', keyupListenr, capture);\n      removeEvent(element, 'keydown', keydownListener, capture);\n      elementEventMap.delete(element);\n    }\n  }\n  if (values.length <= 0 || elementEventMap.size <= 0) {\n    // 移除所有的元素上的监听\n    const eventKeys = Object.keys(elementEventMap);\n    eventKeys.forEach(el => {\n      const {\n        keydownListener,\n        keyupListenr,\n        capture\n      } = elementEventMap.get(el) || {};\n      if (keydownListener && keyupListenr) {\n        removeEvent(el, 'keyup', keyupListenr, capture);\n        removeEvent(el, 'keydown', keydownListener, capture);\n        elementEventMap.delete(el);\n      }\n    });\n    // 清空 elementEventMap\n    elementEventMap.clear();\n    // 清空 _handlers\n    Object.keys(_handlers).forEach(key => delete _handlers[key]);\n    // 移除window上的focus监听\n    if (winListendFocus) {\n      const {\n        listener,\n        capture\n      } = winListendFocus;\n      removeEvent(window, 'focus', listener, capture);\n      winListendFocus = null;\n    }\n  }\n}\nconst _api = {\n  getPressedKeyString,\n  setScope,\n  getScope,\n  deleteScope,\n  getPressedKeyCodes,\n  getAllKeyCodes,\n  isPressed,\n  filter,\n  trigger,\n  unbind,\n  keyMap: _keyMap,\n  modifier: _modifier,\n  modifierMap\n};\nfor (const a in _api) {\n  if (Object.prototype.hasOwnProperty.call(_api, a)) {\n    hotkeys[a] = _api[a];\n  }\n}\nif (typeof window !== 'undefined') {\n  const _hotkeys = window.hotkeys;\n  hotkeys.noConflict = deep => {\n    if (deep && window.hotkeys === hotkeys) {\n      window.hotkeys = _hotkeys;\n    }\n    return hotkeys;\n  };\n  window.hotkeys = hotkeys;\n}\n\nexport { hotkeys as default };\n"]}