@livingdocs/editable.js 5.1.5 → 5.1.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/editable.js +1 -1
- package/dist/editable.js.map +1 -1
- package/package.json +8 -10
package/dist/editable.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dist/editable.js","mappings":"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","sources":["webpack://Editable/webpack/universalModuleDefinition","webpack://Editable/webpack/bootstrap","webpack://Editable/webpack/runtime/define property getters","webpack://Editable/webpack/runtime/global","webpack://Editable/webpack/runtime/hasOwnProperty shorthand","webpack://Editable/webpack/runtime/make namespace object","webpack://Editable/./node_modules/@babel/runtime/helpers/esm/classCallCheck.js","webpack://Editable/./node_modules/@babel/runtime/helpers/esm/typeof.js","webpack://Editable/./node_modules/@babel/runtime/helpers/esm/toPropertyKey.js","webpack://Editable/./node_modules/@babel/runtime/helpers/esm/toPrimitive.js","webpack://Editable/./node_modules/@babel/runtime/helpers/esm/createClass.js","webpack://Editable/./src/config.js","webpack://Editable/./src/util/error.js","webpack://Editable/./src/util/string.js","webpack://Editable/./src/node-type.js","webpack://Editable/./src/node-iterator.js","webpack://Editable/./src/util/dom.js","webpack://Editable/./src/parser.js","webpack://Editable/./src/range-save-restore.js","webpack://Editable/./src/content.js","webpack://Editable/./src/block.js","webpack://Editable/./node_modules/@babel/runtime/helpers/esm/arrayLikeToArray.js","webpack://Editable/./node_modules/@babel/runtime/helpers/esm/unsupportedIterableToArray.js","webpack://Editable/./node_modules/@babel/runtime/helpers/esm/toConsumableArray.js","webpack://Editable/./node_modules/@babel/runtime/helpers/esm/arrayWithoutHoles.js","webpack://Editable/./node_modules/@babel/runtime/helpers/esm/iterableToArray.js","webpack://Editable/./node_modules/@babel/runtime/helpers/esm/nonIterableSpread.js","webpack://Editable/./src/quotes.js","webpack://Editable/./src/clipboard.js","webpack://Editable/./src/feature-detection.js","webpack://Editable/./src/eventable.js","webpack://Editable/./src/util/viewport.js","webpack://Editable/./src/cursor.js","webpack://Editable/./node_modules/@babel/runtime/helpers/esm/slicedToArray.js","webpack://Editable/./node_modules/@babel/runtime/helpers/esm/arrayWithHoles.js","webpack://Editable/./node_modules/@babel/runtime/helpers/esm/iterableToArrayLimit.js","webpack://Editable/./node_modules/@babel/runtime/helpers/esm/nonIterableRest.js","webpack://Editable/./node_modules/@babel/runtime/helpers/esm/getPrototypeOf.js","webpack://Editable/./node_modules/@babel/runtime/helpers/esm/setPrototypeOf.js","webpack://Editable/./src/highlight-text.js","webpack://Editable/./src/plugins/highlighting/text-search.js","webpack://Editable/./src/highlight-support.js","webpack://Editable/./src/selection.js","webpack://Editable/./node_modules/@babel/runtime/helpers/esm/possibleConstructorReturn.js","webpack://Editable/./node_modules/@babel/runtime/helpers/esm/assertThisInitialized.js","webpack://Editable/./node_modules/@babel/runtime/helpers/esm/inherits.js","webpack://Editable/./src/range-container.js","webpack://Editable/./src/selection-watcher.js","webpack://Editable/./src/keyboard.js","webpack://Editable/./src/smartQuotes.js","webpack://Editable/./src/dispatcher.js","webpack://Editable/./node_modules/lodash-es/_listCacheClear.js","webpack://Editable/./node_modules/lodash-es/eq.js","webpack://Editable/./node_modules/lodash-es/_assocIndexOf.js","webpack://Editable/./node_modules/lodash-es/_listCacheDelete.js","webpack://Editable/./node_modules/lodash-es/_ListCache.js","webpack://Editable/./node_modules/lodash-es/_listCacheGet.js","webpack://Editable/./node_modules/lodash-es/_listCacheHas.js","webpack://Editable/./node_modules/lodash-es/_listCacheSet.js","webpack://Editable/./node_modules/lodash-es/_freeGlobal.js","webpack://Editable/./node_modules/lodash-es/_root.js","webpack://Editable/./node_modules/lodash-es/_Symbol.js","webpack://Editable/./node_modules/lodash-es/_getRawTag.js","webpack://Editable/./node_modules/lodash-es/_objectToString.js","webpack://Editable/./node_modules/lodash-es/_baseGetTag.js","webpack://Editable/./node_modules/lodash-es/isObject.js","webpack://Editable/./node_modules/lodash-es/isFunction.js","webpack://Editable/./node_modules/lodash-es/_coreJsData.js","webpack://Editable/./node_modules/lodash-es/_isMasked.js","webpack://Editable/./node_modules/lodash-es/_toSource.js","webpack://Editable/./node_modules/lodash-es/_baseIsNative.js","webpack://Editable/./node_modules/lodash-es/_getNative.js","webpack://Editable/./node_modules/lodash-es/_getValue.js","webpack://Editable/./node_modules/lodash-es/_Map.js","webpack://Editable/./node_modules/lodash-es/_nativeCreate.js","webpack://Editable/./node_modules/lodash-es/_hashGet.js","webpack://Editable/./node_modules/lodash-es/_hashHas.js","webpack://Editable/./node_modules/lodash-es/_Hash.js","webpack://Editable/./node_modules/lodash-es/_hashClear.js","webpack://Editable/./node_modules/lodash-es/_hashDelete.js","webpack://Editable/./node_modules/lodash-es/_hashSet.js","webpack://Editable/./node_modules/lodash-es/_getMapData.js","webpack://Editable/./node_modules/lodash-es/_isKeyable.js","webpack://Editable/./node_modules/lodash-es/_MapCache.js","webpack://Editable/./node_modules/lodash-es/_mapCacheClear.js","webpack://Editable/./node_modules/lodash-es/_mapCacheDelete.js","webpack://Editable/./node_modules/lodash-es/_mapCacheGet.js","webpack://Editable/./node_modules/lodash-es/_mapCacheHas.js","webpack://Editable/./node_modules/lodash-es/_mapCacheSet.js","webpack://Editable/./node_modules/lodash-es/_Stack.js","webpack://Editable/./node_modules/lodash-es/_stackClear.js","webpack://Editable/./node_modules/lodash-es/_stackDelete.js","webpack://Editable/./node_modules/lodash-es/_stackGet.js","webpack://Editable/./node_modules/lodash-es/_stackHas.js","webpack://Editable/./node_modules/lodash-es/_stackSet.js","webpack://Editable/./node_modules/lodash-es/_defineProperty.js","webpack://Editable/./node_modules/lodash-es/_baseAssignValue.js","webpack://Editable/./node_modules/lodash-es/_assignMergeValue.js","webpack://Editable/./node_modules/lodash-es/_baseFor.js","webpack://Editable/./node_modules/lodash-es/_createBaseFor.js","webpack://Editable/./node_modules/lodash-es/_cloneBuffer.js","webpack://Editable/./node_modules/lodash-es/_Uint8Array.js","webpack://Editable/./node_modules/lodash-es/_cloneTypedArray.js","webpack://Editable/./node_modules/lodash-es/_cloneArrayBuffer.js","webpack://Editable/./node_modules/lodash-es/_baseCreate.js","webpack://Editable/./node_modules/lodash-es/_getPrototype.js","webpack://Editable/./node_modules/lodash-es/_overArg.js","webpack://Editable/./node_modules/lodash-es/_isPrototype.js","webpack://Editable/./node_modules/lodash-es/isObjectLike.js","webpack://Editable/./node_modules/lodash-es/_baseIsArguments.js","webpack://Editable/./node_modules/lodash-es/isArguments.js","webpack://Editable/./node_modules/lodash-es/isArray.js","webpack://Editable/./node_modules/lodash-es/isLength.js","webpack://Editable/./node_modules/lodash-es/isArrayLike.js","webpack://Editable/./node_modules/lodash-es/isBuffer.js","webpack://Editable/./node_modules/lodash-es/stubFalse.js","webpack://Editable/./node_modules/lodash-es/isPlainObject.js","webpack://Editable/./node_modules/lodash-es/_baseIsTypedArray.js","webpack://Editable/./node_modules/lodash-es/_nodeUtil.js","webpack://Editable/./node_modules/lodash-es/isTypedArray.js","webpack://Editable/./node_modules/lodash-es/_baseUnary.js","webpack://Editable/./node_modules/lodash-es/_safeGet.js","webpack://Editable/./node_modules/lodash-es/_assignValue.js","webpack://Editable/./node_modules/lodash-es/_isIndex.js","webpack://Editable/./node_modules/lodash-es/_arrayLikeKeys.js","webpack://Editable/./node_modules/lodash-es/_baseTimes.js","webpack://Editable/./node_modules/lodash-es/_baseKeysIn.js","webpack://Editable/./node_modules/lodash-es/_nativeKeysIn.js","webpack://Editable/./node_modules/lodash-es/keysIn.js","webpack://Editable/./node_modules/lodash-es/toPlainObject.js","webpack://Editable/./node_modules/lodash-es/_copyObject.js","webpack://Editable/./node_modules/lodash-es/_baseMergeDeep.js","webpack://Editable/./node_modules/lodash-es/isArrayLikeObject.js","webpack://Editable/./node_modules/lodash-es/_copyArray.js","webpack://Editable/./node_modules/lodash-es/_initCloneObject.js","webpack://Editable/./node_modules/lodash-es/_baseMerge.js","webpack://Editable/./node_modules/lodash-es/identity.js","webpack://Editable/./node_modules/lodash-es/_overRest.js","webpack://Editable/./node_modules/lodash-es/_baseSetToString.js","webpack://Editable/./node_modules/lodash-es/constant.js","webpack://Editable/./node_modules/lodash-es/_shortOut.js","webpack://Editable/./node_modules/lodash-es/_setToString.js","webpack://Editable/./node_modules/lodash-es/_baseRest.js","webpack://Editable/./node_modules/lodash-es/_apply.js","webpack://Editable/./node_modules/lodash-es/merge.js","webpack://Editable/./node_modules/lodash-es/_createAssigner.js","webpack://Editable/./node_modules/lodash-es/_isIterateeCall.js","webpack://Editable/./src/plugins/highlighting/spellcheck-service.js","webpack://Editable/./src/plugins/highlighting/whitespace-highlighting.js","webpack://Editable/./src/plugins/highlighting/match-collection.js","webpack://Editable/./src/monitored-highlighting.js","webpack://Editable/./src/util/log.js","webpack://Editable/./src/util/element.js","webpack://Editable/./src/util/binary_search.js","webpack://Editable/./src/core.js","webpack://Editable/./src/create-default-events.js","webpack://Editable/./src/create-default-behavior.js"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"Editable\"] = factory();\n\telse\n\t\troot[\"Editable\"] = factory();\n})(self, () => {\nreturn ","// The require scope\nvar __webpack_require__ = {};\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","function _classCallCheck(a, n) {\n if (!(a instanceof n)) throw new TypeError(\"Cannot call a class as a function\");\n}\nexport { _classCallCheck as default };","function _typeof(o) {\n \"@babel/helpers - typeof\";\n\n return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) {\n return typeof o;\n } : function (o) {\n return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o;\n }, _typeof(o);\n}\nexport { _typeof as default };","import _typeof from \"./typeof.js\";\nimport toPrimitive from \"./toPrimitive.js\";\nfunction toPropertyKey(t) {\n var i = toPrimitive(t, \"string\");\n return \"symbol\" == _typeof(i) ? i : i + \"\";\n}\nexport { toPropertyKey as default };","import _typeof from \"./typeof.js\";\nfunction toPrimitive(t, r) {\n if (\"object\" != _typeof(t) || !t) return t;\n var e = t[Symbol.toPrimitive];\n if (void 0 !== e) {\n var i = e.call(t, r || \"default\");\n if (\"object\" != _typeof(i)) return i;\n throw new TypeError(\"@@toPrimitive must return a primitive value.\");\n }\n return (\"string\" === r ? String : Number)(t);\n}\nexport { toPrimitive as default };","import toPropertyKey from \"./toPropertyKey.js\";\nfunction _defineProperties(e, r) {\n for (var t = 0; t < r.length; t++) {\n var o = r[t];\n o.enumerable = o.enumerable || !1, o.configurable = !0, \"value\" in o && (o.writable = !0), Object.defineProperty(e, toPropertyKey(o.key), o);\n }\n}\nfunction _createClass(e, r, t) {\n return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, \"prototype\", {\n writable: !1\n }), e;\n}\nexport { _createClass as default };","/**\n * Defines all supported event types by Editable.JS and provides default\n * implementations for them defined in {{#crossLink \"Behavior\"}}{{/crossLink}}\n *\n * @type {Object}\n */\nexport default {\n log: false,\n logErrors: true,\n editableClass: 'js-editable',\n editableDisabledClass: 'js-editable-disabled',\n pastingAttribute: 'data-editable-is-pasting',\n trimLeadingAndTrailingWhitespaces: true,\n boldMarkup: {\n type: 'tag',\n name: 'strong',\n attribs: {},\n trim: true\n },\n italicMarkup: {\n type: 'tag',\n name: 'em',\n attribs: {},\n trim: true\n },\n underlineMarkup: {\n type: 'tag',\n name: 'u',\n attribs: {},\n trim: false\n },\n linkMarkup: {\n type: 'tag',\n name: 'a',\n attribs: {},\n trim: true\n },\n\n // Rules that are applied when filtering pasted content\n pastedHtmlRules: {\n // Elements and their attributes to keep in pasted text\n // Note that elements not explicitly allowed here will not be removed, their\n // tags will get stripped but their content will be kept. Use `blacklistedElements`\n // to get rid of a whole element (tag+content)\n allowedElements: {\n 'a': {\n 'href': true,\n 'rel': true,\n 'target': true\n },\n 'strong': {},\n 'em': {},\n 'br': {}\n },\n allowedPlainTextElements: {\n 'br': {}\n },\n\n // Elements that have required attributes.\n // If these are not present the elements are filtered out.\n // Required attributes have to be present in the 'allowed' object\n // as well if they should not be filtered out.\n requiredAttributes: {\n 'a': ['href']\n },\n\n // Elements that should be transformed into other elements\n transformElements: {\n 'b': 'strong',\n 'i': 'em'\n },\n\n // A list of elements which should be split into paragraphs.\n splitIntoBlocks: ['h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'p', 'blockquote'],\n\n // A list of HTML block level elements.\n blockLevelElements: [\n 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'div', 'p', 'pre', 'hr', 'blockquote',\n 'article', 'figure', 'header', 'footer', 'ul', 'ol', 'li', 'section', 'table', 'video'\n ],\n\n // A list of elements that will get completely removed when pasted. Their tags\n // and content (text content and child elements) will get removed.\n blacklistedElements: ['style', 'script'],\n\n keepInternalRelativeLinks: false,\n\n // Replace quotes in a pasted content with quotes from config.\n replaceQuotes: {\n // quotes: ['“', '”'],\n // singleQuotes: ['‘', '’'],\n // apostrophe: '’'\n }\n }\n}\n","import config from '../config.js'\n\n// Allows for safe error logging\n// Falls back to console.log if console.error is not available\nexport default function error () {\n if (config.logErrors === false) return\n\n const args = arguments.length === 1 ? arguments[0] : Array.from(arguments)\n\n if (!global.console) return\n\n if (typeof console.error === 'function') return console.error(args)\n\n console.log(args)\n}\n","const toString = Object.prototype.toString\nconst htmlCharacters = {\n '&': '&',\n '<': '<',\n '>': '>',\n '\"': '"',\n \"'\": '''\n}\n\n// TODO: replace with lodash methods\nexport function trimRight (text) {\n return text.replace(/\\s+$/, '')\n}\n\nexport function trimLeft (text) {\n return text.replace(/^\\s+/, '')\n}\n\nexport function trim (text) {\n return text.replace(/^\\s+|\\s+$/g, '')\n}\n\nexport function isString (obj) {\n return toString.call(obj) === '[object String]'\n}\n\n/**\n * Turn any string into a regular expression.\n * This can be used to search or replace a string conveniently.\n */\n\nexport function regexp (str, flags) {\n if (!flags) flags = 'g'\n const escapedStr = str.replace(/[-[\\]{}()*+?.,\\\\^$|#\\s]/g, '\\\\$&')\n return new RegExp(escapedStr, flags)\n}\n\n/**\n * Escape HTML characters <, > and &\n * Usage: escapeHtml('<div>')\n *\n * @param { String }\n * @param { Boolean } Optional. If true \" and ' will also be escaped.\n * @return { String } Escaped Html you can assign to innerHTML of an element.\n */\n\n// TODO: replace with npm.im/he\n\nexport function escapeHtml (s, forAttribute) {\n return s.replace(forAttribute ? /[&<>'\"]/g : /[&<>]/g, function (c) { // \"'\n return htmlCharacters[c]\n })\n}\n\n/**\n * Escape a string the browser way.\n */\n\nexport function browserEscapeHtml (str) {\n const div = document.createElement('div')\n div.appendChild(document.createTextNode(str))\n return div.innerHTML\n}\n\nexport function replaceLast (text, searchValue, replaceValue) {\n if (!text) return ''\n text = `${text}`\n if (!searchValue || replaceValue == null) return text\n const lastOccurrenceIndex = text.lastIndexOf(searchValue)\n if (lastOccurrenceIndex === -1) return text\n return `${\n text.slice(0, lastOccurrenceIndex)\n }${\n replaceValue\n }${\n text.slice(lastOccurrenceIndex + searchValue.length)\n }`\n}\n\nexport function endsWithSingleSpace (text) {\n return /\\S+\\s{1}$/.test(text)\n}\n","// DOM node types\n// https://developer.mozilla.org/en-US/docs/Web/API/Node.nodeType\n\nexport const elementNode = 1\nexport const attributeNode = 2\nexport const textNode = 3\nexport const cdataSectionNode = 4\nexport const entityReferenceNode = 5\nexport const entityNode = 6\nexport const processingInstructionNode = 7\nexport const commentNode = 8\nexport const documentNode = 9\nexport const documentTypeNode = 10\nexport const documentFragmentNode = 11\nexport const notationNode = 12\n","import {textNode} from './node-type.js'\n\n// A DOM node iterator.\n//\n// Has the ability to replace nodes on the fly and continue\n// the iteration.\nexport default class NodeIterator {\n\n constructor (root, method) {\n this.current = this.previous = this.nextNode = this.root = root\n this.iteratorFunc = this[method || 'getNext']\n }\n\n [Symbol.iterator] () {\n return this\n }\n\n getNextTextNode () {\n let next\n while ((next = this.getNext())) {\n if (next.nodeType === textNode && next.data !== '') return next\n }\n }\n\n getPreviousTextNode () {\n let prev\n while ((prev = this.getPrevious())) {\n if (prev.nodeType === textNode && prev.data !== '') return prev\n }\n }\n\n next () {\n const value = this.iteratorFunc()\n return value ? {value} : {done: true}\n }\n\n getNext () {\n let n = this.current = this.nextNode\n let child = this.nextNode = undefined\n if (this.current) {\n child = n.firstChild\n\n // Skip the children of elements with the attribute data-editable=\"remove\"\n // This prevents text nodes that are not part of the content to be included.\n if (child && n.getAttribute('data-editable') !== 'remove') {\n this.nextNode = child\n } else {\n while ((n !== this.root) && !(this.nextNode = n.nextSibling)) {\n n = n.parentNode\n }\n }\n }\n return this.current\n }\n\n getPrevious () {\n let n = this.current = this.previous\n let child = this.previous = undefined\n if (this.current) {\n child = n.lastChild\n\n // Skip the children of elements with the attribute data-editable=\"remove\"\n // This prevents text nodes that are not part of the content to be included.\n if (child && n.getAttribute('data-editable') !== 'remove') {\n this.previous = child\n } else {\n while ((n !== this.root) && !(this.previous = n.previousSibling)) {\n n = n.parentNode\n }\n }\n }\n return this.current\n }\n\n replaceCurrent (replacement) {\n this.current = replacement\n this.nextNode = undefined\n this.previous = undefined\n let n = this.current\n while ((n !== this.root) && !(this.nextNode = n.nextSibling)) {\n n = n.parentNode\n }\n }\n}\n","import NodeIterator from '../node-iterator.js'\nimport {textNode} from '../node-type.js'\n\n/**\n * @param {HTMLElement | Array | String} target\n * @param {Document} document\n */\nexport const domArray = (target, document) => {\n if (typeof target === 'string') return Array.from(document.querySelectorAll(target))\n if (target.tagName) return [target]\n if (Array.isArray(target)) return target\n // Support NodeList and jQuery arrays\n return Array.from(target)\n}\n\n/**\n * @param { HTMLElement | String } target\n * @param { Document } document\n * @returns { HTMLElement }\n */\nexport const domSelector = (target, document) => {\n if (typeof target === 'string') return document.querySelector(target)\n if (target.tagName) return target\n // Support NodeList and jQuery arrays\n if (target[0]) return target[0]\n return target\n}\n\nexport const createElement = (html, win = window) => {\n const el = win.document.createElement('div')\n el.innerHTML = html\n return el.firstElementChild\n}\n\n/**\n* Get the closest dom element matching a selector\n* @description\n* - If a textNode is passed, it will still find the correct element\n* - If a document is passed, it will return undefined\n* @param {Node} elem\n* @param {String} selector\n* @returns {HTMLElement|undefined}\n*/\nexport const closest = (elem, selector) => {\n if (!elem.closest) elem = elem.parentNode\n if (elem && elem.closest) return elem.closest(selector)\n}\n\nexport const createRange = (win = window) => {\n return win.document.createRange()\n}\n\nexport const getSelection = (win = window) => {\n return win.document.getSelection()\n}\n\nexport const getNodes = (range, nodeTypes, filterFunc, win = window) => {\n const nodes = []\n\n const nodeIterator = win.document.createNodeIterator(\n range.commonAncestorContainer,\n NodeFilter.SHOW_ALL,\n {\n acceptNode (node) {\n if (\n range.intersectsNode(node) &&\n nodeTypes.includes(node.nodeType) &&\n node !== range.commonAncestorContainer // Exclude the common ancestor container\n ) {\n if (typeof filterFunc === 'function') {\n return filterFunc(node) ? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_SKIP\n }\n return NodeFilter.FILTER_ACCEPT\n }\n return NodeFilter.FILTER_SKIP\n }\n },\n false\n )\n\n let currentNode\n while ((currentNode = nodeIterator.nextNode())) {\n nodes.push(currentNode)\n }\n\n return nodes\n}\n\n// export const getNodes = (range, nodeTypes, filterFunc, win = window) => {\n// const nodes = []\n\n// const nodeIterator = win.document.createNodeIterator(\n// range.startContainer,\n// NodeFilter.SHOW_ALL,\n// {\n// acceptNode (node) {\n// if (\n// range.intersectsNode(node) &&\n// nodeTypes.includes(node.nodeType)\n// ) {\n// if (typeof filterFunc === 'function') {\n// return filterFunc(node) ? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_SKIP\n// }\n// return NodeFilter.FILTER_ACCEPT\n// }\n// return NodeFilter.FILTER_SKIP\n// }\n// },\n// false\n// )\n\n// let currentNode\n// while ((currentNode = nodeIterator.nextNode())) {\n// if (range.intersectsNode(currentNode)) {\n// nodes.push(currentNode)\n// }\n// }\n\n// return nodes\n// }\n\n\nexport const normalizeBoundaries = (range) => {\n if (range.startContainer.compareDocumentPosition(range.endContainer) === Node.DOCUMENT_POSITION_FOLLOWING) {\n range.setStartBefore(range.endContainer)\n }\n\n if (range.endContainer.compareDocumentPosition(range.startContainer) === Node.DOCUMENT_POSITION_PRECEDING) {\n range.setEndAfter(range.startContainer)\n }\n}\n\nexport const containsRange = (containerRange, testRange) => {\n return (\n containerRange.compareBoundaryPoints(Range.START_TO_START, testRange) <= 0 &&\n containerRange.compareBoundaryPoints(Range.END_TO_END, testRange) >= 0\n )\n}\n\nexport const containsNodeText = (range, node) => {\n const nodeRange = document.createRange()\n nodeRange.selectNodeContents(node)\n const comparisonStart = range.compareBoundaryPoints(Range.START_TO_START, nodeRange)\n const comparisonEnd = range.compareBoundaryPoints(Range.END_TO_END, nodeRange)\n return comparisonStart <= 0 && comparisonEnd >= 0\n}\n\nexport const nodeContainsRange = (node, range) => {\n const nodeRange = document.createRange()\n nodeRange.selectNodeContents(node)\n const comparisonStart = range.compareBoundaryPoints(Range.START_TO_START, nodeRange)\n const comparisonEnd = range.compareBoundaryPoints(Range.END_TO_END, nodeRange)\n return comparisonStart >= 0 && comparisonEnd <= 0\n}\n\nconst isCharacterDataNode = (node) => {\n return node && (node.nodeType === Node.TEXT_NODE || node.nodeType === Node.COMMENT_NODE)\n}\n\nconst splitDataNode = (node, offset) => {\n return node.splitText(offset)\n}\n\nexport const splitBoundaries = (range) => {\n const startContainer = range.startContainer\n const startOffset = range.startOffset\n const endContainer = range.endContainer\n const endOffset = range.endOffset\n\n if (isCharacterDataNode(endContainer) && endOffset > 0 && endOffset < endContainer.length) {\n splitDataNode(endContainer, endOffset)\n }\n\n if (isCharacterDataNode(startContainer) && startOffset > 0 && startOffset < startContainer.length) {\n const newStartContainer = splitDataNode(startContainer, startOffset)\n range.setStart(newStartContainer, 0)\n }\n}\n\nexport const toCharacterRange = (range, container) => {\n const startRange = range.cloneRange()\n startRange.setStart(container, 0)\n startRange.setEnd(range.startContainer, range.startOffset)\n\n const rangeText = range.toString()\n const start = startRange.toString().length\n const end = start + rangeText.length\n\n return {start, end, text: rangeText}\n}\n\nexport const rangesAreEqual = (range1, range2) => {\n return (\n range1.startContainer === range2.startContainer &&\n range1.startOffset === range2.startOffset &&\n range1.endContainer === range2.endContainer &&\n range1.endOffset === range2.endOffset\n )\n}\n\nexport const rangeToHtml = (range, win = window) => {\n const div = win.document.createElement('div')\n div.appendChild(range.cloneContents())\n return div.innerHTML\n}\n\nexport const getSelectionCoordinates = (selection) => {\n const range = selection.getRangeAt(0) // Assuming you want coordinates of the first range\n\n const rects = range.getClientRects()\n const coordinates = []\n\n for (let i = 0; i < rects.length; i++) {\n const rect = rects[i]\n coordinates.push({\n top: rect.top,\n left: rect.left,\n bottom: rect.bottom,\n right: rect.right,\n width: rect.width,\n height: rect.height\n })\n }\n\n return coordinates\n}\n\nexport const createRangeFromCharacterRange = (element, actualStartIndex, actualEndIndex) => {\n const walker = document.createTreeWalker(element, NodeFilter.SHOW_TEXT, null, false)\n let currentIndex = 0\n let startNode, endNode, startOffset, endOffset\n\n while (walker.nextNode()) {\n const node = walker.currentNode\n const nodeLength = node.nodeValue.length\n\n if (currentIndex + nodeLength <= actualStartIndex) {\n currentIndex += nodeLength\n continue\n }\n\n if (!startNode) {\n startNode = node\n startOffset = actualStartIndex - currentIndex\n }\n\n if (currentIndex + nodeLength >= actualEndIndex) {\n endNode = node\n endOffset = actualEndIndex - currentIndex\n break\n }\n\n currentIndex += nodeLength\n }\n\n if (startNode && endNode) {\n const range = createRange()\n range.setStart(startNode, startOffset)\n range.setEnd(endNode, endOffset)\n return range\n } else {\n throw new Error('Invalid character offsets.')\n }\n}\n\nexport function findStartExcludingWhitespace ({root, startContainer, startOffset, whitespacesOnTheLeft}) {\n const isTextNode = startContainer.nodeType === textNode\n if (!isTextNode) {\n return findStartExcludingWhitespace({\n root,\n startContainer: startContainer.childNodes[startOffset],\n startOffset: 0,\n whitespacesOnTheLeft\n })\n }\n\n const offsetAfterWhitespace = startOffset + whitespacesOnTheLeft\n if (startContainer.length > offsetAfterWhitespace) {\n return [startContainer, offsetAfterWhitespace]\n }\n\n // Pass the root so that the iterator can traverse to siblings\n const iterator = new NodeIterator(root)\n // Set the position to the node which is selected\n iterator.nextNode = startContainer\n // Iterate once to avoid returning self\n iterator.getNextTextNode()\n\n const container = iterator.getNextTextNode()\n if (!container) {\n // No more text nodes - use the end of the last text node\n const previousTextNode = iterator.getPreviousTextNode()\n return [previousTextNode, previousTextNode.length]\n }\n\n return findStartExcludingWhitespace({\n root,\n startContainer: container,\n startOffset: 0,\n whitespacesOnTheLeft: offsetAfterWhitespace - startContainer.length\n })\n}\n\nexport function findEndExcludingWhitespace ({root, endContainer, endOffset, whitespacesOnTheRight}) {\n const isTextNode = endContainer.nodeType === textNode\n if (!isTextNode) {\n const isFirstNode = !endContainer.childNodes[endOffset - 1]\n const container = isFirstNode\n ? endContainer.childNodes[endOffset]\n : endContainer.childNodes[endOffset - 1]\n let offset = 0\n if (!isFirstNode) {\n offset = container.nodeType === textNode\n ? container.length\n : container.childNodes.length\n }\n return findEndExcludingWhitespace({\n root,\n endContainer: container,\n endOffset: offset,\n whitespacesOnTheRight\n })\n }\n\n const offsetBeforeWhitespace = endOffset - whitespacesOnTheRight\n if (offsetBeforeWhitespace > 0) {\n return [endContainer, offsetBeforeWhitespace]\n }\n\n // Pass the root so that the iterator can traverse to siblings\n const iterator = new NodeIterator(root)\n // Set the position to the node which is selected\n iterator.previous = endContainer\n // Iterate once to avoid returning self\n iterator.getPreviousTextNode()\n\n const container = iterator.getPreviousTextNode()\n if (!container) {\n // No more text nodes - use the start of the first text node\n return [iterator.getNextTextNode(), 0]\n }\n\n return findEndExcludingWhitespace({\n root,\n endContainer: container,\n endOffset: container.length,\n whitespacesOnTheRight: whitespacesOnTheRight - endOffset\n })\n}\n","import * as string from './util/string.js'\nimport * as nodeType from './node-type.js'\nimport config from './config.js'\nimport {closest} from './util/dom.js'\n\n/**\n * The parser module provides helper methods to parse html-chunks\n * manipulations and helpers for common tasks.\n * Provides DOM lookup helpers\n *\n * @module core\n * @submodule parser\n */\n\n/**\n * Get the editableJS host block of a node.\n *\n * @method getHost\n * @param {DOM Node}\n * @return {DOM Node}\n */\nexport function getHost (node) {\n node = (node.jquery ? node[0] : node)\n return closest(node, `.${config.editableClass}`)\n}\n\n/**\n * Get the index of a node so that\n * parent.childNodes[ getNodeIndex(node) ] would return the node again.\n *\n * @method getNodeIndex\n * @param {HTMLElement}\n */\nexport function getNodeIndex (node) {\n let index = 0\n while ((node = node.previousSibling) !== null) index++\n return index\n}\n\n/**\n * Check if node contains text or element nodes\n * whitespace counts too!\n *\n * @method isVoid\n * @param {HTMLElement}\n */\nexport function isVoid (node) {\n for (const child of node.childNodes) {\n if (child.nodeType === nodeType.textNode && !isVoidTextNode(child)) {\n return false\n }\n if (child.nodeType === nodeType.elementNode) {\n return false\n }\n }\n return true\n}\n\n/**\n * Check if node is a text node and completely empty without any whitespace\n *\n * @method isVoidTextNode\n * @param {HTMLElement}\n */\nexport function isVoidTextNode (node) {\n return node.nodeType === nodeType.textNode && !node.nodeValue\n}\n\n/**\n * Check if node is a text node and contains nothing but whitespace\n *\n * @method isWhitespaceOnly\n * @param {HTMLElement}\n */\nexport function isWhitespaceOnly (node) {\n return node.nodeType === nodeType.textNode && lastOffsetWithContent(node) === 0\n}\n\nexport function isLinebreak (node) {\n return node.nodeType === nodeType.elementNode && node.tagName === 'BR'\n}\n\n/**\n * Returns the last offset where the cursor can be positioned to\n * be at the visible end of its container.\n * Currently works only for empty text nodes (not empty tags)\n *\n * @method isWhitespaceOnly\n * @param {HTMLElement}\n */\nexport function lastOffsetWithContent (elem) {\n if (elem.nodeType === nodeType.textNode) return string.trimRight(elem.nodeValue).length\n\n let lastOffset = 0\n Array.from(elem.childNodes).reverse().every((node, index, nodes) => {\n if (isWhitespaceOnly(node) || isLinebreak(node)) return true\n\n lastOffset = nodes.length - index\n return false\n })\n return lastOffset\n}\n\nexport function isBeginningOfHost (host, container, offset) {\n if (container === host) return isStartOffset(container, offset)\n\n if (isStartOffset(container, offset)) {\n // The index of the element simulates a range offset\n // right before the element.\n const offsetInParent = getNodeIndex(container)\n return isBeginningOfHost(host, container.parentNode, offsetInParent)\n }\n\n return false\n}\n\nexport function isEndOfHost (host, container, offset) {\n if (container === host) return isEndOffset(container, offset)\n\n if (isEndOffset(container, offset)) {\n // The index of the element plus one simulates a range offset\n // right after the element.\n const offsetInParent = getNodeIndex(container) + 1\n return isEndOfHost(host, container.parentNode, offsetInParent)\n }\n\n return false\n}\n\nexport function isStartOffset (container, offset) {\n if (container.nodeType === nodeType.textNode) return offset === 0\n\n if (container.childNodes.length === 0) return true\n\n if (\n container.childNodes.length === 1 &&\n container.firstChild.nodeType === nodeType.elementNode &&\n container.firstChild.getAttribute('data-editable') === 'remove'\n ) return true\n\n return container.childNodes[offset] === container.firstChild\n}\n\nexport function isEndOffset (container, offset) {\n if (container.nodeType === nodeType.textNode) return offset === container.length\n\n if (container.childNodes.length === 0) return true\n\n if (offset > 0) return container.childNodes[offset - 1] === container.lastChild\n\n return false\n}\n\nexport function isTextEndOfHost (host, container, offset) {\n if (container === host) return isTextEndOffset(container, offset)\n\n if (isTextEndOffset(container, offset)) {\n // The index of the element plus one simulates a range offset\n // right after the element.\n const offsetInParent = getNodeIndex(container) + 1\n return isTextEndOfHost(host, container.parentNode, offsetInParent)\n }\n\n return false\n}\n\nexport function isTextEndOffset (container, offset) {\n if (container.nodeType === nodeType.textNode) {\n const text = string.trimRight(container.nodeValue)\n return offset >= text.length\n }\n\n if (container.childNodes.length === 0) return true\n\n return offset >= lastOffsetWithContent(container)\n}\n\nexport function isSameNode (target, source) {\n let i, len, attr\n\n if (target.nodeType !== source.nodeType) return false\n\n if (target.nodeName !== source.nodeName) return false\n\n for (i = 0, len = target.attributes.length; i < len; i++) {\n attr = target.attributes[i]\n if (source.getAttribute(attr.name) !== attr.value) return false\n }\n\n return true\n}\n\n/**\n * Return the deepest last child of a node.\n *\n * @method lastChild\n * @param {HTMLElement} container The container to iterate on.\n * @return {HTMLElement} The deepest last child in the container.\n */\nexport function lastChild (container) {\n return container.lastChild\n ? lastChild(container.lastChild)\n : container\n}\n\n/**\n * Obsolete version of {{#crossLink \"lastChild\"}}{{/crossLink}}.\n */\nexport function latestChild (container) {\n console.warn('Editable.js: Using obsolete function parser.latestCild(), use lastChild() instead')\n return lastChild(container)\n}\n\n/**\n * Checks if a documentFragment has no children.\n * Fragments without children can cause errors if inserted into ranges.\n *\n * @method isDocumentFragmentWithoutChildren\n * @param {HTMLElement} DOM node.\n * @return {Boolean}\n */\nexport function isDocumentFragmentWithoutChildren (fragment) {\n return fragment &&\n fragment.nodeType === nodeType.documentFragmentNode &&\n fragment.childNodes.length === 0\n}\n\n/**\n * Determine if an element behaves like an inline element.\n */\nexport function isInlineElement (window, element) {\n const styles = element.currentStyle || window.getComputedStyle(element, '')\n const display = styles.display\n switch (display) {\n case 'inline':\n case 'inline-block':\n return true\n default:\n return false\n }\n}\n","import error from './util/error.js'\nimport * as nodeType from './node-type.js'\nimport {createRange, normalizeBoundaries} from './util/dom.js'\n\n/**\n * Inspired by the Selection save and restore module for Rangy by Tim Down\n * Saves and restores ranges using invisible marker elements in the DOM.\n */\nlet boundaryMarkerId = 0\n\n// (U+FEFF) zero width no-break space\nconst markerTextChar = '\\ufeff'\n\nfunction isSecondChildOfCommonAncestor (range, rangeContainer) {\n const parent = range.commonAncestorContainer\n if (parent.nodeType === 3) return false // if we are on the text node it can't be a parent\n const possibleChild = rangeContainer.parentElement\n return possibleChild?.parentElement === parent\n}\n\nexport function insertRangeBoundaryMarker (range, atStart) {\n const container = range.commonAncestorContainer\n\n // If ownerDocument is null the commonAncestorContainer is window.document\n if (!container.ownerDocument) {\n error('Cannot save range: range is empty')\n }\n\n // Create the marker element containing a single\n // invisible character using DOM methods and insert it\n const doc = container.ownerDocument.defaultView.document\n const markerEl = doc.createElement('span')\n markerEl.id = `editable-range-boundary-${++boundaryMarkerId}`\n markerEl.setAttribute('data-editable', 'remove')\n markerEl.style.lineHeight = '0'\n markerEl.style.display = 'none'\n markerEl.appendChild(doc.createTextNode(markerTextChar))\n\n // This logic can expand the selection by inserting the marker before the element\n // of the start or end container. In some cases this prevents breaking up existing tags.\n // The solution is not perfect, but has been here a while.\n // And it is somewhat inconsistent as it check if the container is a second grade child\n // of the common ancestor.\n // It can help to prevent the nuking of e.g. comments when formatting like bold\n // is applied.\n const directlyBeforeFormatTag = atStart && isSecondChildOfCommonAncestor(range, range.startContainer)\n const directlyAfterFormatTag = !atStart && isSecondChildOfCommonAncestor(range, range.endContainer)\n if (directlyBeforeFormatTag) {\n const startParentElem = range.startContainer.parentElement\n startParentElem.parentElement.insertBefore(markerEl, startParentElem)\n } else if (directlyAfterFormatTag) {\n const endParentElem = range.endContainer.parentElement\n endParentElem.parentElement.insertBefore(markerEl, endParentElem.nextSibling)\n } else {\n // Clone the Range and collapse to the appropriate boundary point\n const boundaryRange = range.cloneRange()\n boundaryRange.collapse(atStart)\n boundaryRange.insertNode(markerEl)\n }\n\n return markerEl\n}\n\nexport function setRangeBoundary (host, range, markerId, atStart) {\n const markerEl = getMarker(host, markerId)\n if (!markerEl) return console.log('Marker element has been removed. Cannot restore selection.')\n range[atStart ? 'setStartBefore' : 'setEndBefore'](markerEl)\n markerEl.remove()\n}\n\nexport function save (range) {\n let rangeInfo, startEl, endEl\n\n // insert markers\n if (range.collapsed) {\n endEl = insertRangeBoundaryMarker(range, false)\n rangeInfo = {\n markerId: endEl.id,\n collapsed: true\n }\n } else {\n endEl = insertRangeBoundaryMarker(range, false)\n startEl = insertRangeBoundaryMarker(range, true)\n\n rangeInfo = {\n startMarkerId: startEl.id,\n endMarkerId: endEl.id,\n collapsed: false\n }\n }\n\n // Adjust each range's boundaries to lie between its markers\n if (range.collapsed) {\n range.setStartBefore(endEl)\n range.collapse(true)\n } else {\n range.setEndBefore(endEl)\n range.setStartAfter(startEl)\n }\n\n return rangeInfo\n}\n\nexport function restore (host, rangeInfo) {\n if (rangeInfo.restored) return\n\n const range = createRange()\n if (rangeInfo.collapsed) {\n const markerEl = getMarker(host, rangeInfo.markerId)\n if (markerEl) {\n markerEl.style.display = 'inline'\n const previousNode = markerEl.previousSibling\n\n // Workaround for rangy issue 17\n if (previousNode && previousNode.nodeType === nodeType.textNode) {\n markerEl.remove()\n range.setStart(previousNode, previousNode.length)\n } else {\n range.setStartBefore(markerEl)\n range.collapse(true)\n markerEl.remove()\n }\n } else {\n console.log('Marker element has been removed. Cannot restore selection.')\n }\n } else {\n setRangeBoundary(host, range, rangeInfo.startMarkerId, true)\n setRangeBoundary(host, range, rangeInfo.endMarkerId, false)\n }\n\n normalizeBoundaries(range)\n return range\n}\n\nfunction getMarker (host, id) {\n return host.querySelector(`#${id}`)\n}\n","import * as nodeType from './node-type.js'\nimport * as rangeSaveRestore from './range-save-restore.js'\nimport * as parser from './parser.js'\nimport * as string from './util/string.js'\nimport {createElement, createRange, getNodes, normalizeBoundaries, splitBoundaries, containsNodeText} from './util/dom.js'\nimport config from './config.js'\n\nfunction restoreRange (host, range, func) {\n range = rangeSaveRestore.save(range)\n func()\n return rangeSaveRestore.restore(host, range)\n}\n\nconst zeroWidthSpace = /\\u200B/g\nconst zeroWidthNonBreakingSpace = /\\uFEFF/g\nconst whitespaceExceptSpace = /[^\\S ]/g\n\nconst everythingWhitespace = /^\\s+$/\nconst leadingWhitespace = /^\\s+/\nconst trailingWhitespace = /\\s+$/\n\n// Clean up the Html.\nexport function tidyHtml (element) {\n // if (element.normalize) element.normalize()\n normalizeTags(element)\n}\n\n// Remove empty tags and merge consecutive tags (they must have the same\n// attributes).\n//\n// @method normalizeTags\n// @param {HTMLElement} element The element to process.\nexport function normalizeTags (element) {\n const fragment = document.createDocumentFragment()\n\n // Remove line breaks at the beginning of a content block\n removeWhitespaces(element, 'firstChild')\n\n // Remove line breaks at the end of a content block\n removeWhitespaces(element, 'lastChild')\n\n for (const node of element.childNodes) {\n // skip empty tags, so they'll get removed\n if (node.nodeName !== 'BR' && !node.textContent) continue\n\n if (node.nodeType === nodeType.elementNode && node.nodeName !== 'BR') {\n let sibling = node\n while ((sibling = sibling.nextSibling) !== null) {\n if (!parser.isSameNode(sibling, node)) break\n\n for (const siblingChild of sibling.childNodes) {\n node.appendChild(siblingChild.cloneNode(true))\n }\n\n sibling.remove()\n }\n\n normalizeTags(node)\n }\n\n fragment.appendChild(node.cloneNode(true))\n }\n\n while (element.firstChild) element.removeChild(element.firstChild)\n\n element.appendChild(fragment)\n}\n\nexport function normalizeWhitespace (text) {\n return text.replace(whitespaceExceptSpace, ' ')\n}\n\n// Clean the element from character, tags, etc... added by the plugin logic.\n//\n// @method cleanInternals\n// @param {HTMLElement} element The element to process.\nexport function cleanInternals (element) {\n // Uses extract content for simplicity. A custom method\n // that does not clone the element could be faster if needed.\n element.innerHTML = extractContent(element, true)\n}\n\n// Extracts the content from a host element.\n// Does not touch or change the host. Just returns\n// the content and removes elements marked for removal by editable.\n//\n// @param {DOM node or document fragment} Element where to clean out the innerHTML.\n// If you pass a document fragment it will be empty after this call.\n// @param {Boolean} Flag whether to keep ui elements like spellchecking highlights.\n// @returns {String} The cleaned innerHTML of the passed element or document fragment.\nexport function extractContent (element, keepUiElements) {\n const innerHtml = (element.nodeType === nodeType.documentFragmentNode\n ? getInnerHtmlOfFragment(element)\n : element.innerHTML\n )\n .replace(zeroWidthNonBreakingSpace, '') // Used for forcing inline elements to have a height\n .replace(zeroWidthSpace, '<br>') // Used for cross-browser newlines\n\n const clone = document.createElement('div')\n clone.innerHTML = innerHtml\n unwrapInternalNodes(clone, keepUiElements)\n\n // Remove line breaks at the beginning of a content block\n removeWhitespaces(clone, 'firstChild')\n\n // Remove line breaks at the end of a content block\n removeWhitespaces(clone, 'lastChild')\n\n return clone.innerHTML\n}\n\nexport function getInnerHtmlOfFragment (documentFragment) {\n const div = document.createElement('div')\n div.appendChild(documentFragment)\n return div.innerHTML\n}\n\n// Create a document fragment from an html string\n// @param {String} e.g. 'some html <span>text</span>.'\nexport function createFragmentFromString (htmlString) {\n const wrapper = document.createElement('div')\n wrapper.innerHTML = htmlString\n\n const fragment = document.createDocumentFragment()\n while (wrapper.firstChild) fragment.appendChild(wrapper.firstChild)\n return fragment\n}\n\nexport function adoptElement (node, doc) {\n return node.ownerDocument !== doc\n ? doc.adoptNode(node)\n : node\n}\n\n// It will return a fragment with the cloned contents of the range\n// without the commonAncestorElement.\n//\n// @param {Range}\n// @return {DocumentFragment}\nexport function cloneRangeContents (range) {\n const rangeFragment = range.cloneContents()\n const parent = rangeFragment.childNodes[0]\n const fragment = document.createDocumentFragment()\n while (parent.childNodes.length) fragment.appendChild(parent.childNodes[0])\n return fragment\n}\n\nfunction removeWhitespaces (node, type, firstCall = true) {\n let elem\n // loop through all children:\n // from left to right if type = 'firstChild',\n // from right to left if type = 'lastChild'\n while ((elem = node[type])) {\n if (elem.nodeType === nodeType.textNode) {\n // Just remove text nodes if they consist only of whitespace\n if (everythingWhitespace.test(elem.textContent)) node.removeChild(elem)\n else break\n } else if (elem.nodeName === 'BR') {\n elem.remove()\n } else {\n // For element nodes (e.g. <strong> tags), we repeat the logic recursively\n // to remove empty text nodes or <br> tags.\n if (elem[type]) removeWhitespaces(elem, type, false)\n break\n }\n }\n\n // Text nodes with leading/trailing whitespace can be trimmed if config allows.\n // We only do it to the outermost text node. Once a text was wrapped in\n // another element, we preserve the whitespace.\n if (!firstCall) return\n elem = node[type]\n if (elem?.nodeType !== nodeType.textNode) return\n // Remove whitespaces at the end or start of a block with content\n // e.g. ' Hello world' > 'Hello World'\n if (config.trimLeadingAndTrailingWhitespaces) {\n elem.textContent = elem.textContent.replace(type.startsWith('last') ? trailingWhitespace : leadingWhitespace, '')\n }\n}\n\n// Remove elements that were inserted for internal or user interface purposes\n//\n// @param {DOM node}\n// @param {Boolean} whether to keep ui elements like spellchecking highlights\n// Currently:\n// - Saved ranges\nexport function unwrapInternalNodes (sibling, keepUiElements) {\n while (sibling) {\n const nextSibling = sibling.nextSibling\n\n if (sibling.nodeType !== nodeType.elementNode) {\n sibling = nextSibling\n continue\n }\n\n const attr = sibling.getAttribute('data-editable')\n\n if (sibling.firstChild) unwrapInternalNodes(sibling.firstChild, keepUiElements)\n\n if (attr === 'remove' || (attr === 'ui-remove' && !keepUiElements)) {\n sibling.remove()\n } if (attr === 'unwrap' || (attr === 'ui-unwrap' && !keepUiElements)) {\n unwrap(sibling)\n }\n\n sibling = nextSibling\n }\n}\n\n// Get all tags that start or end inside the range\nexport function getTags (host, range, filterFunc) {\n const innerTags = getInnerTags(range, filterFunc)\n const ancestorTags = getAncestorTags(host, range, filterFunc)\n return innerTags.concat(ancestorTags)\n}\n\n// Get all ancestor tags that start or end inside the range\nexport function getAncestorTags (host, range, filterFunc) {\n const tags = []\n let node = range.commonAncestorContainer\n while (node !== host) {\n if (!filterFunc || filterFunc(node)) tags.push(node)\n node = node.parentNode\n }\n\n return tags\n}\n\nexport function getTagsByName (host, range, tagName) {\n return getTags(host, range, (node) => {\n return node.nodeName.toUpperCase() === tagName.toUpperCase()\n })\n}\n\nexport function getTagsByNameAndAttributes (host, range, elem) {\n return getTags(host, range, (node) => {\n return node.nodeName.toUpperCase() === elem.nodeName.toUpperCase() &&\n areSameAttributes(node.attributes, elem.attributes)\n })\n}\n\nexport function areSameAttributes (attrs1, attrs2) {\n if (attrs1.length !== attrs2.length) return false\n\n for (let i = 0; i < attrs1.length; i++) {\n const attr = attrs2[attrs1[i].name]\n if (!(attr && attr.value === attrs1[i].value)) return false\n }\n\n return true\n}\n\n// Get all tags that start or end inside the range\nexport function getInnerTags (range, filterFunc) {\n return getNodes(range, [nodeType.elementNode], filterFunc)\n}\n\n// Get all tags whose text is completely within the current selection.\nexport function getContainedTags (range, filterFunc) {\n return getNodes(range, [nodeType.elementNode], filterFunc)\n .filter(elem => containsNodeText(range, elem))\n}\n\n// Transform an array of elements into an array\n// of tagnames in uppercase\n//\n// @return example: ['STRONG', 'B']\nexport function getTagNames (elements = []) {\n return elements.map((element) => element.nodeName)\n}\n\nexport function isAffectedBy (host, range, tagName) {\n return getTags(host, range)\n .some((elem) => elem.nodeName === tagName.toUpperCase())\n}\n\n// select a whole element\nexport function selectNodeContents (element) {\n const range = createRange()\n range.selectNodeContents(element)\n return range\n}\n\nfunction intersectsRange (range1, range2) {\n return range1.compareBoundaryPoints(Range.END_TO_START, range2) === -1 &&\n range2.compareBoundaryPoints(Range.END_TO_START, range1) === -1\n}\n\n// Check if the range selects all of the elements contents,\n// not less or more.\n//\n// @param visible: Only compare visible text. That way it does not\n// matter if the user selects an additional whitespace or not.\nexport function isExactSelection (range, elem, visible) {\n const elemRange = createRange()\n elemRange.selectNodeContents(elem)\n\n if (!intersectsRange(range, elemRange)) return false\n\n let rangeText = range.toString()\n let elemText = (elem.jquery ? elem[0] : elem).textContent\n\n if (visible) {\n rangeText = string.trim(rangeText)\n elemText = string.trim(elemText)\n }\n\n return rangeText !== '' && rangeText === elemText\n}\n\nexport function expandTo (host, range, elem) {\n range.selectNodeContents(elem)\n return range\n}\n\nexport function toggleTag (host, range, elem) {\n const elems = getTagsByNameAndAttributes(host, range, elem)\n\n if (elems.length === 1 &&\n isExactSelection(range, elems[0], 'visible')) {\n return removeFormattingElem(host, range, elem)\n }\n\n return forceWrap(host, range, elem)\n}\n\nexport function isWrappable (range) {\n return canSurroundContents(range)\n}\n\nexport function forceWrap (host, range, elem) {\n let restoredRange = restoreRange(host, range, () => {\n nukeElem(host, range, elem)\n })\n\n // remove all tags if the range is not wrappable\n if (!isWrappable(restoredRange)) {\n restoredRange = restoreRange(host, restoredRange, () => {\n nuke(host, restoredRange)\n })\n }\n\n wrap(restoredRange, elem)\n return restoredRange\n}\n\nexport function wrap (range, elem) {\n if (!isWrappable(range)) {\n console.log('content.wrap(): can not surround range')\n return\n }\n\n if (typeof elem === 'string') elem = createElement(elem)\n range.surroundContents(elem)\n}\n\nexport function unwrap (elem) {\n elem = elem.jquery ? elem[0] : elem\n const parent = elem.parentNode\n while (elem.firstChild) parent.insertBefore(elem.firstChild, elem)\n parent.removeChild(elem)\n}\n\nexport function removeFormattingElem (host, range, elem) {\n return restoreRange(host, range, () => {\n nukeElem(host, range, elem)\n })\n}\n\nexport function removeFormatting (host, range, selector) {\n return restoreRange(host, range, () => {\n nuke(host, range, selector)\n })\n}\n\n// Unwrap all tags this range is affected by.\n// Can also affect content outside of the range.\nexport function nuke (host, range, selector) {\n getTags(host, range).forEach((elem) => {\n if (elem.nodeName.toUpperCase() !== 'BR' && (!selector || elem.matches(selector))) {\n unwrap(elem)\n }\n })\n}\n\n// Unwrap all tags this range is affected by.\n// Can also affect content outside of the range.\nexport function nukeElem (host, range, node) {\n getTags(host, range).forEach((elem) => {\n if (elem.nodeName.toUpperCase() !== 'BR' && (!node ||\n (elem.nodeName.toUpperCase() === node.nodeName.toUpperCase() &&\n areSameAttributes(elem.attributes, node.attributes)))) {\n unwrap(elem)\n }\n })\n}\n\n// Insert a single character (or string) before or after\n// the range.\nexport function insertCharacter (range, character, atStart) {\n const insertEl = document.createTextNode(character)\n const boundaryRange = range.cloneRange()\n boundaryRange.collapse(atStart)\n boundaryRange.insertNode(insertEl)\n range[atStart ? 'setStartBefore' : 'setEndAfter'](insertEl)\n normalizeBoundaries(range)\n}\n\n// Surround the range with characters like start and end quotes.\n//\n// @method surround\nexport function surround (host, range, startCharacter, endCharacter) {\n insertCharacter(range, endCharacter || startCharacter, false)\n insertCharacter(range, startCharacter, true)\n return range\n}\n\n// Removes a character from the text within a range.\n//\n// @method deleteCharacter\nexport function deleteCharacter (host, range, character) {\n if (!containsString(range, character)) return range\n\n // check for selection.rangeCount > 0 ?\n if (window.getSelection().rangeCount > 0) splitBoundaries(range)\n const restoredRange = restoreRange(host, range, () => {\n getNodes(range, [nodeType.textNode], (node) => {\n return node.nodeValue.indexOf(character) >= 0\n })\n .forEach((node) => {\n node.nodeValue = node.nodeValue.replaceAll(character, '')\n })\n })\n\n normalizeBoundaries(restoredRange)\n return restoredRange\n}\n\nexport function containsString (range, str) {\n return range.toString().indexOf(str) >= 0\n}\n\n// Unwrap all tags this range is affected by.\n// Can also affect content outside of the range.\nexport function nukeTag (host, range, tagName) {\n getTags(host, range).forEach((elem) => {\n if (elem.nodeName.toUpperCase() === tagName.toUpperCase()) unwrap(elem)\n })\n}\n\nfunction createNodeIterator (root, filter) {\n let currentNode = root\n let previousNode = null\n\n function nextNode () {\n if (!currentNode) {\n return null\n }\n\n if (currentNode.firstChild && previousNode !== currentNode.firstChild) {\n previousNode = currentNode\n currentNode = currentNode.firstChild\n } else if (currentNode.nextSibling) {\n previousNode = currentNode\n currentNode = currentNode.nextSibling\n } else {\n let parent = currentNode.parentNode\n while (parent && parent !== root) {\n if (parent.nextSibling) {\n previousNode = currentNode = parent.nextSibling\n break\n }\n parent = parent.parentNode\n }\n if (!parent || parent === root) {\n previousNode = currentNode = null\n }\n }\n\n return currentNode\n }\n\n return {\n next: nextNode\n }\n}\n\nfunction isNodeFullyContained (node, range) {\n const nodeRange = document.createRange()\n nodeRange.selectNodeContents(node)\n return range.compareBoundaryPoints(Range.START_TO_START, nodeRange) <= 0 &&\n range.compareBoundaryPoints(Range.END_TO_END, nodeRange) >= 0\n}\n\nfunction canSurroundContents (range) {\n if (!range || !range.startContainer || !range.endContainer) {\n return false\n }\n\n if (range.startContainer === range.endContainer) return true\n\n // Create a custom node iterator for the common ancestor container\n const iterator = createNodeIterator(range.commonAncestorContainer, function (node) {\n return range.isPointInRange(node, 0)\n })\n\n let currentNode\n let boundariesInvalid = false\n\n while ((currentNode = iterator.next())) {\n if (currentNode.nodeType === Node.ELEMENT_NODE) {\n if (!isNodeFullyContained(currentNode, range)) {\n boundariesInvalid = true\n break\n }\n }\n }\n\n return !boundariesInvalid\n}\n","import config from './config.js'\nimport * as content from './content.js'\n\nlet nextBlockId = 1\nconst state = {}\n\nexport const next = getSibling('nextElementSibling')\nexport const previous = getSibling('previousElementSibling')\n\nexport function init (elem, {normalize, plainText, shouldSpellcheck}) {\n setBlockId(elem)\n\n elem.setAttribute('contenteditable', true)\n elem.setAttribute('spellcheck', Boolean(shouldSpellcheck))\n elem.setAttribute('data-plaintext', Boolean(plainText))\n\n elem.classList.remove(config.editableDisabledClass)\n elem.classList.add(config.editableClass)\n\n if (normalize) content.tidyHtml(elem)\n}\n\n\nexport function disable (elem) {\n elem.removeAttribute('contenteditable')\n elem.removeAttribute('spellcheck')\n elem.removeAttribute('data-plaintext')\n\n setState(elem, undefined)\n\n elem.classList.remove(config.editableClass)\n elem.classList.add(config.editableDisabledClass)\n}\n\nexport function isPlainTextBlock (elem) {\n return elem.getAttribute('data-plaintext') === 'true'\n}\n\nexport function setBlockId (elem) {\n if (!elem.hasAttribute('data-editable')) {\n elem.setAttribute('data-editable', `id-${nextBlockId}`)\n nextBlockId += 1\n }\n}\n\n\nexport function getState (elem) {\n if (elem.hasAttribute('data-editable')) {\n const id = elem.getAttribute('data-editable')\n return state[id]\n }\n}\n\n\nexport function setState (elem, data) {\n if (elem.hasAttribute('data-editable')) {\n const id = elem.getAttribute('data-editable')\n state[id] = data\n }\n}\n\n\n// Helpers\n// -------\n\nfunction getSibling (type) {\n return function (element) {\n const sibling = element[type]\n return sibling && sibling.getAttribute('contenteditable')\n ? sibling\n : null\n }\n}\n","function _arrayLikeToArray(r, a) {\n (null == a || a > r.length) && (a = r.length);\n for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e];\n return n;\n}\nexport { _arrayLikeToArray as default };","import arrayLikeToArray from \"./arrayLikeToArray.js\";\nfunction _unsupportedIterableToArray(r, a) {\n if (r) {\n if (\"string\" == typeof r) return arrayLikeToArray(r, a);\n var t = {}.toString.call(r).slice(8, -1);\n return \"Object\" === t && r.constructor && (t = r.constructor.name), \"Map\" === t || \"Set\" === t ? Array.from(r) : \"Arguments\" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? arrayLikeToArray(r, a) : void 0;\n }\n}\nexport { _unsupportedIterableToArray as default };","import arrayWithoutHoles from \"./arrayWithoutHoles.js\";\nimport iterableToArray from \"./iterableToArray.js\";\nimport unsupportedIterableToArray from \"./unsupportedIterableToArray.js\";\nimport nonIterableSpread from \"./nonIterableSpread.js\";\nfunction _toConsumableArray(r) {\n return arrayWithoutHoles(r) || iterableToArray(r) || unsupportedIterableToArray(r) || nonIterableSpread();\n}\nexport { _toConsumableArray as default };","import arrayLikeToArray from \"./arrayLikeToArray.js\";\nfunction _arrayWithoutHoles(r) {\n if (Array.isArray(r)) return arrayLikeToArray(r);\n}\nexport { _arrayWithoutHoles as default };","function _iterableToArray(r) {\n if (\"undefined\" != typeof Symbol && null != r[Symbol.iterator] || null != r[\"@@iterator\"]) return Array.from(r);\n}\nexport { _iterableToArray as default };","function _nonIterableSpread() {\n throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\nexport { _nonIterableSpread as default };","const doubleQuotePairs = [\n ['«', '»'], // ch german, french\n ['»', '«'], // danish\n ['\"', '\"'], // danish, not specified\n ['“', '”'], // english US\n ['”', '”'], // swedish\n ['“', '“'], // chinese simplified\n ['„', '“'] // german\n]\nconst singleQuotePairs = [\n ['‘', '’'], // english UK\n ['‹', '›'], // ch german, french\n ['‚', '‘'], // german\n ['’', '’'], // swedish\n ['›', '‹'], // danish\n [`'`, `'`], // danish, not specified\n [`‘`, `’`] // chinese simplified\n]\n\nconst apostrophe = [\n '’', // german\n `'` // default\n]\nconst quotesRegex = /([‘’‹›‚'«»\"“”„])(?![^<]*?>)/g\n// whitespace end of tag, or any dash (normal, en or em-dash)\n// or any opening double quote\nconst beforeOpeningQuote = /\\s|[>\\-–—«»”\"“„]/\n\n// whitespace begin of tag, or any dash (normal, en or em-dash)\n// or any closing quote, or any punctuation\nconst afterClosingQuote = /\\s|[<\\-–—«»”\"“‘’‹›'.;?:,]/\nlet replacements\n\nexport function replaceAllQuotes (str, replaceQuotesRules) {\n replacements = replaceQuotesRules || {}\n replacements.quotes = replacements.quotes || [undefined, undefined]\n replacements.singleQuotes = replacements.singleQuotes || [undefined, undefined]\n\n const matches = getAllQuotes(str)\n if (matches.length > 0) {\n replaceMatchedQuotes(matches, 0)\n return replaceExistingQuotes(str, matches)\n }\n\n return str\n}\n\nfunction replaceMatchedQuotes (matches, position) {\n\n while (position < matches.length) {\n const closingTag = findClosingQuote(matches, position)\n\n if (closingTag) {\n matches[position].replace = closingTag.type === 'double'\n ? replacements.quotes[0]\n : replacements.singleQuotes[0]\n\n matches[closingTag.position].replace = closingTag.type === 'double'\n ? replacements.quotes[1]\n : replacements.singleQuotes[1]\n\n if (closingTag.position !== position + 1) {\n const nestedMatches = matches.slice(position + 1, closingTag.position)\n if (nestedMatches) {\n replaceMatchedQuotes(nestedMatches, 0)\n }\n }\n\n position = closingTag.position + 1\n } else {\n matches[position].replace = replaceApostrophe(matches[position].char)\n position += 1\n }\n }\n}\n\nfunction findClosingQuote (matches, position) {\n if (position === matches.length - 1) return\n const current = matches[position]\n const openingQuote = current.char\n\n if (current.before && !beforeOpeningQuote.test(current.before)) return\n\n const possibleClosingSingleQuotes = getPossibleClosingQuotes(openingQuote, singleQuotePairs)\n const possibleClosingDoubleQuotes = getPossibleClosingQuotes(openingQuote, doubleQuotePairs)\n for (let i = position + 1; i < matches.length; i++) {\n if ((matches[i].after && afterClosingQuote.test(matches[i].after)) || !matches[i].after) {\n if (possibleClosingSingleQuotes.includes(matches[i].char)) {\n return {position: i, type: 'single'}\n }\n if (possibleClosingDoubleQuotes.includes(matches[i].char)) {\n return {position: i, type: 'double'}\n }\n }\n }\n}\n\nfunction getPossibleClosingQuotes (openingQuote, pairs) {\n return pairs.filter(quotePair => quotePair[0] === openingQuote).map((quotePair) => quotePair[1])\n}\n\nfunction replaceApostrophe (quote) {\n if (apostrophe.includes(quote)) {\n return replacements.apostrophe\n }\n}\n\nfunction getAllQuotes (str) {\n return [...str.matchAll(quotesRegex)].map((match) => {\n const index = match.index\n return {\n char: match[1],\n before: index > 0 ? str[index - 1] : '',\n after: (index + 1) < str.length ? str[index + 1] : ''\n }\n })\n}\n\nfunction replaceExistingQuotes (str, matches) {\n let index = 0\n return str.replace(quotesRegex, (match) => {\n const replacement = matches[index].replace || matches[index].char\n index += 1\n return replacement\n })\n}\n","import config from './config.js'\nimport * as string from './util/string.js'\nimport * as nodeType from './node-type.js'\nimport * as quotes from './quotes.js'\nimport {isPlainTextBlock} from './block.js'\n\nlet allowedElements, allowedPlainTextElements, requiredAttributes, transformElements, blockLevelElements, replaceQuotes\nlet splitIntoBlocks, blacklistedElements\nconst whitespaceOnly = /^\\s*$/\nconst blockPlaceholder = '<!-- BLOCK -->'\nlet keepInternalRelativeLinks\n\nupdateConfig(config)\nexport function updateConfig (conf) {\n const rules = conf.pastedHtmlRules\n allowedElements = rules.allowedElements || {}\n allowedPlainTextElements = rules.allowedPlainTextElements || {}\n requiredAttributes = rules.requiredAttributes || {}\n transformElements = rules.transformElements || {}\n blacklistedElements = rules.blacklistedElements || []\n keepInternalRelativeLinks = rules.keepInternalRelativeLinks || false\n replaceQuotes = rules.replaceQuotes || {}\n\n blockLevelElements = {}\n rules.blockLevelElements.forEach((name) => { blockLevelElements[name] = true })\n splitIntoBlocks = {}\n rules.splitIntoBlocks.forEach((name) => { splitIntoBlocks[name] = true })\n}\n\nexport function paste (block, cursor, clipboardContent) {\n const document = block.ownerDocument\n block.setAttribute(config.pastingAttribute, true)\n\n if (cursor.isSelection) {\n cursor = cursor.deleteExactSurroundingTags()\n .deleteContainedTags()\n .deleteContent()\n }\n\n // Create a placeholder to help parse HTML\n const pasteHolder = document.createElement('div')\n pasteHolder.innerHTML = clipboardContent\n\n const isPlainText = isPlainTextBlock(block)\n const blocks = parseContent(pasteHolder, {plainText: isPlainText})\n\n block.removeAttribute(config.pastingAttribute)\n return {blocks, cursor}\n}\n\n/**\n * - Parse pasted content\n * - Split it up into blocks\n * - clean and normalize every block\n * - optionally strip the host location an anchorTag-href\n * www.livindocs.io/internalLink -> /internalLink\n *\n * @param {DOM node} A container where the pasted content is located.\n * @returns {Array of Strings} An array of cleaned innerHTML like strings.\n */\nexport function parseContent (element, {plainText = false} = {}) {\n const options = {\n allowedElements: plainText ? allowedPlainTextElements : allowedElements,\n keepInternalRelativeLinks: plainText ? false : keepInternalRelativeLinks\n }\n\n // Filter pasted content\n return filterHtmlElements(element, options)\n // Handle Blocks\n .split(blockPlaceholder)\n .map((entry) => string.trim(cleanWhitespace(replaceAllQuotes(entry))))\n .filter((entry) => !whitespaceOnly.test(entry))\n}\n\nfunction filterHtmlElements (elem, options) {\n return Array.from(elem.childNodes).reduce((content, child) => {\n if (blacklistedElements.indexOf(child.nodeName.toLowerCase()) !== -1) {\n return ''\n }\n\n // Keep internal relative links relative (on paste).\n if (options.keepInternalRelativeLinks && child.nodeName === 'A' && child.href) {\n const stripInternalHost = child.getAttribute('href').replace(window.location.origin, '')\n child.setAttribute('href', stripInternalHost)\n }\n\n if (child.nodeType === nodeType.elementNode) {\n const childContent = filterHtmlElements(child, options)\n return content + conditionalNodeWrap(child, childContent, options)\n }\n\n // Escape HTML characters <, > and &\n if (child.nodeType === nodeType.textNode) return content + string.escapeHtml(child.nodeValue)\n return content\n }, '')\n}\n\nfunction conditionalNodeWrap (child, content, options) {\n let nodeName = child.nodeName.toLowerCase()\n nodeName = transformNodeName(nodeName)\n\n if (shouldKeepNode(nodeName, child, options)) {\n const attributes = filterAttributes(nodeName, child)\n\n if (nodeName === 'br') return `<${nodeName + attributes}>`\n\n if (!whitespaceOnly.test(content)) {\n return `<${nodeName + attributes}>${content}</${nodeName}>`\n }\n\n return content\n }\n\n if (splitIntoBlocks[nodeName]) {\n return blockPlaceholder + content + blockPlaceholder\n }\n\n // prevent missing whitespace between text when block-level\n // elements are removed.\n if (blockLevelElements[nodeName]) return `${content} `\n\n return content\n}\n\n// returns string of concatenated attributes e.g. 'target=\"_blank\" rel=\"nofollow\" href=\"/test.com\"'\nfunction filterAttributes (nodeName, node) {\n return Array.from(node.attributes).reduce((attributes, {name, value}) => {\n if (allowedElements[nodeName]?.[name] && value) {\n return `${attributes} ${name}=\"${value}\"`\n }\n return attributes\n }, '')\n}\n\nfunction transformNodeName (nodeName) {\n return transformElements[nodeName] || nodeName\n}\n\nfunction hasRequiredAttributes (nodeName, node) {\n const requiredAttrs = requiredAttributes[nodeName]\n if (!requiredAttrs) return true\n\n return !requiredAttrs.some((name) => !node.getAttribute(name))\n}\n\nfunction shouldKeepNode (nodeName, node, options) {\n return options.allowedElements[nodeName] && hasRequiredAttributes(nodeName, node)\n}\n\nfunction cleanWhitespace (str) {\n return str\n .replace(/\\n/g, ' ')\n .replace(/ {2,}/g, ' ')\n .replace(/(.)\\u00A0/g, (match, group) => group + (/[\\u0020]/.test(group)\n ? '\\u00A0'\n : ' '\n ))\n}\n\nfunction replaceAllQuotes (str) {\n if (replaceQuotes.quotes || replaceQuotes.singleQuotes || replaceQuotes.apostrophe) {\n return quotes.replaceAllQuotes(str, replaceQuotes)\n }\n\n return str\n}\n","/**\n* Check for contenteditable support\n*\n* (from Modernizr)\n* this is known to false positive in some mobile browsers\n* here is a whitelist of verified working browsers:\n* https://github.com/NielsLeenheer/html5test/blob/549f6eac866aa861d9649a0707ff2c0157895706/scripts/engine.js#L2083\n*/\nexport const contenteditable = typeof document.documentElement.contentEditable !== 'undefined'\n\n// Detect webkit browser engine\n// That way we can detect the contenteditable span bug on safari, but exclude chrome\n// Regex taken from: https://github.com/lancedikson/bowser/blob/f09411489ced05811c91cc6670a8e4ca9cbe39a7/src/parser-engines.js#L93-L106\n// Attention, this might be error prone as any engine version change breaks this.\nconst isBlink = /(apple)?webkit\\/537\\.36/i.test(window.navigator.userAgent)\nconst isWebkit = /(apple)?webkit/i.test(window.navigator.userAgent)\nconst webKit = !isBlink && isWebkit\n\n/**\n * Check selectionchange event (supported in IE, Chrome, Firefox and Safari)\n * Firefox supports it since version 52 (2017).\n * Opera has no support as of 2021.\n */\nconst hasNativeSelectionchangeSupport = (document) => {\n const doc = document\n const osc = doc.onselectionchange\n if (osc !== undefined) {\n try {\n doc.onselectionchange = 0\n return doc.onselectionchange === null\n } catch (e) {\n } finally {\n doc.onselectionchange = osc\n }\n }\n return false\n}\n\nexport const selectionchange = hasNativeSelectionchangeSupport(document)\n\n// See Keyboard.prototype.preventContenteditableBug for more information.\nexport const contenteditableSpanBug = !!webKit\n","// Eventable Mixin.\n//\n// Simple mixin to add event emitter methods to an object (Publish/Subscribe).\n//\n// Add on, off and notify methods to an object:\n// eventable(obj)\n//\n// publish an event:\n// obj.notify(context, 'action', param1, param2)\n//\n// Optionally pass a context that will be applied to every event:\n// eventable(obj, context)\n//\n// With this publishing can omit the context argument:\n// obj.notify('action', param1, param2)\n//\n// Subscribe to a 'channel'\n// obj.on('action', funtion(param1, param2){ ... })\n//\n// Unsubscribe an individual listener:\n// obj.off('action', method)\n//\n// Unsubscribe all listeners of a channel:\n// obj.off('action')\n//\n// Unsubscribe all listeners of all channels:\n// obj.off()\n\nexport default function eventable (obj, notifyContext) {\n const events = getEventableModule(notifyContext)\n obj.on = events.on\n obj.off = events.off\n obj.notify = events.notify\n}\n\nfunction getEventableModule (notifyContext) {\n let listeners = {}\n\n function addListener (events, listener) {\n events.split(' ').forEach(event => {\n listeners[event] = listeners[event] || []\n listeners[event].unshift(listener)\n })\n }\n\n function removeListener (event, listener) {\n const eventListeners = listeners[event]\n if (!eventListeners) return\n\n const index = eventListeners.indexOf(listener)\n if (index < 0) return\n\n eventListeners.splice(index, 1)\n }\n\n // Public Methods\n return {\n on (event, listener) {\n if (arguments.length === 2) {\n addListener(event, listener)\n } else if (arguments.length === 1) {\n for (const eventType in event) addListener(eventType, event[eventType])\n }\n return this\n },\n\n off (event, listener) {\n if (arguments.length === 2) {\n removeListener(event, listener)\n } else if (arguments.length === 1) {\n listeners[event] = []\n } else {\n listeners = {}\n }\n },\n\n notify (context, event) {\n const args = Array.from(arguments)\n\n if (notifyContext) {\n event = context\n context = notifyContext\n args.splice(0, 1)\n } else {\n args.splice(0, 2)\n }\n\n if (this.switchContext) {\n const nextEvent = this.switchContext.events.shift()\n if (event !== nextEvent) this.switchContext = undefined\n }\n\n const eventListeners = listeners[event]\n if (!eventListeners) return\n\n // Execute the newest listeners first.\n // Stop if a listener returns false.\n eventListeners.every((listener) => listener.apply(context, args) !== false)\n }\n }\n}\n","// code from mdn: https://developer.mozilla.org/en-US/docs/Web/API/window.scrollX\nfunction getScrollPosition (win) {\n const x = (win.pageXOffset !== undefined) ? win.pageXOffset : (win.document.documentElement || win.document.body.parentNode || win.document.body).scrollLeft\n const y = (win.pageYOffset !== undefined) ? win.pageYOffset : (win.document.documentElement || win.document.body.parentNode || win.document.body).scrollTop\n return {x, y}\n}\n\nexport {getScrollPosition}\n","import * as viewport from './util/viewport.js'\n\nimport * as content from './content.js'\nimport * as parser from './parser.js'\nimport * as string from './util/string.js'\nimport {elementNode, documentFragmentNode} from './node-type.js'\nimport error from './util/error.js'\nimport * as rangeSaveRestore from './range-save-restore.js'\nimport {closest, getSelection, rangesAreEqual} from './util/dom.js'\n\n/**\n * The Cursor module provides a cross-browser abstraction layer for cursor.\n *\n * @module core\n * @submodule cursor\n */\n\nexport default class Cursor {\n\n static findHost (elem, selector) {\n return closest(elem, selector)\n }\n\n /**\n * Class for the Cursor module.\n *\n * @class Cursor\n * @constructor\n */\n constructor (editableHost, range) {\n this.setHost(editableHost)\n this.range = range\n this.isCursor = true\n }\n\n // Get all tags that affect the current selection. Optionally pass a\n // method to filter the returned elements.\n //\n // @param {Function filter(node)} [Optional] Method to filter the returned\n // DOM Nodes.\n // @return {Array of DOM Nodes}\n getTags (filterFunc) {\n return content.getTags(this.host, this.range, filterFunc)\n }\n\n // Get the names of all tags that affect the current selection. Optionally\n // pass a method to filter the returned elements.\n //\n // @param {Function filter(node)} [Optional] Method to filter the DOM\n // Nodes whose names are returned.\n // @return {Array<String> of tag names}\n getTagNames (filterFunc) {\n return content.getTagNames(this.getTags(filterFunc))\n }\n\n // Get all tags of the specified type that affect the current selection.\n //\n // @method getTagsByName\n // @param {String} tagName. E.g. 'a' to get all links.\n // @return {Array of DOM Nodes}\n getTagsByName (tagName) {\n return content.getTagsByName(this.host, this.range, tagName)\n }\n\n // Get all tags that are completely within the current selection.\n getInnerTags (filterFunc) {\n return content.getInnerTags(this.range, filterFunc)\n }\n\n // Get all tags whose text is completely within the current selection.\n getContainedTags (filterFunc) {\n return content.getContainedTags(this.range, filterFunc)\n }\n\n // Get all tags that surround the current selection.\n getAncestorTags (filterFunc) {\n return content.getAncestorTags(this.host, this.range, filterFunc)\n }\n\n isAtEnd () {\n return parser.isEndOfHost(\n this.host,\n this.range.endContainer,\n this.range.endOffset\n )\n }\n\n isAtTextEnd () {\n return parser.isTextEndOfHost(\n this.host,\n this.range.endContainer,\n this.range.endOffset\n )\n }\n\n isAtLastLine () {\n const hostRange = this.win.document.createRange()\n hostRange.selectNodeContents(this.host)\n hostRange.collapse(false)\n const hostCoords = getRangeBoundingClientRect(hostRange, this.win)\n const cursorCoords = getRangeBoundingClientRect(this.range, this.win)\n return isCloseTo(hostCoords.bottom, cursorCoords.bottom)\n }\n\n isAtFirstLine () {\n const hostRange = this.win.document.createRange()\n hostRange.selectNodeContents(this.host)\n hostRange.collapse(true)\n const hostCoords = getRangeBoundingClientRect(hostRange, this.win)\n const cursorCoords = getRangeBoundingClientRect(this.range, this.win)\n return isCloseTo(hostCoords.top, cursorCoords.top)\n }\n\n isAtBeginning () {\n return parser.isBeginningOfHost(\n this.host,\n this.range.startContainer,\n this.range.startOffset\n )\n }\n\n // Insert content before the cursor\n //\n // @param {String, DOM node or document fragment}\n insertBefore (element) {\n if (string.isString(element)) element = content.createFragmentFromString(element)\n if (parser.isDocumentFragmentWithoutChildren(element)) return\n\n element = this.adoptElement(element)\n\n let preceedingElement = element\n if (element.nodeType === documentFragmentNode) {\n const lastIndex = element.childNodes.length - 1\n preceedingElement = element.childNodes[lastIndex]\n }\n\n this.range.insertNode(element)\n this.range.setStartAfter(preceedingElement)\n this.range.setEndAfter(preceedingElement)\n this.host.normalize() // mend text nodes\n }\n\n // Insert content after the cursor\n //\n // @param {String, DOM node or document fragment}\n insertAfter (element) {\n if (string.isString(element)) element = content.createFragmentFromString(element)\n if (parser.isDocumentFragmentWithoutChildren(element)) return\n\n element = this.adoptElement(element)\n\n const after = this.range.cloneRange()\n after.setStart(after.endContainer, after.endOffset)\n after.collapse(true)\n after.insertNode(element)\n this.host.normalize() // mend text nodes\n }\n\n // Alias for #setVisibleSelection()\n setSelection () {\n this.setVisibleSelection()\n }\n\n setVisibleSelection () {\n if (this.win.document.activeElement !== this.host) {\n const {x, y} = viewport.getScrollPosition(this.win)\n this.win.scrollTo(x, y)\n }\n\n const selection = getSelection(this.win)\n selection.removeAllRanges()\n selection.addRange(this.range)\n }\n\n // Take the following example:\n // (The character '|' represents the cursor position)\n //\n // <div contenteditable=\"true\">fo|o</div>\n // before() will return a document fragment containing a text node 'fo'.\n //\n // @returns {Document Fragment} content before the cursor or selection.\n before () {\n const range = this.range.cloneRange()\n range.collapse(true)\n range.setStartBefore(this.host)\n return content.cloneRangeContents(range)\n }\n\n textBefore () {\n const range = this.range.cloneRange()\n range.collapse(true)\n range.setStartBefore(this.host)\n return range.toString()\n }\n\n // Same as before() but returns a string.\n beforeHtml () {\n return content.getInnerHtmlOfFragment(this.before())\n }\n\n // Take the following example:\n // (The character '|' represents the cursor position)\n //\n // <div contenteditable=\"true\">fo|o</div>\n // after() will return a document fragment containing a text node 'o'.\n //\n // @returns {Document Fragment} content after the cursor or selection.\n after () {\n const range = this.range.cloneRange()\n range.collapse(false)\n range.setEndAfter(this.host)\n return content.cloneRangeContents(range)\n }\n\n textAfter () {\n const range = this.range.cloneRange()\n range.collapse(false)\n range.setEndAfter(this.host)\n return range.toString()\n }\n\n // Same as after() but returns a string.\n afterHtml () {\n return content.getInnerHtmlOfFragment(this.after())\n }\n\n getBoundingClientRect () {\n return this.range.getBoundingClientRect()\n }\n\n // Get the BoundingClientRect of the cursor.\n // The returned values are transformed to be absolute\n // (relative to the document).\n getCoordinates (positioning = 'absolute') {\n const coords = this.range.getBoundingClientRect()\n if (positioning === 'fixed') return coords\n\n // translate into absolute positions\n const {x, y} = viewport.getScrollPosition(this.win)\n return {\n top: coords.top + y,\n bottom: coords.bottom + y,\n left: coords.left + x,\n right: coords.right + x,\n height: coords.height,\n width: coords.width\n }\n }\n\n moveBefore (element) {\n this.updateHost(element)\n this.range.setStartBefore(element)\n this.range.setEndBefore(element)\n if (this.isSelection) return new Cursor(this.host, this.range)\n }\n\n moveAfter (element) {\n this.updateHost(element)\n this.range.setStartAfter(element)\n this.range.setEndAfter(element)\n if (this.isSelection) return new Cursor(this.host, this.range)\n }\n\n // Move the cursor to the beginning of the host.\n moveAtBeginning (element = this.host) {\n this.updateHost(element)\n this.range.selectNodeContents(element)\n this.range.collapse(true)\n if (this.isSelection) return new Cursor(this.host, this.range)\n }\n\n // Move the cursor to the end of the host.\n moveAtEnd (element = this.host) {\n this.updateHost(element)\n this.range.selectNodeContents(element)\n this.range.collapse(false)\n if (this.isSelection) return new Cursor(this.host, this.range)\n }\n\n // Move the cursor after the last visible character of the host.\n moveAtTextEnd (element) {\n return this.moveAtEnd(parser.lastChild(element))\n }\n\n setHost (element) {\n if (element.jquery) element = element[0]\n this.host = element\n this.win = (element === undefined || element === null) ? window : element.ownerDocument.defaultView\n }\n\n updateHost (element) {\n const host = parser.getHost(element)\n if (!host) error('Can not set cursor outside of an editable block')\n this.setHost(host)\n }\n\n retainVisibleSelection (callback) {\n this.save()\n callback() // eslint-disable-line callback-return\n this.restore()\n this.setVisibleSelection()\n }\n\n save () {\n this.savedRangeInfo = rangeSaveRestore.save(this.range)\n this.savedRangeInfo.host = this.host\n }\n\n restore () {\n if (!this.savedRangeInfo) error('Could not restore selection')\n\n this.host = this.savedRangeInfo.host\n this.range = rangeSaveRestore.restore(this.host, this.savedRangeInfo)\n this.savedRangeInfo = undefined\n }\n\n equals (cursor) {\n if (!cursor) return false\n\n if (!cursor.host) return false\n if (!cursor.host.isEqualNode(this.host)) return false\n\n if (!cursor.range) return false\n if (!rangesAreEqual(cursor.range, this.range)) return false\n\n return true\n }\n\n // Create an element with the correct ownerWindow\n // (see: http://www.w3.org/DOM/faq.html#ownerdoc)\n createElement (tagName, attributes = {}) {\n const element = this.win.document.createElement(tagName)\n for (const attributeName in attributes) {\n const attributeValue = attributes[attributeName]\n element.setAttribute(attributeName, attributeValue)\n }\n return element\n }\n\n createTextNode (text) {\n return this.win.document.createTextNode(text)\n }\n\n // Make sure a node has the correct ownerWindow\n // (see: https://developer.mozilla.org/en-US/docs/Web/API/Document/importNode)\n adoptElement (node) {\n return content.adoptElement(node, this.win.document)\n }\n\n // Currently we call triggerChange manually after format changes.\n // This is to prevent excessive triggering of the change event during\n // merge or split operations or other manipulations by scripts.\n triggerChange () {\n const event = new Event('formatEditable', {bubbles: true, cancelable: false})\n this.host.dispatchEvent(event)\n }\n}\n\n\n/**\n* Get position of the range or cursor\n*\n* Can be used to reliably get the boundingClientRect without\n* some any of the drawbacks that the native range has.\n*\n* With the native range.getClientBoundingRect(), newlines are\n* not considered when calculating the position\n*\n* @param {Range} range\n* @param {Window} win\n*/\nfunction getRangeBoundingClientRect (range, win) {\n if (range.startContainer.nodeType !== elementNode) return range.getBoundingClientRect()\n const el = win.document.createElement('span')\n el.setAttribute('doc-editable', 'unwrap')\n range.insertNode(el)\n const coords = el.getBoundingClientRect()\n el.remove()\n return coords\n}\n\nfunction isCloseTo (a, b) {\n if (a === b) return true\n if (Math.abs(a - b) <= 2) return true\n return false\n}\n","import arrayWithHoles from \"./arrayWithHoles.js\";\nimport iterableToArrayLimit from \"./iterableToArrayLimit.js\";\nimport unsupportedIterableToArray from \"./unsupportedIterableToArray.js\";\nimport nonIterableRest from \"./nonIterableRest.js\";\nfunction _slicedToArray(r, e) {\n return arrayWithHoles(r) || iterableToArrayLimit(r, e) || unsupportedIterableToArray(r, e) || nonIterableRest();\n}\nexport { _slicedToArray as default };","function _arrayWithHoles(r) {\n if (Array.isArray(r)) return r;\n}\nexport { _arrayWithHoles as default };","function _iterableToArrayLimit(r, l) {\n var t = null == r ? null : \"undefined\" != typeof Symbol && r[Symbol.iterator] || r[\"@@iterator\"];\n if (null != t) {\n var e,\n n,\n i,\n u,\n a = [],\n f = !0,\n o = !1;\n try {\n if (i = (t = t.call(r)).next, 0 === l) {\n if (Object(t) !== t) return;\n f = !1;\n } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0);\n } catch (r) {\n o = !0, n = r;\n } finally {\n try {\n if (!f && null != t[\"return\"] && (u = t[\"return\"](), Object(u) !== u)) return;\n } finally {\n if (o) throw n;\n }\n }\n return a;\n }\n}\nexport { _iterableToArrayLimit as default };","function _nonIterableRest() {\n throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\nexport { _nonIterableRest as default };","function _getPrototypeOf(t) {\n return _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function (t) {\n return t.__proto__ || Object.getPrototypeOf(t);\n }, _getPrototypeOf(t);\n}\nexport { _getPrototypeOf as default };","function _setPrototypeOf(t, e) {\n return _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) {\n return t.__proto__ = e, t;\n }, _setPrototypeOf(t, e);\n}\nexport { _setPrototypeOf as default };","import NodeIterator from './node-iterator.js'\nimport * as nodeType from './node-type.js'\nimport {createRange} from './util/dom.js'\n\nexport default {\n\n // Get the text from an editable block with a NodeIterator.\n // This must work the same as when later iterating over the text\n // in highlightMatches().\n extractText (element, convertBRs = true) {\n let text = ''\n getText(element, convertBRs, (part) => { text += part })\n return text\n },\n\n // Go through the element to highlight the matches while keeping the\n // existing html valid (highlighting a match may require inserting multiple\n // elements).\n //\n // @params\n // - matches\n // Array of positions in the string to highlight:\n // e.g [{\n // startIndex: 0,\n // endIndex: 1,\n // match: 'The', // not used, only the indexes are used for highlighting)\n // marker: DOMNode, // A clone of this element will be inserted\n // id: 'a7382', // used in word-id attribute\n // title: 'The World' // used in title attribute (optional)\n // }]\n highlightMatches (element, matches, countBRs = true) {\n if (!matches || matches.length === 0) {\n return\n }\n\n element.normalize() // mend text nodes\n\n const iterator = new NodeIterator(element)\n let currentMatchIndex = 0\n let totalOffset = 0\n let currentMatch = matches[currentMatchIndex]\n let portions = []\n let next\n let wordId\n let textNode\n while ((next = iterator.getNext())) {\n // Account for <br> elements\n if (next.nodeType === nodeType.textNode && next.data !== '') {\n textNode = next\n } else if (countBRs && next.nodeType === nodeType.elementNode && next.nodeName === 'BR') {\n totalOffset += 1\n continue\n } else {\n continue\n }\n\n const nodeText = textNode.data\n let nodeEndOffset = totalOffset + nodeText.length\n if (currentMatch.startIndex < nodeEndOffset && totalOffset < currentMatch.endIndex) {\n // get portion position (fist, last or in the middle)\n const isFirstPortion = totalOffset <= currentMatch.startIndex\n const isLastPortion = nodeEndOffset >= currentMatch.endIndex\n\n if (isFirstPortion) {\n wordId = currentMatch.id || currentMatch.startIndex\n }\n\n // calculate offset and length\n let offset\n if (isFirstPortion) {\n offset = currentMatch.startIndex - totalOffset\n } else {\n offset = 0\n }\n\n let length\n if (isLastPortion) {\n length = (currentMatch.endIndex - totalOffset) - offset\n } else {\n length = nodeText.length - offset\n }\n\n // create portion object\n const portion = {\n element: textNode,\n text: nodeText.substring(offset, offset + length),\n offset,\n length,\n isLastPortion,\n wordId\n }\n\n portions.push(portion)\n\n if (isLastPortion) {\n const lastNode = this.wrapMatch(portions, currentMatch.marker, currentMatch.title)\n iterator.replaceCurrent(lastNode)\n\n // recalculate nodeEndOffset if we have to replace the current node.\n nodeEndOffset = totalOffset + portion.length + portion.offset\n\n portions = []\n currentMatchIndex += 1\n if (currentMatchIndex < matches.length) {\n currentMatch = matches[currentMatchIndex]\n }\n }\n }\n\n totalOffset = nodeEndOffset\n }\n },\n\n // @return the last wrapped element\n wrapMatch (portions, stencilElement, title) {\n return portions.map((portion) => this.wrapPortion(portion, stencilElement, title)).pop()\n },\n\n wrapPortion (portion, stencilElement, title) {\n const range = createRange()\n range.setStart(portion.element, portion.offset)\n range.setEnd(portion.element, portion.offset + portion.length)\n const node = stencilElement.cloneNode(true)\n node.setAttribute('data-word-id', portion.wordId)\n if (title) node.setAttribute('title', title)\n range.surroundContents(node)\n\n // Fix a weird behaviour where an empty text node is inserted after the range\n if (node.nextSibling) {\n const next = node.nextSibling\n if (next.nodeType === nodeType.textNode && next.data === '') {\n next.remove()\n }\n }\n\n return node\n }\n\n}\n\n// Extract the text of an element.\n// This has two notable behaviours:\n// - It uses a NodeIterator which will skip elements\n// with data-editable=\"remove\"\n// - It returns a \\n for <br> elements\n// (The only block level element allowed inside of editables)\nfunction getText (element, convertBRs, func) {\n const iterator = new NodeIterator(element)\n let next\n while ((next = iterator.getNext())) {\n if (next.nodeType === nodeType.textNode && next.data !== '') {\n func(next.data)\n } else if (convertBRs && next.nodeType === nodeType.elementNode && next.nodeName === 'BR') {\n func('\\n')\n }\n }\n}\n","export function searchText (text, searchTerm, marker) {\n const matchMode = 'text'\n return findMatches(text, [searchTerm], matchMode, marker)\n}\n\nexport function searchWord (text, word, marker) {\n const matchMode = 'word'\n return findMatches(text, [word], matchMode, marker)\n}\n\nexport function searchAllWords (text, words, marker) {\n const matchMode = 'word'\n return findMatches(text, words, matchMode, marker)\n}\n\nfunction findMatches (text, searchTexts, matchMode, marker) {\n if (!text || text === '') return []\n if (marker && !isElement(marker)) return []\n if (!searchTexts?.length) return []\n\n const createRegex = matchMode === 'word'\n ? createWordRegex\n : createHighlightRegex\n\n const regex = createRegex(searchTexts)\n const matches = [...text.matchAll(regex)]\n\n return matches.map((match) => {\n let startIndex\n let matchedText\n if (matchMode === 'word') {\n startIndex = match.index + match[1].length\n matchedText = match[2]\n } else {\n startIndex = match.index\n matchedText = match[0]\n }\n\n return {\n startIndex,\n endIndex: startIndex + matchedText.length,\n match: matchedText,\n marker\n }\n })\n}\n\nfunction isElement (obj) {\n try {\n if (!obj) return false\n return obj instanceof obj.ownerDocument?.defaultView.HTMLElement\n } catch (e) {\n // Browsers not supporting W3 DOM2 don't have HTMLElement and\n // an exception is thrown and we end up here. Testing some\n // properties that all elements have (works on IE7)\n return (typeof obj === 'object') &&\n (obj.nodeType === 1) && (typeof obj.style === 'object') &&\n (typeof obj.ownerDocument === 'object')\n }\n}\n\nfunction createHighlightRegex (words = []) {\n const escapedWords = words.map((word) => escapeRegEx(word))\n\n const regex = `(${escapedWords.join('|')})`\n return new RegExp(regex, 'g')\n}\n\n// Regex to find whole words within a string\n//\n// Unicode character blocks for letters.\n// See: http://jrgraphix.net/research/unicode_blocks.php\n//\n// \\\\u0041-\\\\u005A A-Z (Basic Latin)\n// \\\\u0061-\\\\u007A a-z (Basic Latin)\n// \\\\u0030-\\\\u0039 0-9 (Basic Latin)\n// \\\\u00AA ª (Latin-1 Supplement)\n// \\\\u00B5 µ (Latin-1 Supplement)\n// \\\\u00BA º (Latin-1 Supplement)\n// \\\\u00C0-\\\\u00D6 À-Ö (Latin-1 Supplement)\n// \\\\u00D8-\\\\u00F6 Ø-ö (Latin-1 Supplement)\n// \\\\u00F8-\\\\u00FF ø-ÿ (Latin-1 Supplement)\n// \\\\u0100-\\\\u017F Ā-ſ (Latin Extended-A)\n// \\\\u0180-\\\\u024F ƀ-ɏ (Latin Extended-B)\nconst letterChars = '\\\\u0041-\\\\u005A\\\\u0061-\\\\u007A\\\\u0030-\\\\u0039\\\\u00AA\\\\u00B5\\\\u00BA\\\\u00C0-\\\\u00D6\\\\u00D8-\\\\u00F6\\\\u00F8-\\\\u00FF\\\\u0100-\\\\u017F\\\\u0180-\\\\u024F'\n\nfunction createWordRegex (words = []) {\n const escapedWords = words.map((word) => escapeRegEx(word))\n\n // (notLetter|^)(words)(?=notLetter|$)\n const regex = `([^${letterChars}]|^)` +\n `(${escapedWords.join('|')})` +\n `(?=[^${letterChars}]|$)`\n\n return new RegExp(regex, 'g')\n}\n\nfunction escapeRegEx (s) {\n return String(s).replace(/([.*+?^=!:${}()|[\\]/\\\\])/g, '\\\\$1')\n}\n","import * as content from './content.js'\nimport highlightText from './highlight-text.js'\nimport {searchText} from './plugins/highlighting/text-search.js'\nimport {createElement, createRange, toCharacterRange} from './util/dom.js'\n\nconst highlightSupport = {\n\n // Used to highlight arbitrary text in an editable. All occurrences\n // will be highlighted.\n highlightText (editableHost, text, highlightId, type, dispatcher) {\n if (this.hasHighlight(editableHost, highlightId)) return\n const blockText = highlightText.extractText(editableHost)\n\n const marker = `<span class=\"highlight-${type}\"></span>`\n const markerNode = highlightSupport.createMarkerNode(marker, type, this.win)\n\n const matches = searchText(blockText, text, markerNode)\n\n if (matches && matches.length) {\n if (highlightId) matches[0].id = highlightId\n highlightText.highlightMatches(editableHost, matches)\n if (dispatcher) dispatcher.notify('change', editableHost)\n return matches[0].startIndex\n }\n },\n\n // Used to highlight comments.\n // This function was changed to track matches when text is added to the start\n // of a component, but multiple white spaces break it in a strict sense\n // The function works in the editor and in browsers, but tests with\n // multiple white spaces will fail.\n // Browsers change the white spaces to   and the function works,\n // and the tests in highlight.spec.js have been updated to represent this.\n highlightRange (editableHost, text, highlightId, startIndex, endIndex, dispatcher, type = 'comment') {\n if (this.hasHighlight(editableHost, highlightId)) {\n this.removeHighlight(editableHost, highlightId)\n }\n\n const blockText = highlightText.extractText(editableHost, false)\n if (blockText === '') return -1 // the text was deleted so we can't highlight anything\n\n const marker = highlightSupport.createMarkerNode(\n `<span class=\"highlight-${type}\"></span>`,\n type,\n this.win\n )\n\n const actualStartIndex = startIndex\n const actualEndIndex = endIndex\n\n highlightText.highlightMatches(editableHost, [{\n startIndex: actualStartIndex,\n endIndex: actualEndIndex,\n id: highlightId,\n marker\n }], false)\n\n if (dispatcher) dispatcher.notify('change', editableHost)\n\n return actualStartIndex\n },\n\n updateHighlight (editableHost, highlightId, addCssClass, removeCssClass) {\n if (!document.documentElement.classList) return\n\n const elems = editableHost.querySelectorAll(`[data-word-id=\"${highlightId}\"]`)\n for (const elem of elems) {\n if (removeCssClass) elem.classList.remove(removeCssClass)\n if (addCssClass) elem.classList.add(addCssClass)\n }\n },\n\n removeHighlight (editableHost, highlightId, dispatcher) {\n const elems = editableHost.querySelectorAll(`[data-word-id=\"${highlightId}\"]`)\n for (const elem of elems) {\n content.unwrap(elem)\n }\n\n // remove empty text nodes, combine adjacent text nodes\n editableHost.normalize()\n\n if (dispatcher) dispatcher.notify('change', editableHost)\n },\n\n hasHighlight (editableHost, highlightId) {\n const matches = editableHost.querySelectorAll(`[data-word-id=\"${highlightId}\"]`)\n return !!matches.length\n },\n\n extractHighlightedRanges (editableHost, type) {\n let findMarkersQuery = '[data-word-id]'\n if (type) findMarkersQuery += `[data-highlight=\"${type}\"]`\n const markers = editableHost.querySelectorAll(findMarkersQuery)\n if (!markers.length) return\n\n const groups = {}\n for (const marker of markers) {\n const highlightId = marker.getAttribute('data-word-id')\n if (!groups[highlightId]) {\n groups[highlightId] = editableHost.querySelectorAll(`[data-word-id=\"${highlightId}\"]`)\n }\n }\n\n const res = {}\n for (const highlightId in groups) {\n const position = this.extractMarkerNodePosition(editableHost, groups[highlightId])\n if (position) res[highlightId] = position\n }\n\n return res\n },\n\n extractMarkerNodePosition (editableHost, markers) {\n const range = createRange()\n if (markers.length > 1) {\n range.setStartBefore(markers[0])\n range.setEndAfter(markers[markers.length - 1])\n } else {\n range.selectNode(markers[0])\n }\n\n const textRange = toCharacterRange(range, editableHost)\n return {\n start: textRange.start,\n end: textRange.end,\n text: textRange.text, // browser range result (does whitespace normalization)\n nativeRange: range\n }\n },\n\n cleanupStaleMarkerNodes (editableHost, highlightType) {\n const nodes = editableHost.querySelectorAll(`span[data-highlight=\"${highlightType}\"]`)\n for (const node of nodes) {\n if (!node.textContent.length) {\n node.remove()\n }\n }\n },\n\n createMarkerNode (markerMarkup, highlightType, win) {\n const marker = createElement(markerMarkup, win)\n marker.setAttribute('data-editable', 'ui-unwrap')\n marker.setAttribute('data-highlight', highlightType)\n return marker\n }\n}\n\nexport default highlightSupport\n","import Cursor from './cursor.js'\nimport * as content from './content.js'\nimport * as parser from './parser.js'\nimport * as block from './block.js'\nimport config from './config.js'\nimport highlightSupport from './highlight-support.js'\nimport highlightText from './highlight-text.js'\nimport {\n toCharacterRange,\n rangeToHtml,\n findStartExcludingWhitespace,\n findEndExcludingWhitespace\n} from './util/dom.js'\n\n/**\n * The Selection module provides a cross-browser abstraction layer for range\n * and selection.\n *\n * @module core\n * @submodule selection\n */\n/**\n * Class that represents a selection and provides functionality to access or\n * modify the selection.\n *\n * @class Selection\n * @constructor\n */\n\nexport default class Selection extends Cursor {\n constructor () {\n super(...arguments)\n delete this.isCursor\n this.isSelection = true\n }\n\n // Get the text inside the selection.\n text () {\n return this.range.toString()\n }\n\n // Get the html inside the selection.\n html () {\n return rangeToHtml(this.range)\n }\n\n isAllSelected () {\n return parser.isBeginningOfHost(\n this.host,\n this.range.startContainer,\n this.range.startOffset\n ) && parser.isTextEndOfHost(\n this.host,\n this.range.endContainer,\n this.range.endOffset\n )\n }\n\n getTextRange () {\n return toCharacterRange(this.range, this.host)\n }\n\n // Return a plain string of the current selection content.\n toString () {\n return this.range.toString()\n }\n\n // Return true if the selection can be wrapped, i.e. all open nodes\n // are closed within this selection.\n isWrappable () {\n return content.isWrappable(this.range)\n }\n\n // Get the ClientRects of this selection.\n // Use this if you want more precision than getBoundingClientRect can give.\n getRects () {\n // consider: translate into absolute positions\n // just like Cursor#getCoordinates()\n return this.range.getClientRects()\n }\n\n link (href, attrs = {}) {\n if (href) attrs.href = href\n const link = this.createElement(config.linkMarkup.name, config.linkMarkup.attribs)\n for (const key in attrs) {\n const value = attrs[key]\n if (value === undefined) continue\n if (value === null) {\n link.removeAttribute(key)\n } else {\n link.setAttribute(key, value)\n }\n }\n if (config.linkMarkup.trim) this.trimRange()\n\n this.forceWrap(link)\n }\n\n // trims whitespaces on the left and right of a selection, i.e. what you want in case of links\n trimRange () {\n const textToTrim = this.range.toString()\n const whitespacesOnTheLeft = textToTrim.search(/\\S|$/)\n const lastNonWhitespace = textToTrim.search(/\\S[\\s]+$/)\n const whitespacesOnTheRight = lastNonWhitespace === -1\n ? 0\n : textToTrim.length - (lastNonWhitespace + 1)\n\n const [startContainer, startOffset] = findStartExcludingWhitespace({\n root: this.range.commonAncestorContainer,\n startContainer: this.range.startContainer,\n startOffset: this.range.startOffset,\n whitespacesOnTheLeft\n })\n this.range.setStart(startContainer, startOffset)\n\n const [endContainer, endOffset] = findEndExcludingWhitespace({\n root: this.range.commonAncestorContainer,\n endContainer: this.range.endContainer,\n endOffset: this.range.endOffset,\n whitespacesOnTheRight\n })\n this.range.setEnd(endContainer, endOffset)\n }\n\n unlink () {\n this.removeFormatting(config.linkMarkup.name)\n }\n\n toggleLink (href, attrs) {\n const links = this.getTagsByName(config.linkMarkup.name)\n if (links.length >= 1) {\n const firstLink = links[0]\n if (this.isExactSelection(firstLink, 'visible')) {\n this.unlink()\n } else {\n this.expandTo(firstLink)\n }\n } else {\n this.link(href, attrs)\n }\n }\n\n highlightComment ({highlightId, textRange}) {\n highlightSupport.highlightRange(\n this.host,\n highlightId,\n textRange.text,\n textRange.start,\n textRange.end,\n undefined, // dispatcher\n 'comment'\n )\n }\n\n // Manually add a highlight\n // Note: the current code does not work with newlines (LP)\n highlight ({highlightId}) {\n const textBefore = this.textBefore()\n const currentTextContent = this.text()\n\n const marker = '<span class=\"highlight-comment\"></span>'\n const markerNode = highlightSupport.createMarkerNode(marker, this.win)\n\n markerNode.setAttribute('data-match', currentTextContent)\n\n const match = {\n startIndex: textBefore.length,\n endIndex: textBefore.length + currentTextContent.length,\n match: currentTextContent,\n marker: markerNode\n }\n\n // Note: highlighting won't retain the selection\n highlightText.highlightMatches(this.host, [match])\n }\n\n // e.g. toggle('<em>')\n toggle (elem) {\n if (block.isPlainTextBlock(this.host)) return\n if (this.range.collapsed) return\n elem = this.adoptElement(elem)\n this.range = content.toggleTag(this.host, this.range, elem)\n this.setVisibleSelection()\n }\n\n toggleCustom ({tagName, attributes, trim = false}) {\n const customElem = this.createElement(tagName, attributes)\n if (trim) this.trimRange()\n this.toggle(customElem)\n }\n\n makeCustom ({tagName, attributes, trim = false}) {\n const customElem = this.createElement(tagName, attributes)\n if (trim) this.trimRange()\n this.forceWrap(customElem)\n }\n\n makeBold () {\n const bold = this.createElement(config.boldMarkup.name, config.boldMarkup.attribs)\n if (config.boldMarkup.trim) this.trimRange()\n this.forceWrap(bold)\n }\n\n toggleBold () {\n const bold = this.createElement(config.boldMarkup.name, config.boldMarkup.attribs)\n if (config.boldMarkup.trim) this.trimRange()\n this.toggle(bold)\n }\n\n giveEmphasis () {\n const em = this.createElement(config.italicMarkup.name, config.italicMarkup.attribs)\n if (config.italicMarkup.trim) this.trimRange()\n this.forceWrap(em)\n }\n\n toggleEmphasis () {\n const em = this.createElement(config.italicMarkup.name, config.italicMarkup.attribs)\n if (config.italicMarkup.trim) this.trimRange()\n this.toggle(em)\n }\n\n makeUnderline () {\n const u = this.createElement(config.underlineMarkup.name, config.underlineMarkup.attribs)\n if (config.underlineMarkup.trim) this.trimRange()\n this.forceWrap(u)\n }\n\n toggleUnderline () {\n const u = this.createElement(config.underlineMarkup.name, config.underlineMarkup.attribs)\n if (config.underlineMarkup.trim) this.trimRange()\n this.toggle(u)\n }\n\n insertCharacter (character) {\n const cursor = this.deleteContent()\n const textNode = cursor.createTextNode(character)\n cursor.insertBefore(textNode)\n cursor.setVisibleSelection()\n return cursor\n }\n\n // Surround the selection with characters like quotes.\n //\n // @param {String} E.g. '«'\n // @param {String} E.g. '»'\n surround (startCharacter, endCharacter) {\n this.range = content.surround(this.host, this.range, startCharacter, endCharacter)\n this.setVisibleSelection()\n }\n\n removeSurround (startCharacter, endCharacter) {\n this.range = content.deleteCharacter(this.host, this.range, startCharacter)\n this.range = content.deleteCharacter(this.host, this.range, endCharacter)\n this.setVisibleSelection()\n }\n\n removeChars (chars = []) {\n for (let i = 0; i < chars.length; i++) {\n const char = chars[i]\n this.range = content.deleteCharacter(this.host, this.range, char)\n }\n this.setVisibleSelection()\n }\n\n toggleSurround (startCharacter, endCharacter) {\n if (this.containsString(startCharacter) &&\n this.containsString(endCharacter)) {\n this.removeSurround(startCharacter, endCharacter)\n } else {\n this.surround(startCharacter, endCharacter)\n }\n }\n\n // @param {String} selector. An element selector, e.g. 'a' or 'span.some-class'\n // that represents elements to be removed; if undefined,\n // remove all.\n removeFormatting (selector) {\n this.range = content.removeFormatting(this.host, this.range, selector)\n this.setVisibleSelection()\n }\n\n // Delete the farest ancestor that is an exact selection\n //\n // @return Selection instance\n deleteExactSurroundingTags () {\n const ancestorTags = this.getAncestorTags().reverse()\n for (const ancestorTag of ancestorTags) {\n if (this.isExactSelection(ancestorTag)) {\n ancestorTag.remove()\n break\n }\n }\n return new Selection(this.host, this.range)\n }\n\n // Delete all the tags whose text is completely within the current selection.\n //\n // @return Selection instance\n deleteContainedTags () {\n const containedTags = this.getContainedTags()\n containedTags.forEach(containedTag => containedTag.remove())\n return new Selection(this.host, this.range)\n }\n\n // Delete the contents inside the range and exact surrounding markups.\n // After that the selection will be a cursor.\n //\n // @return Cursor instance\n deleteContent () {\n this.range.deleteContents()\n return new Cursor(this.host, this.range)\n }\n\n // Expand the current selection.\n //\n // @param {DOM Node}\n expandTo (elem) {\n this.range = content.expandTo(this.host, this.range, elem)\n this.setVisibleSelection()\n }\n\n // Collapse the selection at the beginning of the selection\n //\n // @return Cursor instance\n collapseAtBeginning (elem) {\n this.range.collapse(true)\n this.setVisibleSelection()\n return new Cursor(this.host, this.range)\n }\n\n // Collapse the selection at the end of the selection\n //\n // @return Cursor instance\n collapseAtEnd (elem) {\n this.range.collapse(false)\n this.setVisibleSelection()\n return new Cursor(this.host, this.range)\n }\n\n // Wrap the selection with the specified tag. If any other tag with\n // the same tagName is affecting the selection this tag will be\n // remove first.\n forceWrap (elem) {\n if (block.isPlainTextBlock(this.host)) return\n if (this.range.collapsed) return\n elem = this.adoptElement(elem)\n this.range = content.forceWrap(this.host, this.range, elem)\n this.setVisibleSelection()\n }\n\n // Check if the selection is the same as the elements contents.\n //\n // @method isExactSelection\n // @param {DOM Node}\n // @param {flag: undefined or 'visible'} if 'visible' is passed\n // whitespaces at the beginning or end of the selection will\n // be ignored.\n // @return {Boolean}\n isExactSelection (elem, onlyVisible) {\n return content.isExactSelection(this.range, elem, onlyVisible)\n }\n\n // Check if the selection contains the passed string.\n //\n // @method containsString\n // @return {Boolean}\n containsString (str) {\n return content.containsString(this.range, str)\n }\n\n // Delete all occurrences of the specified character from the\n // selection.\n deleteCharacter (character) {\n this.range = content.deleteCharacter(this.host, this.range, character)\n this.setVisibleSelection()\n }\n}\n","import _typeof from \"./typeof.js\";\nimport assertThisInitialized from \"./assertThisInitialized.js\";\nfunction _possibleConstructorReturn(t, e) {\n if (e && (\"object\" == _typeof(e) || \"function\" == typeof e)) return e;\n if (void 0 !== e) throw new TypeError(\"Derived constructors may only return object or undefined\");\n return assertThisInitialized(t);\n}\nexport { _possibleConstructorReturn as default };","function _assertThisInitialized(e) {\n if (void 0 === e) throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n return e;\n}\nexport { _assertThisInitialized as default };","import setPrototypeOf from \"./setPrototypeOf.js\";\nfunction _inherits(t, e) {\n if (\"function\" != typeof e && null !== e) throw new TypeError(\"Super expression must either be null or a function\");\n t.prototype = Object.create(e && e.prototype, {\n constructor: {\n value: t,\n writable: !0,\n configurable: !0\n }\n }), Object.defineProperty(t, \"prototype\", {\n writable: !1\n }), e && setPrototypeOf(t, e);\n}\nexport { _inherits as default };","import Cursor from './cursor.js'\nimport Selection from './selection.js'\nimport {rangesAreEqual} from './util/dom.js'\n\n/** RangeContainer\n *\n * primarily used to compare ranges\n * its designed to work with undefined ranges as well\n * so we can easily compare them without checking for undefined\n * all the time\n */\n\nexport default class RangeContainer {\n constructor (editableHost, range) {\n this.host = editableHost && editableHost.jquery\n ? editableHost[0]\n : editableHost\n // Safari 17 seems to modify the range instance on the fly which breaks later comparisons.\n // We clone the range at the time of the RangeContainer creation.\n // https://developer.apple.com/documentation/safari-release-notes/safari-17-release-notes#New-Features\n this.range = range?.cloneRange()\n this.isAnythingSelected = (range !== undefined)\n this.isCursor = (this.isAnythingSelected && range.collapsed)\n this.isSelection = (this.isAnythingSelected && !this.isCursor)\n }\n\n getCursor () {\n if (this.isCursor) return new Cursor(this.host, this.range)\n }\n\n getSelection () {\n if (this.isSelection) return new Selection(this.host, this.range)\n }\n\n forceCursor () {\n if (!this.isSelection) return this.getCursor()\n return this.getSelection().deleteContent()\n }\n\n isDifferentFrom (otherRangeContainer = new RangeContainer()) {\n const self = this.range\n const other = otherRangeContainer.range\n if (self && other) return !rangesAreEqual(self, other)\n if (!self && !other) return false\n return true\n }\n}\n","import * as parser from './parser.js'\nimport RangeContainer from './range-container.js'\nimport Cursor from './cursor.js'\nimport Selection from './selection.js'\nimport {getSelection} from './util/dom.js'\n\n/**\n * The SelectionWatcher module watches for selection changes inside\n * of editable blocks.\n *\n * @module core\n * @submodule selectionWatcher\n */\n\nexport default class SelectionWatcher {\n constructor (dispatcher, win) {\n this.dispatcher = dispatcher\n this.win = win || window\n this.selection = undefined\n this.currentSelection = undefined\n this.currentRange = undefined\n }\n\n /**\n * Updates the internal selection pointer to the current selection.\n * Returns true if no exception occurred.\n */\n syncSelection () {\n // Note: the try catch was introduced because of rangy exceptions with nativeSelections\n try {\n this.selection = getSelection(this.win)\n } catch (err) {\n return false\n }\n\n return true\n }\n\n /**\n * Return a RangeContainer if the current selection is within an editable\n * otherwise return an empty RangeContainer\n */\n getRangeContainer () {\n const successfulSync = this.syncSelection()\n\n // rangeCount is 0 or 1 in all browsers except firefox\n // firefox can work with multiple ranges\n // (on a mac hold down the command key to select multiple ranges)\n if (this.selection?.rangeCount && successfulSync) {\n const range = this.selection.getRangeAt(0)\n const hostNode = parser.getHost(range.commonAncestorContainer)\n if (hostNode) return new RangeContainer(hostNode, range)\n }\n\n // return an empty range container\n return new RangeContainer()\n }\n\n /**\n * Gets a fresh RangeContainer with the current selection or cursor.\n *\n * @return RangeContainer instance\n */\n getFreshRange () {\n return this.getRangeContainer()\n }\n\n /**\n * Gets a fresh RangeContainer with the current selection or cursor.\n *\n * @return Either a Cursor or Selection instance or undefined if\n * there is neither a selection or cursor.\n */\n getFreshSelection () {\n const rangeContainer = this.getRangeContainer()\n\n return rangeContainer.isCursor\n ? rangeContainer.getCursor(this.win)\n : rangeContainer.getSelection(this.win)\n }\n\n /**\n * Get the selection set by the last selectionChanged event.\n * Sometimes the event does not fire fast enough and the selection\n * you get is not the one the user sees.\n * In those cases use #getFreshSelection()\n *\n * @return Either a Cursor or Selection instance or undefined if\n * there is neither a selection or cursor.\n */\n getSelection () {\n return this.currentSelection\n }\n\n forceCursor () {\n const rangeContainer = this.getRangeContainer()\n return rangeContainer.forceCursor()\n }\n\n selectionChanged () {\n const newRangeContainer = this.getRangeContainer()\n if (newRangeContainer.isDifferentFrom(this.currentRange)) {\n const lastSelection = this.currentSelection\n this.currentRange = newRangeContainer\n\n // empty selection or cursor\n if (lastSelection) {\n if (lastSelection.isCursor && !this.currentRange.isCursor) {\n this.dispatcher.notify('cursor', lastSelection.host)\n } else if (lastSelection.isSelection && !this.currentRange.isSelection) {\n this.dispatcher.notify('selection', lastSelection.host)\n }\n }\n\n // set new selection or cursor and fire event\n if (this.currentRange.isCursor) {\n this.currentSelection = new Cursor(this.currentRange.host, this.currentRange.range)\n this.dispatcher.notify('cursor', this.currentSelection.host, this.currentSelection)\n } else if (this.currentRange.isSelection) {\n this.currentSelection = new Selection(this.currentRange.host, this.currentRange.range)\n this.dispatcher.notify('selection', this.currentSelection.host, this.currentSelection)\n } else {\n this.currentSelection = undefined\n }\n }\n }\n}\n","import {createRange, containsRange} from './util/dom.js'\nimport {contenteditableSpanBug} from './feature-detection.js'\nimport * as nodeType from './node-type.js'\nimport eventable from './eventable.js'\n\n/**\n * The Keyboard module defines an event API for key events.\n */\n\nexport default class Keyboard {\n constructor (selectionWatcher) {\n eventable(this)\n this.selectionWatcher = selectionWatcher\n }\n\n dispatchKeyEvent (event, target, notifyCharacterEvent) {\n switch (event.keyCode) {\n case this.key.left:\n return this.notify(target, 'left', event)\n\n case this.key.right:\n return this.notify(target, 'right', event)\n\n case this.key.up:\n return this.notify(target, 'up', event)\n\n case this.key.down:\n return this.notify(target, 'down', event)\n\n case this.key.tab:\n if (event.shiftKey) return this.notify(target, 'shiftTab', event)\n return this.notify(target, 'tab', event)\n\n case this.key.esc:\n return this.notify(target, 'esc', event)\n\n case this.key.backspace:\n this.preventContenteditableBug(target, event)\n return this.notify(target, 'backspace', event)\n\n case this.key.delete:\n this.preventContenteditableBug(target, event)\n return this.notify(target, 'delete', event)\n\n case this.key.enter:\n if (event.shiftKey) return this.notify(target, 'shiftEnter', event)\n return this.notify(target, 'enter', event)\n\n case this.key.ctrl:\n case this.key.shift:\n case this.key.alt:\n return\n\n // Metakey\n case 224: // Firefox: 224\n case 17: // Opera: 17\n case 91: // Chrome/Safari: 91 (Left)\n case 93: // Chrome/Safari: 93 (Right)\n return\n\n default:\n // Added here to avoid using fall-through in the switch\n // when b or i are pressed without ctrlKey or metaKey\n if (event.keyCode === this.key.b && (event.ctrlKey || event.metaKey)) {\n return this.notify(target, 'bold', event)\n }\n if (event.keyCode === this.key.i && (event.ctrlKey || event.metaKey)) {\n return this.notify(target, 'italic', event)\n }\n\n this.preventContenteditableBug(target, event)\n if (!notifyCharacterEvent) return\n // Don't notify character events as long as either the ctrl or\n // meta key are pressed.\n // see: https://github.com/livingdocsIO/editable.js/pull/125\n if (!event.ctrlKey && !event.metaKey) return this.notify(target, 'character', event)\n }\n }\n\n preventContenteditableBug (target, event) {\n if (!contenteditableSpanBug) return\n if (event.ctrlKey || event.metaKey) return\n\n // This fixes a strange webkit bug that can be reproduced as follows:\n //\n // 1. A node used within a contenteditable has some style, e.g through the\n // following CSS:\n //\n // strong {\n // color: red\n // }\n //\n // 2. A selection starts with the first character of a styled node and ends\n // outside of that node, e.g: \"big beautiful\" is selected in the following\n // html:\n //\n // <p contenteditable=\"true\">\n // Hello <strong>big</strong> beautiful world\n // </p>\n //\n // 3. The user types a letter character to replace \"big beautiful\", e.g. \"x\"\n //\n // Result: Webkits adds <font> and <b> tags:\n //\n // <p contenteditable=\"true\">\n // Hello\n // <font color=\"#ff0000\">\n // <b>f</b>\n // </font>\n // world\n // </p>\n //\n // This bug ONLY happens, if the first character of the node is selected and\n // the selection goes further than the node.\n //\n // Solution:\n //\n // Manually remove the element that would be removed anyway before inserting\n // the new letter.\n const rangeContainer = this.selectionWatcher.getFreshRange()\n if (!rangeContainer.isSelection) return\n\n const nodeToRemove = Keyboard.getNodeToRemove(rangeContainer.range, target)\n if (nodeToRemove) nodeToRemove.remove()\n }\n\n static getNodeToRemove (selectionRange, target) {\n // This function is only used by preventContenteditableBug. It is exposed on\n // the Keyboard constructor for testing purpose only.\n\n // Let's make sure we are in the edge-case, in which the bug happens.\n // The selection does not start at the beginning of a node. We have\n // nothing to do.\n if (selectionRange.startOffset !== 0) return\n\n let startNodeElement = selectionRange.startContainer\n\n // If the node is a textNode, we select its parent.\n if (startNodeElement.nodeType === nodeType.textNode) startNodeElement = startNodeElement.parentNode\n\n // The target is the contenteditable element, which we do not want to replace\n if (startNodeElement === target) return\n\n // We get a range that contains everything within the sartNodeElement to test\n // if the selectionRange is within the startNode, we have nothing to do.\n const startNodeRange = createRange()\n startNodeRange.setStartBefore(startNodeElement.firstChild)\n startNodeRange.setEndAfter(startNodeElement.lastChild)\n if (containsRange(startNodeRange, selectionRange)) return\n\n // If the selectionRange.startContainer was a textNode, we have to make sure\n // that its parent's content starts with this node. Content is either a\n // text node or an element. This is done to avoid false positives like the\n // following one:\n // <strong>foo<em>bar</em>|baz</strong>quux|\n if (selectionRange.startContainer.nodeType === nodeType.textNode) {\n const contentNodeTypes = [nodeType.textNode, nodeType.elementNode]\n let firstContentNode = startNodeElement.firstChild\n\n do {\n if (contentNodeTypes.indexOf(firstContentNode.nodeType) !== -1) break\n } while ((firstContentNode = firstContentNode.nextSibling))\n\n if (firstContentNode !== selectionRange.startContainer) return\n }\n\n // Now we know, that we have to return at least the startNodeElement for\n // removal. But it could be, that we also need to remove its parent, e.g.\n // we need to remove <strong> in the following example:\n // <strong><em>|foo</em>bar</strong>baz|\n const rangeStartingBeforeCurrentElement = selectionRange.cloneRange()\n rangeStartingBeforeCurrentElement.setStartBefore(startNodeElement)\n\n return Keyboard.getNodeToRemove(\n rangeStartingBeforeCurrentElement,\n target\n ) || startNodeElement\n }\n}\n\nKeyboard.key = Keyboard.prototype.key = {\n left: 37,\n up: 38,\n right: 39,\n down: 40,\n tab: 9,\n esc: 27,\n backspace: 8,\n delete: 46,\n enter: 13,\n shift: 16,\n ctrl: 17,\n alt: 18,\n b: 66,\n i: 73\n}\n","const isValidQuotePairConfig = (quotePair) => Array.isArray(quotePair) && quotePair.length === 2\n\nexport const shouldApplySmartQuotes = (config, target) => {\n const {smartQuotes, quotes, singleQuotes} = config\n return !!smartQuotes && isValidQuotePairConfig(quotes) && isValidQuotePairConfig(singleQuotes) && target.isContentEditable\n}\n\nexport const isDoubleQuote = (char) => /^[«»\"“”„]$/.test(char)\nexport const isSingleQuote = (char) => /^[‘’‹›‚']$/.test(char)\nexport const isApostrophe = (char) => /^[’']$/.test(char)\nexport const isWhitespace = (char) => /^\\s$/.test(char)\nexport const isSeparatorOrWhitespace = (char) => /\\s|[>\\-–—]/.test(char)\n\nconst shouldBeOpeningQuote = (text, indexCharBefore) => indexCharBefore < 0 || isSeparatorOrWhitespace(text[indexCharBefore])\nconst shouldBeClosingQuote = (text, indexCharBefore) => !!text[indexCharBefore] && !isSeparatorOrWhitespace(text[indexCharBefore])\nconst hasCharAfter = (textArr, indexCharAfter) => !!textArr[indexCharAfter] && !isWhitespace(textArr[indexCharAfter])\nconst shouldBeSingleOpeningQuote = (text, indexCharBefore) => !!text[indexCharBefore] && isDoubleQuote(text[indexCharBefore])\n\nexport const replaceQuote = (range, index, quoteType) => {\n const startContainer = range?.startContainer\n const nodeValue = startContainer?.nodeValue\n if (!nodeValue) {\n return null\n }\n const newText = `${nodeValue.substring(0, index)}${quoteType}${nodeValue.substring(index + 1)}`\n const newTextNode = document.createTextNode(newText)\n startContainer.replaceWith(newTextNode)\n return newTextNode\n}\n\nconst hasSingleOpeningQuote = (textArr, offset, singleOpeningQuote) => {\n if (offset <= 0) {\n return false\n }\n for (let i = offset - 1; i >= 0; i--) {\n if (isSingleQuote(textArr[i]) && (!isApostrophe(singleOpeningQuote) && !isApostrophe(textArr[i]))) {\n return textArr[i] === singleOpeningQuote\n }\n }\n return false\n}\n\nexport const applySmartQuotes = (range, config, char, target, cursorOffset) => {\n const isCharSingleQuote = isSingleQuote(char)\n const isCharDoubleQuote = isDoubleQuote(char)\n\n if (!isCharDoubleQuote && !isCharSingleQuote) {\n return\n }\n\n const {quotes, singleQuotes} = config\n if (char === quotes[0] || char === quotes[1] || char === singleQuotes[0] || char === singleQuotes[1]) {\n return\n }\n\n const offset = range.startOffset\n const textArr = [...range.startContainer.textContent]\n let newTextNode\n\n // Special case for a single quote following a double quote,\n // which should be transformed into a single opening quote\n if (isCharSingleQuote && shouldBeSingleOpeningQuote(textArr, offset - 2)) {\n newTextNode = replaceQuote(range, offset - 1, singleQuotes[0])\n } else if (shouldBeClosingQuote(textArr, offset - 2)) {\n if (isCharSingleQuote) {\n // Don't transform apostrophes\n if (hasCharAfter(textArr, offset)) {\n return\n }\n // Don't transform single-quote if there is no respective single-opening-quote\n if (!hasSingleOpeningQuote(textArr, offset, singleQuotes[0])) {\n return\n }\n }\n const closingQuote = isCharSingleQuote ? singleQuotes[1] : quotes[1]\n newTextNode = replaceQuote(range, offset - 1, closingQuote)\n } else if (shouldBeOpeningQuote(textArr, offset - 2)) {\n const openingQuote = isCharSingleQuote ? singleQuotes[0] : quotes[0]\n newTextNode = replaceQuote(range, offset - 1, openingQuote)\n }\n\n if (!newTextNode) {\n return\n }\n\n // Resets the cursor to the currentPosition after applying the smart-quote\n const window = target.ownerDocument.defaultView\n const selection = window.getSelection()\n selection.collapse(newTextNode, cursorOffset ?? offset)\n}\n\n","import {selectionchange} from './feature-detection.js'\nimport * as clipboard from './clipboard.js'\nimport eventable from './eventable.js'\nimport SelectionWatcher from './selection-watcher.js'\nimport config from './config.js'\nimport Keyboard from './keyboard.js'\nimport {closest} from './util/dom.js'\nimport {replaceLast, endsWithSingleSpace} from './util/string.js'\nimport {applySmartQuotes, shouldApplySmartQuotes} from './smartQuotes.js'\n\n/**\n * The Dispatcher module is responsible for dealing with events and their handlers.\n *\n * @module core\n * @submodule dispatcher\n */\nexport default class Dispatcher {\n\n constructor (editable) {\n const win = editable.win\n eventable(this, editable)\n this.document = win.document\n this.config = editable.config\n this.editable = editable\n this.editableSelector = editable.editableSelector\n this.selectionWatcher = new SelectionWatcher(this, win)\n this.keyboard = new Keyboard(this.selectionWatcher)\n this.activeListeners = []\n this.setup()\n this.getEditableBlockByEvent = (evt) => closest(evt.target, editable.editableSelector)\n }\n\n setupDocumentListener (event, func, capture = false) {\n const listener = {event, listener: func.bind(this), capture}\n this.activeListeners.push(listener)\n\n this.document.addEventListener(event, listener.listener, capture)\n return this\n }\n\n /**\n * Sets up all events that Editable.JS is catching.\n *\n * @method setup\n */\n setup () {\n // setup all events listeners and keyboard handlers\n this.setupKeyboardEvents()\n this.setupEventListeners()\n }\n\n unload () {\n this.off()\n for (const l of this.activeListeners) {\n this.document.removeEventListener(l.event, l.listener, l.capture)\n }\n this.activeListeners.length = 0\n }\n\n suspend () {\n if (this.suspended) return\n this.suspended = true\n for (const l of this.activeListeners) {\n this.document.removeEventListener(l.event, l.listener, l.capture)\n }\n this.activeListeners.length = 0\n }\n\n continue () {\n if (!this.suspended) return\n this.suspended = false\n this.setupEventListeners()\n }\n\n setupEventListeners () {\n this.setupElementListeners()\n this.setupKeydownListener()\n\n if (selectionchange) {\n this.setupSelectionChangeListeners()\n } else {\n this.setupSelectionChangeFallbackListeners()\n }\n }\n\n /**\n * Sets up events that are triggered on modifying an element.\n *\n * @method setupElementListeners\n */\n setupElementListeners () {\n const currentInput = {offset: undefined}\n this\n .setupDocumentListener('focus', function focusListener (evt) {\n const block = this.getEditableBlockByEvent(evt)\n if (!block) return\n if (evt.target.getAttribute(config.pastingAttribute)) return\n this.selectionWatcher.syncSelection()\n this.notify('focus', block)\n }, true)\n .setupDocumentListener('blur', function blurListener (evt) {\n const block = this.getEditableBlockByEvent(evt)\n if (!block) return\n if (block.getAttribute(config.pastingAttribute)) return\n this.notify('blur', block)\n }, true)\n .setupDocumentListener('copy', function copyListener (evt) {\n const block = this.getEditableBlockByEvent(evt)\n if (!block) return\n const selection = this.selectionWatcher.getFreshSelection()\n if (selection && selection.isSelection) {\n this.notify('clipboard', block, 'copy', selection)\n }\n })\n .setupDocumentListener('cut', function cutListener (evt) {\n const block = this.getEditableBlockByEvent(evt)\n if (!block) return\n const selection = this.selectionWatcher.getFreshSelection()\n if (selection && selection.isSelection) {\n this.notify('clipboard', block, 'cut', selection)\n }\n })\n .setupDocumentListener('paste', function pasteListener (evt) {\n const block = this.getEditableBlockByEvent(evt)\n if (!block) return\n\n evt.preventDefault()\n const selection = this.selectionWatcher.getFreshSelection()\n const clipboardContent = evt.clipboardData.getData('text/html') || evt.clipboardData.getData('text/plain')\n\n const {blocks, cursor} = clipboard.paste(block, selection, clipboardContent)\n if (blocks.length) {\n if (endsWithSingleSpace(evt.target.innerText)) {\n cursor.retainVisibleSelection(() => {\n block.innerHTML = replaceLast(block.innerHTML, ' ', ' ')\n })\n }\n this.notify('paste', block, blocks, cursor)\n // The input event does not fire when we process the content manually\n // and insert it via script\n this.notify('change', block)\n } else {\n cursor.setVisibleSelection()\n }\n })\n .setupDocumentListener('input', function inputListener (evt) {\n const block = this.getEditableBlockByEvent(evt)\n if (!block) return\n\n if (shouldApplySmartQuotes(config, evt.target)) {\n const selection = this.selectionWatcher.getFreshSelection()\n // Save offset of new input, to reset cursor correctly after timeout delay\n currentInput.offset = selection.range?.startOffset\n setTimeout(() => {\n applySmartQuotes(selection.range, config, evt.data, evt.target, currentInput.offset)\n }, 300\n )\n }\n\n this.notify('change', block)\n })\n\n .setupDocumentListener('formatEditable', function formatEditableListener (evt) {\n const block = this.getEditableBlockByEvent(evt)\n if (!block) return\n this.notify('change', block)\n })\n }\n\n dispatchSwitchEvent (event, element, direction) {\n if (event.altKey || event.ctrlKey || event.metaKey || event.shiftKey) return\n const cursor = this.selectionWatcher.getFreshSelection()\n if (!cursor || cursor.isSelection) return\n\n // store position\n if (!this.switchContext) {\n this.switchContext = {\n positionX: cursor.getBoundingClientRect().left,\n events: ['cursor']\n }\n } else {\n this.switchContext.events = ['cursor']\n }\n\n if (direction === 'up' && cursor.isAtFirstLine()) {\n event.preventDefault()\n event.stopPropagation()\n this.switchContext.events = ['switch', 'blur', 'focus', 'cursor']\n this.notify('switch', element, direction, cursor)\n }\n\n if (direction === 'down' && cursor.isAtLastLine()) {\n event.preventDefault()\n event.stopPropagation()\n this.switchContext.events = ['switch', 'blur', 'focus', 'cursor']\n this.notify('switch', element, direction, cursor)\n }\n }\n\n /**\n * Sets up listener for keydown event which forwards events to\n * the Keyboard instance.\n *\n * @method setupKeydownListener\n */\n setupKeydownListener () {\n this.setupDocumentListener('keydown', function (evt) {\n const block = this.getEditableBlockByEvent(evt)\n if (!block) return\n this.keyboard.dispatchKeyEvent(evt, block, false)\n }, true)\n }\n\n /**\n * Sets up handlers for the keyboard events.\n * Keyboard definitions are in {{#crossLink \"Keyboard\"}}{{/crossLink}}.\n *\n * @method setupKeyboardEvents\n */\n setupKeyboardEvents () {\n const self = this\n\n this.keyboard\n .on('up', function (event) {\n self.dispatchSwitchEvent(event, this, 'up')\n })\n\n .on('down', function (event) {\n self.dispatchSwitchEvent(event, this, 'down')\n })\n\n .on('backspace', function (event) {\n const rangeContainer = self.selectionWatcher.getFreshRange()\n if (!rangeContainer.isCursor) return\n\n const cursor = rangeContainer.getCursor()\n if (!cursor.isAtBeginning()) return\n\n event.preventDefault()\n event.stopPropagation()\n self.notify('merge', this, 'before', cursor)\n })\n\n .on('delete', function (event) {\n const rangeContainer = self.selectionWatcher.getFreshRange()\n if (!rangeContainer.isCursor) return\n\n const cursor = rangeContainer.getCursor()\n if (!cursor.isAtTextEnd()) return\n\n event.preventDefault()\n event.stopPropagation()\n self.notify('merge', this, 'after', cursor)\n })\n\n .on('enter', function (event) {\n event.preventDefault()\n event.stopPropagation()\n const rangeContainer = self.selectionWatcher.getFreshRange()\n const cursor = rangeContainer.forceCursor()\n\n if (cursor.isAtTextEnd()) {\n self.notify('insert', this, 'after', cursor)\n } else if (cursor.isAtBeginning()) {\n self.notify('insert', this, 'before', cursor)\n } else {\n self.notify('split', this, cursor.before(), cursor.after(), cursor)\n }\n })\n\n .on('shiftEnter', function (event) {\n event.preventDefault()\n event.stopPropagation()\n const cursor = self.selectionWatcher.forceCursor()\n self.notify('newline', this, cursor)\n })\n\n .on('bold', function (event) {\n event.preventDefault()\n event.stopPropagation()\n const selection = self.selectionWatcher.getFreshSelection()\n if (selection.isSelection) {\n self.notify('toggleBold', selection)\n }\n })\n\n .on('italic', function (event) {\n event.preventDefault()\n event.stopPropagation()\n const selection = self.selectionWatcher.getFreshSelection()\n if (selection.isSelection) {\n self.notify('toggleEmphasis', selection)\n }\n })\n\n .on('character', function (event) {\n self.notify('change', this)\n })\n }\n\n /**\n * Sets up events that are triggered on a selection change.\n *\n * @method setupSelectionChangeListeners\n */\n setupSelectionChangeListeners () {\n let selectionDirty = false\n let suppressSelectionChanges = false\n const selectionWatcher = this.selectionWatcher\n\n // fires on mousemove (thats probably a bit too much)\n // catches changes like 'select all' from context menu\n this.setupDocumentListener('selectionchange', (evt) => {\n const cursor = this.selectionWatcher.getFreshSelection()\n\n if (cursor && cursor.isSelection && cursor.isAtBeginning() && cursor.isAtEnd()) {\n this.notify('selectToBoundary', cursor.host, evt, 'both')\n } else if (cursor && cursor.isSelection && cursor.isAtBeginning()) {\n this.notify('selectToBoundary', cursor.host, evt, 'start')\n } else if (cursor && cursor.isSelection && cursor.isAtEnd()) {\n this.notify('selectToBoundary', cursor.host, evt, 'end')\n }\n\n if (suppressSelectionChanges) {\n selectionDirty = true\n } else {\n selectionWatcher.selectionChanged()\n }\n })\n\n // listen for selection changes by mouse so we can\n // suppress the selectionchange event and only fire the\n // change event on mouseup\n this.setupDocumentListener('mousedown', function (evt) {\n if (!this.getEditableBlockByEvent(evt)) return\n if (this.config.mouseMoveSelectionChanges === false) {\n suppressSelectionChanges = true\n\n // Without this timeout the previous selection is active\n // until the mouseup event (no. not good).\n setTimeout(() => selectionWatcher.selectionChanged(), 0)\n }\n\n this.document.addEventListener('mouseup', () => {\n suppressSelectionChanges = false\n\n if (selectionDirty) {\n selectionDirty = false\n selectionWatcher.selectionChanged()\n }\n }, {\n capture: true,\n once: true\n })\n })\n }\n\n /**\n * Fallback solution to support selection change events on browsers that don't\n * support selectionChange.\n *\n * @method setupSelectionChangeFallbackListeners\n */\n setupSelectionChangeFallbackListeners () {\n // listen for selection changes by mouse\n this.setupDocumentListener('mouseup', () => {\n // In Opera when clicking outside of a block\n // it does not update the selection as it should\n // without the timeout\n setTimeout(() => this.selectionWatcher.selectionChanged(), 0)\n })\n\n // listen for selection changes by keys\n this.setupDocumentListener('keyup', (evt) => {\n if (!this.getEditableBlockByEvent(evt)) return\n // when pressing Command + Shift + Left for example the keyup is only triggered\n // after at least two keys are released. Strange. The culprit seems to be the\n // Command key. Do we need a workaround?\n this.selectionWatcher.selectionChanged()\n })\n }\n}\n","/**\n * Removes all key-value entries from the list cache.\n *\n * @private\n * @name clear\n * @memberOf ListCache\n */\nfunction listCacheClear() {\n this.__data__ = [];\n this.size = 0;\n}\n\nexport default listCacheClear;\n","/**\n * Performs a\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * comparison between two values to determine if they are equivalent.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n * @example\n *\n * var object = { 'a': 1 };\n * var other = { 'a': 1 };\n *\n * _.eq(object, object);\n * // => true\n *\n * _.eq(object, other);\n * // => false\n *\n * _.eq('a', 'a');\n * // => true\n *\n * _.eq('a', Object('a'));\n * // => false\n *\n * _.eq(NaN, NaN);\n * // => true\n */\nfunction eq(value, other) {\n return value === other || (value !== value && other !== other);\n}\n\nexport default eq;\n","import eq from './eq.js';\n\n/**\n * Gets the index at which the `key` is found in `array` of key-value pairs.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} key The key to search for.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction assocIndexOf(array, key) {\n var length = array.length;\n while (length--) {\n if (eq(array[length][0], key)) {\n return length;\n }\n }\n return -1;\n}\n\nexport default assocIndexOf;\n","import assocIndexOf from './_assocIndexOf.js';\n\n/** Used for built-in method references. */\nvar arrayProto = Array.prototype;\n\n/** Built-in value references. */\nvar splice = arrayProto.splice;\n\n/**\n * Removes `key` and its value from the list cache.\n *\n * @private\n * @name delete\n * @memberOf ListCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction listCacheDelete(key) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n if (index < 0) {\n return false;\n }\n var lastIndex = data.length - 1;\n if (index == lastIndex) {\n data.pop();\n } else {\n splice.call(data, index, 1);\n }\n --this.size;\n return true;\n}\n\nexport default listCacheDelete;\n","import listCacheClear from './_listCacheClear.js';\nimport listCacheDelete from './_listCacheDelete.js';\nimport listCacheGet from './_listCacheGet.js';\nimport listCacheHas from './_listCacheHas.js';\nimport listCacheSet from './_listCacheSet.js';\n\n/**\n * Creates an list cache object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction ListCache(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n// Add methods to `ListCache`.\nListCache.prototype.clear = listCacheClear;\nListCache.prototype['delete'] = listCacheDelete;\nListCache.prototype.get = listCacheGet;\nListCache.prototype.has = listCacheHas;\nListCache.prototype.set = listCacheSet;\n\nexport default ListCache;\n","import assocIndexOf from './_assocIndexOf.js';\n\n/**\n * Gets the list cache value for `key`.\n *\n * @private\n * @name get\n * @memberOf ListCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction listCacheGet(key) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n return index < 0 ? undefined : data[index][1];\n}\n\nexport default listCacheGet;\n","import assocIndexOf from './_assocIndexOf.js';\n\n/**\n * Checks if a list cache value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf ListCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction listCacheHas(key) {\n return assocIndexOf(this.__data__, key) > -1;\n}\n\nexport default listCacheHas;\n","import assocIndexOf from './_assocIndexOf.js';\n\n/**\n * Sets the list cache `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf ListCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the list cache instance.\n */\nfunction listCacheSet(key, value) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n if (index < 0) {\n ++this.size;\n data.push([key, value]);\n } else {\n data[index][1] = value;\n }\n return this;\n}\n\nexport default listCacheSet;\n","/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\nexport default freeGlobal;\n","import freeGlobal from './_freeGlobal.js';\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\nexport default root;\n","import root from './_root.js';\n\n/** Built-in value references. */\nvar Symbol = root.Symbol;\n\nexport default Symbol;\n","import Symbol from './_Symbol.js';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the raw `toStringTag`.\n */\nfunction getRawTag(value) {\n var isOwn = hasOwnProperty.call(value, symToStringTag),\n tag = value[symToStringTag];\n\n try {\n value[symToStringTag] = undefined;\n var unmasked = true;\n } catch (e) {}\n\n var result = nativeObjectToString.call(value);\n if (unmasked) {\n if (isOwn) {\n value[symToStringTag] = tag;\n } else {\n delete value[symToStringTag];\n }\n }\n return result;\n}\n\nexport default getRawTag;\n","/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/**\n * Converts `value` to a string using `Object.prototype.toString`.\n *\n * @private\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n */\nfunction objectToString(value) {\n return nativeObjectToString.call(value);\n}\n\nexport default objectToString;\n","import Symbol from './_Symbol.js';\nimport getRawTag from './_getRawTag.js';\nimport objectToString from './_objectToString.js';\n\n/** `Object#toString` result references. */\nvar nullTag = '[object Null]',\n undefinedTag = '[object Undefined]';\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * The base implementation of `getTag` without fallbacks for buggy environments.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nfunction baseGetTag(value) {\n if (value == null) {\n return value === undefined ? undefinedTag : nullTag;\n }\n return (symToStringTag && symToStringTag in Object(value))\n ? getRawTag(value)\n : objectToString(value);\n}\n\nexport default baseGetTag;\n","/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n var type = typeof value;\n return value != null && (type == 'object' || type == 'function');\n}\n\nexport default isObject;\n","import baseGetTag from './_baseGetTag.js';\nimport isObject from './isObject.js';\n\n/** `Object#toString` result references. */\nvar asyncTag = '[object AsyncFunction]',\n funcTag = '[object Function]',\n genTag = '[object GeneratorFunction]',\n proxyTag = '[object Proxy]';\n\n/**\n * Checks if `value` is classified as a `Function` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a function, else `false`.\n * @example\n *\n * _.isFunction(_);\n * // => true\n *\n * _.isFunction(/abc/);\n * // => false\n */\nfunction isFunction(value) {\n if (!isObject(value)) {\n return false;\n }\n // The use of `Object#toString` avoids issues with the `typeof` operator\n // in Safari 9 which returns 'object' for typed arrays and other constructors.\n var tag = baseGetTag(value);\n return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;\n}\n\nexport default isFunction;\n","import root from './_root.js';\n\n/** Used to detect overreaching core-js shims. */\nvar coreJsData = root['__core-js_shared__'];\n\nexport default coreJsData;\n","import coreJsData from './_coreJsData.js';\n\n/** Used to detect methods masquerading as native. */\nvar maskSrcKey = (function() {\n var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');\n return uid ? ('Symbol(src)_1.' + uid) : '';\n}());\n\n/**\n * Checks if `func` has its source masked.\n *\n * @private\n * @param {Function} func The function to check.\n * @returns {boolean} Returns `true` if `func` is masked, else `false`.\n */\nfunction isMasked(func) {\n return !!maskSrcKey && (maskSrcKey in func);\n}\n\nexport default isMasked;\n","/** Used for built-in method references. */\nvar funcProto = Function.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/**\n * Converts `func` to its source code.\n *\n * @private\n * @param {Function} func The function to convert.\n * @returns {string} Returns the source code.\n */\nfunction toSource(func) {\n if (func != null) {\n try {\n return funcToString.call(func);\n } catch (e) {}\n try {\n return (func + '');\n } catch (e) {}\n }\n return '';\n}\n\nexport default toSource;\n","import isFunction from './isFunction.js';\nimport isMasked from './_isMasked.js';\nimport isObject from './isObject.js';\nimport toSource from './_toSource.js';\n\n/**\n * Used to match `RegExp`\n * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).\n */\nvar reRegExpChar = /[\\\\^$.*+?()[\\]{}|]/g;\n\n/** Used to detect host constructors (Safari). */\nvar reIsHostCtor = /^\\[object .+?Constructor\\]$/;\n\n/** Used for built-in method references. */\nvar funcProto = Function.prototype,\n objectProto = Object.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Used to detect if a method is native. */\nvar reIsNative = RegExp('^' +\n funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\\\$&')\n .replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g, '$1.*?') + '$'\n);\n\n/**\n * The base implementation of `_.isNative` without bad shim checks.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a native function,\n * else `false`.\n */\nfunction baseIsNative(value) {\n if (!isObject(value) || isMasked(value)) {\n return false;\n }\n var pattern = isFunction(value) ? reIsNative : reIsHostCtor;\n return pattern.test(toSource(value));\n}\n\nexport default baseIsNative;\n","import baseIsNative from './_baseIsNative.js';\nimport getValue from './_getValue.js';\n\n/**\n * Gets the native function at `key` of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {string} key The key of the method to get.\n * @returns {*} Returns the function if it's native, else `undefined`.\n */\nfunction getNative(object, key) {\n var value = getValue(object, key);\n return baseIsNative(value) ? value : undefined;\n}\n\nexport default getNative;\n","/**\n * Gets the value at `key` of `object`.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {string} key The key of the property to get.\n * @returns {*} Returns the property value.\n */\nfunction getValue(object, key) {\n return object == null ? undefined : object[key];\n}\n\nexport default getValue;\n","import getNative from './_getNative.js';\nimport root from './_root.js';\n\n/* Built-in method references that are verified to be native. */\nvar Map = getNative(root, 'Map');\n\nexport default Map;\n","import getNative from './_getNative.js';\n\n/* Built-in method references that are verified to be native. */\nvar nativeCreate = getNative(Object, 'create');\n\nexport default nativeCreate;\n","import nativeCreate from './_nativeCreate.js';\n\n/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Gets the hash value for `key`.\n *\n * @private\n * @name get\n * @memberOf Hash\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction hashGet(key) {\n var data = this.__data__;\n if (nativeCreate) {\n var result = data[key];\n return result === HASH_UNDEFINED ? undefined : result;\n }\n return hasOwnProperty.call(data, key) ? data[key] : undefined;\n}\n\nexport default hashGet;\n","import nativeCreate from './_nativeCreate.js';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Checks if a hash value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Hash\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction hashHas(key) {\n var data = this.__data__;\n return nativeCreate ? (data[key] !== undefined) : hasOwnProperty.call(data, key);\n}\n\nexport default hashHas;\n","import hashClear from './_hashClear.js';\nimport hashDelete from './_hashDelete.js';\nimport hashGet from './_hashGet.js';\nimport hashHas from './_hashHas.js';\nimport hashSet from './_hashSet.js';\n\n/**\n * Creates a hash object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction Hash(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n// Add methods to `Hash`.\nHash.prototype.clear = hashClear;\nHash.prototype['delete'] = hashDelete;\nHash.prototype.get = hashGet;\nHash.prototype.has = hashHas;\nHash.prototype.set = hashSet;\n\nexport default Hash;\n","import nativeCreate from './_nativeCreate.js';\n\n/**\n * Removes all key-value entries from the hash.\n *\n * @private\n * @name clear\n * @memberOf Hash\n */\nfunction hashClear() {\n this.__data__ = nativeCreate ? nativeCreate(null) : {};\n this.size = 0;\n}\n\nexport default hashClear;\n","/**\n * Removes `key` and its value from the hash.\n *\n * @private\n * @name delete\n * @memberOf Hash\n * @param {Object} hash The hash to modify.\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction hashDelete(key) {\n var result = this.has(key) && delete this.__data__[key];\n this.size -= result ? 1 : 0;\n return result;\n}\n\nexport default hashDelete;\n","import nativeCreate from './_nativeCreate.js';\n\n/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/**\n * Sets the hash `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Hash\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the hash instance.\n */\nfunction hashSet(key, value) {\n var data = this.__data__;\n this.size += this.has(key) ? 0 : 1;\n data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value;\n return this;\n}\n\nexport default hashSet;\n","import isKeyable from './_isKeyable.js';\n\n/**\n * Gets the data for `map`.\n *\n * @private\n * @param {Object} map The map to query.\n * @param {string} key The reference key.\n * @returns {*} Returns the map data.\n */\nfunction getMapData(map, key) {\n var data = map.__data__;\n return isKeyable(key)\n ? data[typeof key == 'string' ? 'string' : 'hash']\n : data.map;\n}\n\nexport default getMapData;\n","/**\n * Checks if `value` is suitable for use as unique object key.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is suitable, else `false`.\n */\nfunction isKeyable(value) {\n var type = typeof value;\n return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')\n ? (value !== '__proto__')\n : (value === null);\n}\n\nexport default isKeyable;\n","import mapCacheClear from './_mapCacheClear.js';\nimport mapCacheDelete from './_mapCacheDelete.js';\nimport mapCacheGet from './_mapCacheGet.js';\nimport mapCacheHas from './_mapCacheHas.js';\nimport mapCacheSet from './_mapCacheSet.js';\n\n/**\n * Creates a map cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction MapCache(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n// Add methods to `MapCache`.\nMapCache.prototype.clear = mapCacheClear;\nMapCache.prototype['delete'] = mapCacheDelete;\nMapCache.prototype.get = mapCacheGet;\nMapCache.prototype.has = mapCacheHas;\nMapCache.prototype.set = mapCacheSet;\n\nexport default MapCache;\n","import Hash from './_Hash.js';\nimport ListCache from './_ListCache.js';\nimport Map from './_Map.js';\n\n/**\n * Removes all key-value entries from the map.\n *\n * @private\n * @name clear\n * @memberOf MapCache\n */\nfunction mapCacheClear() {\n this.size = 0;\n this.__data__ = {\n 'hash': new Hash,\n 'map': new (Map || ListCache),\n 'string': new Hash\n };\n}\n\nexport default mapCacheClear;\n","import getMapData from './_getMapData.js';\n\n/**\n * Removes `key` and its value from the map.\n *\n * @private\n * @name delete\n * @memberOf MapCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction mapCacheDelete(key) {\n var result = getMapData(this, key)['delete'](key);\n this.size -= result ? 1 : 0;\n return result;\n}\n\nexport default mapCacheDelete;\n","import getMapData from './_getMapData.js';\n\n/**\n * Gets the map value for `key`.\n *\n * @private\n * @name get\n * @memberOf MapCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction mapCacheGet(key) {\n return getMapData(this, key).get(key);\n}\n\nexport default mapCacheGet;\n","import getMapData from './_getMapData.js';\n\n/**\n * Checks if a map value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf MapCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction mapCacheHas(key) {\n return getMapData(this, key).has(key);\n}\n\nexport default mapCacheHas;\n","import getMapData from './_getMapData.js';\n\n/**\n * Sets the map `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf MapCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the map cache instance.\n */\nfunction mapCacheSet(key, value) {\n var data = getMapData(this, key),\n size = data.size;\n\n data.set(key, value);\n this.size += data.size == size ? 0 : 1;\n return this;\n}\n\nexport default mapCacheSet;\n","import ListCache from './_ListCache.js';\nimport stackClear from './_stackClear.js';\nimport stackDelete from './_stackDelete.js';\nimport stackGet from './_stackGet.js';\nimport stackHas from './_stackHas.js';\nimport stackSet from './_stackSet.js';\n\n/**\n * Creates a stack cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction Stack(entries) {\n var data = this.__data__ = new ListCache(entries);\n this.size = data.size;\n}\n\n// Add methods to `Stack`.\nStack.prototype.clear = stackClear;\nStack.prototype['delete'] = stackDelete;\nStack.prototype.get = stackGet;\nStack.prototype.has = stackHas;\nStack.prototype.set = stackSet;\n\nexport default Stack;\n","import ListCache from './_ListCache.js';\n\n/**\n * Removes all key-value entries from the stack.\n *\n * @private\n * @name clear\n * @memberOf Stack\n */\nfunction stackClear() {\n this.__data__ = new ListCache;\n this.size = 0;\n}\n\nexport default stackClear;\n","/**\n * Removes `key` and its value from the stack.\n *\n * @private\n * @name delete\n * @memberOf Stack\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction stackDelete(key) {\n var data = this.__data__,\n result = data['delete'](key);\n\n this.size = data.size;\n return result;\n}\n\nexport default stackDelete;\n","/**\n * Gets the stack value for `key`.\n *\n * @private\n * @name get\n * @memberOf Stack\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction stackGet(key) {\n return this.__data__.get(key);\n}\n\nexport default stackGet;\n","/**\n * Checks if a stack value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Stack\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction stackHas(key) {\n return this.__data__.has(key);\n}\n\nexport default stackHas;\n","import ListCache from './_ListCache.js';\nimport Map from './_Map.js';\nimport MapCache from './_MapCache.js';\n\n/** Used as the size to enable large array optimizations. */\nvar LARGE_ARRAY_SIZE = 200;\n\n/**\n * Sets the stack `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Stack\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the stack cache instance.\n */\nfunction stackSet(key, value) {\n var data = this.__data__;\n if (data instanceof ListCache) {\n var pairs = data.__data__;\n if (!Map || (pairs.length < LARGE_ARRAY_SIZE - 1)) {\n pairs.push([key, value]);\n this.size = ++data.size;\n return this;\n }\n data = this.__data__ = new MapCache(pairs);\n }\n data.set(key, value);\n this.size = data.size;\n return this;\n}\n\nexport default stackSet;\n","import getNative from './_getNative.js';\n\nvar defineProperty = (function() {\n try {\n var func = getNative(Object, 'defineProperty');\n func({}, '', {});\n return func;\n } catch (e) {}\n}());\n\nexport default defineProperty;\n","import defineProperty from './_defineProperty.js';\n\n/**\n * The base implementation of `assignValue` and `assignMergeValue` without\n * value checks.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {string} key The key of the property to assign.\n * @param {*} value The value to assign.\n */\nfunction baseAssignValue(object, key, value) {\n if (key == '__proto__' && defineProperty) {\n defineProperty(object, key, {\n 'configurable': true,\n 'enumerable': true,\n 'value': value,\n 'writable': true\n });\n } else {\n object[key] = value;\n }\n}\n\nexport default baseAssignValue;\n","import baseAssignValue from './_baseAssignValue.js';\nimport eq from './eq.js';\n\n/**\n * This function is like `assignValue` except that it doesn't assign\n * `undefined` values.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {string} key The key of the property to assign.\n * @param {*} value The value to assign.\n */\nfunction assignMergeValue(object, key, value) {\n if ((value !== undefined && !eq(object[key], value)) ||\n (value === undefined && !(key in object))) {\n baseAssignValue(object, key, value);\n }\n}\n\nexport default assignMergeValue;\n","import createBaseFor from './_createBaseFor.js';\n\n/**\n * The base implementation of `baseForOwn` which iterates over `object`\n * properties returned by `keysFunc` and invokes `iteratee` for each property.\n * Iteratee functions may exit iteration early by explicitly returning `false`.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @param {Function} keysFunc The function to get the keys of `object`.\n * @returns {Object} Returns `object`.\n */\nvar baseFor = createBaseFor();\n\nexport default baseFor;\n","/**\n * Creates a base function for methods like `_.forIn` and `_.forOwn`.\n *\n * @private\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Function} Returns the new base function.\n */\nfunction createBaseFor(fromRight) {\n return function(object, iteratee, keysFunc) {\n var index = -1,\n iterable = Object(object),\n props = keysFunc(object),\n length = props.length;\n\n while (length--) {\n var key = props[fromRight ? length : ++index];\n if (iteratee(iterable[key], key, iterable) === false) {\n break;\n }\n }\n return object;\n };\n}\n\nexport default createBaseFor;\n","import root from './_root.js';\n\n/** Detect free variable `exports`. */\nvar freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n/** Detect free variable `module`. */\nvar freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n/** Detect the popular CommonJS extension `module.exports`. */\nvar moduleExports = freeModule && freeModule.exports === freeExports;\n\n/** Built-in value references. */\nvar Buffer = moduleExports ? root.Buffer : undefined,\n allocUnsafe = Buffer ? Buffer.allocUnsafe : undefined;\n\n/**\n * Creates a clone of `buffer`.\n *\n * @private\n * @param {Buffer} buffer The buffer to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Buffer} Returns the cloned buffer.\n */\nfunction cloneBuffer(buffer, isDeep) {\n if (isDeep) {\n return buffer.slice();\n }\n var length = buffer.length,\n result = allocUnsafe ? allocUnsafe(length) : new buffer.constructor(length);\n\n buffer.copy(result);\n return result;\n}\n\nexport default cloneBuffer;\n","import root from './_root.js';\n\n/** Built-in value references. */\nvar Uint8Array = root.Uint8Array;\n\nexport default Uint8Array;\n","import cloneArrayBuffer from './_cloneArrayBuffer.js';\n\n/**\n * Creates a clone of `typedArray`.\n *\n * @private\n * @param {Object} typedArray The typed array to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Object} Returns the cloned typed array.\n */\nfunction cloneTypedArray(typedArray, isDeep) {\n var buffer = isDeep ? cloneArrayBuffer(typedArray.buffer) : typedArray.buffer;\n return new typedArray.constructor(buffer, typedArray.byteOffset, typedArray.length);\n}\n\nexport default cloneTypedArray;\n","import Uint8Array from './_Uint8Array.js';\n\n/**\n * Creates a clone of `arrayBuffer`.\n *\n * @private\n * @param {ArrayBuffer} arrayBuffer The array buffer to clone.\n * @returns {ArrayBuffer} Returns the cloned array buffer.\n */\nfunction cloneArrayBuffer(arrayBuffer) {\n var result = new arrayBuffer.constructor(arrayBuffer.byteLength);\n new Uint8Array(result).set(new Uint8Array(arrayBuffer));\n return result;\n}\n\nexport default cloneArrayBuffer;\n","import isObject from './isObject.js';\n\n/** Built-in value references. */\nvar objectCreate = Object.create;\n\n/**\n * The base implementation of `_.create` without support for assigning\n * properties to the created object.\n *\n * @private\n * @param {Object} proto The object to inherit from.\n * @returns {Object} Returns the new object.\n */\nvar baseCreate = (function() {\n function object() {}\n return function(proto) {\n if (!isObject(proto)) {\n return {};\n }\n if (objectCreate) {\n return objectCreate(proto);\n }\n object.prototype = proto;\n var result = new object;\n object.prototype = undefined;\n return result;\n };\n}());\n\nexport default baseCreate;\n","import overArg from './_overArg.js';\n\n/** Built-in value references. */\nvar getPrototype = overArg(Object.getPrototypeOf, Object);\n\nexport default getPrototype;\n","/**\n * Creates a unary function that invokes `func` with its argument transformed.\n *\n * @private\n * @param {Function} func The function to wrap.\n * @param {Function} transform The argument transform.\n * @returns {Function} Returns the new function.\n */\nfunction overArg(func, transform) {\n return function(arg) {\n return func(transform(arg));\n };\n}\n\nexport default overArg;\n","/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Checks if `value` is likely a prototype object.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.\n */\nfunction isPrototype(value) {\n var Ctor = value && value.constructor,\n proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto;\n\n return value === proto;\n}\n\nexport default isPrototype;\n","/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n return value != null && typeof value == 'object';\n}\n\nexport default isObjectLike;\n","import baseGetTag from './_baseGetTag.js';\nimport isObjectLike from './isObjectLike.js';\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]';\n\n/**\n * The base implementation of `_.isArguments`.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n */\nfunction baseIsArguments(value) {\n return isObjectLike(value) && baseGetTag(value) == argsTag;\n}\n\nexport default baseIsArguments;\n","import baseIsArguments from './_baseIsArguments.js';\nimport isObjectLike from './isObjectLike.js';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Built-in value references. */\nvar propertyIsEnumerable = objectProto.propertyIsEnumerable;\n\n/**\n * Checks if `value` is likely an `arguments` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n * else `false`.\n * @example\n *\n * _.isArguments(function() { return arguments; }());\n * // => true\n *\n * _.isArguments([1, 2, 3]);\n * // => false\n */\nvar isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsArguments : function(value) {\n return isObjectLike(value) && hasOwnProperty.call(value, 'callee') &&\n !propertyIsEnumerable.call(value, 'callee');\n};\n\nexport default isArguments;\n","/**\n * Checks if `value` is classified as an `Array` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array, else `false`.\n * @example\n *\n * _.isArray([1, 2, 3]);\n * // => true\n *\n * _.isArray(document.body.children);\n * // => false\n *\n * _.isArray('abc');\n * // => false\n *\n * _.isArray(_.noop);\n * // => false\n */\nvar isArray = Array.isArray;\n\nexport default isArray;\n","/** Used as references for various `Number` constants. */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/**\n * Checks if `value` is a valid array-like length.\n *\n * **Note:** This method is loosely based on\n * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n * @example\n *\n * _.isLength(3);\n * // => true\n *\n * _.isLength(Number.MIN_VALUE);\n * // => false\n *\n * _.isLength(Infinity);\n * // => false\n *\n * _.isLength('3');\n * // => false\n */\nfunction isLength(value) {\n return typeof value == 'number' &&\n value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n}\n\nexport default isLength;\n","import isFunction from './isFunction.js';\nimport isLength from './isLength.js';\n\n/**\n * Checks if `value` is array-like. A value is considered array-like if it's\n * not a function and has a `value.length` that's an integer greater than or\n * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\n * @example\n *\n * _.isArrayLike([1, 2, 3]);\n * // => true\n *\n * _.isArrayLike(document.body.children);\n * // => true\n *\n * _.isArrayLike('abc');\n * // => true\n *\n * _.isArrayLike(_.noop);\n * // => false\n */\nfunction isArrayLike(value) {\n return value != null && isLength(value.length) && !isFunction(value);\n}\n\nexport default isArrayLike;\n","import root from './_root.js';\nimport stubFalse from './stubFalse.js';\n\n/** Detect free variable `exports`. */\nvar freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n/** Detect free variable `module`. */\nvar freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n/** Detect the popular CommonJS extension `module.exports`. */\nvar moduleExports = freeModule && freeModule.exports === freeExports;\n\n/** Built-in value references. */\nvar Buffer = moduleExports ? root.Buffer : undefined;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined;\n\n/**\n * Checks if `value` is a buffer.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a buffer, else `false`.\n * @example\n *\n * _.isBuffer(new Buffer(2));\n * // => true\n *\n * _.isBuffer(new Uint8Array(2));\n * // => false\n */\nvar isBuffer = nativeIsBuffer || stubFalse;\n\nexport default isBuffer;\n","/**\n * This method returns `false`.\n *\n * @static\n * @memberOf _\n * @since 4.13.0\n * @category Util\n * @returns {boolean} Returns `false`.\n * @example\n *\n * _.times(2, _.stubFalse);\n * // => [false, false]\n */\nfunction stubFalse() {\n return false;\n}\n\nexport default stubFalse;\n","import baseGetTag from './_baseGetTag.js';\nimport getPrototype from './_getPrototype.js';\nimport isObjectLike from './isObjectLike.js';\n\n/** `Object#toString` result references. */\nvar objectTag = '[object Object]';\n\n/** Used for built-in method references. */\nvar funcProto = Function.prototype,\n objectProto = Object.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Used to infer the `Object` constructor. */\nvar objectCtorString = funcToString.call(Object);\n\n/**\n * Checks if `value` is a plain object, that is, an object created by the\n * `Object` constructor or one with a `[[Prototype]]` of `null`.\n *\n * @static\n * @memberOf _\n * @since 0.8.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * }\n *\n * _.isPlainObject(new Foo);\n * // => false\n *\n * _.isPlainObject([1, 2, 3]);\n * // => false\n *\n * _.isPlainObject({ 'x': 0, 'y': 0 });\n * // => true\n *\n * _.isPlainObject(Object.create(null));\n * // => true\n */\nfunction isPlainObject(value) {\n if (!isObjectLike(value) || baseGetTag(value) != objectTag) {\n return false;\n }\n var proto = getPrototype(value);\n if (proto === null) {\n return true;\n }\n var Ctor = hasOwnProperty.call(proto, 'constructor') && proto.constructor;\n return typeof Ctor == 'function' && Ctor instanceof Ctor &&\n funcToString.call(Ctor) == objectCtorString;\n}\n\nexport default isPlainObject;\n","import baseGetTag from './_baseGetTag.js';\nimport isLength from './isLength.js';\nimport isObjectLike from './isObjectLike.js';\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]',\n arrayTag = '[object Array]',\n boolTag = '[object Boolean]',\n dateTag = '[object Date]',\n errorTag = '[object Error]',\n funcTag = '[object Function]',\n mapTag = '[object Map]',\n numberTag = '[object Number]',\n objectTag = '[object Object]',\n regexpTag = '[object RegExp]',\n setTag = '[object Set]',\n stringTag = '[object String]',\n weakMapTag = '[object WeakMap]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n dataViewTag = '[object DataView]',\n float32Tag = '[object Float32Array]',\n float64Tag = '[object Float64Array]',\n int8Tag = '[object Int8Array]',\n int16Tag = '[object Int16Array]',\n int32Tag = '[object Int32Array]',\n uint8Tag = '[object Uint8Array]',\n uint8ClampedTag = '[object Uint8ClampedArray]',\n uint16Tag = '[object Uint16Array]',\n uint32Tag = '[object Uint32Array]';\n\n/** Used to identify `toStringTag` values of typed arrays. */\nvar typedArrayTags = {};\ntypedArrayTags[float32Tag] = typedArrayTags[float64Tag] =\ntypedArrayTags[int8Tag] = typedArrayTags[int16Tag] =\ntypedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =\ntypedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =\ntypedArrayTags[uint32Tag] = true;\ntypedArrayTags[argsTag] = typedArrayTags[arrayTag] =\ntypedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =\ntypedArrayTags[dataViewTag] = typedArrayTags[dateTag] =\ntypedArrayTags[errorTag] = typedArrayTags[funcTag] =\ntypedArrayTags[mapTag] = typedArrayTags[numberTag] =\ntypedArrayTags[objectTag] = typedArrayTags[regexpTag] =\ntypedArrayTags[setTag] = typedArrayTags[stringTag] =\ntypedArrayTags[weakMapTag] = false;\n\n/**\n * The base implementation of `_.isTypedArray` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n */\nfunction baseIsTypedArray(value) {\n return isObjectLike(value) &&\n isLength(value.length) && !!typedArrayTags[baseGetTag(value)];\n}\n\nexport default baseIsTypedArray;\n","import freeGlobal from './_freeGlobal.js';\n\n/** Detect free variable `exports`. */\nvar freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n/** Detect free variable `module`. */\nvar freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n/** Detect the popular CommonJS extension `module.exports`. */\nvar moduleExports = freeModule && freeModule.exports === freeExports;\n\n/** Detect free variable `process` from Node.js. */\nvar freeProcess = moduleExports && freeGlobal.process;\n\n/** Used to access faster Node.js helpers. */\nvar nodeUtil = (function() {\n try {\n // Use `util.types` for Node.js 10+.\n var types = freeModule && freeModule.require && freeModule.require('util').types;\n\n if (types) {\n return types;\n }\n\n // Legacy `process.binding('util')` for Node.js < 10.\n return freeProcess && freeProcess.binding && freeProcess.binding('util');\n } catch (e) {}\n}());\n\nexport default nodeUtil;\n","import baseIsTypedArray from './_baseIsTypedArray.js';\nimport baseUnary from './_baseUnary.js';\nimport nodeUtil from './_nodeUtil.js';\n\n/* Node.js helper references. */\nvar nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray;\n\n/**\n * Checks if `value` is classified as a typed array.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n * @example\n *\n * _.isTypedArray(new Uint8Array);\n * // => true\n *\n * _.isTypedArray([]);\n * // => false\n */\nvar isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray;\n\nexport default isTypedArray;\n","/**\n * The base implementation of `_.unary` without support for storing metadata.\n *\n * @private\n * @param {Function} func The function to cap arguments for.\n * @returns {Function} Returns the new capped function.\n */\nfunction baseUnary(func) {\n return function(value) {\n return func(value);\n };\n}\n\nexport default baseUnary;\n","/**\n * Gets the value at `key`, unless `key` is \"__proto__\" or \"constructor\".\n *\n * @private\n * @param {Object} object The object to query.\n * @param {string} key The key of the property to get.\n * @returns {*} Returns the property value.\n */\nfunction safeGet(object, key) {\n if (key === 'constructor' && typeof object[key] === 'function') {\n return;\n }\n\n if (key == '__proto__') {\n return;\n }\n\n return object[key];\n}\n\nexport default safeGet;\n","import baseAssignValue from './_baseAssignValue.js';\nimport eq from './eq.js';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Assigns `value` to `key` of `object` if the existing value is not equivalent\n * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {string} key The key of the property to assign.\n * @param {*} value The value to assign.\n */\nfunction assignValue(object, key, value) {\n var objValue = object[key];\n if (!(hasOwnProperty.call(object, key) && eq(objValue, value)) ||\n (value === undefined && !(key in object))) {\n baseAssignValue(object, key, value);\n }\n}\n\nexport default assignValue;\n","/** Used as references for various `Number` constants. */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/** Used to detect unsigned integer values. */\nvar reIsUint = /^(?:0|[1-9]\\d*)$/;\n\n/**\n * Checks if `value` is a valid array-like index.\n *\n * @private\n * @param {*} value The value to check.\n * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.\n * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.\n */\nfunction isIndex(value, length) {\n var type = typeof value;\n length = length == null ? MAX_SAFE_INTEGER : length;\n\n return !!length &&\n (type == 'number' ||\n (type != 'symbol' && reIsUint.test(value))) &&\n (value > -1 && value % 1 == 0 && value < length);\n}\n\nexport default isIndex;\n","import baseTimes from './_baseTimes.js';\nimport isArguments from './isArguments.js';\nimport isArray from './isArray.js';\nimport isBuffer from './isBuffer.js';\nimport isIndex from './_isIndex.js';\nimport isTypedArray from './isTypedArray.js';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Creates an array of the enumerable property names of the array-like `value`.\n *\n * @private\n * @param {*} value The value to query.\n * @param {boolean} inherited Specify returning inherited property names.\n * @returns {Array} Returns the array of property names.\n */\nfunction arrayLikeKeys(value, inherited) {\n var isArr = isArray(value),\n isArg = !isArr && isArguments(value),\n isBuff = !isArr && !isArg && isBuffer(value),\n isType = !isArr && !isArg && !isBuff && isTypedArray(value),\n skipIndexes = isArr || isArg || isBuff || isType,\n result = skipIndexes ? baseTimes(value.length, String) : [],\n length = result.length;\n\n for (var key in value) {\n if ((inherited || hasOwnProperty.call(value, key)) &&\n !(skipIndexes && (\n // Safari 9 has enumerable `arguments.length` in strict mode.\n key == 'length' ||\n // Node.js 0.10 has enumerable non-index properties on buffers.\n (isBuff && (key == 'offset' || key == 'parent')) ||\n // PhantomJS 2 has enumerable non-index properties on typed arrays.\n (isType && (key == 'buffer' || key == 'byteLength' || key == 'byteOffset')) ||\n // Skip index properties.\n isIndex(key, length)\n ))) {\n result.push(key);\n }\n }\n return result;\n}\n\nexport default arrayLikeKeys;\n","/**\n * The base implementation of `_.times` without support for iteratee shorthands\n * or max array length checks.\n *\n * @private\n * @param {number} n The number of times to invoke `iteratee`.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the array of results.\n */\nfunction baseTimes(n, iteratee) {\n var index = -1,\n result = Array(n);\n\n while (++index < n) {\n result[index] = iteratee(index);\n }\n return result;\n}\n\nexport default baseTimes;\n","import isObject from './isObject.js';\nimport isPrototype from './_isPrototype.js';\nimport nativeKeysIn from './_nativeKeysIn.js';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * The base implementation of `_.keysIn` which doesn't treat sparse arrays as dense.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction baseKeysIn(object) {\n if (!isObject(object)) {\n return nativeKeysIn(object);\n }\n var isProto = isPrototype(object),\n result = [];\n\n for (var key in object) {\n if (!(key == 'constructor' && (isProto || !hasOwnProperty.call(object, key)))) {\n result.push(key);\n }\n }\n return result;\n}\n\nexport default baseKeysIn;\n","/**\n * This function is like\n * [`Object.keys`](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n * except that it includes inherited enumerable properties.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction nativeKeysIn(object) {\n var result = [];\n if (object != null) {\n for (var key in Object(object)) {\n result.push(key);\n }\n }\n return result;\n}\n\nexport default nativeKeysIn;\n","import arrayLikeKeys from './_arrayLikeKeys.js';\nimport baseKeysIn from './_baseKeysIn.js';\nimport isArrayLike from './isArrayLike.js';\n\n/**\n * Creates an array of the own and inherited enumerable property names of `object`.\n *\n * **Note:** Non-object values are coerced to objects.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.keysIn(new Foo);\n * // => ['a', 'b', 'c'] (iteration order is not guaranteed)\n */\nfunction keysIn(object) {\n return isArrayLike(object) ? arrayLikeKeys(object, true) : baseKeysIn(object);\n}\n\nexport default keysIn;\n","import copyObject from './_copyObject.js';\nimport keysIn from './keysIn.js';\n\n/**\n * Converts `value` to a plain object flattening inherited enumerable string\n * keyed properties of `value` to own properties of the plain object.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {Object} Returns the converted plain object.\n * @example\n *\n * function Foo() {\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.assign({ 'a': 1 }, new Foo);\n * // => { 'a': 1, 'b': 2 }\n *\n * _.assign({ 'a': 1 }, _.toPlainObject(new Foo));\n * // => { 'a': 1, 'b': 2, 'c': 3 }\n */\nfunction toPlainObject(value) {\n return copyObject(value, keysIn(value));\n}\n\nexport default toPlainObject;\n","import assignValue from './_assignValue.js';\nimport baseAssignValue from './_baseAssignValue.js';\n\n/**\n * Copies properties of `source` to `object`.\n *\n * @private\n * @param {Object} source The object to copy properties from.\n * @param {Array} props The property identifiers to copy.\n * @param {Object} [object={}] The object to copy properties to.\n * @param {Function} [customizer] The function to customize copied values.\n * @returns {Object} Returns `object`.\n */\nfunction copyObject(source, props, object, customizer) {\n var isNew = !object;\n object || (object = {});\n\n var index = -1,\n length = props.length;\n\n while (++index < length) {\n var key = props[index];\n\n var newValue = customizer\n ? customizer(object[key], source[key], key, object, source)\n : undefined;\n\n if (newValue === undefined) {\n newValue = source[key];\n }\n if (isNew) {\n baseAssignValue(object, key, newValue);\n } else {\n assignValue(object, key, newValue);\n }\n }\n return object;\n}\n\nexport default copyObject;\n","import assignMergeValue from './_assignMergeValue.js';\nimport cloneBuffer from './_cloneBuffer.js';\nimport cloneTypedArray from './_cloneTypedArray.js';\nimport copyArray from './_copyArray.js';\nimport initCloneObject from './_initCloneObject.js';\nimport isArguments from './isArguments.js';\nimport isArray from './isArray.js';\nimport isArrayLikeObject from './isArrayLikeObject.js';\nimport isBuffer from './isBuffer.js';\nimport isFunction from './isFunction.js';\nimport isObject from './isObject.js';\nimport isPlainObject from './isPlainObject.js';\nimport isTypedArray from './isTypedArray.js';\nimport safeGet from './_safeGet.js';\nimport toPlainObject from './toPlainObject.js';\n\n/**\n * A specialized version of `baseMerge` for arrays and objects which performs\n * deep merges and tracks traversed objects enabling objects with circular\n * references to be merged.\n *\n * @private\n * @param {Object} object The destination object.\n * @param {Object} source The source object.\n * @param {string} key The key of the value to merge.\n * @param {number} srcIndex The index of `source`.\n * @param {Function} mergeFunc The function to merge values.\n * @param {Function} [customizer] The function to customize assigned values.\n * @param {Object} [stack] Tracks traversed source values and their merged\n * counterparts.\n */\nfunction baseMergeDeep(object, source, key, srcIndex, mergeFunc, customizer, stack) {\n var objValue = safeGet(object, key),\n srcValue = safeGet(source, key),\n stacked = stack.get(srcValue);\n\n if (stacked) {\n assignMergeValue(object, key, stacked);\n return;\n }\n var newValue = customizer\n ? customizer(objValue, srcValue, (key + ''), object, source, stack)\n : undefined;\n\n var isCommon = newValue === undefined;\n\n if (isCommon) {\n var isArr = isArray(srcValue),\n isBuff = !isArr && isBuffer(srcValue),\n isTyped = !isArr && !isBuff && isTypedArray(srcValue);\n\n newValue = srcValue;\n if (isArr || isBuff || isTyped) {\n if (isArray(objValue)) {\n newValue = objValue;\n }\n else if (isArrayLikeObject(objValue)) {\n newValue = copyArray(objValue);\n }\n else if (isBuff) {\n isCommon = false;\n newValue = cloneBuffer(srcValue, true);\n }\n else if (isTyped) {\n isCommon = false;\n newValue = cloneTypedArray(srcValue, true);\n }\n else {\n newValue = [];\n }\n }\n else if (isPlainObject(srcValue) || isArguments(srcValue)) {\n newValue = objValue;\n if (isArguments(objValue)) {\n newValue = toPlainObject(objValue);\n }\n else if (!isObject(objValue) || isFunction(objValue)) {\n newValue = initCloneObject(srcValue);\n }\n }\n else {\n isCommon = false;\n }\n }\n if (isCommon) {\n // Recursively merge objects and arrays (susceptible to call stack limits).\n stack.set(srcValue, newValue);\n mergeFunc(newValue, srcValue, srcIndex, customizer, stack);\n stack['delete'](srcValue);\n }\n assignMergeValue(object, key, newValue);\n}\n\nexport default baseMergeDeep;\n","import isArrayLike from './isArrayLike.js';\nimport isObjectLike from './isObjectLike.js';\n\n/**\n * This method is like `_.isArrayLike` except that it also checks if `value`\n * is an object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array-like object,\n * else `false`.\n * @example\n *\n * _.isArrayLikeObject([1, 2, 3]);\n * // => true\n *\n * _.isArrayLikeObject(document.body.children);\n * // => true\n *\n * _.isArrayLikeObject('abc');\n * // => false\n *\n * _.isArrayLikeObject(_.noop);\n * // => false\n */\nfunction isArrayLikeObject(value) {\n return isObjectLike(value) && isArrayLike(value);\n}\n\nexport default isArrayLikeObject;\n","/**\n * Copies the values of `source` to `array`.\n *\n * @private\n * @param {Array} source The array to copy values from.\n * @param {Array} [array=[]] The array to copy values to.\n * @returns {Array} Returns `array`.\n */\nfunction copyArray(source, array) {\n var index = -1,\n length = source.length;\n\n array || (array = Array(length));\n while (++index < length) {\n array[index] = source[index];\n }\n return array;\n}\n\nexport default copyArray;\n","import baseCreate from './_baseCreate.js';\nimport getPrototype from './_getPrototype.js';\nimport isPrototype from './_isPrototype.js';\n\n/**\n * Initializes an object clone.\n *\n * @private\n * @param {Object} object The object to clone.\n * @returns {Object} Returns the initialized clone.\n */\nfunction initCloneObject(object) {\n return (typeof object.constructor == 'function' && !isPrototype(object))\n ? baseCreate(getPrototype(object))\n : {};\n}\n\nexport default initCloneObject;\n","import Stack from './_Stack.js';\nimport assignMergeValue from './_assignMergeValue.js';\nimport baseFor from './_baseFor.js';\nimport baseMergeDeep from './_baseMergeDeep.js';\nimport isObject from './isObject.js';\nimport keysIn from './keysIn.js';\nimport safeGet from './_safeGet.js';\n\n/**\n * The base implementation of `_.merge` without support for multiple sources.\n *\n * @private\n * @param {Object} object The destination object.\n * @param {Object} source The source object.\n * @param {number} srcIndex The index of `source`.\n * @param {Function} [customizer] The function to customize merged values.\n * @param {Object} [stack] Tracks traversed source values and their merged\n * counterparts.\n */\nfunction baseMerge(object, source, srcIndex, customizer, stack) {\n if (object === source) {\n return;\n }\n baseFor(source, function(srcValue, key) {\n stack || (stack = new Stack);\n if (isObject(srcValue)) {\n baseMergeDeep(object, source, key, srcIndex, baseMerge, customizer, stack);\n }\n else {\n var newValue = customizer\n ? customizer(safeGet(object, key), srcValue, (key + ''), object, source, stack)\n : undefined;\n\n if (newValue === undefined) {\n newValue = srcValue;\n }\n assignMergeValue(object, key, newValue);\n }\n }, keysIn);\n}\n\nexport default baseMerge;\n","/**\n * This method returns the first argument it receives.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Util\n * @param {*} value Any value.\n * @returns {*} Returns `value`.\n * @example\n *\n * var object = { 'a': 1 };\n *\n * console.log(_.identity(object) === object);\n * // => true\n */\nfunction identity(value) {\n return value;\n}\n\nexport default identity;\n","import apply from './_apply.js';\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max;\n\n/**\n * A specialized version of `baseRest` which transforms the rest array.\n *\n * @private\n * @param {Function} func The function to apply a rest parameter to.\n * @param {number} [start=func.length-1] The start position of the rest parameter.\n * @param {Function} transform The rest array transform.\n * @returns {Function} Returns the new function.\n */\nfunction overRest(func, start, transform) {\n start = nativeMax(start === undefined ? (func.length - 1) : start, 0);\n return function() {\n var args = arguments,\n index = -1,\n length = nativeMax(args.length - start, 0),\n array = Array(length);\n\n while (++index < length) {\n array[index] = args[start + index];\n }\n index = -1;\n var otherArgs = Array(start + 1);\n while (++index < start) {\n otherArgs[index] = args[index];\n }\n otherArgs[start] = transform(array);\n return apply(func, this, otherArgs);\n };\n}\n\nexport default overRest;\n","import constant from './constant.js';\nimport defineProperty from './_defineProperty.js';\nimport identity from './identity.js';\n\n/**\n * The base implementation of `setToString` without support for hot loop shorting.\n *\n * @private\n * @param {Function} func The function to modify.\n * @param {Function} string The `toString` result.\n * @returns {Function} Returns `func`.\n */\nvar baseSetToString = !defineProperty ? identity : function(func, string) {\n return defineProperty(func, 'toString', {\n 'configurable': true,\n 'enumerable': false,\n 'value': constant(string),\n 'writable': true\n });\n};\n\nexport default baseSetToString;\n","/**\n * Creates a function that returns `value`.\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Util\n * @param {*} value The value to return from the new function.\n * @returns {Function} Returns the new constant function.\n * @example\n *\n * var objects = _.times(2, _.constant({ 'a': 1 }));\n *\n * console.log(objects);\n * // => [{ 'a': 1 }, { 'a': 1 }]\n *\n * console.log(objects[0] === objects[1]);\n * // => true\n */\nfunction constant(value) {\n return function() {\n return value;\n };\n}\n\nexport default constant;\n","/** Used to detect hot functions by number of calls within a span of milliseconds. */\nvar HOT_COUNT = 800,\n HOT_SPAN = 16;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeNow = Date.now;\n\n/**\n * Creates a function that'll short out and invoke `identity` instead\n * of `func` when it's called `HOT_COUNT` or more times in `HOT_SPAN`\n * milliseconds.\n *\n * @private\n * @param {Function} func The function to restrict.\n * @returns {Function} Returns the new shortable function.\n */\nfunction shortOut(func) {\n var count = 0,\n lastCalled = 0;\n\n return function() {\n var stamp = nativeNow(),\n remaining = HOT_SPAN - (stamp - lastCalled);\n\n lastCalled = stamp;\n if (remaining > 0) {\n if (++count >= HOT_COUNT) {\n return arguments[0];\n }\n } else {\n count = 0;\n }\n return func.apply(undefined, arguments);\n };\n}\n\nexport default shortOut;\n","import baseSetToString from './_baseSetToString.js';\nimport shortOut from './_shortOut.js';\n\n/**\n * Sets the `toString` method of `func` to return `string`.\n *\n * @private\n * @param {Function} func The function to modify.\n * @param {Function} string The `toString` result.\n * @returns {Function} Returns `func`.\n */\nvar setToString = shortOut(baseSetToString);\n\nexport default setToString;\n","import identity from './identity.js';\nimport overRest from './_overRest.js';\nimport setToString from './_setToString.js';\n\n/**\n * The base implementation of `_.rest` which doesn't validate or coerce arguments.\n *\n * @private\n * @param {Function} func The function to apply a rest parameter to.\n * @param {number} [start=func.length-1] The start position of the rest parameter.\n * @returns {Function} Returns the new function.\n */\nfunction baseRest(func, start) {\n return setToString(overRest(func, start, identity), func + '');\n}\n\nexport default baseRest;\n","/**\n * A faster alternative to `Function#apply`, this function invokes `func`\n * with the `this` binding of `thisArg` and the arguments of `args`.\n *\n * @private\n * @param {Function} func The function to invoke.\n * @param {*} thisArg The `this` binding of `func`.\n * @param {Array} args The arguments to invoke `func` with.\n * @returns {*} Returns the result of `func`.\n */\nfunction apply(func, thisArg, args) {\n switch (args.length) {\n case 0: return func.call(thisArg);\n case 1: return func.call(thisArg, args[0]);\n case 2: return func.call(thisArg, args[0], args[1]);\n case 3: return func.call(thisArg, args[0], args[1], args[2]);\n }\n return func.apply(thisArg, args);\n}\n\nexport default apply;\n","import baseMerge from './_baseMerge.js';\nimport createAssigner from './_createAssigner.js';\n\n/**\n * This method is like `_.assign` except that it recursively merges own and\n * inherited enumerable string keyed properties of source objects into the\n * destination object. Source properties that resolve to `undefined` are\n * skipped if a destination value exists. Array and plain object properties\n * are merged recursively. Other objects and value types are overridden by\n * assignment. Source objects are applied from left to right. Subsequent\n * sources overwrite property assignments of previous sources.\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @memberOf _\n * @since 0.5.0\n * @category Object\n * @param {Object} object The destination object.\n * @param {...Object} [sources] The source objects.\n * @returns {Object} Returns `object`.\n * @example\n *\n * var object = {\n * 'a': [{ 'b': 2 }, { 'd': 4 }]\n * };\n *\n * var other = {\n * 'a': [{ 'c': 3 }, { 'e': 5 }]\n * };\n *\n * _.merge(object, other);\n * // => { 'a': [{ 'b': 2, 'c': 3 }, { 'd': 4, 'e': 5 }] }\n */\nvar merge = createAssigner(function(object, source, srcIndex) {\n baseMerge(object, source, srcIndex);\n});\n\nexport default merge;\n","import baseRest from './_baseRest.js';\nimport isIterateeCall from './_isIterateeCall.js';\n\n/**\n * Creates a function like `_.assign`.\n *\n * @private\n * @param {Function} assigner The function to assign values.\n * @returns {Function} Returns the new assigner function.\n */\nfunction createAssigner(assigner) {\n return baseRest(function(object, sources) {\n var index = -1,\n length = sources.length,\n customizer = length > 1 ? sources[length - 1] : undefined,\n guard = length > 2 ? sources[2] : undefined;\n\n customizer = (assigner.length > 3 && typeof customizer == 'function')\n ? (length--, customizer)\n : undefined;\n\n if (guard && isIterateeCall(sources[0], sources[1], guard)) {\n customizer = length < 3 ? undefined : customizer;\n length = 1;\n }\n object = Object(object);\n while (++index < length) {\n var source = sources[index];\n if (source) {\n assigner(object, source, index, customizer);\n }\n }\n return object;\n });\n}\n\nexport default createAssigner;\n","import eq from './eq.js';\nimport isArrayLike from './isArrayLike.js';\nimport isIndex from './_isIndex.js';\nimport isObject from './isObject.js';\n\n/**\n * Checks if the given arguments are from an iteratee call.\n *\n * @private\n * @param {*} value The potential iteratee value argument.\n * @param {*} index The potential iteratee index or key argument.\n * @param {*} object The potential iteratee object argument.\n * @returns {boolean} Returns `true` if the arguments are from an iteratee call,\n * else `false`.\n */\nfunction isIterateeCall(value, index, object) {\n if (!isObject(object)) {\n return false;\n }\n var type = typeof index;\n if (type == 'number'\n ? (isArrayLike(object) && isIndex(index, object.length))\n : (type == 'string' && index in object)\n ) {\n return eq(object[index], value);\n }\n return false;\n}\n\nexport default isIterateeCall;\n","import * as content from '../../content.js'\n\n/**\n* Spellcheck class.\n*\n* @class Spellcheck\n* @constructor\n*/\nexport default class SpellcheckService {\n\n constructor (spellcheckService) {\n this.spellcheckService = spellcheckService\n }\n\n check (text, callback) {\n if (!text) return callback(null)\n\n const condensedText = content.normalizeWhitespace(text)\n\n this.spellcheckService(condensedText, (misspelledWords) => {\n if (misspelledWords && misspelledWords.length > 0) {\n return callback(null, misspelledWords)\n }\n return callback(null)\n })\n }\n\n}\n","// See: https://en.wikipedia.org/wiki/Whitespace_character\n\nconst characters = {\n 'A0': 'no-break space', // \\\\u00A0\n '2000': 'en quad', // \\\\u2000\n '2001': 'em quad', // \\\\u2001\n '2002': 'en space', // \\\\u2002\n '2003': 'em space', // \\\\u2003\n '2004': 'three-per-em space', // \\\\u2004\n '2005': 'four-per-em space', // \\\\u2005\n '2006': 'six-per-em space', // \\\\u2006\n '2007': 'figure space', // \\\\u2007\n '2008': 'punctuation space', // \\\\u2008\n '2009': 'thin space', // \\\\u2009\n '200A': 'hair space', // \\\\u200A\n '202F': 'narrow no-break space', // \\\\u202F\n '205F': 'medium mathematical space', // \\\\u205F\n '3000': 'ideographic space' // \\\\u3000\n}\n\n// The no-break space is not highlighted as this can cause problems.\n// Browser can insert no-break spaces when typing at the end of\n// a paragraph and the highlighting prevents browsers from converting\n// the no-break space back to a normal space when the user keeps typing.\nconst specialWhitespaceChars = '\\\\u2000-\\\\u200A\\\\u202F\\\\u205F\\\\u3000'\nconst specialWhitespaceCharsRegex = new RegExp(`[${specialWhitespaceChars}]`, 'g')\n\nexport default class WhitespaceHighlighting {\n\n constructor (markerNode) {\n this.marker = markerNode\n }\n\n findMatches (text) {\n if (!text) return\n\n const matches = [...text.matchAll(specialWhitespaceCharsRegex)]\n return matches.map((entry) => this.prepareMatch(entry))\n }\n\n prepareMatch (match) {\n const startIndex = match.index\n const unicode = getUnicode(match[0])\n const description = characters[unicode]\n return {\n startIndex,\n endIndex: startIndex + match.length,\n match: match[0],\n title: `${description} (\\\\u${unicode})`,\n marker: this.marker\n }\n }\n}\n\nfunction getUnicode (character) {\n const code = character.charCodeAt(0)\n return `${code.toString(16).toUpperCase()}`\n}\n","export default class MatchCollection {\n\n constructor () {\n this.matches = []\n }\n\n addMatches (matches) {\n if (!matches?.length) return\n this.matches = mergeMatches(this.matches, matches)\n }\n\n}\n\n// Private Helpers\n// ---------------\n\nfunction mergeMatches (matches1, matches2) {\n let next\n const length1 = matches1.length\n const length2 = matches2.length\n let lastEndIndex = -1\n const output = []\n\n const state = {\n a1: matches1,\n i1: 0,\n a2: matches2,\n i2: 0\n }\n\n while (state.i1 < length1 || state.i2 < length2) {\n next = pickNext(state)\n if (next.startIndex >= lastEndIndex) {\n output.push(next)\n }\n lastEndIndex = next.endIndex\n }\n\n return output\n}\n\nfunction pickNext (state) {\n const i1 = state.i1\n const i2 = state.i2\n const item1 = state.a1[i1]\n const item2 = state.a2[i2]\n\n if (item1 && item2 && item1.startIndex < item2.startIndex) {\n state.i1 = i1 + 1\n return item1\n } else if (item1 && item2) {\n state.i2 = i2 + 1\n return item2\n } else if (item1) {\n state.i1 = i1 + 1\n return item1\n } else if (item2) {\n state.i2 = i2 + 1\n return item2\n } else {\n return undefined\n }\n}\n","import _merge from 'lodash-es/merge'\nimport * as nodeType from './node-type.js'\nimport * as content from './content.js'\nimport highlightText from './highlight-text.js'\nimport SpellcheckService from './plugins/highlighting/spellcheck-service.js'\nimport WhitespaceHighlighting from './plugins/highlighting/whitespace-highlighting.js'\nimport {searchAllWords} from './plugins/highlighting/text-search.js'\nimport MatchCollection from './plugins/highlighting/match-collection.js'\nimport highlightSupport from './highlight-support.js'\nimport {domArray, domSelector} from './util/dom.js'\n\n// Spellcheck and Whitespace Highlighting\n// --------------------------------------\n//\n// This instance monitors an editable block for changes and\n// updates highlights accordingly. It also calls the spellcheck\n// service after the content has changed.\nexport default class MonitoredHighlighting {\n\n constructor (editable, configuration, spellcheckConfig) {\n this.editable = editable\n this.win = editable.win\n this.focusedEditableHost = undefined\n this.currentlyCheckedEditableHost = undefined\n this.timeout = {}\n\n const defaultConfig = {\n checkOnInit: false,\n checkOnFocus: false,\n checkOnChange: true,\n // unbounce rate in ms before calling the spellcheck service after changes\n throttle: 1000,\n // remove highlights after a change if the cursor is inside a highlight\n removeOnCorrection: true,\n spellcheck: {\n marker: '<span class=\"highlight-spellcheck\"></span>',\n throttle: 1000,\n spellcheckService: function () {}\n },\n whitespace: {\n marker: '<span class=\"highlight-whitespace\"></span>'\n }\n }\n\n this.config = _merge({}, defaultConfig, configuration)\n\n const spellcheckService = this.config.spellcheck.spellcheckService\n const spellcheckMarker = this.config.spellcheck.marker\n const whitespaceMarker = this.config.whitespace.marker\n const whitespaceMarkerNode = highlightSupport\n .createMarkerNode(whitespaceMarker, 'whitespace', this.win)\n this.spellcheckMarkerNode = highlightSupport\n .createMarkerNode(spellcheckMarker, 'spellcheck', this.win)\n\n this.spellcheckService = new SpellcheckService(spellcheckService)\n this.whitespace = new WhitespaceHighlighting(whitespaceMarkerNode)\n\n this.setupListeners()\n }\n\n // Events\n // ------\n\n setupListeners () {\n if (this.config.checkOnFocus) {\n this.editable.on('focus', (...args) => this.onFocus(...args))\n this.editable.on('blur', (...args) => this.onBlur(...args))\n }\n if (this.config.checkOnChange || this.config.removeOnCorrection) {\n this.editable.on('change', (...args) => this.onChange(...args))\n }\n if (this.config.checkOnInit) {\n this.editable.on('init', (...args) => this.onInit(...args))\n }\n }\n\n onInit (editableHost) {\n this.highlight(editableHost)\n }\n\n onFocus (editableHost) {\n if (this.focusedEditableHost !== editableHost) {\n this.focusedEditableHost = editableHost\n this.editableHasChanged(editableHost)\n }\n }\n\n onBlur (editableHost) {\n if (this.focusedEditableHost === editableHost) {\n this.focusedEditableHost = undefined\n }\n }\n\n onChange (editableHost) {\n if (this.config.checkOnChange) {\n this.editableHasChanged(editableHost, this.config.throttle)\n }\n if (this.config.removeOnCorrection) {\n this.removeHighlightsAtCursor(editableHost)\n }\n }\n\n // Manage Highlights\n // -----------------\n\n editableHasChanged (editableHost, throttle) {\n if (this.timeout.id && this.timeout.editableHost === editableHost) {\n clearTimeout(this.timeout.id)\n }\n\n const timeoutId = setTimeout(() => {\n this.highlight(editableHost)\n\n this.timeout = {}\n }, throttle || 0)\n\n this.timeout = {\n id: timeoutId,\n editableHost: editableHost\n }\n }\n\n highlight (editableHost) {\n const textBefore = highlightText.extractText(editableHost)\n\n // getSpellcheck\n this.spellcheckService.check(textBefore, (err, misspelledWords) => {\n if (err || !editableHost.isConnected) { return } // return in case the host was removed from the dom\n\n // refresh the text\n const text = highlightText.extractText(editableHost)\n\n const matchCollection = new MatchCollection()\n\n let matches = searchAllWords(text, misspelledWords, this.spellcheckMarkerNode)\n matchCollection.addMatches(matches)\n\n matches = this.whitespace.findMatches(text)\n matchCollection.addMatches(matches)\n\n this.safeHighlightMatches(editableHost, matchCollection.matches)\n })\n }\n\n // Calls highlightMatches internally but ensures\n // that the selection stays the same\n safeHighlightMatches (editableHost, matches) {\n const selection = this.editable.getSelection(editableHost)\n if (selection) {\n selection.retainVisibleSelection(() => {\n this.highlightMatches(editableHost, matches)\n })\n } else {\n this.highlightMatches(editableHost, matches)\n }\n if (this.editable.dispatcher) {\n this.editable.dispatcher.notify('spellcheckUpdated', editableHost)\n }\n }\n\n highlightMatches (editableHost, matches) {\n // Remove old highlights\n this.removeHighlights(editableHost)\n\n // Create new highlights\n if (matches && matches.length > 0) {\n // const span = this.createMarkerNode()\n highlightText.highlightMatches(editableHost, matches)\n }\n }\n\n removeHighlights (editableHost) {\n editableHost = domSelector(editableHost, this.win.document)\n for (const elem of domArray('[data-highlight=\"spellcheck\"], [data-highlight=\"whitespace\"]', editableHost)) {\n content.unwrap(elem)\n }\n }\n\n removeHighlightsAtCursor (editableHost) {\n editableHost = domSelector(editableHost, this.win.document)\n const selection = this.editable.getSelection(editableHost)\n if (selection && selection.isCursor) {\n let elementAtCursor = selection.range.startContainer\n if (elementAtCursor.nodeType === nodeType.textNode) {\n elementAtCursor = elementAtCursor.parentNode\n }\n\n let wordId\n do {\n if (elementAtCursor === editableHost) return\n const highlightType = elementAtCursor.getAttribute('data-highlight')\n if (highlightType === 'spellcheck' || highlightType === 'whitespace') {\n wordId = elementAtCursor.getAttribute('data-word-id')\n break\n }\n } while ((elementAtCursor = elementAtCursor.parentNode))\n\n if (wordId) {\n selection.retainVisibleSelection(() => {\n for (const elem of domArray(`[data-word-id=\"${wordId}\"]`, editableHost)) {\n content.unwrap(elem)\n }\n })\n }\n }\n }\n\n}\n","import config from '../config.js'\n\n// Allows for safe console logging\n// If the last param is the string \"trace\" console.trace will be called\n// configuration: disable with config.log = false\nexport default function log () {\n if (config.log === false) return\n\n if (!global.console) return\n\n const args = arguments.length === 1 ? arguments[0] : Array.from(arguments)\n\n if (arguments.length !== 1 && args[args.length - 1] === 'trace') {\n args.pop()\n if (console.trace) console.trace()\n }\n\n return console.log(args)\n}\n","'use strict'\nimport NodeIterator from '../node-iterator.js'\n\nexport function textNodesUnder (node) {\n const iterator = new NodeIterator(node, 'getNextTextNode')\n return [...iterator]\n}\n\n// NOTE: if there is only one text node, then just that node and\n// the abs offset are returned\nexport function getTextNodeAndRelativeOffset ({textNodes, absOffset}) {\n let cumulativeOffset = 0\n let relativeOffset = 0\n let targetNode\n for (let i = 0; i < textNodes.length; i++) {\n const node = textNodes[i]\n if (absOffset <= cumulativeOffset + node.textContent.length) {\n targetNode = node\n relativeOffset = absOffset - cumulativeOffset\n break\n }\n cumulativeOffset += node.textContent.length\n }\n return {node: targetNode, relativeOffset}\n}\n\nexport function getTotalCharCount (element) {\n const textNodes = textNodesUnder(element)\n const reducer = (acc, node) => acc + node.textContent.length\n return textNodes.reduce(reducer, 0)\n}\n","'use strict'\nimport {getTotalCharCount, textNodesUnder, getTextNodeAndRelativeOffset} from './element.js'\n\n/**\n * This is a binary search algorithm implementation aimed at finding\n * a character offset position in a consecutive strings of characters\n * over several lines.\n *\n * Refer to this page in order to learn more about binary search:\n * https://en.wikipedia.org/wiki/Binary_search_algorithm\n *\n * @returns {object}\n * - object with boolean `wasFound` indicating if the binary search found an offset and `offset` to indicate the actual character offset\n */\nexport function binaryCursorSearch ({\n host,\n requiredOnFirstLine,\n requiredOnLastLine,\n positionX // coordinates relative to viewport (e.g. from getBoundingClientRect())\n}) {\n const hostRange = host.ownerDocument.createRange()\n hostRange.selectNodeContents(host)\n const hostCoords = hostRange.getBoundingClientRect()\n const totalCharCount = getTotalCharCount(host)\n const textNodes = textNodesUnder(host)\n\n // early terminate on empty editables\n if (totalCharCount === 0) return {wasFound: false}\n\n const data = {\n currentOffset: Math.floor(totalCharCount / 2),\n leftLimit: 0,\n rightLimit: totalCharCount\n }\n\n let offset = data.currentOffset\n let distance\n let safety = 20\n while (data.leftLimit < data.rightLimit && safety > 0) {\n safety = safety -= 1\n offset = data.currentOffset\n const range = createRangeAtCharacterOffset({textNodes, offset: data.currentOffset})\n const coords = range.getBoundingClientRect()\n distance = Math.abs(coords.left - positionX)\n\n // up / down axis\n if (requiredOnFirstLine && hostCoords.top !== coords.top) {\n moveLeft(data)\n continue\n } else if (requiredOnLastLine && hostCoords.bottom !== coords.bottom) {\n moveRight(data)\n continue\n }\n\n // left / right axis\n if (positionX < coords.left) {\n moveLeft(data)\n } else {\n moveRight(data)\n }\n }\n\n const range = createRangeAtCharacterOffset({textNodes, offset: data.currentOffset})\n const coords = range.getBoundingClientRect()\n const finalDistance = Math.abs(coords.left - positionX)\n\n // Decide if last or second last offset is closest\n if (finalDistance < distance) {\n distance = finalDistance\n offset = data.currentOffset\n }\n\n return {distance, offset, wasFound: true}\n}\n\n// move the binary search index in between the current position and the left limit\nfunction moveLeft (data) {\n data.rightLimit = data.currentOffset\n data.currentOffset = Math.floor((data.currentOffset + data.leftLimit) / 2)\n}\n// move the binary search index in between the current position and the right limit\nfunction moveRight (data) {\n data.leftLimit = data.currentOffset\n data.currentOffset = Math.ceil((data.currentOffset + data.rightLimit) / 2)\n}\n\nfunction createRangeAtCharacterOffset ({textNodes, offset}) {\n const {node, relativeOffset} = getTextNodeAndRelativeOffset({textNodes, absOffset: offset})\n\n const newRange = node.ownerDocument.createRange()\n newRange.setStart(node, relativeOffset)\n newRange.collapse(true)\n\n return newRange\n}\n","import config from './config.js'\nimport error from './util/error.js'\nimport * as parser from './parser.js'\nimport * as block from './block.js'\nimport * as content from './content.js'\nimport * as clipboard from './clipboard.js'\nimport Dispatcher from './dispatcher.js'\nimport Cursor from './cursor.js'\nimport highlightSupport from './highlight-support.js'\nimport MonitoredHighlighting from './monitored-highlighting.js'\nimport createDefaultEvents from './create-default-events.js'\nimport {textNodesUnder, getTextNodeAndRelativeOffset} from './util/element.js'\nimport {binaryCursorSearch} from './util/binary_search.js'\nimport {domArray, createRange, nodeContainsRange} from './util/dom.js'\n\n/**\n * The Core module provides the Editable class that defines the Editable.JS\n * API and is the main entry point for Editable.JS.\n * It also provides the cursor module for cross-browser cursors, and the dom\n * submodule.\n *\n * @module core\n */\n\n/**\n * Constructor for the Editable.JS API that is externally visible.\n *\n * @param {Object} configuration for this editable instance.\n * window: The window where to attach the editable events.\n * defaultBehavior: {Boolean} Load default-behavior.js.\n * mouseMoveSelectionChanges: {Boolean} Whether to get cursor and selection events on mousemove.\n * browserSpellcheck: {Boolean} Set the spellcheck attribute on editable elements\n *\n * @class Editable\n */\nexport class Editable {\n\n constructor (instanceConfig) {\n const defaultInstanceConfig = {\n window: window,\n defaultBehavior: true,\n mouseMoveSelectionChanges: false,\n browserSpellcheck: true\n }\n\n this.config = Object.assign(defaultInstanceConfig, instanceConfig)\n this.win = this.config.window\n this.editableSelector = `.${config.editableClass}`\n\n this.dispatcher = new Dispatcher(this)\n if (this.config.defaultBehavior === true) {\n this.dispatcher.on(createDefaultEvents(this))\n }\n }\n\n /**\n * @returns the default Editable configs from config.js\n */\n static getGlobalConfig () {\n return config\n }\n\n /**\n * Set configuration options that affect all editable\n * instances.\n *\n * @param {Object} global configuration options (defaults are defined in config.js)\n * log: {Boolean}\n * logErrors: {Boolean}\n * editableClass: {String} e.g. 'js-editable'\n * editableDisabledClass: {String} e.g. 'js-editable-disabled'\n * pastingAttribute: {String} default: e.g. 'data-editable-is-pasting'\n * boldTag: e.g. '<strong>'\n * italicTag: e.g. '<em>'\n */\n static globalConfig (globalConfig) {\n Object.assign(config, globalConfig)\n clipboard.updateConfig(config)\n }\n\n /**\n * Adds the Editable.JS API to the given target elements.\n * Opposite of {{#crossLink \"Editable/remove\"}}{{/crossLink}}.\n * Calls dispatcher.setup to setup all event listeners.\n *\n * @method add\n * @param {HTMLElement|Array(HTMLElement)|String} target A HTMLElement, an\n * array of HTMLElement or a query selector representing the target where\n * the API should be added on.\n * @param {normalize, plainText} options Block specific configuration\n * @chainable\n */\n add (target, options) {\n this.enable(target, options)\n // TODO check css whitespace settings\n return this\n }\n\n /**\n * Removes the Editable.JS API from the given target elements.\n * Opposite of {{#crossLink \"Editable/add\"}}{{/crossLink}}.\n *\n * @method remove\n * @param {HTMLElement|Array(HTMLElement)|String} target A HTMLElement, an\n * array of HTMLElement or a query selector representing the target where\n * the API should be removed from.\n * @chainable\n */\n remove (target) {\n const targets = domArray(target, this.win.document)\n\n this.disable(targets)\n\n for (const element of targets) {\n element.classList.remove(config.editableDisabledClass)\n }\n\n return this\n }\n\n /**\n * Removes the Editable.JS API from the given target elements.\n * The target elements are marked as disabled.\n *\n * @method disable\n * @param { HTMLElement | undefined } elem editable root element(s)\n * If no param is specified all editables are disabled.\n * @chainable\n */\n disable (target) {\n const targets = domArray(target || `.${config.editableClass}`, this.win.document)\n\n for (const element of targets) {\n block.disable(element)\n }\n\n return this\n }\n\n /**\n * Adds the Editable.JS API to the given target elements.\n *\n * @method enable\n * @param { HTMLElement | undefined } target editable root element(s)\n * If no param is specified all editables marked as disabled are enabled.\n * @param {boolean} normalize normalizes target content (legacy param)\n * @param {boolean} options.normalize normalizes target content\n * @param {boolean} options.plainText prevents text formatting for block\n * @chainable\n */\n enable (target, options) {\n const {\n normalize = typeof options === 'boolean' ? options : false,\n plainText = false\n } = options ?? {}\n const shouldSpellcheck = this.config.browserSpellcheck\n const targets = domArray(target || `.${config.editableDisabledClass}`, this.win.document)\n\n for (const element of targets) {\n block.init(element, {normalize, plainText, shouldSpellcheck})\n this.dispatcher.notify('init', element)\n }\n\n return this\n }\n\n /**\n * Temporarily disable an editable.\n * Can be used to prevent text selection while dragging an element\n * for example.\n *\n * @method suspend\n * @param { HTMLElement | undefined } target\n */\n suspend (target) {\n const targets = domArray(target || `.${config.editableClass}`, this.win.document)\n\n for (const element of targets) {\n element.removeAttribute('contenteditable')\n }\n\n this.dispatcher.suspend()\n return this\n }\n\n /**\n * Reverse the effects of suspend()\n *\n * @method continue\n * @param { HTMLElement | undefined } target\n */\n continue (target) {\n const targets = domArray(target || `.${config.editableClass}`, this.win.document)\n\n for (const element of targets) {\n element.setAttribute('contenteditable', true)\n }\n\n this.dispatcher.continue()\n return this\n }\n /**\n * Set the cursor inside of an editable block.\n *\n * @method createCursor\n * @param { HTMLElement } element\n * @param { 'beginning' | 'end' | 'before' | 'after' } position\n */\n\n createCursor (element, position = 'beginning') {\n const host = Cursor.findHost(element, this.editableSelector)\n if (!host) return undefined\n\n const range = createRange()\n\n if (position === 'beginning' || position === 'end') {\n range.selectNodeContents(element)\n range.collapse(position === 'beginning')\n } else if (element !== host) {\n if (position === 'before') {\n range.setStartBefore(element)\n range.setEndBefore(element)\n } else if (position === 'after') {\n range.setStartAfter(element)\n range.setEndAfter(element)\n }\n } else {\n error('EditableJS: cannot create cursor outside of an editable block.')\n }\n\n return new Cursor(host, range)\n }\n\n createCursorAtCharacterOffset ({element, offset}) {\n const textNodes = textNodesUnder(element)\n const {node, relativeOffset} = getTextNodeAndRelativeOffset({textNodes, absOffset: offset})\n const newRange = createRange()\n newRange.setStart(node, relativeOffset)\n newRange.collapse(true)\n\n const host = Cursor.findHost(element, this.editableSelector)\n const nextCursor = new Cursor(host, newRange)\n\n nextCursor.setVisibleSelection()\n return nextCursor\n }\n\n createCursorAtBeginning (element) {\n return this.createCursor(element, 'beginning')\n }\n\n createCursorAtEnd (element) {\n return this.createCursor(element, 'end')\n }\n\n createCursorBefore (element) {\n return this.createCursor(element, 'before')\n }\n\n createCursorAfter (element) {\n return this.createCursor(element, 'after')\n }\n\n /**\n * Extract the content from an editable host or document fragment.\n * This method will remove all internal elements and ui-elements.\n *\n * @param {DOM node or Document Fragment} The innerHTML of this element or fragment will be extracted.\n * @returns {String} The cleaned innerHTML.\n */\n getContent (element) {\n return content.extractContent(element)\n }\n\n /**\n * @param {String | DocumentFragment} content to append.\n * @returns {Cursor} A new Cursor object just before the inserted content.\n */\n appendTo (inputElement, contentToAppend) {\n const element = content.adoptElement(inputElement, this.win.document)\n\n const cursor = this.createCursor(element, 'end')\n // TODO create content in the right window\n cursor.insertAfter(typeof contentToAppend === 'string'\n ? content.createFragmentFromString(contentToAppend)\n : contentToAppend\n )\n return cursor\n }\n\n /**\n * @param {String | DocumentFragment} content to prepend\n * @returns {Cursor} A new Cursor object just after the inserted content.\n */\n prependTo (inputElement, contentToPrepend) {\n const element = content.adoptElement(inputElement, this.win.document)\n\n const cursor = this.createCursor(element, 'beginning')\n // TODO create content in the right window\n cursor.insertBefore(typeof contentToPrepend === 'string'\n ? content.createFragmentFromString(contentToPrepend)\n : contentToPrepend\n )\n return cursor\n }\n\n /**\n * Get the current selection.\n * Only returns something if the selection is within an editable element.\n * If you pass an editable host as param it only returns something if the selection is inside this\n * very editable element.\n *\n * @param {DOMNode} Optional. An editable host where the selection needs to be contained.\n * @returns A Cursor or Selection object or undefined.\n */\n getSelection (editableHost) {\n const selection = this.dispatcher.selectionWatcher.getFreshSelection()\n if (!editableHost || !selection) return selection\n\n const range = selection.range\n\n // Check if the selection is inside the editableHost\n if (editableHost?.isConnected && nodeContainsRange(editableHost, range)) {\n return selection\n }\n }\n\n /**\n * Enable spellchecking\n *\n * @chainable\n */\n setupHighlighting (hightlightingConfig) {\n this.highlighting = new MonitoredHighlighting(this, hightlightingConfig)\n\n return this\n }\n\n // For backwards compatibility\n setupSpellcheck (conf) {\n let marker\n\n if (conf.markerNode) {\n marker = conf.markerNode.outerHTML\n }\n\n this.setupHighlighting({\n throttle: conf.throttle,\n spellcheck: {\n marker: marker,\n spellcheckService: conf.spellcheckService\n }\n })\n\n this.spellcheck = {\n checkSpelling: (elem) => {\n this.highlighting.highlight(elem)\n }\n }\n }\n\n /**\n * Highlight text within an editable.\n *\n * By default highlights all occurrences of `text`.\n * Pass it a `textRange` object to highlight a\n * specific text portion.\n *\n * The markup used for the highlighting will be removed\n * from the final content.\n *\n *\n * @param {Object} options\n * @param {DOMNode} options.editableHost\n * @param {String} options.text\n * @param {String} options.highlightId Added to the highlight markups in the property `data-word-id`\n * @param {Object} [options.textRange] An optional range which gets used to set the markers.\n * @param {Number} options.textRange.start\n * @param {Number} options.textRange.end\n * @param {Boolean} options.raiseEvents do throw change events\n * @return {Number} The text-based start offset of the newly applied highlight or `-1` if the range was considered invalid.\n */\n highlight ({editableHost, text, highlightId, textRange, raiseEvents, type = 'comment'}) {\n if (!textRange) {\n return highlightSupport.highlightText(editableHost, text, highlightId, type, raiseEvents ? this.dispatcher : undefined)\n }\n if (typeof textRange.start !== 'number' || typeof textRange.end !== 'number') {\n error(\n 'Error in Editable.highlight: You passed a textRange object with invalid keys. Expected shape: { start: Number, end: Number }'\n )\n return -1\n }\n if (textRange.start === textRange.end) {\n error(\n 'Error in Editable.highlight: You passed a textRange object with equal start and end offsets, which is considered a cursor and therefore unfit to create a highlight.'\n )\n return -1\n }\n return highlightSupport.highlightRange(editableHost, text, highlightId, textRange.start, textRange.end, raiseEvents ? this.dispatcher : undefined, type)\n }\n\n /**\n * Extracts positions of all DOMNodes that match `[data-word-id]` and the `[data-highlight]`\n *\n * Returns an object where the keys represent a highlight id and the value\n * a text range object of shape:\n * ```\n * { start: number, end: number, text: string}\n * ```\n *\n * @param {Object} options\n * @param {DOMNode} options.editableHost\n * @param {String} [options.type]\n * @return {Object} ranges\n */\n getHighlightPositions ({editableHost, type}) {\n return highlightSupport.extractHighlightedRanges(\n editableHost,\n type\n )\n }\n\n removeHighlight ({editableHost, highlightId, raiseEvents}) {\n highlightSupport.removeHighlight(editableHost, highlightId, raiseEvents ? this.dispatcher : undefined)\n }\n\n decorateHighlight ({editableHost, highlightId, addCssClass, removeCssClass}) {\n highlightSupport.updateHighlight(editableHost, highlightId, addCssClass, removeCssClass)\n }\n\n /**\n * Subscribe a callback function to a custom event fired by the API.\n *\n * @param {String} event The name of the event.\n * @param {Function} handler The callback to execute in response to the\n * event.\n *\n * @chainable\n */\n on (event, handler) {\n // TODO throw error if event is not one of EVENTS\n // TODO throw error if handler is not a function\n this.dispatcher.on(event, handler)\n return this\n }\n\n /**\n * Unsubscribe a callback function from a custom event fired by the API.\n * Opposite of {{#crossLink \"Editable/on\"}}{{/crossLink}}.\n *\n * @param {String} event The name of the event.\n * @param {Function} handler The callback to remove from the\n * event or the special value false to remove all callbacks.\n *\n * @chainable\n */\n off (...args) {\n this.dispatcher.off.apply(this.dispatcher, args)\n return this\n }\n\n /**\n * Unsubscribe all callbacks and event listeners.\n *\n * @chainable\n */\n unload () {\n this.dispatcher.unload()\n return this\n }\n\n /**\n * Takes coordinates and uses its left value to find out how to offset a character in a string to\n * closely match the coordinates.left value.\n * Takes conditions for the result being on the first line, used when navigating to a paragraph from\n * the above paragraph and being on the last line, used when navigating to a paragraph from the below\n * paragraph.\n *\n * Internally this sets up the methods used for a binary cursor search and calls this.\n *\n * @param {DomNode} element\n * - the editable hostDOM Node to which the cursor jumps\n * @param {object} coordinates\n * - The bounding rect of the preceding cursor to be matched\n * @param {boolean} requiredOnFirstLine\n * - set to true if you want to require the cursor to be on the first line of the paragraph\n * @param {boolean} requiredOnLastLine\n * - set to true if you want to require the cursor to be on the last line of the paragraph\n *\n * @return {Object}\n * - object with boolean `wasFound` indicating if the binary search found an offset and `offset` to indicate the actual character offset\n */\n findClosestCursorOffset ({\n element,\n origCoordinates,\n requiredOnFirstLine = false,\n requiredOnLastLine = false\n }) {\n const positionX = this.dispatcher.switchContext\n ? this.dispatcher.switchContext.positionX\n : origCoordinates.left\n\n return binaryCursorSearch({\n host: element,\n requiredOnFirstLine,\n requiredOnLastLine,\n positionX\n })\n }\n}\n\n// Expose modules and editable\nEditable.parser = parser\nEditable.content = content\n\n// Set up callback functions for several events.\n;['focus', 'blur', 'flow', 'selection', 'cursor', 'newline',\n 'insert', 'split', 'merge', 'empty', 'change', 'switch',\n 'move', 'clipboard', 'paste', 'spellcheckUpdated', 'selectToBoundary'\n].forEach((name) => {\n // Generate a callback function to subscribe to an event.\n Editable.prototype[name] = function (handler) {\n return this.on(name, handler)\n }\n})\n","import createDefaultBehavior from './create-default-behavior.js'\n\nexport default function createDefaultEvents (editable) {\n const behavior = createDefaultBehavior(editable)\n\n return {\n /**\n * The focus event is triggered when an element gains focus.\n * The default behavior is to... TODO\n *\n * @event focus\n * @param {HTMLElement} element The element triggering the event.\n */\n focus (element) {\n behavior.focus(element)\n },\n\n /**\n * The blur event is triggered when an element looses focus.\n * The default behavior is to... TODO\n *\n * @event blur\n * @param {HTMLElement} element The element triggering the event.\n */\n blur (element) {\n behavior.blur(element)\n },\n\n /**\n * The flow event is triggered when the user starts typing or pause typing.\n * The default behavior is to... TODO\n *\n * @event flow\n * @param {HTMLElement} element The element triggering the event.\n * @param {String} action The flow action: \"start\" or \"pause\".\n */\n flow (element, action) {\n behavior.flow(element, action)\n },\n\n /**\n * The selection event is triggered after the user has selected some\n * content.\n * The default behavior is to... TODO\n *\n * @event selection\n * @param {HTMLElement} element The element triggering the event.\n * @param {Selection} selection The actual Selection object.\n */\n selection (element, selection) {\n behavior.selection(element, selection)\n },\n\n /**\n * The cursor event is triggered after cursor position has changed.\n * The default behavior is to... TODO\n *\n * @event cursor\n * @param {HTMLElement} element The element triggering the event.\n * @param {Cursor} cursor The actual Cursor object.\n */\n cursor (element, cursor) {\n behavior.cursor(element, cursor)\n },\n\n /**\n * The newline event is triggered when a newline should be inserted. This\n * happens when SHIFT+ENTER key is pressed.\n * The default behavior is to add a <br />\n *\n * @event newline\n * @param {HTMLElement} element The element triggering the event.\n * @param {Cursor} cursor The actual cursor object.\n */\n newline (element, cursor) {\n behavior.newline(element, cursor)\n },\n\n /**\n * The split event is triggered when a block should be split into two\n * blocks. This happens when ENTER is pressed within a non-empty block.\n * The default behavior is to... TODO\n *\n * @event split\n * @param {HTMLElement} element The element triggering the event.\n * @param {String} before The HTML string before the split.\n * @param {String} after The HTML string after the split.\n * @param {Cursor} cursor The actual cursor object.\n */\n split (element, before, after, cursor) {\n behavior.split(element, before, after, cursor)\n },\n\n /**\n * The insert event is triggered when a new block should be inserted. This\n * happens when ENTER key is pressed at the beginning of a block (should\n * insert before) or at the end of a block (should insert after).\n * The default behavior is to... TODO\n *\n * @event insert\n * @param {HTMLElement} element The element triggering the event.\n * @param {String} direction The insert direction: \"before\" or \"after\".\n * @param {Cursor} cursor The actual cursor object.\n */\n insert (element, direction, cursor) {\n behavior.insert(element, direction, cursor)\n },\n\n /**\n * The merge event is triggered when two needs to be merged. This happens\n * when BACKSPACE is pressed at the beginning of a block (should merge with\n * the preceding block) or DEL is pressed at the end of a block (should\n * merge with the following block).\n * The default behavior is to... TODO\n *\n * @event merge\n * @param {HTMLElement} element The element triggering the event.\n * @param {String} direction The merge direction: \"before\" or \"after\".\n * @param {Cursor} cursor The actual cursor object.\n */\n merge (element, direction, cursor) {\n behavior.merge(element, direction, cursor)\n },\n\n /**\n * The empty event is triggered when a block is emptied.\n * The default behavior is to... TODO\n *\n * @event empty\n * @param {HTMLElement} element The element triggering the event.\n */\n empty (element) {\n behavior.empty(element)\n },\n\n /**\n * The switch event is triggered when the user switches to another block.\n * This happens when an ARROW key is pressed near the boundaries of a block.\n * The default behavior is to... TODO\n *\n * @event switch\n * @param {HTMLElement} element The element triggering the event.\n * @param {String} direction The switch direction: \"before\" or \"after\".\n * @param {Cursor} cursor The actual cursor object.*\n */\n switch (element, direction, cursor) {\n behavior.switch(element, direction, cursor)\n },\n\n /**\n * The move event is triggered when the user moves a selection in a block.\n * This happens when the user selects some (or all) content in a block and\n * an ARROW key is pressed (up: drag before, down: drag after).\n * The default behavior is to... TODO\n *\n * @event move\n * @param {HTMLElement} element The element triggering the event.\n * @param {Selection} selection The actual Selection object.\n * @param {String} direction The move direction: \"before\" or \"after\".\n */\n move (element, selection, direction) {\n behavior.move(element, selection, direction)\n },\n\n /**\n * The clipboard event is triggered when the user copies or cuts\n * a selection within a block.\n *\n * @event clipboard\n * @param {HTMLElement} element The element triggering the event.\n * @param {String} action The clipboard action: \"copy\" or \"cut\".\n * @param {Selection} selection A selection object around the copied content.\n */\n clipboard (element, action, selection) {\n behavior.clipboard(element, action, selection)\n },\n\n /**\n * The paste event is triggered when the user pastes text\n *\n * @event paste\n * @param {HTMLElement} The element triggering the event.\n * @param {Array of String} The pasted blocks\n * @param {Cursor} The cursor object.\n */\n paste (element, blocks, cursor) {\n behavior.paste(element, blocks, cursor)\n },\n\n /**\n * The toggleBold event is triggered when the bold keyboard shortcut is used\n *\n * @event toggleBold\n * @param {Selection} The selection object.\n */\n toggleBold (selection) {\n behavior.toggleBold(selection)\n },\n\n /**\n * The toggleEmphasis event is triggered when the italic keyboard shortcut is used\n *\n * @event toggleEmphasis\n * @param {Selection} The selection object.\n */\n toggleEmphasis (selection) {\n behavior.toggleEmphasis(selection)\n }\n }\n}\n","import * as parser from './parser.js'\nimport * as content from './content.js'\nimport log from './util/log.js'\nimport * as block from './block.js'\nimport * as nodeType from './node-type.js'\n\n/**\n * The Behavior module defines the behavior triggered in response to the Editable.JS\n * events (see {{#crossLink \"Editable\"}}{{/crossLink}}).\n * The behavior can be overwritten by a user with Editable.init() or on\n * Editable.add() per element.\n *\n * @module core\n * @submodule behavior\n */\n\nexport default function createDefaultBehavior (editable) {\n const document = editable.win.document\n /**\n * Factory for the default behavior.\n * Provides default behavior of the Editable.JS API.\n *\n * @static\n */\n\n return {\n /** @param {HTMLElement} element */\n focus (element) {\n if (!parser.isVoid(element)) return\n\n // Add an zero width space if the editable is empty to force it to have a height\n // E.g. Firefox does not render empty block elements\n // and most browsers do not render empty inline elements.\n element.appendChild(document.createTextNode('\\uFEFF'))\n },\n\n blur (element) {\n // Note: there is a special case when the tab is changed where\n // we can get a blur event even if the cursor is still in the editable.\n // This blur would cause us to loose the cursor position (cause of cleanInternals()).\n // To prevent this we check if the activeElement is still the editable.\n // (Note: document.getSelection() did not work reliably in this case.)\n if (document.activeElement === element) return\n\n content.cleanInternals(element)\n },\n\n selection (element, selection) {\n log(selection ? 'Default selection behavior' : 'Default selection empty behavior')\n },\n\n cursor (element, cursor) {\n log(cursor ? 'Default cursor behavior' : 'Default cursor empty behavior')\n },\n\n newline (element, cursor) {\n // When the cursor is at the text end, we'll need to add an empty text node\n // after the br tag to ensure that the cursor shows up on the next line\n if (cursor.isAtTextEnd()) {\n const br = document.createElement('br')\n cursor.insertBefore(br)\n\n // Only append a zero width space if there's none after the br tag\n // We don't need to remove them as they get cleaned up on blur\n if (\n br.nextSibling?.nodeType !== nodeType.textNode ||\n br.nextSibling.textContent[0] !== '\\uFEFF'\n ) {\n cursor.insertAfter(document.createTextNode('\\uFEFF'))\n }\n } else {\n cursor.insertBefore(document.createElement('br'))\n }\n\n cursor.setVisibleSelection()\n },\n\n insert (element, direction, cursor) {\n const parent = element.parentNode\n const newElement = element.cloneNode(false)\n if (newElement.id) newElement.removeAttribute('id')\n\n switch (direction) {\n case 'before':\n parent.insertBefore(newElement, element)\n element.focus()\n break\n case 'after':\n parent.insertBefore(newElement, element.nextSibling)\n newElement.focus()\n break\n }\n },\n\n split (element, before, after, cursor) {\n const newNode = element.cloneNode(false)\n newNode.appendChild(before)\n\n const parent = element.parentNode\n parent.insertBefore(newNode, element)\n\n while (element.firstChild) element.removeChild(element.firstChild)\n\n element.appendChild(after)\n content.tidyHtml(newNode)\n content.tidyHtml(element)\n element.focus()\n },\n\n merge (element, direction, cursor) {\n let container, merger\n\n switch (direction) {\n case 'before':\n container = block.previous(element)\n merger = element\n break\n case 'after':\n container = element\n merger = block.next(element)\n break\n }\n\n if (!(container && merger)) return\n\n cursor = container.childNodes.length > 0\n ? editable.appendTo(container, merger.innerHTML)\n : editable.prependTo(container, merger.innerHTML)\n\n // remove merged node\n merger.remove()\n\n cursor.save()\n content.tidyHtml(container)\n cursor.restore()\n cursor.setVisibleSelection()\n },\n\n empty (element) {\n log('Default empty behavior')\n },\n\n switch (element, direction, cursor) {\n switch (direction) {\n case 'before':\n const previous = block.previous(element)\n if (previous) {\n cursor.moveAtTextEnd(previous)\n cursor.setVisibleSelection()\n }\n break\n case 'after':\n const next = block.next(element)\n if (next) {\n cursor.moveAtBeginning(next)\n cursor.setVisibleSelection()\n }\n break\n }\n },\n\n move (element, selection, direction) {\n log('Default move behavior')\n },\n\n paste (element, blocks, cursor) {\n if (blocks.length === 0) return\n\n cursor.insertBefore(blocks.shift())\n if (blocks.length === 0) return cursor.setVisibleSelection()\n\n const parent = element.parentNode\n let currentElement = element\n\n blocks.forEach((str) => {\n const newElement = element.cloneNode(false)\n if (newElement.id) newElement.removeAttribute('id')\n const fragment = content.createFragmentFromString(str)\n newElement.appendChild(fragment)\n parent.insertBefore(newElement, currentElement.nextSibling)\n currentElement = newElement\n })\n\n // focus last element\n editable.createCursorAtEnd(currentElement)\n .setVisibleSelection()\n },\n\n clipboard (element, action, cursor) {\n log('Default clipboard behavior')\n },\n\n toggleBold (selection) {\n selection.toggleBold()\n },\n\n toggleEmphasis (selection) {\n selection.toggleEmphasis()\n }\n }\n}\n"],"names":["root","factory","exports","module","define","amd","self","__webpack_require__","definition","key","o","Object","defineProperty","enumerable","get","g","globalThis","this","Function","e","window","obj","prop","prototype","hasOwnProperty","call","r","Symbol","toStringTag","value","_classCallCheck","a","n","TypeError","_typeof","iterator","constructor","toPropertyKey","t","i","toPrimitive","String","_defineProperties","length","configurable","writable","_createClass","log","logErrors","editableClass","editableDisabledClass","pastingAttribute","trimLeadingAndTrailingWhitespaces","boldMarkup","type","name","attribs","trim","italicMarkup","underlineMarkup","linkMarkup","pastedHtmlRules","allowedElements","allowedPlainTextElements","requiredAttributes","transformElements","splitIntoBlocks","blockLevelElements","blacklistedElements","keepInternalRelativeLinks","replaceQuotes","error","config","args","arguments","Array","from","global","console","toString","htmlCharacters","trimRight","text","replace","isString","elementNode","textNode","documentFragmentNode","NodeIterator","method","current","previous","nextNode","iteratorFunc","next","getNext","nodeType","data","prev","getPrevious","done","child","undefined","firstChild","getAttribute","nextSibling","parentNode","lastChild","previousSibling","replacement","domArray","target","document","querySelectorAll","tagName","isArray","domSelector","querySelector","createElement","html","el","innerHTML","firstElementChild","closest","elem","selector","createRange","getSelection","getNodes","range","nodeTypes","filterFunc","currentNode","nodes","nodeIterator","createNodeIterator","commonAncestorContainer","NodeFilter","SHOW_ALL","acceptNode","node","intersectsNode","includes","FILTER_ACCEPT","FILTER_SKIP","push","normalizeBoundaries","startContainer","compareDocumentPosition","endContainer","Node","DOCUMENT_POSITION_FOLLOWING","setStartBefore","DOCUMENT_POSITION_PRECEDING","setEndAfter","containsNodeText","nodeRange","selectNodeContents","comparisonStart","compareBoundaryPoints","Range","START_TO_START","comparisonEnd","END_TO_END","isCharacterDataNode","TEXT_NODE","COMMENT_NODE","splitDataNode","offset","splitText","splitBoundaries","startOffset","endOffset","newStartContainer","setStart","toCharacterRange","container","startRange","cloneRange","setEnd","rangeText","start","end","rangesAreEqual","range1","range2","findStartExcludingWhitespace","_ref","whitespacesOnTheLeft","childNodes","offsetAfterWhitespace","getNextTextNode","previousTextNode","getPreviousTextNode","findEndExcludingWhitespace","_ref2","whitespacesOnTheRight","isFirstNode","offsetBeforeWhitespace","getHost","jquery","concat","getNodeIndex","index","isVoid","_step","_iterator","_createForOfIteratorHelper","s","isVoidTextNode","err","f","nodeValue","isWhitespaceOnly","lastOffsetWithContent","isLinebreak","string","lastOffset","reverse","every","isBeginningOfHost","host","isStartOffset","offsetInParent","isEndOfHost","isEndOffset","isTextEndOfHost","isTextEndOffset","isSameNode","source","len","attr","nodeName","attributes","latestChild","warn","isDocumentFragmentWithoutChildren","fragment","isInlineElement","element","currentStyle","getComputedStyle","display","boundaryMarkerId","markerTextChar","isSecondChildOfCommonAncestor","rangeContainer","parent","possibleChild","parentElement","insertRangeBoundaryMarker","atStart","ownerDocument","doc","defaultView","markerEl","id","setAttribute","style","lineHeight","appendChild","createTextNode","directlyBeforeFormatTag","directlyAfterFormatTag","startParentElem","insertBefore","endParentElem","boundaryRange","collapse","insertNode","setRangeBoundary","markerId","getMarker","remove","save","rangeInfo","startEl","endEl","collapsed","startMarkerId","endMarkerId","setEndBefore","setStartAfter","restore","restored","previousNode","restoreRange","func","rangeSaveRestore","zeroWidthSpace","zeroWidthNonBreakingSpace","whitespaceExceptSpace","everythingWhitespace","leadingWhitespace","trailingWhitespace","tidyHtml","normalizeTags","createDocumentFragment","removeWhitespaces","textContent","sibling","parser","_step2","_iterator2","siblingChild","cloneNode","removeChild","normalizeWhitespace","cleanInternals","extractContent","keepUiElements","innerHtml","getInnerHtmlOfFragment","clone","unwrapInternalNodes","documentFragment","div","createFragmentFromString","htmlString","wrapper","adoptElement","adoptNode","cloneRangeContents","cloneContents","_elem","firstCall","test","startsWith","unwrap","getTags","innerTags","getInnerTags","ancestorTags","getAncestorTags","tags","getTagsByName","toUpperCase","getTagsByNameAndAttributes","areSameAttributes","attrs1","attrs2","getContainedTags","filter","getTagNames","map","isAffectedBy","some","isExactSelection","visible","elemRange","END_TO_START","elemText","expandTo","toggleTag","elems","removeFormattingElem","forceWrap","isWrappable","boundariesInvalid","ELEMENT_NODE","isNodeFullyContained","canSurroundContents","restoredRange","nukeElem","nuke","wrap","surroundContents","removeFormatting","forEach","matches","insertCharacter","character","insertEl","surround","startCharacter","endCharacter","deleteCharacter","containsString","rangeCount","indexOf","replaceAll","str","nukeTag","nextBlockId","state","getSibling","init","normalize","plainText","shouldSpellcheck","hasAttribute","setBlockId","Boolean","classList","add","content","isPlainTextBlock","slice","_toConsumableArray","replacements","doubleQuotePairs","singleQuotePairs","apostrophe","quotesRegex","beforeOpeningQuote","afterClosingQuote","replaceAllQuotes","replaceQuotesRules","quotes","singleQuotes","matchAll","match","char","before","after","getAllQuotes","replaceMatchedQuotes","replaceExistingQuotes","position","closingTag","findClosingQuote","nestedMatches","replaceApostrophe","openingQuote","possibleClosingSingleQuotes","getPossibleClosingQuotes","possibleClosingDoubleQuotes","pairs","quotePair","quote","whitespaceOnly","blockPlaceholder","updateConfig","conf","rules","paste","block","cursor","clipboardContent","isSelection","deleteExactSurroundingTags","deleteContainedTags","deleteContent","pasteHolder","blocks","_ref$plainText","filterHtmlElements","split","entry","group","parseContent","removeAttribute","options","reduce","toLowerCase","href","stripInternalHost","location","origin","requiredAttrs","hasRequiredAttributes","shouldKeepNode","transformNodeName","_allowedElements$node","filterAttributes","conditionalNodeWrap","c","documentElement","contentEditable","isBlink","navigator","userAgent","isWebkit","webKit","selectionchange","osc","onselectionchange","hasNativeSelectionchangeSupport","contenteditableSpanBug","eventable","notifyContext","events","listeners","addListener","listener","event","unshift","on","eventType","off","eventListeners","splice","removeListener","notify","context","switchContext","shift","apply","getEventableModule","getScrollPosition","win","x","pageXOffset","body","scrollLeft","y","pageYOffset","scrollTop","Cursor","editableHost","setHost","isCursor","hostRange","hostCoords","getRangeBoundingClientRect","cursorCoords","isCloseTo","bottom","top","preceedingElement","lastIndex","setVisibleSelection","activeElement","_viewport$getScrollPo","viewport","scrollTo","selection","removeAllRanges","addRange","getBoundingClientRect","positioning","coords","_viewport$getScrollPo2","left","right","height","width","updateHost","moveAtEnd","callback","savedRangeInfo","isEqualNode","attributeName","attributeValue","Event","bubbles","cancelable","dispatchEvent","b","Math","abs","_slicedToArray","l","u","_getPrototypeOf","setPrototypeOf","getPrototypeOf","bind","__proto__","_setPrototypeOf","extractText","convertBRs","getText","part","highlightMatches","countBRs","wordId","currentMatchIndex","totalOffset","currentMatch","portions","nodeText","nodeEndOffset","startIndex","endIndex","isFirstPortion","isLastPortion","portion","substring","lastNode","wrapMatch","marker","title","replaceCurrent","stencilElement","_this","wrapPortion","pop","findMatches","searchTexts","matchMode","_obj$ownerDocument","HTMLElement","isElement","regex","createWordRegex","createHighlightRegex","matchedText","escapedWords","word","escapeRegEx","join","RegExp","letterChars","highlightSupport","highlightText","highlightId","dispatcher","hasHighlight","blockText","searchTerm","searchText","createMarkerNode","highlightRange","removeHighlight","actualStartIndex","actualEndIndex","updateHighlight","addCssClass","removeCssClass","extractHighlightedRanges","findMarkersQuery","markers","_step3","groups","_iterator3","res","extractMarkerNodePosition","selectNode","textRange","nativeRange","cleanupStaleMarkerNodes","highlightType","_step4","_iterator4","markerMarkup","Selection","_Cursor","ReferenceError","create","_inherits","rangeToHtml","getClientRects","attrs","link","trimRange","textToTrim","search","lastNonWhitespace","_findStartExcludingWh2","_findEndExcludingWhit2","links","firstLink","unlink","textBefore","currentTextContent","markerNode","_ref3","_ref3$trim","customElem","toggle","_ref4","_ref4$trim","bold","em","chars","removeSurround","ancestorTag","containedTag","deleteContents","onlyVisible","RangeContainer","isAnythingSelected","getCursor","otherRangeContainer","other","SelectionWatcher","currentSelection","currentRange","_this$selection","successfulSync","syncSelection","getRangeAt","hostNode","getRangeContainer","forceCursor","newRangeContainer","isDifferentFrom","lastSelection","Keyboard","selectionWatcher","notifyCharacterEvent","keyCode","up","down","tab","shiftKey","esc","backspace","preventContenteditableBug","enter","ctrl","alt","ctrlKey","metaKey","getFreshRange","nodeToRemove","getNodeToRemove","selectionRange","startNodeElement","startNodeRange","testRange","containerRange","contentNodeTypes","firstContentNode","rangeStartingBeforeCurrentElement","delete","isValidQuotePairConfig","isDoubleQuote","isSingleQuote","isApostrophe","isSeparatorOrWhitespace","replaceQuote","quoteType","newText","newTextNode","replaceWith","Dispatcher","editable","editableSelector","keyboard","activeListeners","setup","getEditableBlockByEvent","evt","capture","addEventListener","setupKeyboardEvents","setupEventListeners","removeEventListener","suspended","setupElementListeners","setupKeydownListener","setupSelectionChangeListeners","setupSelectionChangeFallbackListeners","currentInput","setupDocumentListener","getFreshSelection","preventDefault","clipboardData","getData","_clipboard$paste","clipboard","innerText","retainVisibleSelection","searchValue","lastOccurrenceIndex","lastIndexOf","replaceLast","smartQuotes","isContentEditable","shouldApplySmartQuotes","_selection$range","setTimeout","cursorOffset","isCharSingleQuote","indexCharBefore","textArr","shouldBeClosingQuote","indexCharAfter","hasCharAfter","singleOpeningQuote","hasSingleOpeningQuote","closingQuote","shouldBeOpeningQuote","applySmartQuotes","direction","altKey","positionX","isAtFirstLine","stopPropagation","isAtLastLine","dispatchKeyEvent","dispatchSwitchEvent","isAtBeginning","isAtTextEnd","selectionDirty","suppressSelectionChanges","isAtEnd","selectionChanged","mouseMoveSelectionChanges","once","_this2","array","ListCache","entries","clear","set","__data__","size","has","freeSelf","objectProto","nativeObjectToString","symToStringTag","isOwn","tag","unmasked","result","uid","maskSrcKey","exec","keys","IE_PROTO","funcToString","reIsHostCtor","reIsNative","object","Hash","MapCache","Stack","LARGE_ARRAY_SIZE","iteratee","keysFunc","iterable","props","freeExports","freeModule","Buffer","allocUnsafe","Uint8Array","typedArray","isDeep","arrayBuffer","buffer","byteLength","byteOffset","objectCreate","proto","transform","arg","Ctor","propertyIsEnumerable","isBuffer","objectCtorString","typedArrayTags","freeProcess","process","nodeUtil","require","types","binding","nodeIsTypedArray","isTypedArray","objValue","reIsUint","inherited","isArr","isArg","isBuff","isType","skipIndexes","isProto","customizer","isNew","newValue","srcIndex","mergeFunc","stack","srcValue","stacked","isCommon","isTyped","copy","baseMerge","nativeMax","max","nativeNow","Date","now","count","lastCalled","stamp","remaining","otherArgs","thisArg","assigner","sources","guard","SpellcheckService","spellcheckService","condensedText","misspelledWords","characters","specialWhitespaceCharsRegex","WhitespaceHighlighting","prepareMatch","code","unicode","charCodeAt","description","MatchCollection","matches1","matches2","length1","length2","lastEndIndex","output","a1","i1","a2","i2","pickNext","mergeMatches","item1","item2","MonitoredHighlighting","configuration","spellcheckConfig","focusedEditableHost","currentlyCheckedEditableHost","timeout","_merge","checkOnInit","checkOnFocus","checkOnChange","throttle","removeOnCorrection","spellcheck","whitespace","spellcheckMarker","whitespaceMarker","whitespaceMarkerNode","spellcheckMarkerNode","setupListeners","onFocus","onBlur","onChange","onInit","highlight","editableHasChanged","removeHighlightsAtCursor","clearTimeout","timeoutId","_this3","check","isConnected","matchCollection","words","searchAllWords","addMatches","safeHighlightMatches","_this4","removeHighlights","elementAtCursor","trace","textNodesUnder","getTextNodeAndRelativeOffset","targetNode","textNodes","absOffset","cumulativeOffset","relativeOffset","moveLeft","rightLimit","currentOffset","floor","leftLimit","moveRight","ceil","createRangeAtCharacterOffset","_getTextNodeAndRelati","newRange","Editable","instanceConfig","behavior","defaultInstanceConfig","defaultBehavior","browserSpellcheck","assign","focus","blur","newline","_br$nextSibling","br","insertAfter","insert","newElement","newNode","merge","merger","appendTo","prependTo","empty","moveAtTextEnd","moveAtBeginning","move","currentElement","createCursorAtEnd","action","toggleBold","toggleEmphasis","createDefaultBehavior","flow","enable","targets","disable","setState","_ref$normalize","suspend","_step5","_iterator5","findHost","nextCursor","createCursor","inputElement","contentToAppend","contentToPrepend","nodeContainsRange","hightlightingConfig","highlighting","outerHTML","setupHighlighting","checkSpelling","raiseEvents","_ref3$type","_ref5","_ref6","handler","_len","_key","unload","_ref7","origCoordinates","_ref7$requiredOnFirst","requiredOnFirstLine","_ref7$requiredOnLastL","requiredOnLastLine","totalCharCount","acc","wasFound","distance","safety","finalDistance","binaryCursorSearch","globalConfig"],"sourceRoot":""}
|
|
1
|
+
{"version":3,"file":"dist/editable.js","mappings":"CAAA,SAA2CA,EAAMC,GAC1B,iBAAZC,SAA0C,iBAAXC,OACxCA,OAAOD,QAAUD,IACQ,mBAAXG,QAAyBA,OAAOC,IAC9CD,OAAO,GAAIH,GACe,iBAAZC,QACdA,QAAkB,SAAID,IAEtBD,EAAe,SAAIC,GACpB,CATD,CASGK,MAAM,I,mBCRT,IAAIC,EAAsB,CCA1BA,EAAwB,CAACL,EAASM,KACjC,IAAI,IAAIC,KAAOD,EACXD,EAAoBG,EAAEF,EAAYC,KAASF,EAAoBG,EAAER,EAASO,IAC5EE,OAAOC,eAAeV,EAASO,EAAK,CAAEI,YAAY,EAAMC,IAAKN,EAAWC,IAE1E,GCNDF,EAAoBQ,EAAI,WACvB,GAA0B,iBAAfC,WAAyB,OAAOA,WAC3C,IACC,OAAOC,MAAQ,IAAIC,SAAS,cAAb,EAChB,CAAE,MAAOC,GACR,GAAsB,iBAAXC,OAAqB,OAAOA,MACxC,CACA,CAPuB,GCAxBb,EAAoBG,EAAI,CAACW,EAAKC,IAAUX,OAAOY,UAAUC,eAAeC,KAAKJ,EAAKC,GCClFf,EAAoBmB,EAAKxB,IACH,oBAAXyB,QAA0BA,OAAOC,aAC1CjB,OAAOC,eAAeV,EAASyB,OAAOC,YAAa,CAAEC,MAAO,WAE7DlB,OAAOC,eAAeV,EAAS,aAAc,CAAE2B,OAAO,GAAO,E,ysCCC9D,SACEC,KAAK,EACLC,WAAW,EACXC,cAAe,cACfC,sBAAuB,uBACvBC,iBAAkB,2BAClBC,mCAAmC,EACnCC,WAAY,CACVC,KAAM,MACNC,KAAM,SACNC,QAAS,CAAC,EACVC,MAAM,GAERC,aAAc,CACZJ,KAAM,MACNC,KAAM,KACNC,QAAS,CAAC,EACVC,MAAM,GAERE,gBAAiB,CACfL,KAAM,MACNC,KAAM,IACNC,QAAS,CAAC,EACVC,MAAM,GAERG,WAAY,CACVN,KAAM,MACNC,KAAM,IACNC,QAAS,CAAC,EACVC,MAAM,GAIRI,gBAAiB,CAKfC,gBAAiB,CACf,EAAK,CACH,MAAQ,EACR,KAAO,EACP,QAAU,GAEZ,OAAU,CAAC,EACX,GAAM,CAAC,EACP,GAAM,CAAC,GAETC,yBAA0B,CACxB,GAAM,CAAC,GAOTC,mBAAoB,CAClB,EAAK,CAAC,SAIRC,kBAAmB,CACjB,EAAK,SACL,EAAK,MAIPC,gBAAiB,CAAC,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,IAAK,cAG3DC,mBAAoB,CAClB,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,MAAO,IAAK,MAAO,KAAM,aAC7D,UAAW,SAAU,SAAU,SAAU,KAAM,KAAM,KAAM,UAAW,QAAS,SAKjFC,oBAAqB,CAAC,QAAS,UAE/BC,2BAA2B,EAG3BC,cAAe,CAGb,ICvFS,SAASC,IACtB,IAAyB,IAArBC,EAAOxB,UAAX,CAEA,IAAMyB,EAA4B,IAArBC,UAAUC,OAAeD,UAAU,GAAKE,MAAMC,KAAKH,WAEhE,GAAKI,EAAAA,EAAOC,QAEZ,MAA6B,mBAAlBA,QAAQR,MAA6BQ,QAAQR,MAAME,QAE9DM,QAAQhC,IAAI0B,EAR0B,CASxC,CCdA,IAAMO,EAAWpD,OAAOY,UAAUwC,SAC5BC,EAAiB,CACrB,IAAK,QACL,IAAK,OACL,IAAK,OACL,IAAK,SACL,IAAK,SAIA,SAASC,EAAWC,GACzB,OAAOA,EAAKC,QAAQ,OAAQ,GAC9B,CAMO,SAAS3B,EAAM0B,GACpB,OAAOA,EAAKC,QAAQ,aAAc,GACpC,CAEO,SAASC,EAAU/C,GACxB,MAA8B,oBAAvB0C,EAAStC,KAAKJ,EACvB,CCrBO,IAAMgD,EAAc,EAEdC,EAAW,EAQXC,EAAuB,G,kqBCRpC,IACqBC,EAAY,WAK9B,O,EAHD,SAAAA,EAAaxE,EAAMyE,I,4FAAQC,CAAA,KAAAF,GACzBvD,KAAK0D,QAAU1D,KAAK2D,SAAW3D,KAAK4D,SAAW5D,KAAKjB,KAAOA,EAC3DiB,KAAK6D,aAAe7D,KAAKwD,GAAU,UACrC,G,EAAC,EAAAhE,IAEAkB,OAAOoD,SAAQlD,MAAhB,WACE,OAAOZ,IACT,GAAC,CAAAR,IAAA,kBAAAoB,MAED,WAEE,IADA,IAAImD,EACIA,EAAO/D,KAAKgE,WAClB,GAAID,EAAKE,WAAaZ,GAA0B,KAAdU,EAAKG,KAAa,OAAOH,CAE/D,GAAC,CAAAvE,IAAA,sBAAAoB,MAED,WAEE,IADA,IAAIuD,EACIA,EAAOnE,KAAKoE,eAClB,GAAID,EAAKF,WAAaZ,GAA0B,KAAdc,EAAKD,KAAa,OAAOC,CAE/D,GAAC,CAAA3E,IAAA,OAAAoB,MAED,WACE,IAAMA,EAAQZ,KAAK6D,eACnB,OAAOjD,EAAQ,CAACA,MAAAA,GAAS,CAACyD,MAAM,EAClC,GAAC,CAAA7E,IAAA,UAAAoB,MAED,WACE,IAAI0D,EAAItE,KAAK0D,QAAU1D,KAAK4D,SACxBW,EAAQvE,KAAK4D,cAAWY,EAC5B,GAAIxE,KAAK0D,QAKP,IAJAa,EAAQD,EAAEG,aAIuC,WAApCH,EAAEI,aAAa,iBAC1B1E,KAAK4D,SAAWW,OAEhB,KAAQD,IAAMtE,KAAKjB,QAAWiB,KAAK4D,SAAWU,EAAEK,cAC9CL,EAAIA,EAAEM,WAIZ,OAAO5E,KAAK0D,OACd,GAAC,CAAAlE,IAAA,cAAAoB,MAED,WACE,IAAI0D,EAAItE,KAAK0D,QAAU1D,KAAK2D,SACxBY,EAAQvE,KAAK2D,cAAWa,EAC5B,GAAIxE,KAAK0D,QAKP,IAJAa,EAAQD,EAAEO,YAIuC,WAApCP,EAAEI,aAAa,iBAC1B1E,KAAK2D,SAAWY,OAEhB,KAAQD,IAAMtE,KAAKjB,QAAWiB,KAAK2D,SAAWW,EAAEQ,kBAC9CR,EAAIA,EAAEM,WAIZ,OAAO5E,KAAK0D,OACd,GAAC,CAAAlE,IAAA,iBAAAoB,MAED,SAAgBmE,GACd/E,KAAK0D,QAAUqB,EACf/E,KAAK4D,cAAWY,EAChBxE,KAAK2D,cAAWa,EAEhB,IADA,IAAIF,EAAItE,KAAK0D,QACLY,IAAMtE,KAAKjB,QAAWiB,KAAK4D,SAAWU,EAAEK,cAC9CL,EAAIA,EAAEM,UAEV,M,6EAAC,CA5E8B,GCCpBI,EAAW,SAACC,EAAQC,GAC/B,MAAsB,iBAAXD,EAA4BvC,MAAMC,KAAKuC,EAASC,iBAAiBF,IACxEA,EAAOG,QAAgB,CAACH,GACxBvC,MAAM2C,QAAQJ,GAAgBA,EAE3BvC,MAAMC,KAAKsC,EACpB,EAOaK,EAAc,SAACL,EAAQC,GAClC,MAAsB,iBAAXD,EAA4BC,EAASK,cAAcN,GAC1DA,EAAOG,QAAgBH,EAEvBA,EAAO,GAAWA,EAAO,GACtBA,CACT,EAEaO,EAAgB,SAACC,GAAuB,IAC7CC,GAD+BlD,UAAAC,OAAA,QAAA+B,IAAAhC,UAAA,GAAAA,UAAA,GAAGrC,QACzB+E,SAASM,cAAc,OAEtC,OADAE,EAAGC,UAAYF,EACRC,EAAGE,iBACZ,EAWaC,EAAU,SAACC,EAAMC,GAE5B,GADKD,EAAKD,UAASC,EAAOA,EAAKlB,YAC3BkB,GAAQA,EAAKD,QAAS,OAAOC,EAAKD,QAAQE,EAChD,EAEaC,EAAc,WACzB,OAD6BxD,UAAAC,OAAA,QAAA+B,IAAAhC,UAAA,GAAAA,UAAA,GAAGrC,QACrB+E,SAASc,aACtB,EAEaC,EAAe,WAC1B,OAD8BzD,UAAAC,OAAA,QAAA+B,IAAAhC,UAAA,GAAAA,UAAA,GAAGrC,QACtB+E,SAASe,cACtB,EAEaC,EAAW,SAACC,EAAOC,EAAWC,GAyBzC,IAzBsE,IAwBlEC,EAvBEC,EAAQ,GAERC,GAHkDhE,UAAAC,OAAA,QAAA+B,IAAAhC,UAAA,GAAAA,UAAA,GAAGrC,QAGlC+E,SAASuB,mBAChCN,EAAMO,wBACNC,WAAWC,SACX,CACEC,WAAU,SAAEC,GACV,OACEX,EAAMY,eAAeD,IACrBV,EAAUY,SAASF,EAAK7C,WACxB6C,IAASX,EAAMO,wBAEW,mBAAfL,EACFA,EAAWS,GAAQH,WAAWM,cAAgBN,WAAWO,YAE3DP,WAAWM,cAEbN,WAAWO,WACpB,IAEF,GAIMZ,EAAcE,EAAa5C,YACjC2C,EAAMY,KAAKb,GAGb,OAAOC,CACT,EAoCaa,EAAsB,SAACjB,GAC9BA,EAAMkB,eAAeC,wBAAwBnB,EAAMoB,gBAAkBC,KAAKC,6BAC5EtB,EAAMuB,eAAevB,EAAMoB,cAGzBpB,EAAMoB,aAAaD,wBAAwBnB,EAAMkB,kBAAoBG,KAAKG,6BAC5ExB,EAAMyB,YAAYzB,EAAMkB,eAE5B,EASaQ,EAAmB,SAAC1B,EAAOW,GACtC,IAAMgB,EAAY5C,SAASc,cAC3B8B,EAAUC,mBAAmBjB,GAC7B,IAAMkB,EAAkB7B,EAAM8B,sBAAsBC,MAAMC,eAAgBL,GACpEM,EAAgBjC,EAAM8B,sBAAsBC,MAAMG,WAAYP,GACpE,OAAOE,GAAmB,GAAKI,GAAiB,CAClD,EAUME,EAAsB,SAACxB,GAC3B,OAAOA,IAASA,EAAK7C,WAAauD,KAAKe,WAAazB,EAAK7C,WAAauD,KAAKgB,aAC7E,EAEMC,EAAgB,SAAC3B,EAAM4B,GAC3B,OAAO5B,EAAK6B,UAAUD,EACxB,EAEaE,EAAkB,SAACzC,GAC9B,IAAMkB,EAAiBlB,EAAMkB,eACvBwB,EAAc1C,EAAM0C,YACpBtB,EAAepB,EAAMoB,aACrBuB,EAAY3C,EAAM2C,UAMxB,GAJIR,EAAoBf,IAAiBuB,EAAY,GAAKA,EAAYvB,EAAa9E,QACjFgG,EAAclB,EAAcuB,GAG1BR,EAAoBjB,IAAmBwB,EAAc,GAAKA,EAAcxB,EAAe5E,OAAQ,CACjG,IAAMsG,EAAoBN,EAAcpB,EAAgBwB,GACxD1C,EAAM6C,SAASD,EAAmB,EACpC,CACF,EAEaE,EAAmB,SAAC9C,EAAO+C,GACtC,IAAMC,EAAahD,EAAMiD,aACzBD,EAAWH,SAASE,EAAW,GAC/BC,EAAWE,OAAOlD,EAAMkB,eAAgBlB,EAAM0C,aAE9C,IAAMS,EAAYnD,EAAMrD,WAClByG,EAAQJ,EAAWrG,WAAWL,OAGpC,MAAO,CAAC8G,MAAAA,EAAOC,IAFHD,EAAQD,EAAU7G,OAEVQ,KAAMqG,EAC5B,EAEaG,EAAiB,SAACC,EAAQC,GACrC,OACED,EAAOrC,iBAAmBsC,EAAOtC,gBACjCqC,EAAOb,cAAgBc,EAAOd,aAC9Ba,EAAOnC,eAAiBoC,EAAOpC,cAC/BmC,EAAOZ,YAAca,EAAOb,SAEhC,EAmEO,SAASc,EAA4BC,GAA6D,IAA1D9K,EAAI8K,EAAJ9K,KAAMsI,EAAcwC,EAAdxC,eAAgBwB,EAAWgB,EAAXhB,YAAaiB,EAAoBD,EAApBC,qBAEhF,GADmBzC,EAAepD,WAAaZ,EAE7C,OAAOuG,EAA6B,CAClC7K,KAAAA,EACAsI,eAAgBA,EAAe0C,WAAWlB,GAC1CA,YAAa,EACbiB,qBAAAA,IAIJ,IAAME,EAAwBnB,EAAciB,EAC5C,GAAIzC,EAAe5E,OAASuH,EAC1B,MAAO,CAAC3C,EAAgB2C,GAI1B,IAAMlG,EAAW,IAAIP,EAAaxE,GAElC+E,EAASF,SAAWyD,EAEpBvD,EAASmG,kBAET,IAAMf,EAAYpF,EAASmG,kBAC3B,IAAKf,EAAW,CAEd,IAAMgB,EAAmBpG,EAASqG,sBAClC,MAAO,CAACD,EAAkBA,EAAiBzH,OAC7C,CAEA,OAAOmH,EAA6B,CAClC7K,KAAAA,EACAsI,eAAgB6B,EAChBL,YAAa,EACbiB,qBAAsBE,EAAwB3C,EAAe5E,QAEjE,CAEO,SAAS2H,EAA0BC,GAA0D,IAAvDtL,EAAIsL,EAAJtL,KAAMwI,EAAY8C,EAAZ9C,aAAcuB,EAASuB,EAATvB,UAAWwB,EAAqBD,EAArBC,sBAE1E,GADmB/C,EAAatD,WAAaZ,EAC5B,CACf,IAAMkH,GAAehD,EAAawC,WAAWjB,EAAY,GACnDI,EAAYqB,EACdhD,EAAawC,WAAWjB,GACxBvB,EAAawC,WAAWjB,EAAY,GACpCJ,EAAS,EAMb,OALK6B,IACH7B,EAASQ,EAAUjF,WAAaZ,EAC5B6F,EAAUzG,OACVyG,EAAUa,WAAWtH,QAEpB2H,EAA2B,CAChCrL,KAAAA,EACAwI,aAAc2B,EACdJ,UAAWJ,EACX4B,sBAAAA,GAEJ,CAEA,IAAME,EAAyB1B,EAAYwB,EAC3C,GAAIE,EAAyB,EAC3B,MAAO,CAACjD,EAAciD,GAIxB,IAAM1G,EAAW,IAAIP,EAAaxE,GAElC+E,EAASH,SAAW4D,EAEpBzD,EAASqG,sBAET,IAAMjB,EAAYpF,EAASqG,sBAC3B,OAAKjB,EAKEkB,EAA2B,CAChCrL,KAAAA,EACAwI,aAAc2B,EACdJ,UAAWI,EAAUzG,OACrB6H,sBAAuBA,EAAwBxB,IAPxC,CAAChF,EAASmG,kBAAmB,EASxC,C,sGCvUO,SAASQ,EAAS3D,GAEvB,OADAA,EAAQA,EAAK4D,OAAS5D,EAAK,GAAKA,EACzBjB,EAAQiB,EAAM,IAAF6D,OAAMrI,EAAOvB,eAClC,CASO,SAAS6J,EAAc9D,GAE5B,IADA,IAAI+D,EAAQ,EAC6B,QAAjC/D,EAAOA,EAAKhC,kBAA2B+F,IAC/C,OAAOA,CACT,CASO,SAASC,EAAQhE,GAAM,IACOiE,EADPC,E,64BAAAC,CACRnE,EAAKiD,YAAU,IAAnC,IAAAiB,EAAAE,MAAAH,EAAAC,EAAA1G,KAAAD,MAAqC,KAA1BE,EAAKwG,EAAAnK,MACd,GAAI2D,EAAMN,WAAaA,IAAsBkH,EAAe5G,GAC1D,OAAO,EAET,GAAIA,EAAMN,WAAaA,EACrB,OAAO,CAEX,CAAC,OAAAmH,GAAAJ,EAAA9K,EAAAkL,EAAA,SAAAJ,EAAAK,GAAA,CACD,OAAO,CACT,CAQO,SAASF,EAAgBrE,GAC9B,OAAOA,EAAK7C,WAAaA,IAAsB6C,EAAKwE,SACtD,CAQO,SAASC,EAAkBzE,GAChC,OAAOA,EAAK7C,WAAaA,GAAqD,IAAhCuH,EAAsB1E,EACtE,CAEO,SAAS2E,EAAa3E,GAC3B,OAAOA,EAAK7C,WAAaA,GAAyC,OAAjB6C,EAAK1B,OACxD,CAUO,SAASoG,EAAuB1F,GACrC,GAAIA,EAAK7B,WAAaA,EAAmB,OAAOyH,EAAiB5F,EAAKwF,WAAW7I,OAEjF,IAAIkJ,EAAa,EAOjB,OANAjJ,MAAMC,KAAKmD,EAAKiE,YAAY6B,UAAUC,OAAM,SAAC/E,EAAM+D,EAAOtE,GACxD,SAAIgF,EAAiBzE,KAAS2E,EAAY3E,KAE1C6E,EAAapF,EAAM9D,OAASoI,EACrB,GACT,IACOc,CACT,CAEO,SAASG,EAAmBC,EAAM7C,EAAWR,GAClD,GAAIQ,IAAc6C,EAAM,OAAOC,EAAc9C,EAAWR,GAExD,GAAIsD,EAAc9C,EAAWR,GAAS,CAGpC,IAAMuD,EAAiBrB,EAAa1B,GACpC,OAAO4C,EAAkBC,EAAM7C,EAAUtE,WAAYqH,EACvD,CAEA,OAAO,CACT,CAEO,SAASC,EAAaH,EAAM7C,EAAWR,GAC5C,GAAIQ,IAAc6C,EAAM,OAAOI,EAAYjD,EAAWR,GAEtD,GAAIyD,EAAYjD,EAAWR,GAAS,CAGlC,IAAMuD,EAAiBrB,EAAa1B,GAAa,EACjD,OAAOgD,EAAYH,EAAM7C,EAAUtE,WAAYqH,EACjD,CAEA,OAAO,CACT,CAEO,SAASD,EAAe9C,EAAWR,GACxC,OAAIQ,EAAUjF,WAAaA,EAAqC,IAAXyE,EAEjB,IAAhCQ,EAAUa,WAAWtH,QAGS,IAAhCyG,EAAUa,WAAWtH,QACrByG,EAAUzE,WAAWR,WAAaA,GACqB,WAAvDiF,EAAUzE,WAAWC,aAAa,kBAG7BwE,EAAUa,WAAWrB,KAAYQ,EAAUzE,UACpD,CAEO,SAAS0H,EAAajD,EAAWR,GACtC,OAAIQ,EAAUjF,WAAaA,EAA0ByE,IAAWQ,EAAUzG,OAEtC,IAAhCyG,EAAUa,WAAWtH,QAErBiG,EAAS,GAAUQ,EAAUa,WAAWrB,EAAS,KAAOQ,EAAUrE,SAGxE,CAEO,SAASuH,EAAiBL,EAAM7C,EAAWR,GAChD,GAAIQ,IAAc6C,EAAM,OAAOM,EAAgBnD,EAAWR,GAE1D,GAAI2D,EAAgBnD,EAAWR,GAAS,CAGtC,IAAMuD,EAAiBrB,EAAa1B,GAAa,EACjD,OAAOkD,EAAgBL,EAAM7C,EAAUtE,WAAYqH,EACrD,CAEA,OAAO,CACT,CAEO,SAASI,EAAiBnD,EAAWR,GAC1C,OAAIQ,EAAUjF,WAAaA,EAElByE,GADMgD,EAAiBxC,EAAUoC,WAClB7I,OAGY,IAAhCyG,EAAUa,WAAWtH,QAElBiG,GAAU8C,EAAsBtC,EACzC,CAEO,SAASoD,EAAYrH,EAAQsH,GAClC,IAAIC,EAAGC,EAAKC,EAEZ,GAAIzH,EAAOhB,WAAasI,EAAOtI,SAAU,OAAO,EAEhD,GAAIgB,EAAO0H,WAAaJ,EAAOI,SAAU,OAAO,EAEhD,IAAKH,EAAI,EAAGC,EAAMxH,EAAO2H,WAAWnK,OAAQ+J,EAAIC,EAAKD,IAEnD,GADAE,EAAOzH,EAAO2H,WAAWJ,GACrBD,EAAO7H,aAAagI,EAAKrL,QAAUqL,EAAK9L,MAAO,OAAO,EAG5D,OAAO,CACT,CASO,SAASiE,EAAWqE,GACzB,OAAOA,EAAUrE,UACbA,EAAUqE,EAAUrE,WACpBqE,CACN,CAKO,SAAS2D,EAAa3D,GAE3B,OADArG,QAAQiK,KAAK,qFACNjI,EAAUqE,EACnB,CAUO,SAAS6D,EAAmCC,GACjD,OAAOA,GACLA,EAAS/I,WAAaA,GACS,IAA/B+I,EAASjD,WAAWtH,MACxB,CAKO,SAASwK,EAAiB9M,EAAQ+M,GAGvC,QAFeA,EAAQC,cAAgBhN,EAAOiN,iBAAiBF,EAAS,KACjDG,SAErB,IAAK,SACL,IAAK,eACH,OAAO,EACT,QACE,OAAO,EAEb,CCxOA,IAAIC,EAAmB,EAGjBC,GAAiB,SAEvB,SAASC,GAA+BrH,EAAOsH,GAC7C,IAAMC,EAASvH,EAAMO,wBACrB,GAAwB,IAApBgH,EAAOzJ,SAAgB,OAAO,EAClC,IAAM0J,EAAgBF,EAAeG,cACrC,OAAOD,aAAa,EAAbA,EAAeC,iBAAkBF,CAC1C,CAEO,SAASG,GAA2B1H,EAAO2H,GAChD,IAAM5E,EAAY/C,EAAMO,wBAGnBwC,EAAU6E,eACb1L,EAAM,qCAKR,IAAM2L,EAAM9E,EAAU6E,cAAcE,YAAY/I,SAC1CgJ,EAAWF,EAAIxI,cAAc,QACnC0I,EAASC,GAAK,2BAAHxD,SAAgC2C,GAC3CY,EAASE,aAAa,gBAAiB,UACvCF,EAASG,MAAMC,WAAa,IAC5BJ,EAASG,MAAMhB,QAAU,OACzBa,EAASK,YAAYP,EAAIQ,eAAejB,KASxC,IAAMkB,EAA0BX,GAAWN,GAA8BrH,EAAOA,EAAMkB,gBAChFqH,GAA0BZ,GAAWN,GAA8BrH,EAAOA,EAAMoB,cACtF,GAAIkH,EAAyB,CAC3B,IAAME,EAAkBxI,EAAMkB,eAAeuG,cAC7Ce,EAAgBf,cAAcgB,aAAaV,EAAUS,EACvD,MAAO,GAAID,EAAwB,CACjC,IAAMG,EAAgB1I,EAAMoB,aAAaqG,cACzCiB,EAAcjB,cAAcgB,aAAaV,EAAUW,EAAclK,YACnE,KAAO,CAEL,IAAMmK,EAAgB3I,EAAMiD,aAC5B0F,EAAcC,SAASjB,GACvBgB,EAAcE,WAAWd,EAC3B,CAEA,OAAOA,CACT,CAEO,SAASe,GAAkBlD,EAAM5F,EAAO+I,EAAUpB,GACvD,IAAMI,EAAWiB,GAAUpD,EAAMmD,GACjC,IAAKhB,EAAU,OAAOrL,QAAQhC,IAAI,8DAClCsF,EAAM2H,EAAU,iBAAmB,gBAAgBI,GACnDA,EAASkB,QACX,CAEO,SAASC,GAAMlJ,GACpB,IAAImJ,EAAWC,EAASC,EA6BxB,OA1BIrJ,EAAMsJ,UAERH,EAAY,CACVJ,UAFFM,EAAQ3B,GAA0B1H,GAAO,IAEvBgI,GAChBsB,WAAW,IAGbD,EAAQ3B,GAA0B1H,GAAO,GAGzCmJ,EAAY,CACVI,eAHFH,EAAU1B,GAA0B1H,GAAO,IAGlBgI,GACvBwB,YAAaH,EAAMrB,GACnBsB,WAAW,IAKXtJ,EAAMsJ,WACRtJ,EAAMuB,eAAe8H,GACrBrJ,EAAM4I,UAAS,KAEf5I,EAAMyJ,aAAaJ,GACnBrJ,EAAM0J,cAAcN,IAGfD,CACT,CAEO,SAASQ,GAAS/D,EAAMuD,GAC7B,IAAIA,EAAUS,SAAd,CAEA,IAAM5J,EAAQH,IACd,GAAIsJ,EAAUG,UAAW,CACvB,IAAMvB,EAAWiB,GAAUpD,EAAMuD,EAAUJ,UAC3C,GAAIhB,EAAU,CACZA,EAASG,MAAMhB,QAAU,SACzB,IAAM2C,EAAe9B,EAASpJ,gBAG1BkL,GAAgBA,EAAa/L,WAAaA,GAC5CiK,EAASkB,SACTjJ,EAAM6C,SAASgH,EAAcA,EAAavN,UAE1C0D,EAAMuB,eAAewG,GACrB/H,EAAM4I,UAAS,GACfb,EAASkB,SAEb,MACEvM,QAAQhC,IAAI,6DAEhB,MACEoO,GAAiBlD,EAAM5F,EAAOmJ,EAAUI,eAAe,GACvDT,GAAiBlD,EAAM5F,EAAOmJ,EAAUK,aAAa,GAIvD,OADAvI,EAAoBjB,GACbA,CA3BuB,CA4BhC,CAEA,SAASgJ,GAAWpD,EAAMoC,GACxB,OAAOpC,EAAKxG,cAAc,IAADoF,OAAKwD,GAChC,C,y/BCjIA,SAAS8B,GAAclE,EAAM5F,EAAO+J,GAGlC,OAFA/J,EAAQgK,GAAsBhK,GAC9B+J,IACOC,GAAyBpE,EAAM5F,EACxC,CAEA,IAAMiK,GAAiB,UACjBC,GAA4B,UAC5BC,GAAwB,UAExBC,GAAuB,QACvBC,GAAoB,OACpBC,GAAqB,OAGpB,SAASC,GAAUxD,GAExByD,GAAczD,EAChB,CAOO,SAASyD,GAAezD,GAC7B,IAAMF,EAAW9H,SAAS0L,yBAG1BC,GAAkB3D,EAAS,cAG3B2D,GAAkB3D,EAAS,aAAY,IAEFnC,EAFEC,EAAAC,GAEpBiC,EAAQnD,YAAU,IAArC,IAAAiB,EAAAE,MAAAH,EAAAC,EAAA1G,KAAAD,MAAuC,KAA5ByC,EAAIiE,EAAAnK,MAEb,GAAsB,OAAlBkG,EAAK6F,UAAsB7F,EAAKgK,YAApC,CAEA,GAAIhK,EAAK7C,WAAaA,GAA0C,OAAlB6C,EAAK6F,SAAmB,CAEpE,IADA,IAAIoE,EAAUjK,EAC6B,QAAnCiK,EAAUA,EAAQpM,cACnBqM,EAAkBD,EAASjK,IADe,CACH,IAECmK,EAFDC,EAAAjG,GAEjB8F,EAAQhH,YAAU,IAA7C,IAAAmH,EAAAhG,MAAA+F,EAAAC,EAAA5M,KAAAD,MAA+C,KAApC8M,EAAYF,EAAArQ,MACrBkG,EAAKyH,YAAY4C,EAAaC,WAAU,GAC1C,CAAC,OAAAhG,GAAA8F,EAAAhR,EAAAkL,EAAA,SAAA8F,EAAA7F,GAAA,CAED0F,EAAQ3B,QACV,CAEAuB,GAAc7J,EAChB,CAEAkG,EAASuB,YAAYzH,EAAKsK,WAAU,GAjBqB,CAkB3D,CAAC,OAAAhG,GAAAJ,EAAA9K,EAAAkL,EAAA,SAAAJ,EAAAK,GAAA,CAED,KAAO6B,EAAQzI,YAAYyI,EAAQmE,YAAYnE,EAAQzI,YAEvDyI,EAAQqB,YAAYvB,EACtB,CAEO,SAASsE,GAAqBrO,GACnC,OAAOA,EAAKC,QAAQoN,GAAuB,IAC7C,CAMO,SAASiB,GAAgBrE,GAG9BA,EAAQvH,UAAY6L,GAAetE,GAAS,EAC9C,CAUO,SAASsE,GAAgBtE,EAASuE,GACvC,IAAMC,GAAaxE,EAAQjJ,WAAaA,EACpC0N,GAAuBzE,GACvBA,EAAQvH,WAETzC,QAAQmN,GAA2B,IACnCnN,QAAQkN,GAAgB,QAErBwB,EAAQ1M,SAASM,cAAc,OAUrC,OATAoM,EAAMjM,UAAY+L,EAClBG,GAAoBD,EAAOH,GAG3BZ,GAAkBe,EAAO,cAGzBf,GAAkBe,EAAO,aAElBA,EAAMjM,SACf,CAEO,SAASgM,GAAwBG,GACtC,IAAMC,EAAM7M,SAASM,cAAc,OAEnC,OADAuM,EAAIxD,YAAYuD,GACTC,EAAIpM,SACb,CAIO,SAASqM,GAA0BC,GACxC,IAAMC,EAAUhN,SAASM,cAAc,OACvC0M,EAAQvM,UAAYsM,EAGpB,IADA,IAAMjF,EAAW9H,SAAS0L,yBACnBsB,EAAQzN,YAAYuI,EAASuB,YAAY2D,EAAQzN,YACxD,OAAOuI,CACT,CAEO,SAASmF,GAAcrL,EAAMkH,GAClC,OAAOlH,EAAKiH,gBAAkBC,EAC1BA,EAAIoE,UAAUtL,GACdA,CACN,CAOO,SAASuL,GAAoBlM,GAIlC,IAHA,IACMuH,EADgBvH,EAAMmM,gBACCvI,WAAW,GAClCiD,EAAW9H,SAAS0L,yBACnBlD,EAAO3D,WAAWtH,QAAQuK,EAASuB,YAAYb,EAAO3D,WAAW,IACxE,OAAOiD,CACT,CAEA,SAAS6D,GAAmB/J,EAAM1F,GAKhC,IALwD,IAAAmR,EACpDzM,EADkC0M,IAAShQ,UAAAC,OAAA,QAAA+B,IAAAhC,UAAA,KAAAA,UAAA,GAKvCsD,EAAOgB,EAAK1F,IAClB,GAAI0E,EAAK7B,WAAaA,EAAmB,CAEvC,IAAIsM,GAAqBkC,KAAK3M,EAAKgL,aAC9B,MAD4ChK,EAAKuK,YAAYvL,EAEpE,KAAO,IAAsB,OAAlBA,EAAK6G,SAET,CAGD7G,EAAK1E,IAAOyP,GAAkB/K,EAAM1E,GAAM,GAC9C,KACF,CANE0E,EAAKsJ,QAMP,CAMGoD,IAEG,QAAJD,EADJzM,EAAOgB,EAAK1F,UACJ,IAAAmR,OAAA,EAAJA,EAAMtO,YAAaA,GAGnB3B,EAAOpB,oCACT4E,EAAKgL,YAAchL,EAAKgL,YAAY5N,QAAQ9B,EAAKsR,WAAW,QAAUjC,GAAqBD,GAAmB,IAElH,CAQO,SAASqB,GAAqBd,EAASU,GAC5C,KAAOV,GAAS,CACd,IAAMpM,EAAcoM,EAAQpM,YAE5B,GAAIoM,EAAQ9M,WAAaA,EAAzB,CAKA,IAAMyI,EAAOqE,EAAQrM,aAAa,iBAE9BqM,EAAQtM,YAAYoN,GAAoBd,EAAQtM,WAAYgN,IAEnD,WAAT/E,GAA+B,cAATA,IAAyB+E,IACjDV,EAAQ3B,UACK,WAAT1C,GAA+B,cAATA,IAAyB+E,IACnDkB,GAAO5B,GAGTA,EAAUpM,CAZV,MAFEoM,EAAUpM,CAed,CACF,CAGO,SAASiO,GAAS7G,EAAM5F,EAAOE,GACpC,IAAMwM,EAAYC,GAAa3M,EAAOE,GAChC0M,EAAeC,GAAgBjH,EAAM5F,EAAOE,GAClD,OAAOwM,EAAUlI,OAAOoI,EAC1B,CAGO,SAASC,GAAiBjH,EAAM5F,EAAOE,GAG5C,IAFA,IAAM4M,EAAO,GACTnM,EAAOX,EAAMO,wBACVI,IAASiF,GACT1F,IAAcA,EAAWS,IAAOmM,EAAK9L,KAAKL,GAC/CA,EAAOA,EAAKlC,WAGd,OAAOqO,CACT,CAEO,SAASC,GAAenH,EAAM5F,EAAOf,GAC1C,OAAOwN,GAAQ7G,EAAM5F,GAAO,SAACW,GAC3B,OAAOA,EAAK6F,SAASwG,gBAAkB/N,EAAQ+N,aACjD,GACF,CAEO,SAASC,GAA4BrH,EAAM5F,EAAOL,GACvD,OAAO8M,GAAQ7G,EAAM5F,GAAO,SAACW,GAC3B,OAAOA,EAAK6F,SAASwG,gBAAkBrN,EAAK6G,SAASwG,eACnDE,GAAkBvM,EAAK8F,WAAY9G,EAAK8G,WAC5C,GACF,CAEO,SAASyG,GAAmBC,EAAQC,GACzC,GAAID,EAAO7Q,SAAW8Q,EAAO9Q,OAAQ,OAAO,EAE5C,IAAK,IAAI+J,EAAI,EAAGA,EAAI8G,EAAO7Q,OAAQ+J,IAAK,CACtC,IAAME,EAAO6G,EAAOD,EAAO9G,GAAGnL,MAC9B,IAAMqL,GAAQA,EAAK9L,QAAU0S,EAAO9G,GAAG5L,MAAQ,OAAO,CACxD,CAEA,OAAO,CACT,CAGO,SAASkS,GAAc3M,EAAOE,GACnC,OAAOH,EAASC,EAAO,CAAClC,GAAuBoC,EACjD,CAGO,SAASmN,GAAkBrN,EAAOE,GACvC,OAAOH,EAASC,EAAO,CAAClC,GAAuBoC,GAC5CoN,QAAO,SAAA3N,GAAI,OAAI+B,EAAiB1B,EAAOL,EAAK,GACjD,CAMO,SAAS4N,KACd,OADmClR,UAAAC,OAAA,QAAA+B,IAAAhC,UAAA,GAAAA,UAAA,GAAG,IACtBmR,KAAI,SAACzG,GAAO,OAAKA,EAAQP,QAAQ,GACnD,CAEO,SAASiH,GAAc7H,EAAM5F,EAAOf,GACzC,OAAOwN,GAAQ7G,EAAM5F,GAClB0N,MAAK,SAAC/N,GAAI,OAAKA,EAAK6G,WAAavH,EAAQ+N,aAAa,GAC3D,CAGO,SAASpL,GAAoBmF,GAClC,IAAM/G,EAAQH,IAEd,OADAG,EAAM4B,mBAAmBmF,GAClB/G,CACT,CAYO,SAAS2N,GAAkB3N,EAAOL,EAAMiO,GAC7C,IAXwBrK,EAAQC,EAW1BqK,EAAYhO,IAGlB,GAFAgO,EAAUjM,mBAAmBjC,GAZG6D,EAcJqK,GAbyC,KAD7CtK,EAcHvD,GAbP8B,sBAAsBC,MAAM+L,aAActK,KACQ,IAA9DA,EAAO1B,sBAAsBC,MAAM+L,aAAcvK,GAYX,OAAO,EAE/C,IAAIJ,EAAYnD,EAAMrD,WAClBoR,GAAYpO,EAAK4E,OAAS5E,EAAK,GAAKA,GAAMgL,YAO9C,OALIiD,IACFzK,EAAYoC,EAAYpC,GACxB4K,EAAWxI,EAAYwI,IAGJ,KAAd5K,GAAoBA,IAAc4K,CAC3C,CAEO,SAASC,GAAUpI,EAAM5F,EAAOL,GAErC,OADAK,EAAM4B,mBAAmBjC,GAClBK,CACT,CAEO,SAASiO,GAAWrI,EAAM5F,EAAOL,GACtC,IAAMuO,EAAQjB,GAA2BrH,EAAM5F,EAAOL,GAEtD,OAAqB,IAAjBuO,EAAM5R,QACRqR,GAAiB3N,EAAOkO,EAAM,GAAI,WAC3BC,GAAqBvI,EAAM5F,EAAOL,GAGpCyO,GAAUxI,EAAM5F,EAAOL,EAChC,CAEO,SAAS0O,GAAarO,GAC3B,OAuKF,SAA8BA,GAC5B,IAAKA,IAAUA,EAAMkB,iBAAmBlB,EAAMoB,aAC5C,OAAO,EAGT,GAAIpB,EAAMkB,iBAAmBlB,EAAMoB,aAAc,OAAO,EAUxD,IAPA,IAIIjB,EAJExC,EApDR,SAA6B/E,GAC3B,IAAIuH,EAAcvH,EACdiR,EAAe,KA8BnB,MAAO,CACLjM,KA7BF,WACE,IAAKuC,EACH,OAAO,KAGT,GAAIA,EAAY7B,YAAcuL,IAAiB1J,EAAY7B,WACzDuL,EAAe1J,EACfA,EAAcA,EAAY7B,gBACrB,GAAI6B,EAAY3B,YACrBqL,EAAe1J,EACfA,EAAcA,EAAY3B,gBACrB,CAEL,IADA,IAAI+I,EAASpH,EAAY1B,WAClB8I,GAAUA,IAAW3O,GAAM,CAChC,GAAI2O,EAAO/I,YAAa,CACtBqL,EAAe1J,EAAcoH,EAAO/I,YACpC,KACF,CACA+I,EAASA,EAAO9I,UAClB,CACK8I,GAAUA,IAAW3O,IACxBiR,EAAe1J,EAAc,KAEjC,CAEA,OAAOA,CACT,EAKF,CAiBmBG,CAAmBN,EAAMO,yBAKtC+N,GAAoB,EAEhBnO,EAAcxC,EAASC,QAC7B,GAAIuC,EAAYrC,WAAauD,KAAKkN,eAC3BC,GAAqBrO,EAAaH,GAAQ,CAC7CsO,GAAoB,EACpB,KACF,CAIJ,OAAQA,CACV,CAhMSG,CAAoBzO,EAC7B,CAEO,SAASoO,GAAWxI,EAAM5F,EAAOL,GACtC,IAAI+O,EAAgB5E,GAAalE,EAAM5F,GAAO,WAC5C2O,GAAS/I,EAAM5F,EAAOL,EACxB,IAUA,OAPK0O,GAAYK,KACfA,EAAgB5E,GAAalE,EAAM8I,GAAe,WAChDE,GAAKhJ,EAAM8I,EACb,KAGFG,GAAKH,EAAe/O,GACb+O,CACT,CAEO,SAASG,GAAM7O,EAAOL,GACtB0O,GAAYrO,IAKG,iBAATL,IAAmBA,EAAON,EAAcM,IACnDK,EAAM8O,iBAAiBnP,IALrBjD,QAAQhC,IAAI,yCAMhB,CAEO,SAAS8R,GAAQ7M,GAGtB,IADA,IAAM4H,GADN5H,EAAOA,EAAK4E,OAAS5E,EAAK,GAAKA,GACXlB,WACbkB,EAAKrB,YAAYiJ,EAAOkB,aAAa9I,EAAKrB,WAAYqB,GAC7D4H,EAAO2D,YAAYvL,EACrB,CAEO,SAASwO,GAAsBvI,EAAM5F,EAAOL,GACjD,OAAOmK,GAAalE,EAAM5F,GAAO,WAC/B2O,GAAS/I,EAAM5F,EAAOL,EACxB,GACF,CAEO,SAASoP,GAAkBnJ,EAAM5F,EAAOJ,GAC7C,OAAOkK,GAAalE,EAAM5F,GAAO,WAC/B4O,GAAKhJ,EAAM5F,EAAOJ,EACpB,GACF,CAIO,SAASgP,GAAMhJ,EAAM5F,EAAOJ,GACjC6M,GAAQ7G,EAAM5F,GAAOgP,SAAQ,SAACrP,GACQ,OAAhCA,EAAK6G,SAASwG,eAA4BpN,IAAYD,EAAKsP,QAAQrP,IACrE4M,GAAO7M,EAEX,GACF,CAIO,SAASgP,GAAU/I,EAAM5F,EAAOW,GACrC8L,GAAQ7G,EAAM5F,GAAOgP,SAAQ,SAACrP,GACQ,OAAhCA,EAAK6G,SAASwG,iBAA4BrM,GACzChB,EAAK6G,SAASwG,gBAAkBrM,EAAK6F,SAASwG,eAC7CE,GAAkBvN,EAAK8G,WAAY9F,EAAK8F,cAC5C+F,GAAO7M,EAEX,GACF,CAIO,SAASuP,GAAiBlP,EAAOmP,EAAWxH,GACjD,IAAMyH,EAAWrQ,SAASsJ,eAAe8G,GACnCxG,EAAgB3I,EAAMiD,aAC5B0F,EAAcC,SAASjB,GACvBgB,EAAcE,WAAWuG,GACzBpP,EAAM2H,EAAU,iBAAmB,eAAeyH,GAClDnO,EAAoBjB,EACtB,CAKO,SAASqP,GAAUzJ,EAAM5F,EAAOsP,EAAgBC,GAGrD,OAFAL,GAAgBlP,EAAOuP,GAAgBD,GAAgB,GACvDJ,GAAgBlP,EAAOsP,GAAgB,GAChCtP,CACT,CAKO,SAASwP,GAAiB5J,EAAM5F,EAAOmP,GAC5C,IAAKM,GAAezP,EAAOmP,GAAY,OAAOnP,EAG1ChG,OAAO8F,eAAe4P,WAAa,GAAGjN,EAAgBzC,GAC1D,IAAM0O,EAAgB5E,GAAalE,EAAM5F,GAAO,WAC9CD,EAASC,EAAO,CAAClC,IAAoB,SAAC6C,GACpC,OAAOA,EAAKwE,UAAUwK,QAAQR,IAAc,CAC9C,IACGH,SAAQ,SAACrO,GACRA,EAAKwE,UAAYxE,EAAKwE,UAAUyK,WAAWT,EAAW,GACxD,GACJ,IAGA,OADAlO,EAAoByN,GACbA,CACT,CAEO,SAASe,GAAgBzP,EAAO6P,GACrC,OAAO7P,EAAMrD,WAAWgT,QAAQE,IAAQ,CAC1C,CAIO,SAASC,GAASlK,EAAM5F,EAAOf,GACpCwN,GAAQ7G,EAAM5F,GAAOgP,SAAQ,SAACrP,GACxBA,EAAK6G,SAASwG,gBAAkB/N,EAAQ+N,eAAeR,GAAO7M,EACpE,GACF,CAuCA,SAAS6O,GAAsB7N,EAAMX,GACnC,IAAM2B,EAAY5C,SAASc,cAE3B,OADA8B,EAAUC,mBAAmBjB,GACtBX,EAAM8B,sBAAsBC,MAAMC,eAAgBL,IAAc,GAChE3B,EAAM8B,sBAAsBC,MAAMG,WAAYP,IAAc,CACrE,CCzeA,IAAIoO,GAAc,EACZC,GAAQ,CAAC,EAEFpS,GAAOqS,GAAW,sBAClBzS,GAAWyS,GAAW,0BAE5B,SAASC,GAAMvQ,EAAI+D,GAA4C,IAAzCyM,EAASzM,EAATyM,UAAWC,EAAS1M,EAAT0M,UAAWC,EAAgB3M,EAAhB2M,kBA6B5C,SAAqB1Q,GACrBA,EAAK2Q,aAAa,mBACrB3Q,EAAKsI,aAAa,gBAAiB,MAAFzD,OAAQuL,KACzCA,IAAe,EAEnB,CAjCEQ,CAAW5Q,GAEXA,EAAKsI,aAAa,mBAAmB,GACrCtI,EAAKsI,aAAa,aAAcuI,QAAQH,IACxC1Q,EAAKsI,aAAa,iBAAkBuI,QAAQJ,IAE5CzQ,EAAK8Q,UAAUxH,OAAO9M,EAAOtB,uBAC7B8E,EAAK8Q,UAAUC,IAAIvU,EAAOvB,eAEtBuV,GAAWQ,GAAiBhR,EAClC,CAcO,SAASiR,GAAkBjR,GAChC,MAA+C,SAAxCA,EAAKpB,aAAa,iBAC3B,CA6BA,SAAS0R,GAAYhV,GACnB,OAAO,SAAU8L,GACf,IAAM6D,EAAU7D,EAAQ9L,GACxB,OAAO2P,GAAWA,EAAQrM,aAAa,mBACnCqM,EACA,IACN,CACF,C,uGCxEA,IA+BIiG,GCzBApV,GAAiBC,GAA0BC,GAAoBC,GAAmBE,GAAoBG,GACtGJ,GAAiBE,GDPf+U,GAAmB,CACvB,CAAC,IAAK,KACN,CAAC,IAAK,KACN,CAAC,IAAK,KACN,CAAC,IAAK,KACN,CAAC,IAAK,KACN,CAAC,IAAK,KACN,CAAC,IAAK,MAEFC,GAAmB,CACvB,CAAC,IAAK,KACN,CAAC,IAAK,KACN,CAAC,IAAK,KACN,CAAC,IAAK,KACN,CAAC,IAAK,KACN,CAAC,IAAD,KACA,CAAC,IAAD,MAGIC,GAAa,CACjB,IAAK,KAGDC,GAAc,+BAGdC,GAAqB,mBAIrBC,GAAoB,4BAGnB,SAASC,GAAkBvB,EAAKwB,IACrCR,GAAeQ,GAAsB,CAAC,GACzBC,OAAST,GAAaS,QAAU,MAACjT,OAAWA,GACzDwS,GAAaU,aAAeV,GAAaU,cAAgB,MAAClT,OAAWA,GAErE,IAAM4Q,EAqER,SAAuBY,GACrB,O,EAAWA,EAAI2B,SAASP,I,umBAAczD,KAAI,SAACiE,GACzC,IAAM/M,EAAQ+M,EAAM/M,MACpB,MAAO,CACLgN,KAAMD,EAAM,GACZE,OAAQjN,EAAQ,EAAImL,EAAInL,EAAQ,GAAK,GACrCkN,MAAQlN,EAAQ,EAAKmL,EAAIvT,OAASuT,EAAInL,EAAQ,GAAK,GAEvD,I,KACF,CA9EkBmN,CAAahC,GAC7B,OAAIZ,EAAQ3S,OAAS,GACnBwV,GAAqB7C,EAAS,GA8ElC,SAAgCY,EAAKZ,GACnC,IAAIvK,EAAQ,EACZ,OAAOmL,EAAI9S,QAAQkU,IAAa,SAACQ,GAC/B,IAAM7S,EAAcqQ,EAAQvK,GAAO3H,SAAWkS,EAAQvK,GAAM,KAE5D,OADAA,GAAS,EACF9F,CACT,GACF,CApFWmT,CAAsBlC,EAAKZ,IAG7BY,CACT,CAEA,SAASiC,GAAsB7C,EAAS+C,GAEtC,KAAOA,EAAW/C,EAAQ3S,QAAQ,CAChC,IAAM2V,EAAaC,GAAiBjD,EAAS+C,GAE7C,GAAIC,EAAY,CASd,GARAhD,EAAQ+C,GAAUjV,QAA8B,WAApBkV,EAAWhX,KACnC4V,GAAaS,OAAO,GACpBT,GAAaU,aAAa,GAE9BtC,EAAQgD,EAAWD,UAAUjV,QAA8B,WAApBkV,EAAWhX,KAC9C4V,GAAaS,OAAO,GACpBT,GAAaU,aAAa,GAE1BU,EAAWD,WAAaA,EAAW,EAAG,CACxC,IAAMG,EAAgBlD,EAAQmD,MAAMJ,EAAW,EAAGC,EAAWD,UACzDG,GACFL,GAAqBK,EAAe,EAExC,CAEAH,EAAWC,EAAWD,SAAW,CACnC,MACE/C,EAAQ+C,GAAUjV,QAAUsV,GAAkBpD,EAAQ+C,GAAS,MAC/DA,GAAY,CAEhB,CACF,CAEA,SAASE,GAAkBjD,EAAS+C,GAClC,GAAIA,IAAa/C,EAAQ3S,OAAS,EAAlC,CACA,IAAMiB,EAAU0R,EAAQ+C,GAClBM,EAAe/U,EAAO,KAE5B,IAAIA,EAAQoU,QAAWT,GAAmB5E,KAAK/O,EAAQoU,QAIvD,IAFA,IAAMY,EAA8BC,GAAyBF,EAAcvB,IACrE0B,EAA8BD,GAAyBF,EAAcxB,IAClEzK,EAAI2L,EAAW,EAAG3L,EAAI4I,EAAQ3S,OAAQ+J,IAC7C,GAAK4I,EAAQ5I,GAAGuL,OAAST,GAAkB7E,KAAK2C,EAAQ5I,GAAGuL,SAAY3C,EAAQ5I,GAAGuL,MAAO,CACvF,GAAIW,EAA4B1R,SAASoO,EAAQ5I,GAAE,MACjD,MAAO,CAAC2L,SAAU3L,EAAGpL,KAAM,UAE7B,GAAIwX,EAA4B5R,SAASoO,EAAQ5I,GAAE,MACjD,MAAO,CAAC2L,SAAU3L,EAAGpL,KAAM,SAE/B,CAhByC,CAkB7C,CAEA,SAASuX,GAA0BF,EAAcI,GAC/C,OAAOA,EAAMpF,QAAO,SAAAqF,GAAS,OAAIA,EAAU,KAAOL,CAAY,IAAE9E,KAAI,SAACmF,GAAS,OAAKA,EAAU,EAAE,GACjG,CAEA,SAASN,GAAmBO,GAC1B,GAAI5B,GAAWnQ,SAAS+R,GACtB,OAAO/B,GAAaG,UAExB,CCjGA,IAEIhV,GAFE6W,GAAiB,QACjBC,GAAmB,uBAIlB,SAASC,GAAcC,GAC5B,IAAMC,EAAQD,EAAKxX,gBACnBC,GAAkBwX,EAAMxX,iBAAmB,CAAC,EAC5CC,GAA2BuX,EAAMvX,0BAA4B,CAAC,EAC9DC,GAAqBsX,EAAMtX,oBAAsB,CAAC,EAClDC,GAAoBqX,EAAMrX,mBAAqB,CAAC,EAChDG,GAAsBkX,EAAMlX,qBAAuB,GACnDC,GAA4BiX,EAAMjX,4BAA6B,EAC/DC,GAAgBgX,EAAMhX,eAAiB,CAAC,EAExCH,GAAqB,CAAC,EACtBmX,EAAMnX,mBAAmBkT,SAAQ,SAAC9T,GAAWY,GAAmBZ,IAAQ,CAAK,IAC7EW,GAAkB,CAAC,EACnBoX,EAAMpX,gBAAgBmT,SAAQ,SAAC9T,GAAWW,GAAgBX,IAAQ,CAAK,GACzE,CAEO,SAASgY,GAAOC,EAAOC,EAAQC,GACpC,IAAMtU,EAAWoU,EAAMvL,cACvBuL,EAAMlL,aAAa9L,EAAOrB,kBAAkB,GAExCsY,EAAOE,cACTF,EAASA,EAAOG,6BACbC,sBACAC,iBAIL,IAAMC,EAAc3U,EAASM,cAAc,OAC3CqU,EAAYlU,UAAY6T,EAExB,IACMM,EAgBD,SAAuB5M,GAAmC,IAAF6M,GAAEvX,UAAAC,OAAA,QAAA+B,IAAAhC,UAAA,GAAAA,UAAA,GAAJ,CAAC,GAAtB+T,UAAAA,OAAS,IAAAwD,GAAQA,EAOvD,OAAOC,GAAmB9M,EANV,CACdtL,gBAAiB2U,EAAY1U,GAA2BD,GACxDO,2BAA2BoU,GAAoBpU,KAM9C8X,MAAMhB,IACNtF,KAAI,SAACuG,GAAK,OAAKxO,GAyFOsK,EAzFsCkE,EA0F3D9X,GAAcqV,QAAUrV,GAAcsV,cAAgBtV,GAAc+U,WAC/DM,GAAwBzB,EAAK5T,IAG/B4T,GAbJ9S,QAAQ,MAAO,KACfA,QAAQ,SAAU,KAClBA,QAAQ,cAAc,SAAC0U,EAAOuC,GAAK,OAAKA,GAAS,WAAW1H,KAAK0H,GAC9D,IACA,IACH,KAGL,IAA2BnE,CAzF8C,IACpEvC,QAAO,SAACyG,GAAK,OAAMlB,GAAevG,KAAKyH,EAAM,GAClD,CA5BiBE,CAAaP,EAAa,CAACtD,UADtBQ,GAAiBuC,KAIrC,OADAA,EAAMe,gBAAgB/X,EAAOrB,kBACtB,CAAC6Y,OAAAA,EAAQP,OAAAA,EAClB,CA0BA,SAASS,GAAoBlU,EAAMwU,GACjC,OAAO5X,MAAMC,KAAKmD,EAAKiE,YAAYwQ,QAAO,SAACzD,EAASvS,GAClD,IAAmE,IAA/DrC,GAAoB4T,QAAQvR,EAAMoI,SAAS6N,eAC7C,MAAO,GAIT,GAAIF,EAAQnY,2BAAgD,MAAnBoC,EAAMoI,UAAoBpI,EAAMkW,KAAM,CAC7E,IAAMC,EAAoBnW,EAAMG,aAAa,QAAQxB,QAAQ/C,OAAOwa,SAASC,OAAQ,IACrFrW,EAAM6J,aAAa,OAAQsM,EAC7B,CAEA,OAAInW,EAAMN,WAAaA,EAEd6S,EASb,SAA8BvS,EAAOuS,EAASwD,GAC5C,IAAI3N,EAAWpI,EAAMoI,SAAS6N,cAG9B,GA4CF,SAAyB7N,EAAU7F,EAAMwT,GACvC,OAAOA,EAAQ1Y,gBAAgB+K,IARjC,SAAgCA,EAAU7F,GACxC,IAAM+T,EAAgB/Y,GAAmB6K,GACzC,OAAKkO,IAEGA,EAAchH,MAAK,SAACxS,GAAI,OAAMyF,EAAKpC,aAAarD,EAAK,GAC/D,CAG8CyZ,CAAsBnO,EAAU7F,EAC9E,CA9CMiU,CAFJpO,EAmCF,SAA4BA,GAC1B,OAAO5K,GAAkB4K,IAAaA,CACxC,CArCaqO,CAAkBrO,GAEApI,EAAO+V,GAAU,CAC5C,IAAM1N,EAuBV,SAA2BD,EAAU7F,GACnC,OAAOpE,MAAMC,KAAKmE,EAAK8F,YAAY2N,QAAO,SAAC3N,EAAUvC,GAAoB,IAAA4Q,EAAjB5Z,EAAIgJ,EAAJhJ,KAAMT,EAAKyJ,EAALzJ,MAC5D,OAA6B,QAAzBqa,EAAArZ,GAAgB+K,UAAS,IAAAsO,GAAzBA,EAA4B5Z,IAAST,EAChC,GAAP+J,OAAUiC,EAAU,KAAAjC,OAAItJ,EAAI,MAAAsJ,OAAK/J,EAAK,KAEjCgM,CACT,GAAG,GACL,CA9BuBsO,CAAiBvO,EAAUpI,GAE9C,MAAiB,OAAboI,EAA0B,IAAPhC,OAAWgC,EAAWC,EAAU,KAElDoM,GAAevG,KAAKqE,GAIlBA,EAHE,IAAPnM,OAAWgC,EAAWC,EAAU,KAAAjC,OAAImM,EAAO,MAAAnM,OAAKgC,EAAQ,IAI5D,CAEA,OAAI3K,GAAgB2K,GACXsM,GAAmBnC,EAAUmC,GAKlChX,GAAmB0K,GAAkB,GAAPhC,OAAUmM,EAAO,KAE5CA,CACT,CAlCuBqE,CAAoB5W,EADhByV,GAAmBzV,EAAO+V,GACWA,GAIxD/V,EAAMN,WAAaA,EAA0B6S,EAA4BvS,EAAM+G,UT3C5EpI,QAAoC,UAAU,SAAUkY,GAC/D,OAAOrY,EAAeqY,EACxB,IS0CStE,CACT,GAAG,GACL,CAnFAoC,GAAa5W,GCJyB4C,SAASmW,gBAAgBC,gBAAxD,IAMDC,GAAU,2BAA2B9I,KAAKtS,OAAOqb,UAAUC,WAC3DC,GAAW,kBAAkBjJ,KAAKtS,OAAOqb,UAAUC,WACnDE,IAAUJ,IAAWG,GAsBdE,GAf2B,SAAC1W,GACvC,IAAM8I,EAAM9I,EACN2W,EAAM7N,EAAI8N,kBAChB,QAAYtX,IAARqX,EACF,IAEE,OADA7N,EAAI8N,kBAAoB,EACS,OAA1B9N,EAAI8N,iBACb,CAAE,MAAO5b,GACT,CAAE,QACA8N,EAAI8N,kBAAoBD,CAC1B,CAEF,OAAO,CACT,CAE+BE,CAAgC7W,UAGlD8W,KAA2BL,GCbzB,SAASM,GAAW7b,EAAK8b,GACtC,IAAMC,EAMR,SAA6BD,GAC3B,IAAIE,EAAY,CAAC,EAEjB,SAASC,EAAaF,EAAQG,GAC5BH,EAAOlC,MAAM,KAAK9E,SAAQ,SAAAoH,GACxBH,EAAUG,GAASH,EAAUG,IAAU,GACvCH,EAAUG,GAAOC,QAAQF,EAC3B,GACF,CAaA,MAAO,CACLG,GAAE,SAAEF,EAAOD,GACT,GAAyB,IAArB9Z,UAAUC,OACZ4Z,EAAYE,EAAOD,QACd,GAAyB,IAArB9Z,UAAUC,OACnB,IAAK,IAAMia,KAAaH,EAAOF,EAAYK,EAAWH,EAAMG,IAE9D,OAAO1c,IACT,EAEA2c,IAAG,SAAEJ,EAAOD,GACe,IAArB9Z,UAAUC,OAtBlB,SAAyB8Z,EAAOD,GAC9B,IAAMM,EAAiBR,EAAUG,GACjC,GAAKK,EAAL,CAEA,IAAM/R,EAAQ+R,EAAe9G,QAAQwG,GACjCzR,EAAQ,GAEZ+R,EAAeC,OAAOhS,EAAO,EALF,CAM7B,CAeMiS,CAAeP,EAAOD,GACQ,IAArB9Z,UAAUC,OACnB2Z,EAAUG,GAAS,GAEnBH,EAAY,CAAC,CAEjB,EAEAW,OAAM,SAAEC,EAAST,GACf,IAAMha,EAAOG,MAAMC,KAAKH,WAEpB0Z,GACFK,EAAQS,EACRA,EAAUd,EACV3Z,EAAKsa,OAAO,EAAG,IAEfta,EAAKsa,OAAO,EAAG,GAGb7c,KAAKid,eAEHV,IADcvc,KAAKid,cAAcd,OAAOe,UACnBld,KAAKid,mBAAgBzY,GAGhD,IAAMoY,EAAiBR,EAAUG,GAC5BK,GAILA,EAAe/Q,OAAM,SAACyQ,GAAQ,OAAuC,IAAlCA,EAASa,MAAMH,EAASza,EAAe,GAC5E,EAEJ,CAvEiB6a,CAAmBlB,GAClC9b,EAAIqc,GAAKN,EAAOM,GAChBrc,EAAIuc,IAAMR,EAAOQ,IACjBvc,EAAI2c,OAASZ,EAAOY,MACtB,CChCA,SAASM,GAAmBC,GAG1B,MAAO,CAACC,OAFuB/Y,IAApB8Y,EAAIE,YAA6BF,EAAIE,aAAeF,EAAIpY,SAASmW,iBAAmBiC,EAAIpY,SAASuY,KAAK7Y,YAAc0Y,EAAIpY,SAASuY,MAAMC,WAEvIC,OADoBnZ,IAApB8Y,EAAIM,YAA6BN,EAAIM,aAAeN,EAAIpY,SAASmW,iBAAmBiC,EAAIpY,SAASuY,KAAK7Y,YAAc0Y,EAAIpY,SAASuY,MAAMI,UAEpJ,C,2qBCKA,IAOqBC,GAAM,WAYzB,SAAAA,EAAaC,EAAc5X,I,4FAAO1C,CAAA,KAAAqa,GAChC9d,KAAKge,QAAQD,GACb/d,KAAKmG,MAAQA,EACbnG,KAAKie,UAAW,CAClB,CAOA,O,EAAAH,E,EAAA,EAAAte,IAAA,UAAAoB,MACA,SAASyF,GACP,OAAOyQ,GAAgB9W,KAAK+L,KAAM/L,KAAKmG,MAAOE,EAChD,GAOA,CAAA7G,IAAA,cAAAoB,MACA,SAAayF,GACX,OAAOyQ,GAAoB9W,KAAK4S,QAAQvM,GAC1C,GAMA,CAAA7G,IAAA,gBAAAoB,MACA,SAAewE,GACb,OAAO0R,GAAsB9W,KAAK+L,KAAM/L,KAAKmG,MAAOf,EACtD,GAEA,CAAA5F,IAAA,eAAAoB,MACA,SAAcyF,GACZ,OAAOyQ,GAAqB9W,KAAKmG,MAAOE,EAC1C,GAEA,CAAA7G,IAAA,mBAAAoB,MACA,SAAkByF,GAChB,OAAOyQ,GAAyB9W,KAAKmG,MAAOE,EAC9C,GAEA,CAAA7G,IAAA,kBAAAoB,MACA,SAAiByF,GACf,OAAOyQ,GAAwB9W,KAAK+L,KAAM/L,KAAKmG,MAAOE,EACxD,GAAC,CAAA7G,IAAA,UAAAoB,MAED,WACE,OAAOoQ,EACLhR,KAAK+L,KACL/L,KAAKmG,MAAMoB,aACXvH,KAAKmG,MAAM2C,UAEf,GAAC,CAAAtJ,IAAA,cAAAoB,MAED,WACE,OAAOoQ,EACLhR,KAAK+L,KACL/L,KAAKmG,MAAMoB,aACXvH,KAAKmG,MAAM2C,UAEf,GAAC,CAAAtJ,IAAA,eAAAoB,MAED,WACE,IAAMsd,EAAYle,KAAKsd,IAAIpY,SAASc,cACpCkY,EAAUnW,mBAAmB/H,KAAK+L,MAClCmS,EAAUnP,UAAS,GACnB,IAAMoP,EAAaC,GAA2BF,EAAWle,KAAKsd,KACxDe,EAAeD,GAA2Bpe,KAAKmG,MAAOnG,KAAKsd,KACjE,OAAOgB,GAAUH,EAAWI,OAAQF,EAAaE,OACnD,GAAC,CAAA/e,IAAA,gBAAAoB,MAED,WACE,IAAMsd,EAAYle,KAAKsd,IAAIpY,SAASc,cACpCkY,EAAUnW,mBAAmB/H,KAAK+L,MAClCmS,EAAUnP,UAAS,GACnB,IAAMoP,EAAaC,GAA2BF,EAAWle,KAAKsd,KACxDe,EAAeD,GAA2Bpe,KAAKmG,MAAOnG,KAAKsd,KACjE,OAAOgB,GAAUH,EAAWK,IAAKH,EAAaG,IAChD,GAAC,CAAAhf,IAAA,gBAAAoB,MAED,WACE,OAAOoQ,EACLhR,KAAK+L,KACL/L,KAAKmG,MAAMkB,eACXrH,KAAKmG,MAAM0C,YAEf,GAIA,CAAArJ,IAAA,eAAAoB,MACA,SAAcsM,GAEZ,GADIxB,EAAgBwB,KAAUA,EAAU4J,GAAiC5J,KACrE8D,EAAyC9D,GAA7C,CAIA,IAAIuR,EAFJvR,EAAUlN,KAAKmS,aAAajF,GAG5B,GAAIA,EAAQjJ,WAAaX,EAAsB,CAC7C,IAAMob,EAAYxR,EAAQnD,WAAWtH,OAAS,EAC9Cgc,EAAoBvR,EAAQnD,WAAW2U,EACzC,CAEA1e,KAAKmG,MAAM6I,WAAW9B,GACtBlN,KAAKmG,MAAM0J,cAAc4O,GACzBze,KAAKmG,MAAMyB,YAAY6W,GACvBze,KAAK+L,KAAKuK,WAbmD,CAc/D,GAIA,CAAA9W,IAAA,cAAAoB,MACA,SAAasM,GAEX,GADIxB,EAAgBwB,KAAUA,EAAU4J,GAAiC5J,KACrE8D,EAAyC9D,GAA7C,CAEAA,EAAUlN,KAAKmS,aAAajF,GAE5B,IAAM6K,EAAQ/X,KAAKmG,MAAMiD,aACzB2O,EAAM/O,SAAS+O,EAAMxQ,aAAcwQ,EAAMjP,WACzCiP,EAAMhJ,UAAS,GACfgJ,EAAM/I,WAAW9B,GACjBlN,KAAK+L,KAAKuK,WARmD,CAS/D,GAEA,CAAA9W,IAAA,eAAAoB,MACA,WACEZ,KAAK2e,qBACP,GAAC,CAAAnf,IAAA,sBAAAoB,MAED,WACE,GAAIZ,KAAKsd,IAAIpY,SAAS0Z,gBAAkB5e,KAAK+L,KAAM,CACjD,IAAA8S,EAAeC,GAA2B9e,KAAKsd,KAAxCC,EAACsB,EAADtB,EAAGI,EAACkB,EAADlB,EACV3d,KAAKsd,IAAIyB,SAASxB,EAAGI,EACvB,CAEA,IAAMqB,EAAY/Y,EAAajG,KAAKsd,KACpC0B,EAAUC,kBACVD,EAAUE,SAASlf,KAAKmG,MAC1B,GAQA,CAAA3G,IAAA,SAAAoB,MACA,WACE,IAAMuF,EAAQnG,KAAKmG,MAAMiD,aAGzB,OAFAjD,EAAM4I,UAAS,GACf5I,EAAMuB,eAAe1H,KAAK+L,MACnB+K,GAA2B3Q,EACpC,GAAC,CAAA3G,IAAA,aAAAoB,MAED,WACE,IAAMuF,EAAQnG,KAAKmG,MAAMiD,aAGzB,OAFAjD,EAAM4I,UAAS,GACf5I,EAAMuB,eAAe1H,KAAK+L,MACnB5F,EAAMrD,UACf,GAEA,CAAAtD,IAAA,aAAAoB,MACA,WACE,OAAOkW,GAA+B9W,KAAK8X,SAC7C,GAQA,CAAAtY,IAAA,QAAAoB,MACA,WACE,IAAMuF,EAAQnG,KAAKmG,MAAMiD,aAGzB,OAFAjD,EAAM4I,UAAS,GACf5I,EAAMyB,YAAY5H,KAAK+L,MAChB+K,GAA2B3Q,EACpC,GAAC,CAAA3G,IAAA,YAAAoB,MAED,WACE,IAAMuF,EAAQnG,KAAKmG,MAAMiD,aAGzB,OAFAjD,EAAM4I,UAAS,GACf5I,EAAMyB,YAAY5H,KAAK+L,MAChB5F,EAAMrD,UACf,GAEA,CAAAtD,IAAA,YAAAoB,MACA,WACE,OAAOkW,GAA+B9W,KAAK+X,QAC7C,GAAC,CAAAvY,IAAA,wBAAAoB,MAED,WACE,OAAOZ,KAAKmG,MAAMgZ,uBACpB,GAIA,CAAA3f,IAAA,iBAAAoB,MACA,WAA0C,IAA1Bwe,EAAW5c,UAAAC,OAAA,QAAA+B,IAAAhC,UAAA,GAAAA,UAAA,GAAG,WACtB6c,EAASrf,KAAKmG,MAAMgZ,wBAC1B,GAAoB,UAAhBC,EAAyB,OAAOC,EAGpC,IAAAC,EAAeR,GAA2B9e,KAAKsd,KAAxCC,EAAC+B,EAAD/B,EAAGI,EAAC2B,EAAD3B,EACV,MAAO,CACLa,IAAKa,EAAOb,IAAMb,EAClBY,OAAQc,EAAOd,OAASZ,EACxB4B,KAAMF,EAAOE,KAAOhC,EACpBiC,MAAOH,EAAOG,MAAQjC,EACtBkC,OAAQJ,EAAOI,OACfC,MAAOL,EAAOK,MAElB,GAAC,CAAAlgB,IAAA,aAAAoB,MAED,SAAYsM,GAIV,GAHAlN,KAAK2f,WAAWzS,GAChBlN,KAAKmG,MAAMuB,eAAewF,GAC1BlN,KAAKmG,MAAMyJ,aAAa1C,GACpBlN,KAAKyZ,YAAa,OAAO,IAAIqE,EAAO9d,KAAK+L,KAAM/L,KAAKmG,MAC1D,GAAC,CAAA3G,IAAA,YAAAoB,MAED,SAAWsM,GAIT,GAHAlN,KAAK2f,WAAWzS,GAChBlN,KAAKmG,MAAM0J,cAAc3C,GACzBlN,KAAKmG,MAAMyB,YAAYsF,GACnBlN,KAAKyZ,YAAa,OAAO,IAAIqE,EAAO9d,KAAK+L,KAAM/L,KAAKmG,MAC1D,GAEA,CAAA3G,IAAA,kBAAAoB,MACA,WAAsC,IAArBsM,EAAO1K,UAAAC,OAAA,QAAA+B,IAAAhC,UAAA,GAAAA,UAAA,GAAGxC,KAAK+L,KAI9B,GAHA/L,KAAK2f,WAAWzS,GAChBlN,KAAKmG,MAAM4B,mBAAmBmF,GAC9BlN,KAAKmG,MAAM4I,UAAS,GAChB/O,KAAKyZ,YAAa,OAAO,IAAIqE,EAAO9d,KAAK+L,KAAM/L,KAAKmG,MAC1D,GAEA,CAAA3G,IAAA,YAAAoB,MACA,WAAgC,IAArBsM,EAAO1K,UAAAC,OAAA,QAAA+B,IAAAhC,UAAA,GAAAA,UAAA,GAAGxC,KAAK+L,KAIxB,GAHA/L,KAAK2f,WAAWzS,GAChBlN,KAAKmG,MAAM4B,mBAAmBmF,GAC9BlN,KAAKmG,MAAM4I,UAAS,GAChB/O,KAAKyZ,YAAa,OAAO,IAAIqE,EAAO9d,KAAK+L,KAAM/L,KAAKmG,MAC1D,GAEA,CAAA3G,IAAA,gBAAAoB,MACA,SAAesM,GACb,OAAOlN,KAAK4f,UAAU5O,EAAiB9D,GACzC,GAAC,CAAA1N,IAAA,UAAAoB,MAED,SAASsM,GACHA,EAAQxC,SAAQwC,EAAUA,EAAQ,IACtClN,KAAK+L,KAAOmB,EACZlN,KAAKsd,IAAOpQ,QAA6C/M,OAAS+M,EAAQa,cAAcE,WAC1F,GAAC,CAAAzO,IAAA,aAAAoB,MAED,SAAYsM,GACV,IAAMnB,EAAOiF,EAAe9D,GACvBnB,GAAM1J,EAAM,mDACjBrC,KAAKge,QAAQjS,EACf,GAAC,CAAAvM,IAAA,yBAAAoB,MAED,SAAwBif,GACtB7f,KAAKqP,OACLwQ,IACA7f,KAAK8P,UACL9P,KAAK2e,qBACP,GAAC,CAAAnf,IAAA,OAAAoB,MAED,WACEZ,KAAK8f,eAAiB3P,GAAsBnQ,KAAKmG,OACjDnG,KAAK8f,eAAe/T,KAAO/L,KAAK+L,IAClC,GAAC,CAAAvM,IAAA,UAAAoB,MAED,WACOZ,KAAK8f,gBAAgBzd,EAAM,+BAEhCrC,KAAK+L,KAAO/L,KAAK8f,eAAe/T,KAChC/L,KAAKmG,MAAQgK,GAAyBnQ,KAAK+L,KAAM/L,KAAK8f,gBACtD9f,KAAK8f,oBAAiBtb,CACxB,GAAC,CAAAhF,IAAA,SAAAoB,MAED,SAAQ2Y,GACN,SAAKA,GAEAA,EAAOxN,MACPwN,EAAOxN,KAAKgU,YAAY/f,KAAK+L,OAE7BwN,EAAOpT,OACPsD,EAAe8P,EAAOpT,MAAOnG,KAAKmG,OAGzC,GAGA,CAAA3G,IAAA,gBAAAoB,MACA,SAAewE,GAA0B,IAAjBwH,EAAUpK,UAAAC,OAAA,QAAA+B,IAAAhC,UAAA,GAAAA,UAAA,GAAG,CAAC,EAC9B0K,EAAUlN,KAAKsd,IAAIpY,SAASM,cAAcJ,GAChD,IAAK,IAAM4a,KAAiBpT,EAAY,CACtC,IAAMqT,EAAiBrT,EAAWoT,GAClC9S,EAAQkB,aAAa4R,EAAeC,EACtC,CACA,OAAO/S,CACT,GAAC,CAAA1N,IAAA,iBAAAoB,MAED,SAAgBqC,GACd,OAAOjD,KAAKsd,IAAIpY,SAASsJ,eAAevL,EAC1C,GAGA,CAAAzD,IAAA,eAAAoB,MACA,SAAckG,GACZ,OAAOgQ,GAAqBhQ,EAAM9G,KAAKsd,IAAIpY,SAC7C,GAIA,CAAA1F,IAAA,gBAAAoB,MACA,WACE,IAAM2b,EAAQ,IAAI2D,MAAM,iBAAkB,CAACC,SAAS,EAAMC,YAAY,IACtEpgB,KAAK+L,KAAKsU,cAAc9D,EAC1B,I,EAAC,EAAA/c,IAAA,WAAAoB,MAhVD,SAAiBkF,EAAMC,GACrB,OAAOF,EAAQC,EAAMC,EACvB,I,8FAAC,CAJwB,GAkW3B,SAASqY,GAA4BjY,EAAOmX,GAC1C,GAAInX,EAAMkB,eAAepD,WAAab,EAAa,OAAO+C,EAAMgZ,wBAChE,IAAMzZ,EAAK4X,EAAIpY,SAASM,cAAc,QACtCE,EAAG0I,aAAa,eAAgB,UAChCjI,EAAM6I,WAAWtJ,GACjB,IAAM2Z,EAAS3Z,EAAGyZ,wBAElB,OADAzZ,EAAG0J,SACIiQ,CACT,CAEA,SAASf,GAAWgC,EAAGC,GACrB,OAAID,IAAMC,GACNC,KAAKC,IAAIH,EAAIC,IAAM,CAEzB,CC7XA,UAKEG,YAAW,SAAExT,GAA4B,IACnCjK,EAAO,GAEX,OAsIJ,SAAkBiK,EAASyT,EAAYzQ,GAGrC,IAFA,IACInM,EADED,EAAW,IAAIP,EAAa2J,GAE1BnJ,EAAOD,EAASE,WAClBD,EAAKE,WAAaA,GAAmC,KAAdF,EAAKG,KAC9CgM,EAAKnM,EAAKG,MACDyc,GAAc5c,EAAKE,WAAaA,GAA0C,OAAlBF,EAAK4I,UACtEuD,EAAK,KAGX,CAjJI0Q,CAAQ1T,IAFsB1K,UAAAC,OAAA,QAAA+B,IAAAhC,UAAA,KAAAA,UAAA,IAED,SAACqe,GAAW5d,GAAQ4d,CAAK,IAC/C5d,CACT,EAiBA6d,iBAAgB,SAAE5T,EAASkI,GAA0B,IAAjB2L,IAAQve,UAAAC,OAAA,QAAA+B,IAAAhC,UAAA,KAAAA,UAAA,GAC1C,GAAK4S,GAA8B,IAAnBA,EAAQ3S,OAAxB,CAIAyK,EAAQoJ,YAUR,IARA,IAKIvS,EACAid,EACA3d,EAPES,EAAW,IAAIP,EAAa2J,GAC9B+T,EAAoB,EACpBC,EAAc,EACdC,EAAe/L,EAAQ6L,GACvBG,EAAW,GAIPrd,EAAOD,EAASE,WAEtB,GAAID,EAAKE,WAAaA,GAAmC,KAAdF,EAAKG,KAAhD,CASA,IAAMmd,GARJhe,EAAWU,GAQaG,KACtBod,EAAgBJ,EAAcG,EAAS5e,OAC3C,GAAI0e,EAAaI,WAAaD,GAAiBJ,EAAcC,EAAaK,SAAU,CAElF,IAAMC,EAAiBP,GAAeC,EAAaI,WAC7CG,EAAgBJ,GAAiBH,EAAaK,SAEhDC,IACFT,EAASG,EAAahT,IAAMgT,EAAaI,YAI3C,IAAI7Y,EAEFA,EADE+Y,EACON,EAAaI,WAAaL,EAE1B,EAGX,IAAIze,EAEFA,EADEif,EACQP,EAAaK,SAAWN,EAAexY,EAExC2Y,EAAS5e,OAASiG,EAI7B,IAAMiZ,EAAU,CACdzU,QAAS7J,EACTJ,KAAMoe,EAASO,UAAUlZ,EAAQA,EAASjG,GAC1CiG,OAAAA,EACAjG,OAAAA,EACAif,cAAAA,EACAV,OAAAA,GAKF,GAFAI,EAASja,KAAKwa,GAEVD,EAAe,CACjB,IAAMG,EAAW7hB,KAAK8hB,UAAUV,EAAUD,EAAaY,OAAQZ,EAAaa,OAC5Ele,EAASme,eAAeJ,GAGxBP,EAAgBJ,EAAcS,EAAQlf,OAASkf,EAAQjZ,OAEvD0Y,EAAW,IACXH,GAAqB,GACG7L,EAAQ3S,SAC9B0e,EAAe/L,EAAQ6L,GAE3B,CACF,CAEAC,EAAcI,CAvDd,MALO,GAAIP,GAAYhd,EAAKE,WAAaA,GAA0C,OAAlBF,EAAK4I,SAAmB,CACvFuU,GAAe,EACf,QACF,CAnBF,CA8EF,EAGAY,UAAS,SAAEV,EAAUc,EAAgBF,GAAO,IAAAG,EAAA,KAC1C,OAAOf,EAASzN,KAAI,SAACgO,GAAO,OAAKQ,EAAKC,YAAYT,EAASO,EAAgBF,EAAM,IAAEK,KACrF,EAEAD,YAAW,SAAET,EAASO,EAAgBF,GACpC,IAAM7b,EAAQH,IACdG,EAAM6C,SAAS2Y,EAAQzU,QAASyU,EAAQjZ,QACxCvC,EAAMkD,OAAOsY,EAAQzU,QAASyU,EAAQjZ,OAASiZ,EAAQlf,QACvD,IAAMqE,EAAOob,EAAe9Q,WAAU,GAMtC,GALAtK,EAAKsH,aAAa,eAAgBuT,EAAQX,QACtCgB,GAAOlb,EAAKsH,aAAa,QAAS4T,GACtC7b,EAAM8O,iBAAiBnO,GAGnBA,EAAKnC,YAAa,CACpB,IAAMZ,EAAO+C,EAAKnC,YACdZ,EAAKE,WAAaA,GAAmC,KAAdF,EAAKG,MAC9CH,EAAKqL,QAET,CAEA,OAAOtI,CACT,G,gVCzHF,SAASwb,GAAarf,EAAMsf,EAAaC,EAAWT,GAClD,IAAK9e,GAAiB,KAATA,EAAa,MAAO,GACjC,GAAI8e,IA8BN,SAAoB3hB,GAClB,IAAI,IAAAqiB,EACF,QAAKriB,GACEA,aAAgC,QAA7BqiB,EAAYriB,EAAI2N,qBAAa,IAAA0U,OAAA,EAAjBA,EAAmBxU,YAAYyU,YACvD,CAAE,MAAOxiB,GAIP,MAAuB,WAAfyiB,GAAOviB,IACK,IAAjBA,EAAI6D,UAAyC,WAArB0e,GAAOviB,EAAIiO,QACN,WAA7BsU,GAAOviB,EAAI2N,cAChB,CACF,CA1CiB6U,CAAUb,GAAS,MAAO,GACzC,GAAKQ,UAAAA,EAAa9f,OAAQ,MAAO,GAEjC,I,EAIMogB,GAJ4B,SAAdL,EAChBM,GACAC,IAEsBR,GAG1B,O,EAFoBtf,EAAK0U,SAASkL,G,umBAEnBlP,KAAI,SAACiE,GAClB,IAAI2J,EACAyB,EASJ,MARkB,SAAdR,GACFjB,EAAa3J,EAAM/M,MAAQ+M,EAAM,GAAGnV,OACpCugB,EAAcpL,EAAM,KAEpB2J,EAAa3J,EAAM/M,MACnBmY,EAAcpL,EAAM,IAGf,CACL2J,WAAAA,EACAC,SAAUD,EAAayB,EAAYvgB,OACnCmV,MAAOoL,EACPjB,OAAAA,EAEJ,GACF,CAgBA,SAASgB,KAAkC,IACnCE,GAD4BzgB,UAAAC,OAAA,QAAA+B,IAAAhC,UAAA,GAAAA,UAAA,GAAG,IACVmR,KAAI,SAACuP,GAAI,OAAKC,GAAYD,EAAK,IAEpDL,EAAQ,IAAHlY,OAAOsY,EAAaG,KAAK,KAAI,KACxC,OAAO,IAAIC,OAAOR,EAAO,IAC3B,CAkBA,IAAMS,GAAc,gJAEpB,SAASR,KAA6B,IAC9BG,GADuBzgB,UAAAC,OAAA,QAAA+B,IAAAhC,UAAA,GAAAA,UAAA,GAAG,IACLmR,KAAI,SAACuP,GAAI,OAAKC,GAAYD,EAAK,IAGpDL,EAAQ,MAAAlY,OAAM2Y,GAAW,YAAA3Y,OACzBsY,EAAaG,KAAK,KAAI,KAAG,QAAAzY,OACrB2Y,GAAW,QAErB,OAAO,IAAID,OAAOR,EAAO,IAC3B,CAEA,SAASM,GAAajY,GACpB,OAAOqY,OAAOrY,GAAGhI,QAAQ,4BAA6B,OACxD,C,y/BC9FA,IAAMsgB,GAAmB,CAIvBC,cAAa,SAAE1F,EAAc9a,EAAMygB,EAAatiB,EAAMuiB,GACpD,IAAI3jB,KAAK4jB,aAAa7F,EAAc2F,GAApC,CACA,IAAMG,EAAYJ,GAAc/C,YAAY3C,GAEtCgE,EAAS,0BAAHpX,OAA6BvJ,EAAI,aAGvCgU,EDhBH,SAAqBnS,EAAM6gB,EAAY/B,GAE5C,OAAOO,GAAYrf,EAAM,CAAC6gB,GADR,OACgC/B,EACpD,CCaoBgC,CAAWF,EAAW5gB,EAFnBugB,GAAiBQ,iBAAiBjC,EAAQ3gB,EAAMpB,KAAKsd,MAIxE,OAAIlI,GAAWA,EAAQ3S,QACjBihB,IAAatO,EAAQ,GAAGjH,GAAKuV,GACjCD,GAAc3C,iBAAiB/C,EAAc3I,GACzCuO,GAAYA,EAAW5G,OAAO,SAAUgB,GACrC3I,EAAQ,GAAGmM,iBAJpB,CARwD,CAc1D,EASA0C,eAAc,SAAElG,EAAc9a,EAAMygB,EAAanC,EAAYC,EAAUmC,GAA8B,IAAlBviB,EAAIoB,UAAAC,OAAA,QAAA+B,IAAAhC,UAAA,GAAAA,UAAA,GAAG,UAMxF,GALIxC,KAAK4jB,aAAa7F,EAAc2F,IAClC1jB,KAAKkkB,gBAAgBnG,EAAc2F,GAInB,KADAD,GAAc/C,YAAY3C,GAAc,GACpC,OAAQ,EAE9B,IAAMgE,EAASyB,GAAiBQ,iBAAiB,0BAADrZ,OACpBvJ,EAAI,aAC9BA,EACApB,KAAKsd,KAGD6G,EAAmB5C,EACnB6C,EAAiB5C,EAWvB,OATAiC,GAAc3C,iBAAiB/C,EAAc,CAAC,CAC5CwD,WAAY4C,EACZ3C,SAAU4C,EACVjW,GAAIuV,EACJ3B,OAAAA,KACE,GAEA4B,GAAYA,EAAW5G,OAAO,SAAUgB,GAErCoG,CACT,EAEAE,gBAAe,SAAEtG,EAAc2F,EAAaY,EAAaC,GACvD,GAAKrf,SAASmW,gBAAgBzE,UAA9B,CAEA,IACwB7L,EADsDC,EAAAC,GAAhE8S,EAAa5Y,iBAAiB,kBAADwF,OAAmB+Y,EAAW,QACjD,IAAxB,IAAA1Y,EAAAE,MAAAH,EAAAC,EAAA1G,KAAAD,MAA0B,KAAfyB,EAAIiF,EAAAnK,MACT2jB,GAAgBze,EAAK8Q,UAAUxH,OAAOmV,GACtCD,GAAaxe,EAAK8Q,UAAUC,IAAIyN,EACtC,CAAC,OAAAlZ,GAAAJ,EAAA9K,EAAAkL,EAAA,SAAAJ,EAAAK,GAAA,CAN8C,CAOjD,EAEA6Y,gBAAe,SAAEnG,EAAc2F,EAAaC,GAC1C,IACwB1S,EADsDC,EAAAjG,GAAhE8S,EAAa5Y,iBAAiB,kBAADwF,OAAmB+Y,EAAW,QACjD,IAAxB,IAAAxS,EAAAhG,MAAA+F,EAAAC,EAAA5M,KAAAD,MACEyS,GADa7F,EAAArQ,MAIf,OAAAwK,GAAA8F,EAAAhR,EAAAkL,EAAA,SAAA8F,EAAA7F,GAAA,CACA0S,EAAazH,YAETqN,GAAYA,EAAW5G,OAAO,SAAUgB,EAC9C,EAEA6F,aAAY,SAAE7F,EAAc2F,GAE1B,QADgB3F,EAAa5Y,iBAAiB,kBAADwF,OAAmB+Y,EAAW,OAC1DjhB,MACnB,EAEA+hB,yBAAwB,SAAEzG,EAAc3c,GACtC,IAAIqjB,EAAmB,iBACnBrjB,IAAMqjB,GAAoB,oBAAJ9Z,OAAwBvJ,EAAI,OACtD,IAAMsjB,EAAU3G,EAAa5Y,iBAAiBsf,GAC9C,GAAKC,EAAQjiB,OAAb,CAEA,IAC4BkiB,EADtBC,EAAS,CAAC,EAACC,EAAA5Z,GACIyZ,GAAO,IAA5B,IAAAG,EAAA3Z,MAAAyZ,EAAAE,EAAAvgB,KAAAD,MAA8B,KACtBqf,EADSiB,EAAA/jB,MACY8D,aAAa,gBACnCkgB,EAAOlB,KACVkB,EAAOlB,GAAe3F,EAAa5Y,iBAAiB,kBAADwF,OAAmB+Y,EAAW,OAErF,CAAC,OAAAtY,GAAAyZ,EAAA3kB,EAAAkL,EAAA,SAAAyZ,EAAAxZ,GAAA,CAED,IAAMyZ,EAAM,CAAC,EACb,IAAK,IAAMpB,KAAekB,EAAQ,CAChC,IAAMzM,EAAWnY,KAAK+kB,0BAA0BhH,EAAc6G,EAAOlB,IACjEvL,IAAU2M,EAAIpB,GAAevL,EACnC,CAEA,OAAO2M,CAhBoB,CAiB7B,EAEAC,0BAAyB,SAAEhH,EAAc2G,GACvC,IAAMve,EAAQH,IACV0e,EAAQjiB,OAAS,GACnB0D,EAAMuB,eAAegd,EAAQ,IAC7Bve,EAAMyB,YAAY8c,EAAQA,EAAQjiB,OAAS,KAE3C0D,EAAM6e,WAAWN,EAAQ,IAG3B,IAAMO,EAAYhc,EAAiB9C,EAAO4X,GAC1C,MAAO,CACLxU,MAAO0b,EAAU1b,MACjBC,IAAKyb,EAAUzb,IACfvG,KAAMgiB,EAAUhiB,KAChBiiB,YAAa/e,EAEjB,EAEAgf,wBAAuB,SAAEpH,EAAcqH,GACrC,IACwBC,EAD8DC,EAAAra,GAAxE8S,EAAa5Y,iBAAiB,wBAADwF,OAAyBya,EAAa,QACzD,IAAxB,IAAAE,EAAApa,MAAAma,EAAAC,EAAAhhB,KAAAD,MAA0B,KAAfyC,EAAIue,EAAAzkB,MACRkG,EAAKgK,YAAYrO,QACpBqE,EAAKsI,QAET,CAAC,OAAAhE,GAAAka,EAAAplB,EAAAkL,EAAA,SAAAka,EAAAja,GAAA,CACH,EAEA2Y,iBAAgB,SAAEuB,EAAcH,EAAe9H,GAC7C,IAAMyE,EAASvc,EAAc+f,EAAcjI,GAG3C,OAFAyE,EAAO3T,aAAa,gBAAiB,aACrC2T,EAAO3T,aAAa,iBAAkBgX,GAC/BrD,CACT,GAGF,Y,+kEC9HA,IAQqByD,GAAS,SAAAC,GAC5B,SAAAD,IAAe,IAAArD,EAGU,O,4FAHV1e,CAAA,KAAA+hB,UACbrD,E,yYAAAuD,CAAA,KAAAF,EAAShjB,YACGyb,SACZkE,EAAK1I,aAAc,EAAI0I,CACzB,CAEA,O,sRAAAwD,CAAAH,EAAAC,G,EAAAD,E,EAAA,EAAAhmB,IAAA,OAAAoB,MACA,WACE,OAAOZ,KAAKmG,MAAMrD,UACpB,GAEA,CAAAtD,IAAA,OAAAoB,MACA,WACE,Od6JuB,SAACuF,GAAwB,IAC5C4L,GAD8BvP,UAAAC,OAAA,QAAA+B,IAAAhC,UAAA,GAAAA,UAAA,GAAGrC,QACvB+E,SAASM,cAAc,OAEvC,OADAuM,EAAIxD,YAAYpI,EAAMmM,iBACfP,EAAIpM,SACb,CcjKWigB,CAAY5lB,KAAKmG,MAC1B,GAAC,CAAA3G,IAAA,gBAAAoB,MAED,WACE,OAAOoQ,EACLhR,KAAK+L,KACL/L,KAAKmG,MAAMkB,eACXrH,KAAKmG,MAAM0C,cACRmI,EACHhR,KAAK+L,KACL/L,KAAKmG,MAAMoB,aACXvH,KAAKmG,MAAM2C,UAEf,GAAC,CAAAtJ,IAAA,eAAAoB,MAED,WACE,OAAOqI,EAAiBjJ,KAAKmG,MAAOnG,KAAK+L,KAC3C,GAEA,CAAAvM,IAAA,WAAAoB,MACA,WACE,OAAOZ,KAAKmG,MAAMrD,UACpB,GAGA,CAAAtD,IAAA,cAAAoB,MACA,WACE,OAAOkW,GAAoB9W,KAAKmG,MAClC,GAGA,CAAA3G,IAAA,WAAAoB,MACA,WAGE,OAAOZ,KAAKmG,MAAM0f,gBACpB,GAAC,CAAArmB,IAAA,OAAAoB,MAED,SAAM6Z,GAAkB,IAAZqL,EAAKtjB,UAAAC,OAAA,QAAA+B,IAAAhC,UAAA,GAAAA,UAAA,GAAG,CAAC,EACfiY,IAAMqL,EAAMrL,KAAOA,GACvB,IAAMsL,EAAO/lB,KAAKwF,cAAclD,EAAOZ,WAAWL,KAAMiB,EAAOZ,WAAWJ,SAC1E,IAAK,IAAM9B,KAAOsmB,EAAO,CACvB,IAAMllB,EAAQklB,EAAMtmB,QACNgF,IAAV5D,IACU,OAAVA,EACFmlB,EAAK1L,gBAAgB7a,GAErBumB,EAAK3X,aAAa5O,EAAKoB,GAE3B,CACI0B,EAAOZ,WAAWH,MAAMvB,KAAKgmB,YAEjChmB,KAAKuU,UAAUwR,EACjB,GAEA,CAAAvmB,IAAA,YAAAoB,MACA,WACE,IAAMqlB,EAAajmB,KAAKmG,MAAMrD,WACxBgH,EAAuBmc,EAAWC,OAAO,QACzCC,EAAoBF,EAAWC,OAAO,YACtC5b,GAA+C,IAAvB6b,EAC1B,EACAF,EAAWxjB,QAAU0jB,EAAoB,GAO3CC,EAAAC,GALoCzc,EAA6B,CACjE7K,KAAMiB,KAAKmG,MAAMO,wBACjBW,eAAgBrH,KAAKmG,MAAMkB,eAC3BwB,YAAa7I,KAAKmG,MAAM0C,YACxBiB,qBAAAA,IACA,GALKzC,EAAc+e,EAAA,GAAEvd,EAAWud,EAAA,GAMlCpmB,KAAKmG,MAAM6C,SAAS3B,EAAgBwB,GAEpC,IAKEyd,EAAAD,GALgCjc,EAA2B,CAC3DrL,KAAMiB,KAAKmG,MAAMO,wBACjBa,aAAcvH,KAAKmG,MAAMoB,aACzBuB,UAAW9I,KAAKmG,MAAM2C,UACtBwB,sBAAAA,IACA,GALK/C,EAAY+e,EAAA,GAAExd,EAASwd,EAAA,GAM9BtmB,KAAKmG,MAAMkD,OAAO9B,EAAcuB,EAClC,GAAC,CAAAtJ,IAAA,SAAAoB,MAED,WACEZ,KAAKkV,iBAAiB5S,EAAOZ,WAAWL,KAC1C,GAAC,CAAA7B,IAAA,aAAAoB,MAED,SAAY6Z,EAAMqL,GAChB,IAAMS,EAAQvmB,KAAKkT,cAAc5Q,EAAOZ,WAAWL,MACnD,GAAIklB,EAAM9jB,QAAU,EAAG,CACrB,IAAM+jB,EAAYD,EAAM,GACpBvmB,KAAK8T,iBAAiB0S,EAAW,WACnCxmB,KAAKymB,SAELzmB,KAAKmU,SAASqS,EAElB,MACExmB,KAAK+lB,KAAKtL,EAAMqL,EAEpB,GAAC,CAAAtmB,IAAA,mBAAAoB,MAED,SAAgBiJ,GAA4B,IAAzB6Z,EAAW7Z,EAAX6Z,YAAauB,EAASpb,EAATob,UAC9BzB,GAAiBS,eACfjkB,KAAK+L,KACL2X,EACAuB,EAAUhiB,KACVgiB,EAAU1b,MACV0b,EAAUzb,SACVhF,EACA,UAEJ,GAGA,CAAAhF,IAAA,YAAAoB,MACA,SAASyJ,GAAcA,EAAXqZ,YAAc,IAClBgD,EAAa1mB,KAAK0mB,aAClBC,EAAqB3mB,KAAKiD,OAG1B2jB,EAAapD,GAAiBQ,iBADrB,0CAC8ChkB,KAAKsd,KAElEsJ,EAAWxY,aAAa,aAAcuY,GAEtC,IAAM/O,EAAQ,CACZ2J,WAAYmF,EAAWjkB,OACvB+e,SAAUkF,EAAWjkB,OAASkkB,EAAmBlkB,OACjDmV,MAAO+O,EACP5E,OAAQ6E,GAIVnD,GAAc3C,iBAAiB9gB,KAAK+L,KAAM,CAAC6L,GAC7C,GAEA,CAAApY,IAAA,SAAAoB,MACA,SAAQkF,GACFwT,GAAuBtZ,KAAK+L,OAC5B/L,KAAKmG,MAAMsJ,YACf3J,EAAO9F,KAAKmS,aAAarM,GACzB9F,KAAKmG,MAAQ2Q,GAAkB9W,KAAK+L,KAAM/L,KAAKmG,MAAOL,GACtD9F,KAAK2e,sBACP,GAAC,CAAAnf,IAAA,eAAAoB,MAED,SAAYimB,GAAuC,IAApCzhB,EAAOyhB,EAAPzhB,QAASwH,EAAUia,EAAVja,WAAUka,EAAAD,EAAEtlB,KAAAA,OAAI,IAAAulB,GAAQA,EACxCC,EAAa/mB,KAAKwF,cAAcJ,EAASwH,GAC3CrL,GAAMvB,KAAKgmB,YACfhmB,KAAKgnB,OAAOD,EACd,GAAC,CAAAvnB,IAAA,aAAAoB,MAED,SAAUqmB,GAAuC,IAApC7hB,EAAO6hB,EAAP7hB,QAASwH,EAAUqa,EAAVra,WAAUsa,EAAAD,EAAE1lB,KAAAA,OAAI,IAAA2lB,GAAQA,EACtCH,EAAa/mB,KAAKwF,cAAcJ,EAASwH,GAC3CrL,GAAMvB,KAAKgmB,YACfhmB,KAAKuU,UAAUwS,EACjB,GAAC,CAAAvnB,IAAA,WAAAoB,MAED,WACE,IAAMumB,EAAOnnB,KAAKwF,cAAclD,EAAOnB,WAAWE,KAAMiB,EAAOnB,WAAWG,SACtEgB,EAAOnB,WAAWI,MAAMvB,KAAKgmB,YACjChmB,KAAKuU,UAAU4S,EACjB,GAAC,CAAA3nB,IAAA,aAAAoB,MAED,WACE,IAAMumB,EAAOnnB,KAAKwF,cAAclD,EAAOnB,WAAWE,KAAMiB,EAAOnB,WAAWG,SACtEgB,EAAOnB,WAAWI,MAAMvB,KAAKgmB,YACjChmB,KAAKgnB,OAAOG,EACd,GAAC,CAAA3nB,IAAA,eAAAoB,MAED,WACE,IAAMwmB,EAAKpnB,KAAKwF,cAAclD,EAAOd,aAAaH,KAAMiB,EAAOd,aAAaF,SACxEgB,EAAOd,aAAaD,MAAMvB,KAAKgmB,YACnChmB,KAAKuU,UAAU6S,EACjB,GAAC,CAAA5nB,IAAA,iBAAAoB,MAED,WACE,IAAMwmB,EAAKpnB,KAAKwF,cAAclD,EAAOd,aAAaH,KAAMiB,EAAOd,aAAaF,SACxEgB,EAAOd,aAAaD,MAAMvB,KAAKgmB,YACnChmB,KAAKgnB,OAAOI,EACd,GAAC,CAAA5nB,IAAA,gBAAAoB,MAED,WACE,IAAMymB,EAAIrnB,KAAKwF,cAAclD,EAAOb,gBAAgBJ,KAAMiB,EAAOb,gBAAgBH,SAC7EgB,EAAOb,gBAAgBF,MAAMvB,KAAKgmB,YACtChmB,KAAKuU,UAAU8S,EACjB,GAAC,CAAA7nB,IAAA,kBAAAoB,MAED,WACE,IAAMymB,EAAIrnB,KAAKwF,cAAclD,EAAOb,gBAAgBJ,KAAMiB,EAAOb,gBAAgBH,SAC7EgB,EAAOb,gBAAgBF,MAAMvB,KAAKgmB,YACtChmB,KAAKgnB,OAAOK,EACd,GAAC,CAAA7nB,IAAA,kBAAAoB,MAED,SAAiB0U,GACf,IAAMiE,EAASvZ,KAAK4Z,gBACdvW,EAAWkW,EAAO/K,eAAe8G,GAGvC,OAFAiE,EAAO3K,aAAavL,GACpBkW,EAAOoF,sBACApF,CACT,GAKA,CAAA/Z,IAAA,WAAAoB,MACA,SAAU6U,EAAgBC,GACxB1V,KAAKmG,MAAQ2Q,GAAiB9W,KAAK+L,KAAM/L,KAAKmG,MAAOsP,EAAgBC,GACrE1V,KAAK2e,qBACP,GAAC,CAAAnf,IAAA,iBAAAoB,MAED,SAAgB6U,EAAgBC,GAC9B1V,KAAKmG,MAAQ2Q,GAAwB9W,KAAK+L,KAAM/L,KAAKmG,MAAOsP,GAC5DzV,KAAKmG,MAAQ2Q,GAAwB9W,KAAK+L,KAAM/L,KAAKmG,MAAOuP,GAC5D1V,KAAK2e,qBACP,GAAC,CAAAnf,IAAA,cAAAoB,MAED,WACE,IADuB,IAAZ0mB,EAAK9kB,UAAAC,OAAA,QAAA+B,IAAAhC,UAAA,GAAAA,UAAA,GAAG,GACVgK,EAAI,EAAGA,EAAI8a,EAAM7kB,OAAQ+J,IAAK,CACrC,IAAMqL,EAAOyP,EAAM9a,GACnBxM,KAAKmG,MAAQ2Q,GAAwB9W,KAAK+L,KAAM/L,KAAKmG,MAAO0R,EAC9D,CACA7X,KAAK2e,qBACP,GAAC,CAAAnf,IAAA,iBAAAoB,MAED,SAAgB6U,EAAgBC,GAC1B1V,KAAK4V,eAAeH,IACxBzV,KAAK4V,eAAeF,GAClB1V,KAAKunB,eAAe9R,EAAgBC,GAEpC1V,KAAKwV,SAASC,EAAgBC,EAElC,GAIA,CAAAlW,IAAA,mBAAAoB,MACA,SAAkBmF,GAChB/F,KAAKmG,MAAQ2Q,GAAyB9W,KAAK+L,KAAM/L,KAAKmG,MAAOJ,GAC7D/F,KAAK2e,qBACP,GAIA,CAAAnf,IAAA,6BAAAoB,MACA,WACE,IACsCmK,EADeC,E,8lBAAAC,CAAhCjL,KAAKgT,kBAAkBpH,WACN,IAAtC,IAAAZ,EAAAE,MAAAH,EAAAC,EAAA1G,KAAAD,MAAwC,KAA7BmjB,EAAWzc,EAAAnK,MACpB,GAAIZ,KAAK8T,iBAAiB0T,GAAc,CACtCA,EAAYpY,SACZ,KACF,CACF,CAAC,OAAAhE,GAAAJ,EAAA9K,EAAAkL,EAAA,SAAAJ,EAAAK,GAAA,CACD,OAAO,IAAIma,EAAUxlB,KAAK+L,KAAM/L,KAAKmG,MACvC,GAIA,CAAA3G,IAAA,sBAAAoB,MACA,WAGE,OAFsBZ,KAAKwT,mBACb2B,SAAQ,SAAAsS,GAAY,OAAIA,EAAarY,QAAQ,IACpD,IAAIoW,EAAUxlB,KAAK+L,KAAM/L,KAAKmG,MACvC,GAKA,CAAA3G,IAAA,gBAAAoB,MACA,WAEE,OADAZ,KAAKmG,MAAMuhB,iBACJ,IAAI5J,GAAO9d,KAAK+L,KAAM/L,KAAKmG,MACpC,GAIA,CAAA3G,IAAA,WAAAoB,MACA,SAAUkF,GACR9F,KAAKmG,MAAQ2Q,GAAiB9W,KAAK+L,KAAM/L,KAAKmG,MAAOL,GACrD9F,KAAK2e,qBACP,GAIA,CAAAnf,IAAA,sBAAAoB,MACA,SAAqBkF,GAGnB,OAFA9F,KAAKmG,MAAM4I,UAAS,GACpB/O,KAAK2e,sBACE,IAAIb,GAAO9d,KAAK+L,KAAM/L,KAAKmG,MACpC,GAIA,CAAA3G,IAAA,gBAAAoB,MACA,SAAekF,GAGb,OAFA9F,KAAKmG,MAAM4I,UAAS,GACpB/O,KAAK2e,sBACE,IAAIb,GAAO9d,KAAK+L,KAAM/L,KAAKmG,MACpC,GAIA,CAAA3G,IAAA,YAAAoB,MACA,SAAWkF,GACLwT,GAAuBtZ,KAAK+L,OAC5B/L,KAAKmG,MAAMsJ,YACf3J,EAAO9F,KAAKmS,aAAarM,GACzB9F,KAAKmG,MAAQ2Q,GAAkB9W,KAAK+L,KAAM/L,KAAKmG,MAAOL,GACtD9F,KAAK2e,sBACP,GASA,CAAAnf,IAAA,mBAAAoB,MACA,SAAkBkF,EAAM6hB,GACtB,OAAO7Q,GAAyB9W,KAAKmG,MAAOL,EAAM6hB,EACpD,GAKA,CAAAnoB,IAAA,iBAAAoB,MACA,SAAgBoV,GACd,OAAOc,GAAuB9W,KAAKmG,MAAO6P,EAC5C,GAGA,CAAAxW,IAAA,kBAAAoB,MACA,SAAiB0U,GACftV,KAAKmG,MAAQ2Q,GAAwB9W,KAAK+L,KAAM/L,KAAKmG,MAAOmP,GAC5DtV,KAAK2e,qBACP,I,iFAAC,CA1V2B,CAASb,I,2qBCzBvC,IAQqB8J,GAAc,WACjC,SAAAA,EAAa7J,EAAc5X,I,4FAAO1C,CAAA,KAAAmkB,GAChC5nB,KAAK+L,KAAOgS,GAAgBA,EAAarT,OACrCqT,EAAa,GACbA,EAIJ/d,KAAKmG,MAAQA,aAAK,EAALA,EAAOiD,aACpBpJ,KAAK6nB,wBAAgCrjB,IAAV2B,EAC3BnG,KAAKie,SAAYje,KAAK6nB,oBAAsB1hB,EAAMsJ,UAClDzP,KAAKyZ,YAAezZ,KAAK6nB,qBAAuB7nB,KAAKie,QACvD,CAAC,O,EAAA2J,E,EAAA,EAAApoB,IAAA,YAAAoB,MAED,WACE,GAAIZ,KAAKie,SAAU,OAAO,IAAIH,GAAO9d,KAAK+L,KAAM/L,KAAKmG,MACvD,GAAC,CAAA3G,IAAA,eAAAoB,MAED,WACE,GAAIZ,KAAKyZ,YAAa,OAAO,IAAI+L,GAAUxlB,KAAK+L,KAAM/L,KAAKmG,MAC7D,GAAC,CAAA3G,IAAA,cAAAoB,MAED,WACE,OAAKZ,KAAKyZ,YACHzZ,KAAKiG,eAAe2T,gBADG5Z,KAAK8nB,WAErC,GAAC,CAAAtoB,IAAA,kBAAAoB,MAED,WAA6D,IAA5CmnB,EAAmBvlB,UAAAC,OAAA,QAAA+B,IAAAhC,UAAA,GAAAA,UAAA,GAAG,IAAIolB,EACnCvoB,EAAOW,KAAKmG,MACZ6hB,EAAQD,EAAoB5hB,MAClC,OAAI9G,GAAQ2oB,GAAeve,EAAepK,EAAM2oB,MAC3C3oB,IAAS2oB,EAEhB,I,iFAAC,CAjCgC,G,2qBCNnC,IAQqBC,GAAgB,WASnC,O,EARA,SAAAA,EAAatE,EAAYrG,I,4FAAK7Z,CAAA,KAAAwkB,GAC5BjoB,KAAK2jB,WAAaA,EAClB3jB,KAAKsd,IAAMA,GAAOnd,OAClBH,KAAKgf,eAAYxa,EACjBxE,KAAKkoB,sBAAmB1jB,EACxBxE,KAAKmoB,kBAAe3jB,CACtB,G,EAEA,EAAAhF,IAAA,gBAAAoB,MAIA,WAEE,IACEZ,KAAKgf,UAAY/Y,EAAajG,KAAKsd,IACrC,CAAE,MAAOlS,GACP,OAAO,CACT,CAEA,OAAO,CACT,GAEA,CAAA5L,IAAA,oBAAAoB,MAIA,WAAqB,IAAAwnB,EACbC,EAAiBroB,KAAKsoB,gBAK5B,GAAkB,QAAdF,EAAApoB,KAAKgf,iBAAS,IAAAoJ,GAAdA,EAAgBvS,YAAcwS,EAAgB,CAChD,IAAMliB,EAAQnG,KAAKgf,UAAUuJ,WAAW,GAClCC,EAAWxX,EAAe7K,EAAMO,yBACtC,GAAI8hB,EAAU,OAAO,IAAIZ,GAAeY,EAAUriB,EACpD,CAGA,OAAO,IAAIyhB,EACb,GAEA,CAAApoB,IAAA,gBAAAoB,MAKA,WACE,OAAOZ,KAAKyoB,mBACd,GAEA,CAAAjpB,IAAA,oBAAAoB,MAMA,WACE,IAAM6M,EAAiBzN,KAAKyoB,oBAE5B,OAAOhb,EAAewQ,SAClBxQ,EAAeqa,UAAU9nB,KAAKsd,KAC9B7P,EAAexH,aAAajG,KAAKsd,IACvC,GAEA,CAAA9d,IAAA,eAAAoB,MASA,WACE,OAAOZ,KAAKkoB,gBACd,GAAC,CAAA1oB,IAAA,cAAAoB,MAED,WAEE,OADuBZ,KAAKyoB,oBACNC,aACxB,GAAC,CAAAlpB,IAAA,mBAAAoB,MAED,WACE,IAAM+nB,EAAoB3oB,KAAKyoB,oBAC/B,GAAIE,EAAkBC,gBAAgB5oB,KAAKmoB,cAAe,CACxD,IAAMU,EAAgB7oB,KAAKkoB,iBAC3BloB,KAAKmoB,aAAeQ,EAGhBE,IACEA,EAAc5K,WAAaje,KAAKmoB,aAAalK,SAC/Cje,KAAK2jB,WAAW5G,OAAO,SAAU8L,EAAc9c,MACtC8c,EAAcpP,cAAgBzZ,KAAKmoB,aAAa1O,aACzDzZ,KAAK2jB,WAAW5G,OAAO,YAAa8L,EAAc9c,OAKlD/L,KAAKmoB,aAAalK,UACpBje,KAAKkoB,iBAAmB,IAAIpK,GAAO9d,KAAKmoB,aAAapc,KAAM/L,KAAKmoB,aAAahiB,OAC7EnG,KAAK2jB,WAAW5G,OAAO,SAAU/c,KAAKkoB,iBAAiBnc,KAAM/L,KAAKkoB,mBACzDloB,KAAKmoB,aAAa1O,aAC3BzZ,KAAKkoB,iBAAmB,IAAI1C,GAAUxlB,KAAKmoB,aAAapc,KAAM/L,KAAKmoB,aAAahiB,OAChFnG,KAAK2jB,WAAW5G,OAAO,YAAa/c,KAAKkoB,iBAAiBnc,KAAM/L,KAAKkoB,mBAErEloB,KAAKkoB,sBAAmB1jB,CAE5B,CACF,M,8EAAC,CA/GkC,G,2qBCTrC,IAIqBskB,GAAQ,WAC3B,SAAAA,EAAaC,I,4FAAkBtlB,CAAA,KAAAqlB,GAC7B7M,GAAUjc,MACVA,KAAK+oB,iBAAmBA,CAC1B,CAAC,O,EAAAD,E,EA+GA,EAAAtpB,IAAA,kBAAAoB,MAED,SAAwBooB,EAAgB/jB,GAOtC,GAAmC,IAA/B+jB,EAAengB,YAAnB,CAEA,IAAIogB,EAAmBD,EAAe3hB,eAMtC,GAHI4hB,EAAiBhlB,WAAaA,IAAmBglB,EAAmBA,EAAiBrkB,YAGrFqkB,IAAqBhkB,EAAzB,CAIA,IAAMikB,EAAiBljB,IAGvB,GAFAkjB,EAAexhB,eAAeuhB,EAAiBxkB,YAC/CykB,EAAethB,YAAYqhB,EAAiBpkB,WjBfFskB,EiBgBRH,KjBhBRI,EiBgBRF,GjBdHjhB,sBAAsBC,MAAMC,eAAgBghB,IAAc,GACzEC,EAAenhB,sBAAsBC,MAAMG,WAAY8gB,IAAc,GiBarE,CjBhByB,IAACC,EAAgBD,EiBuB1C,GAAIH,EAAe3hB,eAAepD,WAAaA,EAAmB,CAChE,IAAMolB,EAAmB,CAACplB,EAAmBA,GACzCqlB,EAAmBL,EAAiBxkB,WAExC,GACE,IAA6D,IAAzD4kB,EAAiBvT,QAAQwT,EAAiBrlB,UAAkB,YACxDqlB,EAAmBA,EAAiB3kB,aAE9C,GAAI2kB,IAAqBN,EAAe3hB,eAAgB,MAC1D,CAMA,IAAMkiB,EAAoCP,EAAe5f,aAGzD,OAFAmgB,EAAkC7hB,eAAeuhB,GAE1CH,EAASU,gBACdD,EACAtkB,IACGgkB,CA5BoD,CAPlB,CARK,CA4C9C,K,EApKC,EAAAzpB,IAAA,mBAAAoB,MAED,SAAkB2b,EAAOtX,EAAQwkB,GAC/B,OAAQlN,EAAMmN,SACZ,KAAK1pB,KAAKR,IAAI+f,KACZ,OAAOvf,KAAK+c,OAAO9X,EAAQ,OAAQsX,GAErC,KAAKvc,KAAKR,IAAIggB,MACZ,OAAOxf,KAAK+c,OAAO9X,EAAQ,QAASsX,GAEtC,KAAKvc,KAAKR,IAAImqB,GACZ,OAAO3pB,KAAK+c,OAAO9X,EAAQ,KAAMsX,GAEnC,KAAKvc,KAAKR,IAAIoqB,KACZ,OAAO5pB,KAAK+c,OAAO9X,EAAQ,OAAQsX,GAErC,KAAKvc,KAAKR,IAAIqqB,IACZ,OAAItN,EAAMuN,SAAiB9pB,KAAK+c,OAAO9X,EAAQ,WAAYsX,GACpDvc,KAAK+c,OAAO9X,EAAQ,MAAOsX,GAEpC,KAAKvc,KAAKR,IAAIuqB,IACZ,OAAO/pB,KAAK+c,OAAO9X,EAAQ,MAAOsX,GAEpC,KAAKvc,KAAKR,IAAIwqB,UAEZ,OADAhqB,KAAKiqB,0BAA0BhlB,EAAQsX,GAChCvc,KAAK+c,OAAO9X,EAAQ,YAAasX,GAE1C,KAAKvc,KAAKR,IAAG,OAEX,OADAQ,KAAKiqB,0BAA0BhlB,EAAQsX,GAChCvc,KAAK+c,OAAO9X,EAAQ,SAAUsX,GAEvC,KAAKvc,KAAKR,IAAI0qB,MACZ,OAAI3N,EAAMuN,SAAiB9pB,KAAK+c,OAAO9X,EAAQ,aAAcsX,GACtDvc,KAAK+c,OAAO9X,EAAQ,QAASsX,GAEtC,KAAKvc,KAAKR,IAAI2qB,KACd,KAAKnqB,KAAKR,IAAI0d,MACd,KAAKld,KAAKR,IAAI4qB,IAId,KAAK,IACL,KAAK,GACL,KAAK,GACL,KAAK,GACH,OAEF,QAGE,GAAI7N,EAAMmN,UAAY1pB,KAAKR,IAAI+gB,IAAMhE,EAAM8N,SAAW9N,EAAM+N,SAC1D,OAAOtqB,KAAK+c,OAAO9X,EAAQ,OAAQsX,GAErC,GAAIA,EAAMmN,UAAY1pB,KAAKR,IAAIgN,IAAM+P,EAAM8N,SAAW9N,EAAM+N,SAC1D,OAAOtqB,KAAK+c,OAAO9X,EAAQ,SAAUsX,GAIvC,GADAvc,KAAKiqB,0BAA0BhlB,EAAQsX,IAClCkN,EAAsB,OAI3B,IAAKlN,EAAM8N,UAAY9N,EAAM+N,QAAS,OAAOtqB,KAAK+c,OAAO9X,EAAQ,YAAasX,GAEpF,GAAC,CAAA/c,IAAA,4BAAAoB,MAED,SAA2BqE,EAAQsX,GACjC,GAAKP,KACDO,EAAM8N,UAAW9N,EAAM+N,QAA3B,CAsCA,IAAM7c,EAAiBzN,KAAK+oB,iBAAiBwB,gBAC7C,GAAK9c,EAAegM,YAApB,CAEA,IAAM+Q,EAAe1B,EAASU,gBAAgB/b,EAAetH,MAAOlB,GAChEulB,GAAcA,EAAapb,QAHQ,CAvCG,CA2C5C,M,2FAqDC,CAxK0B,G,uGA2K7B0Z,GAAStpB,IAAMspB,GAASxoB,UAAUd,IAAM,CACtC+f,KAAM,GACNoK,GAAI,GACJnK,MAAO,GACPoK,KAAM,GACNC,IAAK,EACLE,IAAK,GACLC,UAAW,EACXS,OAAQ,GACRP,MAAO,GACPhN,MAAO,GACPiN,KAAM,GACNC,IAAK,GACL7J,EAAG,GACH/T,EAAG,IClML,IAAMke,GAAyB,SAAC5R,GAAS,OAAKpW,MAAM2C,QAAQyT,IAAmC,IAArBA,EAAUrW,MAAY,EAOnFkoB,GAAgB,SAAC9S,GAAI,MAAK,aAAapF,KAAKoF,EAAK,EACjD+S,GAAgB,SAAC/S,GAAI,MAAK,aAAapF,KAAKoF,EAAK,EACjDgT,GAAe,SAAChT,GAAI,MAAK,SAASpF,KAAKoF,EAAK,EAE5CiT,GAA0B,SAACjT,GAAI,MAAK,aAAapF,KAAKoF,EAAK,EAO3DkT,GAAe,SAAC5kB,EAAO0E,EAAOmgB,GACzC,IAAM3jB,EAAiBlB,aAAK,EAALA,EAAOkB,eACxBiE,EAAYjE,aAAc,EAAdA,EAAgBiE,UAClC,IAAKA,EACH,OAAO,KAET,IAAM2f,EAAU,GAAHtgB,OAAMW,EAAUsW,UAAU,EAAG/W,IAAMF,OAAGqgB,GAASrgB,OAAGW,EAAUsW,UAAU/W,EAAQ,IACrFqgB,EAAchmB,SAASsJ,eAAeyc,GAE5C,OADA5jB,EAAe8jB,YAAYD,GACpBA,CACT,EAcaE,GAAmB,SAACjlB,EAAO7D,EAAQuV,EAAM5S,EAAQomB,GAC5D,I,EAAMC,EAAoBV,GAAc/S,GAGxC,GAF0B8S,GAAc9S,IAEbyT,EAA3B,CAIA,IAAO7T,EAAwBnV,EAAxBmV,OAAQC,EAAgBpV,EAAhBoV,aACf,GAAIG,IAASJ,EAAO,IAAMI,IAASJ,EAAO,IAAMI,IAASH,EAAa,IAAMG,IAASH,EAAa,GAAlG,CAIA,IAEIwT,EAzC8BjoB,EAAMsoB,EAuClC7iB,EAASvC,EAAM0C,YACf2iB,E,gDAAcrlB,EAAMkB,eAAeyJ,c,ojBAKzC,GAAIwa,IA7C8BroB,EA6CkBuoB,GA7CZD,EA6CqB7iB,EAAS,IA7CiBiiB,GAAc1nB,EAAKsoB,IA8CxGL,EAAcH,GAAa5kB,EAAOuC,EAAS,EAAGgP,EAAa,SACtD,GAjDoB,SAACzU,EAAMsoB,GAAe,QAAOtoB,EAAKsoB,KAAqBT,GAAwB7nB,EAAKsoB,GAAiB,CAiDrHE,CAAqBD,EAAS9iB,EAAS,GAAI,CACpD,GAAI4iB,EAAmB,CAErB,GAnDe,SAACE,EAASE,GAAc,QAAOF,EAAQE,KAL/B7T,EAKgE2T,EAAQE,IAL/D,OAAOjZ,KAAKoF,IAAtB,IAACA,CAKwF,CAmD3G8T,CAAaH,EAAS9iB,GACxB,OAGF,IAxCwB,SAAC8iB,EAAS9iB,EAAQkjB,GAC9C,GAAIljB,GAAU,EACZ,OAAO,EAET,IAAK,IAAI8D,EAAI9D,EAAS,EAAG8D,GAAK,EAAGA,IAC/B,GAAIoe,GAAcY,EAAQhf,MAASqe,GAAae,KAAwBf,GAAaW,EAAQhf,IAC3F,OAAOgf,EAAQhf,KAAOof,EAG1B,OAAO,CACT,CA8BWC,CAAsBL,EAAS9iB,EAAQgP,EAAa,IACvD,MAEJ,CACA,IAAMoU,EAAeR,EAAoB5T,EAAa,GAAKD,EAAO,GAClEyT,EAAcH,GAAa5kB,EAAOuC,EAAS,EAAGojB,EAChD,MAAO,GA/DoB,SAAC7oB,EAAMsoB,GAAe,OAAKA,EAAkB,GAAKT,GAAwB7nB,EAAKsoB,GAAiB,CA+DhHQ,CAAqBP,EAAS9iB,EAAS,GAAI,CACpD,IAAM+P,EAAe6S,EAAoB5T,EAAa,GAAKD,EAAO,GAClEyT,EAAcH,GAAa5kB,EAAOuC,EAAS,EAAG+P,EAChD,CAEKyS,GAKUjmB,EAAO8I,cAAcE,YACXhI,eACf8I,SAASmc,EAAaG,QAAAA,EAAgB3iB,EAnChD,CALA,CAyCF,E,oqDC/EA,IAMqBsjB,GAAU,WAc5B,O,EAZD,SAAAA,EAAaC,I,4FAAUxoB,CAAA,KAAAuoB,GACrB,IAAM1O,EAAM2O,EAAS3O,IACrBrB,GAAUjc,KAAMisB,GAChBjsB,KAAKkF,SAAWoY,EAAIpY,SACpBlF,KAAKsC,OAAS2pB,EAAS3pB,OACvBtC,KAAKisB,SAAWA,EAChBjsB,KAAKksB,iBAAmBD,EAASC,iBACjClsB,KAAK+oB,iBAAmB,IAAId,GAAiBjoB,KAAMsd,GACnDtd,KAAKmsB,SAAW,IAAIrD,GAAS9oB,KAAK+oB,kBAClC/oB,KAAKosB,gBAAkB,GACvBpsB,KAAKqsB,QACLrsB,KAAKssB,wBAA0B,SAACC,GAAG,OAAK1mB,EAAQ0mB,EAAItnB,OAAQgnB,EAASC,iBAAiB,CACxF,E,EAAC,EAAA1sB,IAAA,wBAAAoB,MAED,SAAuB2b,EAAOrM,GAAuB,IAAjBsc,EAAOhqB,UAAAC,OAAA,QAAA+B,IAAAhC,UAAA,IAAAA,UAAA,GACnC8Z,EAAW,CAACC,MAAAA,EAAOD,SAAUpM,EAAKuc,KAAKzsB,MAAOwsB,QAAAA,GAIpD,OAHAxsB,KAAKosB,gBAAgBjlB,KAAKmV,GAE1Btc,KAAKkF,SAASwnB,iBAAiBnQ,EAAOD,EAASA,SAAUkQ,GAClDxsB,IACT,GAEA,CAAAR,IAAA,QAAAoB,MAKA,WAEEZ,KAAK2sB,sBACL3sB,KAAK4sB,qBACP,GAAC,CAAAptB,IAAA,SAAAoB,MAED,WACEZ,KAAK2c,MAAK,IAC0B5R,EAD1BC,EAAAC,GACMjL,KAAKosB,iBAAe,IAApC,IAAAphB,EAAAE,MAAAH,EAAAC,EAAA1G,KAAAD,MAAsC,KAA3BwoB,EAAC9hB,EAAAnK,MACVZ,KAAKkF,SAAS4nB,oBAAoBD,EAAEtQ,MAAOsQ,EAAEvQ,SAAUuQ,EAAEL,QAC3D,CAAC,OAAAphB,GAAAJ,EAAA9K,EAAAkL,EAAA,SAAAJ,EAAAK,GAAA,CACDrL,KAAKosB,gBAAgB3pB,OAAS,CAChC,GAAC,CAAAjD,IAAA,UAAAoB,MAED,WACE,IAAIZ,KAAK+sB,UAAT,CACA/sB,KAAK+sB,WAAY,EAAI,IACe9b,EADfC,EAAAjG,GACLjL,KAAKosB,iBAAe,IAApC,IAAAlb,EAAAhG,MAAA+F,EAAAC,EAAA5M,KAAAD,MAAsC,KAA3BwoB,EAAC5b,EAAArQ,MACVZ,KAAKkF,SAAS4nB,oBAAoBD,EAAEtQ,MAAOsQ,EAAEvQ,SAAUuQ,EAAEL,QAC3D,CAAC,OAAAphB,GAAA8F,EAAAhR,EAAAkL,EAAA,SAAA8F,EAAA7F,GAAA,CACDrL,KAAKosB,gBAAgB3pB,OAAS,CALJ,CAM5B,GAAC,CAAAjD,IAAA,WAAAoB,MAED,WACOZ,KAAK+sB,YACV/sB,KAAK+sB,WAAY,EACjB/sB,KAAK4sB,sBACP,GAAC,CAAAptB,IAAA,sBAAAoB,MAED,WACEZ,KAAKgtB,wBACLhtB,KAAKitB,uBAEDrR,GACF5b,KAAKktB,gCAELltB,KAAKmtB,uCAET,GAEA,CAAA3tB,IAAA,wBAAAoB,MAKA,WACE,IAAMwsB,EAAe,CAAC1kB,YAAQlE,GAC9BxE,KACGqtB,sBAAsB,SAAS,SAAwBd,GACtD,IAAMjT,EAAQtZ,KAAKssB,wBAAwBC,GACtCjT,IACDiT,EAAItnB,OAAOP,aAAapC,EAAOrB,oBACnCjB,KAAK+oB,iBAAiBT,gBACtBtoB,KAAK+c,OAAO,QAASzD,IACvB,IAAG,GACF+T,sBAAsB,QAAQ,SAAuBd,GACpD,IAAMjT,EAAQtZ,KAAKssB,wBAAwBC,GACtCjT,IACDA,EAAM5U,aAAapC,EAAOrB,mBAC9BjB,KAAK+c,OAAO,OAAQzD,GACtB,IAAG,GACF+T,sBAAsB,QAAQ,SAAuBd,GACpD,IAAMjT,EAAQtZ,KAAKssB,wBAAwBC,GAC3C,GAAKjT,EAAL,CACA,IAAM0F,EAAYhf,KAAK+oB,iBAAiBuE,oBACpCtO,GAAaA,EAAUvF,aACzBzZ,KAAK+c,OAAO,YAAazD,EAAO,OAAQ0F,EAHxB,CAKpB,IACCqO,sBAAsB,OAAO,SAAsBd,GAClD,IAAMjT,EAAQtZ,KAAKssB,wBAAwBC,GAC3C,GAAKjT,EAAL,CACA,IAAM0F,EAAYhf,KAAK+oB,iBAAiBuE,oBACpCtO,GAAaA,EAAUvF,aACzBzZ,KAAK+c,OAAO,YAAazD,EAAO,MAAO0F,EAHvB,CAKpB,IACCqO,sBAAsB,SAAS,SAAwBd,GACtD,IAAMjT,EAAQtZ,KAAKssB,wBAAwBC,GAC3C,GAAKjT,EAAL,CAEAiT,EAAIgB,iBACJ,ItBhD6BtqB,EsBgDvB+b,EAAYhf,KAAK+oB,iBAAiBuE,oBAClC9T,EAAmB+S,EAAIiB,cAAcC,QAAQ,cAAgBlB,EAAIiB,cAAcC,QAAQ,cAE7FC,EAAyBC,GAAgBrU,EAAO0F,EAAWxF,GAApDM,EAAM4T,EAAN5T,OAAQP,EAAMmU,EAANnU,OACXO,EAAOrX,QtBpDkBQ,EsBqDHspB,EAAItnB,OAAO2oB,UtBpDpC,YAAYnb,KAAKxP,IsBqDdsW,EAAOsU,wBAAuB,WAC5BvU,EAAM3T,UtBtEb,SAAsB1C,EAAM6qB,GACjC,IAAK7qB,EAAM,MAAO,GAGlB,IAAM8qB,GAFN9qB,EAAO,GAAH0H,OAAM1H,IAEuB+qB,YAAYF,GAC7C,OAA6B,IAAzBC,EAAmC9qB,EAChC,GAAP0H,OACE1H,EAAKsV,MAAM,EAAGwV,IAAoBpjB,OsB+DiC,KtB7DvDA,OAEZ1H,EAAKsV,MAAMwV,EAAsBD,GAErC,CsByDgCG,CAAY3U,EAAM3T,UAAW,SACjD,IAEF3F,KAAK+c,OAAO,QAASzD,EAAOQ,EAAQP,GAGpCvZ,KAAK+c,OAAO,SAAUzD,IAEtBC,EAAOoF,qBAlBS,CAoBpB,IACC0O,sBAAsB,SAAS,SAAwBd,GACtD,IAAMjT,EAAQtZ,KAAKssB,wBAAwBC,GAC3C,GAAKjT,EAAL,CAEA,GDnJ8B,SAAChX,EAAQ2C,GAC7C,IAAOipB,EAAqC5rB,EAArC4rB,YAAazW,EAAwBnV,EAAxBmV,OAAQC,EAAgBpV,EAAhBoV,aAC5B,QAASwW,GAAexD,GAAuBjT,IAAWiT,GAAuBhT,IAAiBzS,EAAOkpB,iBAC3G,CCgJYC,CAAuB9rB,EAAQiqB,EAAItnB,QAAS,KAAAopB,EACxCrP,EAAYhf,KAAK+oB,iBAAiBuE,oBAExCF,EAAa1kB,OAAwB,QAAlB2lB,EAAGrP,EAAU7Y,aAAK,IAAAkoB,OAAA,EAAfA,EAAiBxlB,YACvCylB,YAAW,WACTlD,GAAiBpM,EAAU7Y,MAAO7D,EAAQiqB,EAAIroB,KAAMqoB,EAAItnB,OAAQmoB,EAAa1kB,OAC/E,GAAG,IAEL,CAEA1I,KAAK+c,OAAO,SAAUzD,EAZJ,CAapB,IAEC+T,sBAAsB,kBAAkB,SAAiCd,GACxE,IAAMjT,EAAQtZ,KAAKssB,wBAAwBC,GACtCjT,GACLtZ,KAAK+c,OAAO,SAAUzD,EACxB,GACJ,GAAC,CAAA9Z,IAAA,sBAAAoB,MAED,SAAqB2b,EAAOrP,EAASqhB,GACnC,KAAIhS,EAAMiS,QAAUjS,EAAM8N,SAAW9N,EAAM+N,SAAW/N,EAAMuN,UAA5D,CACA,IAAMvQ,EAASvZ,KAAK+oB,iBAAiBuE,oBAChC/T,IAAUA,EAAOE,cAGjBzZ,KAAKid,cAMRjd,KAAKid,cAAcd,OAAS,CAAC,UAL7Bnc,KAAKid,cAAgB,CACnBwR,UAAWlV,EAAO4F,wBAAwBI,KAC1CpD,OAAQ,CAAC,WAMK,OAAdoS,GAAsBhV,EAAOmV,kBAC/BnS,EAAMgR,iBACNhR,EAAMoS,kBACN3uB,KAAKid,cAAcd,OAAS,CAAC,SAAU,OAAQ,QAAS,UACxDnc,KAAK+c,OAAO,SAAU7P,EAASqhB,EAAWhV,IAG1B,SAAdgV,GAAwBhV,EAAOqV,iBACjCrS,EAAMgR,iBACNhR,EAAMoS,kBACN3uB,KAAKid,cAAcd,OAAS,CAAC,SAAU,OAAQ,QAAS,UACxDnc,KAAK+c,OAAO,SAAU7P,EAASqhB,EAAWhV,IAzBgC,CA2B9E,GAEA,CAAA/Z,IAAA,uBAAAoB,MAMA,WACEZ,KAAKqtB,sBAAsB,WAAW,SAAUd,GAC9C,IAAMjT,EAAQtZ,KAAKssB,wBAAwBC,GACtCjT,GACLtZ,KAAKmsB,SAAS0C,iBAAiBtC,EAAKjT,GAAO,EAC7C,IAAG,EACL,GAEA,CAAA9Z,IAAA,sBAAAoB,MAMA,WACE,IAAMvB,EAAOW,KAEbA,KAAKmsB,SACF1P,GAAG,MAAM,SAAUF,GAClBld,EAAKyvB,oBAAoBvS,EAAOvc,KAAM,KACxC,IAECyc,GAAG,QAAQ,SAAUF,GACpBld,EAAKyvB,oBAAoBvS,EAAOvc,KAAM,OACxC,IAECyc,GAAG,aAAa,SAAUF,GACzB,IAAM9O,EAAiBpO,EAAK0pB,iBAAiBwB,gBAC7C,GAAK9c,EAAewQ,SAApB,CAEA,IAAM1E,EAAS9L,EAAeqa,YACzBvO,EAAOwV,kBAEZxS,EAAMgR,iBACNhR,EAAMoS,kBACNtvB,EAAK0d,OAAO,QAAS/c,KAAM,SAAUuZ,GAPD,CAQtC,IAECkD,GAAG,UAAU,SAAUF,GACtB,IAAM9O,EAAiBpO,EAAK0pB,iBAAiBwB,gBAC7C,GAAK9c,EAAewQ,SAApB,CAEA,IAAM1E,EAAS9L,EAAeqa,YACzBvO,EAAOyV,gBAEZzS,EAAMgR,iBACNhR,EAAMoS,kBACNtvB,EAAK0d,OAAO,QAAS/c,KAAM,QAASuZ,GAPA,CAQtC,IAECkD,GAAG,SAAS,SAAUF,GACrBA,EAAMgR,iBACNhR,EAAMoS,kBACN,IACMpV,EADiBla,EAAK0pB,iBAAiBwB,gBACf7B,cAE1BnP,EAAOyV,cACT3vB,EAAK0d,OAAO,SAAU/c,KAAM,QAASuZ,GAC5BA,EAAOwV,gBAChB1vB,EAAK0d,OAAO,SAAU/c,KAAM,SAAUuZ,GAEtCla,EAAK0d,OAAO,QAAS/c,KAAMuZ,EAAOzB,SAAUyB,EAAOxB,QAASwB,EAEhE,IAECkD,GAAG,cAAc,SAAUF,GAC1BA,EAAMgR,iBACNhR,EAAMoS,kBACN,IAAMpV,EAASla,EAAK0pB,iBAAiBL,cACrCrpB,EAAK0d,OAAO,UAAW/c,KAAMuZ,EAC/B,IAECkD,GAAG,QAAQ,SAAUF,GACpBA,EAAMgR,iBACNhR,EAAMoS,kBACN,IAAM3P,EAAY3f,EAAK0pB,iBAAiBuE,oBACpCtO,EAAUvF,aACZpa,EAAK0d,OAAO,aAAciC,EAE9B,IAECvC,GAAG,UAAU,SAAUF,GACtBA,EAAMgR,iBACNhR,EAAMoS,kBACN,IAAM3P,EAAY3f,EAAK0pB,iBAAiBuE,oBACpCtO,EAAUvF,aACZpa,EAAK0d,OAAO,iBAAkBiC,EAElC,IAECvC,GAAG,aAAa,SAAUF,GACzBld,EAAK0d,OAAO,SAAU/c,KACxB,GACJ,GAEA,CAAAR,IAAA,gCAAAoB,MAKA,WAAiC,IAAAuhB,EAAA,KAC3B8M,GAAiB,EACjBC,GAA2B,EACzBnG,EAAmB/oB,KAAK+oB,iBAI9B/oB,KAAKqtB,sBAAsB,mBAAmB,SAACd,GAC7C,IAAMhT,EAAS4I,EAAK4G,iBAAiBuE,oBAEjC/T,GAAUA,EAAOE,aAAeF,EAAOwV,iBAAmBxV,EAAO4V,UACnEhN,EAAKpF,OAAO,mBAAoBxD,EAAOxN,KAAMwgB,EAAK,QACzChT,GAAUA,EAAOE,aAAeF,EAAOwV,gBAChD5M,EAAKpF,OAAO,mBAAoBxD,EAAOxN,KAAMwgB,EAAK,SACzChT,GAAUA,EAAOE,aAAeF,EAAO4V,WAChDhN,EAAKpF,OAAO,mBAAoBxD,EAAOxN,KAAMwgB,EAAK,OAGhD2C,EACFD,GAAiB,EAEjBlG,EAAiBqG,kBAErB,IAKApvB,KAAKqtB,sBAAsB,aAAa,SAAUd,GAC3CvsB,KAAKssB,wBAAwBC,MACY,IAA1CvsB,KAAKsC,OAAO+sB,4BACdH,GAA2B,EAI3BZ,YAAW,kBAAMvF,EAAiBqG,kBAAkB,GAAE,IAGxDpvB,KAAKkF,SAASwnB,iBAAiB,WAAW,WACxCwC,GAA2B,EAEvBD,IACFA,GAAiB,EACjBlG,EAAiBqG,mBAErB,GAAG,CACD5C,SAAS,EACT8C,MAAM,IAEV,GACF,GAEA,CAAA9vB,IAAA,wCAAAoB,MAMA,WAAyC,IAAA2uB,EAAA,KAEvCvvB,KAAKqtB,sBAAsB,WAAW,WAIpCiB,YAAW,kBAAMiB,EAAKxG,iBAAiBqG,kBAAkB,GAAE,EAC7D,IAGApvB,KAAKqtB,sBAAsB,SAAS,SAACd,GAC9BgD,EAAKjD,wBAAwBC,IAIlCgD,EAAKxG,iBAAiBqG,kBACxB,GACF,I,iFAAC,CA5W4B,GCJ/B,MCwBA,GAJA,SAAYxuB,EAAOonB,GACjB,OAAOpnB,IAAUonB,GAAUpnB,GAAUA,GAASonB,GAAUA,CAC1D,ECdA,GAVA,SAAsBwH,EAAOhwB,GAE3B,IADA,IAAIiD,EAAS+sB,EAAM/sB,OACZA,KACL,GAAI,GAAG+sB,EAAM/sB,GAAQ,GAAIjD,GACvB,OAAOiD,EAGX,OAAQ,CACV,ECfA,IAGIoa,GAHana,MAAMpC,UAGCuc,OCOxB,SAAS4S,GAAUC,GACjB,IAAI7kB,GAAS,EACTpI,EAAoB,MAAXitB,EAAkB,EAAIA,EAAQjtB,OAG3C,IADAzC,KAAK2vB,UACI9kB,EAAQpI,GAAQ,CACvB,IAAIyX,EAAQwV,EAAQ7kB,GACpB7K,KAAK4vB,IAAI1V,EAAM,GAAIA,EAAM,GAC3B,CACF,CAGAuV,GAAUnvB,UAAUqvB,MJlBpB,WACE3vB,KAAK6vB,SAAW,GAChB7vB,KAAK8vB,KAAO,CACd,EIgBAL,GAAUnvB,UAAkB,ODT5B,SAAyBd,GACvB,IAAI0E,EAAOlE,KAAK6vB,SACZhlB,EAAQ,GAAa3G,EAAM1E,GAE/B,QAAIqL,EAAQ,IAIRA,GADY3G,EAAKzB,OAAS,EAE5ByB,EAAKme,MAELxF,GAAOrc,KAAK0D,EAAM2G,EAAO,KAEzB7K,KAAK8vB,KACA,GACT,ECLAL,GAAUnvB,UAAUT,IChBpB,SAAsBL,GACpB,IAAI0E,EAAOlE,KAAK6vB,SACZhlB,EAAQ,GAAa3G,EAAM1E,GAE/B,OAAOqL,EAAQ,OAAIrG,EAAYN,EAAK2G,GAAO,EAC7C,EDYA4kB,GAAUnvB,UAAUyvB,IEjBpB,SAAsBvwB,GACpB,OAAO,GAAaQ,KAAK6vB,SAAUrwB,IAAQ,CAC7C,EFgBAiwB,GAAUnvB,UAAUsvB,IGjBpB,SAAsBpwB,EAAKoB,GACzB,IAAIsD,EAAOlE,KAAK6vB,SACZhlB,EAAQ,GAAa3G,EAAM1E,GAQ/B,OANIqL,EAAQ,KACR7K,KAAK8vB,KACP5rB,EAAKiD,KAAK,CAAC3H,EAAKoB,KAEhBsD,EAAK2G,GAAO,GAAKjK,EAEZZ,IACT,EHQA,YI5BA,GAFkC,iBAAV,EAAAF,GAAsB,EAAAA,GAAU,EAAAA,EAAOJ,SAAWA,QAAU,EAAAI,ECEpF,IAAIkwB,GAA0B,iBAAR3wB,MAAoBA,MAAQA,KAAKK,SAAWA,QAAUL,KAK5E,SAFW,IAAc2wB,IAAY/vB,SAAS,cAATA,GCDrC,GAFa,GAAKS,OCAlB,IAAIuvB,GAAcvwB,OAAOY,UAGrB,GAAiB2vB,GAAY1vB,eAO7B2vB,GAAuBD,GAAYntB,SAGnCqtB,GAAiB,GAAS,GAAOxvB,iBAAc6D,ECfnD,IAOI,GAPc9E,OAAOY,UAOcwC,SCHvC,IAII,GAAiB,GAAS,GAAOnC,iBAAc6D,EAkBnD,SATA,SAAoB5D,GAClB,OAAa,MAATA,OACe4D,IAAV5D,EAdQ,qBADL,gBAiBJ,IAAkB,MAAkBlB,OAAOkB,GFGrD,SAAmBA,GACjB,IAAIwvB,EAAQ,GAAe5vB,KAAKI,EAAOuvB,IACnCE,EAAMzvB,EAAMuvB,IAEhB,IACEvvB,EAAMuvB,SAAkB3rB,EACxB,IAAI8rB,GAAW,CACjB,CAAE,MAAOpwB,GAAI,CAEb,IAAIqwB,EAASL,GAAqB1vB,KAAKI,GAQvC,OAPI0vB,IACEF,EACFxvB,EAAMuvB,IAAkBE,SAEjBzvB,EAAMuvB,KAGVI,CACT,CEpBM,CAAU3vB,GDNhB,SAAwBA,GACtB,OAAO,GAAqBJ,KAAKI,EACnC,CCKM,CAAeA,EACrB,ECKA,GALA,SAAkBA,GAChB,IAAIQ,SAAcR,EAClB,OAAgB,MAATA,IAA0B,UAARQ,GAA4B,YAARA,EAC/C,ECQA,GAVA,SAAoBR,GAClB,IAAK,GAASA,GACZ,OAAO,EAIT,IAAIyvB,EAAM,GAAWzvB,GACrB,MA5BY,qBA4BLyvB,GA3BI,8BA2BcA,GA7BZ,0BA6B6BA,GA1B7B,kBA0BgDA,CAC/D,EC7BA,GAFiB,GAAK,sBCAtB,IACMG,GADFC,IACED,GAAM,SAASE,KAAK,IAAc,GAAWC,MAAQ,GAAWA,KAAKC,UAAY,KACvE,iBAAmBJ,GAAO,GCJ1C,IAGIK,GAHY5wB,SAASK,UAGIwC,SCK7B,IAGIguB,GAAe,8BAGf,GAAY7wB,SAASK,UACrB,GAAcZ,OAAOY,UAGrB,GAAe,GAAUwC,SAGzB,GAAiB,GAAYvC,eAG7BwwB,GAAa1N,OAAO,IACtB,GAAa7iB,KAAK,IAAgB0C,QAjBjB,sBAiBuC,QACvDA,QAAQ,yDAA0D,SAAW,KAmBhF,SARA,SAAsBtC,GACpB,SAAK,GAASA,KFxBEsP,EEwBiBtP,EFvBxB6vB,IAAeA,MAAcvgB,ME0BxB,GAAWtP,GAASmwB,GAAaD,IAChCre,KD9BjB,SAAkBvC,GAChB,GAAY,MAARA,EAAc,CAChB,IACE,OAAO2gB,GAAarwB,KAAK0P,EAC3B,CAAE,MAAOhQ,GAAI,CACb,IACE,OAAQgQ,EAAO,EACjB,CAAE,MAAOhQ,GAAI,CACf,CACA,MAAO,EACT,CCoBsB,CAASU,IF5B/B,IAAkBsP,CE6BlB,EC5BA,GALA,SAAmB8gB,EAAQxxB,GACzB,IAAIoB,ECJN,SAAkBowB,EAAQxxB,GACxB,OAAiB,MAAVwxB,OAAiBxsB,EAAYwsB,EAAOxxB,EAC7C,CDEc,CAASwxB,EAAQxxB,GAC7B,OAAO,GAAaoB,GAASA,OAAQ4D,CACvC,EERA,GAFU,GAAU,GAAM,OCC1B,GAFmB,GAAU9E,OAAQ,UCArC,IAMI,GAHcA,OAAOY,UAGQC,eCNjC,IAGI,GAHcb,OAAOY,UAGQC,eCOjC,SAAS0wB,GAAKvB,GACZ,IAAI7kB,GAAS,EACTpI,EAAoB,MAAXitB,EAAkB,EAAIA,EAAQjtB,OAG3C,IADAzC,KAAK2vB,UACI9kB,EAAQpI,GAAQ,CACvB,IAAIyX,EAAQwV,EAAQ7kB,GACpB7K,KAAK4vB,IAAI1V,EAAM,GAAIA,EAAM,GAC3B,CACF,CAGA+W,GAAK3wB,UAAUqvB,MChBf,WACE3vB,KAAK6vB,SAAW,GAAe,GAAa,MAAQ,CAAC,EACrD7vB,KAAK8vB,KAAO,CACd,EDcAmB,GAAK3wB,UAAkB,OEhBvB,SAAoBd,GAClB,IAAI+wB,EAASvwB,KAAK+vB,IAAIvwB,WAAeQ,KAAK6vB,SAASrwB,GAEnD,OADAQ,KAAK8vB,MAAQS,EAAS,EAAI,EACnBA,CACT,EFaAU,GAAK3wB,UAAUT,IFPf,SAAiBL,GACf,IAAI0E,EAAOlE,KAAK6vB,SAChB,GAAI,GAAc,CAChB,IAAIU,EAASrsB,EAAK1E,GAClB,MArBiB,8BAqBV+wB,OAA4B/rB,EAAY+rB,CACjD,CACA,OAAO,GAAe/vB,KAAK0D,EAAM1E,GAAO0E,EAAK1E,QAAOgF,CACtD,EECAysB,GAAK3wB,UAAUyvB,IDXf,SAAiBvwB,GACf,IAAI0E,EAAOlE,KAAK6vB,SAChB,OAAO,QAA8BrrB,IAAdN,EAAK1E,GAAsB,GAAegB,KAAK0D,EAAM1E,EAC9E,ECSAyxB,GAAK3wB,UAAUsvB,IGdf,SAAiBpwB,EAAKoB,GACpB,IAAIsD,EAAOlE,KAAK6vB,SAGhB,OAFA7vB,KAAK8vB,MAAQ9vB,KAAK+vB,IAAIvwB,GAAO,EAAI,EACjC0E,EAAK1E,GAAQ,SAA0BgF,IAAV5D,EAfV,4BAekDA,EAC9DZ,IACT,EHWA,YIdA,GAPA,SAAoB2T,EAAKnU,GACvB,ICJiBoB,EACbQ,EDGA8C,EAAOyP,EAAIkc,SACf,OCHgB,WADZzuB,SADaR,EDKApB,KCHmB,UAAR4B,GAA4B,UAARA,GAA4B,WAARA,EACrD,cAAVR,EACU,OAAVA,GDEDsD,EAAmB,iBAAP1E,EAAkB,SAAW,QACzC0E,EAAKyP,GACX,EEFA,SAASud,GAASxB,GAChB,IAAI7kB,GAAS,EACTpI,EAAoB,MAAXitB,EAAkB,EAAIA,EAAQjtB,OAG3C,IADAzC,KAAK2vB,UACI9kB,EAAQpI,GAAQ,CACvB,IAAIyX,EAAQwV,EAAQ7kB,GACpB7K,KAAK4vB,IAAI1V,EAAM,GAAIA,EAAM,GAC3B,CACF,CAGAgX,GAAS5wB,UAAUqvB,MCdnB,WACE3vB,KAAK8vB,KAAO,EACZ9vB,KAAK6vB,SAAW,CACd,KAAQ,IAAI,GACZ,IAAO,IAAK,IAAO,IACnB,OAAU,IAAI,GAElB,EDQAqB,GAAS5wB,UAAkB,OEf3B,SAAwBd,GACtB,IAAI+wB,EAAS,GAAWvwB,KAAMR,GAAa,OAAEA,GAE7C,OADAQ,KAAK8vB,MAAQS,EAAS,EAAI,EACnBA,CACT,EFYAW,GAAS5wB,UAAUT,IGhBnB,SAAqBL,GACnB,OAAO,GAAWQ,KAAMR,GAAKK,IAAIL,EACnC,EHeA0xB,GAAS5wB,UAAUyvB,IIjBnB,SAAqBvwB,GACnB,OAAO,GAAWQ,KAAMR,GAAKuwB,IAAIvwB,EACnC,EJgBA0xB,GAAS5wB,UAAUsvB,IKjBnB,SAAqBpwB,EAAKoB,GACxB,IAAIsD,EAAO,GAAWlE,KAAMR,GACxBswB,EAAO5rB,EAAK4rB,KAIhB,OAFA5rB,EAAK0rB,IAAIpwB,EAAKoB,GACdZ,KAAK8vB,MAAQ5rB,EAAK4rB,MAAQA,EAAO,EAAI,EAC9B9vB,IACT,ELYA,YMjBA,SAASmxB,GAAMzB,GACb,IAAIxrB,EAAOlE,KAAK6vB,SAAW,IAAI,GAAUH,GACzC1vB,KAAK8vB,KAAO5rB,EAAK4rB,IACnB,CAGAqB,GAAM7wB,UAAUqvB,MCXhB,WACE3vB,KAAK6vB,SAAW,IAAI,GACpB7vB,KAAK8vB,KAAO,CACd,EDSAqB,GAAM7wB,UAAkB,OEZxB,SAAqBd,GACnB,IAAI0E,EAAOlE,KAAK6vB,SACZU,EAASrsB,EAAa,OAAE1E,GAG5B,OADAQ,KAAK8vB,KAAO5rB,EAAK4rB,KACVS,CACT,EFOAY,GAAM7wB,UAAUT,IGbhB,SAAkBL,GAChB,OAAOQ,KAAK6vB,SAAShwB,IAAIL,EAC3B,EHYA2xB,GAAM7wB,UAAUyvB,IIdhB,SAAkBvwB,GAChB,OAAOQ,KAAK6vB,SAASE,IAAIvwB,EAC3B,EJaA2xB,GAAM7wB,UAAUsvB,IKPhB,SAAkBpwB,EAAKoB,GACrB,IAAIsD,EAAOlE,KAAK6vB,SAChB,GAAI3rB,aAAgB,GAAW,CAC7B,IAAI2U,EAAQ3U,EAAK2rB,SACjB,IAAK,IAAQhX,EAAMpW,OAAS2uB,IAG1B,OAFAvY,EAAM1R,KAAK,CAAC3H,EAAKoB,IACjBZ,KAAK8vB,OAAS5rB,EAAK4rB,KACZ9vB,KAETkE,EAAOlE,KAAK6vB,SAAW,IAAI,GAAShX,EACtC,CAGA,OAFA3U,EAAK0rB,IAAIpwB,EAAKoB,GACdZ,KAAK8vB,KAAO5rB,EAAK4rB,KACV9vB,IACT,ELLA,YMhBA,GARsB,WACpB,IACE,IAAIkQ,EAAO,GAAUxQ,OAAQ,kBAE7B,OADAwQ,EAAK,CAAC,EAAG,GAAI,CAAC,GACPA,CACT,CAAE,MAAOhQ,GAAI,CACf,CANqB,GCsBrB,GAbA,SAAyB8wB,EAAQxxB,EAAKoB,GACzB,aAAPpB,GAAsB,GACxB,GAAewxB,EAAQxxB,EAAK,CAC1B,cAAgB,EAChB,YAAc,EACd,MAASoB,EACT,UAAY,IAGdowB,EAAOxxB,GAAOoB,CAElB,ECHA,GAPA,SAA0BowB,EAAQxxB,EAAKoB,SACtB4D,IAAV5D,IAAwB,GAAGowB,EAAOxxB,GAAMoB,SAC9B4D,IAAV5D,KAAyBpB,KAAOwxB,KACnC,GAAgBA,EAAQxxB,EAAKoB,EAEjC,ECFA,GCPS,SAASowB,EAAQK,EAAUC,GAMhC,IALA,IAAIzmB,GAAS,EACT0mB,EAAW7xB,OAAOsxB,GAClBQ,EAAQF,EAASN,GACjBvuB,EAAS+uB,EAAM/uB,OAEZA,KAAU,CACf,IAAIjD,EAAMgyB,IAA6B3mB,GACvC,IAA+C,IAA3CwmB,EAASE,EAAS/xB,GAAMA,EAAK+xB,GAC/B,KAEJ,CACA,OAAOP,CACT,EClBF,IAAIS,GAAgC,iBAAXxyB,SAAuBA,UAAYA,QAAQgF,UAAYhF,QAG5EyyB,GAAaD,IAAgC,iBAAVvyB,QAAsBA,SAAWA,OAAO+E,UAAY/E,OAMvFyyB,GAHgBD,IAAcA,GAAWzyB,UAAYwyB,GAG5B,GAAKE,YAASntB,EACvCotB,GAAcD,GAASA,GAAOC,iBAAcptB,EAqBhD,MC7BA,GAFiB,GAAKqtB,WCYtB,GALA,SAAyBC,EAAYC,GACnC,ICFwBC,EACpBzB,EDCA0B,EAASF,GCFWC,EDEeF,EAAWG,OCD9C1B,EAAS,IAAIyB,EAAYE,YAAYF,EAAYG,YACrD,IAAI,GAAW5B,GAAQX,IAAI,IAAI,GAAWoC,IACnCzB,GDDqDuB,EAAWG,OACvE,OAAO,IAAIH,EAAWI,YAAYD,EAAQH,EAAWM,WAAYN,EAAWrvB,OAC9E,EEVA,IAAI4vB,GAAe3yB,OAAO4yB,OA0B1B,SAhBkB,WAChB,SAAStB,IAAU,CACnB,OAAO,SAASuB,GACd,IAAK,GAASA,GACZ,MAAO,CAAC,EAEV,GAAIF,GACF,OAAOA,GAAaE,GAEtBvB,EAAO1wB,UAAYiyB,EACnB,IAAIhC,EAAS,IAAIS,EAEjB,OADAA,EAAO1wB,eAAYkE,EACZ+rB,CACT,CACF,CAdiB,GCRjB,ICGiBrgB,GDLUxQ,OAAO8yB,eCKXC,GDL2B/yB,OCMzC,SAASgzB,GACd,OAAOxiB,GAAKuiB,GAAUC,GACxB,GAHF,IAAiBxiB,GAAMuiB,GCPnB,GAAc/yB,OAAOY,UAgBzB,SAPA,SAAqBM,GACnB,IAAI+xB,EAAO/xB,GAASA,EAAMsxB,YAG1B,OAAOtxB,KAFqB,mBAAR+xB,GAAsBA,EAAKryB,WAAc,GAG/D,ECaA,GAJA,SAAsBM,GACpB,OAAgB,MAATA,GAAiC,iBAATA,CACjC,ECTA,GAJA,SAAyBA,GACvB,OAAO,GAAaA,IAVR,sBAUkB,GAAWA,EAC3C,ECXA,IAAI,GAAclB,OAAOY,UAGrB,GAAiB,GAAYC,eAG7BqyB,GAAuB,GAAYA,qBAyBvC,SALkB,GAAgB,WAAa,OAAOpwB,SAAW,CAA/B,IAAsC,GAAkB,SAAS5B,GACjG,OAAO,GAAaA,IAAU,GAAeJ,KAAKI,EAAO,YACtDgyB,GAAqBpyB,KAAKI,EAAO,SACtC,ECRA,GAFc8B,MAAM2C,QCWpB,GALA,SAAkBzE,GAChB,MAAuB,iBAATA,GACZA,GAAS,GAAKA,EAAQ,GAAK,GAAKA,GA9Bb,gBA+BvB,ECAA,GAJA,SAAqBA,GACnB,OAAgB,MAATA,GAAiB,GAASA,EAAM6B,UAAY,GAAW7B,EAChE,EC1BA,IAAI,GAAgC,iBAAX3B,SAAuBA,UAAYA,QAAQgF,UAAYhF,QAG5E,GAAa,IAAgC,iBAAVC,QAAsBA,SAAWA,OAAO+E,UAAY/E,OAMvF,GAHgB,IAAc,GAAWD,UAAY,GAG5B,GAAK0yB,YAASntB,EAwB3C,UArBqB,GAAS,GAAOquB,cAAWruB,ICHhD,WACE,OAAO,CACT,ECVA,IAGI,GAAYvE,SAASK,UACrB,GAAcZ,OAAOY,UAGrB,GAAe,GAAUwC,SAGzB,GAAiB,GAAYvC,eAG7BuyB,GAAmB,GAAatyB,KAAKd,QCbzC,IA2BIqzB,GAAiB,CAAC,EACtBA,GAZiB,yBAYYA,GAXZ,yBAYjBA,GAXc,sBAWYA,GAVX,uBAWfA,GAVe,uBAUYA,GATZ,uBAUfA,GATsB,8BASYA,GARlB,wBAShBA,GARgB,yBAQY,EAC5BA,GAjCc,sBAiCYA,GAhCX,kBAiCfA,GApBqB,wBAoBYA,GAhCnB,oBAiCdA,GApBkB,qBAoBYA,GAhChB,iBAiCdA,GAhCe,kBAgCYA,GA/Bb,qBAgCdA,GA/Ba,gBA+BYA,GA9BT,mBA+BhBA,GA9BgB,mBA8BYA,GA7BZ,mBA8BhBA,GA7Ba,gBA6BYA,GA5BT,mBA6BhBA,GA5BiB,qBA4BY,EC1C7B,IAAI,GAAgC,iBAAX9zB,SAAuBA,UAAYA,QAAQgF,UAAYhF,QAG5E,GAAa,IAAgC,iBAAVC,QAAsBA,SAAWA,OAAO+E,UAAY/E,OAMvF8zB,GAHgB,IAAc,GAAW/zB,UAAY,IAGtB,GAAWg0B,QAG1CC,GAAY,WACd,IAIE,OAFY,IAAc,GAAWC,SAAW,GAAWA,QAAQ,QAAQC,OAOpEJ,IAAeA,GAAYK,SAAWL,GAAYK,QAAQ,OACnE,CAAE,MAAOnzB,GAAI,CACf,CAZe,GCVXozB,GDwBJ,OCxB4CC,aAqB5C,SAFmBD,GCjBnB,SAAmBpjB,GACjB,OAAO,SAAStP,GACd,OAAOsP,EAAKtP,EACd,CACF,CDasC,CAAU0yB,IF8BhD,SAA0B1yB,GACxB,OAAO,GAAaA,IAClB,GAASA,EAAM6B,WAAaswB,GAAe,GAAWnyB,GAC1D,EIrCA,GAZA,SAAiBowB,EAAQxxB,GACvB,IAAY,gBAARA,GAAgD,mBAAhBwxB,EAAOxxB,KAIhC,aAAPA,EAIJ,OAAOwxB,EAAOxxB,EAChB,ECdA,IAGI,GAHcE,OAAOY,UAGQC,eAoBjC,SARA,SAAqBywB,EAAQxxB,EAAKoB,GAChC,IAAI4yB,EAAWxC,EAAOxxB,GAChB,GAAegB,KAAKwwB,EAAQxxB,IAAQ,GAAGg0B,EAAU5yB,UACxC4D,IAAV5D,GAAyBpB,KAAOwxB,IACnC,GAAgBA,EAAQxxB,EAAKoB,EAEjC,ECxBA,IAGI6yB,GAAW,mBAoBf,SAVA,SAAiB7yB,EAAO6B,GACtB,IAAIrB,SAAcR,EAGlB,SAFA6B,EAAmB,MAAVA,EAfY,iBAewBA,KAGlC,UAARrB,GACU,UAARA,GAAoBqyB,GAAShhB,KAAK7R,KAChCA,GAAS,GAAKA,EAAQ,GAAK,GAAKA,EAAQ6B,CACjD,ECdA,IAGI,GAHc/C,OAAOY,UAGQC,eAqCjC,SA3BA,SAAuBK,EAAO8yB,GAC5B,IAAIC,EAAQ,GAAQ/yB,GAChBgzB,GAASD,GAAS,GAAY/yB,GAC9BizB,GAAUF,IAAUC,GAAS,GAAShzB,GACtCkzB,GAAUH,IAAUC,IAAUC,GAAU,GAAajzB,GACrDmzB,EAAcJ,GAASC,GAASC,GAAUC,EAC1CvD,EAASwD,EClBf,SAAmBzvB,EAAG+sB,GAIpB,IAHA,IAAIxmB,GAAS,EACT0lB,EAAS7tB,MAAM4B,KAEVuG,EAAQvG,GACfisB,EAAO1lB,GAASwmB,EAASxmB,GAE3B,OAAO0lB,CACT,CDU6B,CAAU3vB,EAAM6B,OAAQ8gB,QAAU,GACzD9gB,EAAS8tB,EAAO9tB,OAEpB,IAAK,IAAIjD,KAAOoB,GACT8yB,IAAa,GAAelzB,KAAKI,EAAOpB,IACvCu0B,IAEQ,UAAPv0B,GAECq0B,IAAkB,UAAPr0B,GAA0B,UAAPA,IAE9Bs0B,IAAkB,UAAPt0B,GAA0B,cAAPA,GAA8B,cAAPA,IAEtD,GAAQA,EAAKiD,KAElB8tB,EAAOppB,KAAK3H,GAGhB,OAAO+wB,CACT,EEzCA,IAGI,GAHc7wB,OAAOY,UAGQC,eAwBjC,SAfA,SAAoBywB,GAClB,IAAK,GAASA,GACZ,OCVJ,SAAsBA,GACpB,IAAIT,EAAS,GACb,GAAc,MAAVS,EACF,IAAK,IAAIxxB,KAAOE,OAAOsxB,GACrBT,EAAOppB,KAAK3H,GAGhB,OAAO+wB,CACT,CDEW,CAAaS,GAEtB,IAAIgD,EAAU,GAAYhD,GACtBT,EAAS,GAEb,IAAK,IAAI/wB,KAAOwxB,GACD,eAAPxxB,IAAyBw0B,GAAY,GAAexzB,KAAKwwB,EAAQxxB,KACrE+wB,EAAOppB,KAAK3H,GAGhB,OAAO+wB,CACT,EECA,GAJA,SAAgBS,GACd,OAAO,GAAYA,GAAU,GAAcA,GAAQ,GAAQ,GAAWA,EACxE,ECEA,GAJA,SAAuBpwB,GACrB,OCfF,SAAoB2L,EAAQilB,EAAOR,EAAQiD,GACzC,IAAIC,GAASlD,EACbA,IAAWA,EAAS,CAAC,GAKrB,IAHA,IAAInmB,GAAS,EACTpI,EAAS+uB,EAAM/uB,SAEVoI,EAAQpI,GAAQ,CACvB,IAAIjD,EAAMgyB,EAAM3mB,GAEZspB,EAAWF,EACXA,EAAWjD,EAAOxxB,GAAM+M,EAAO/M,GAAMA,EAAKwxB,EAAQzkB,QAClD/H,OAEaA,IAAb2vB,IACFA,EAAW5nB,EAAO/M,IAEhB00B,EACF,GAAgBlD,EAAQxxB,EAAK20B,GAE7B,GAAYnD,EAAQxxB,EAAK20B,EAE7B,CACA,OAAOnD,CACT,CDTS,CAAWpwB,EAAO,GAAOA,GAClC,EEgEA,GA9DA,SAAuBowB,EAAQzkB,EAAQ/M,EAAK40B,EAAUC,EAAWJ,EAAYK,GAC3E,ICJyB1zB,EDIrB4yB,EAAW,GAAQxC,EAAQxxB,GAC3B+0B,EAAW,GAAQhoB,EAAQ/M,GAC3Bg1B,EAAUF,EAAMz0B,IAAI00B,GAExB,GAAIC,EACF,GAAiBxD,EAAQxxB,EAAKg1B,OADhC,CAIA,IAAIL,EAAWF,EACXA,EAAWT,EAAUe,EAAW/0B,EAAM,GAAKwxB,EAAQzkB,EAAQ+nB,QAC3D9vB,EAEAiwB,OAAwBjwB,IAAb2vB,EAEf,GAAIM,EAAU,CACZ,IAAId,EAAQ,GAAQY,GAChBV,GAAUF,GAAS,GAASY,GAC5BG,GAAWf,IAAUE,GAAU,GAAaU,GAEhDJ,EAAWI,EACPZ,GAASE,GAAUa,EACjB,GAAQlB,GACVW,EAAWX,ECzBV,GADkB5yB,ED4BM4yB,IC3BD,GAAY5yB,GD4BpCuzB,EEjDR,SAAmB5nB,EAAQijB,GACzB,IAAI3kB,GAAS,EACTpI,EAAS8J,EAAO9J,OAGpB,IADA+sB,IAAUA,EAAQ9sB,MAAMD,MACfoI,EAAQpI,GACf+sB,EAAM3kB,GAAS0B,EAAO1B,GAExB,OAAO2kB,CACT,CFwCmB,CAAUgE,GAEdK,GACPY,GAAW,EACXN,E/BtCR,SAAqBlC,EAAQF,GAC3B,GAAIA,EACF,OAAOE,EAAO1Z,QAEhB,IAAI9V,EAASwvB,EAAOxvB,OAChB8tB,EAASqB,GAAcA,GAAYnvB,GAAU,IAAIwvB,EAAOC,YAAYzvB,GAGxE,OADAwvB,EAAO0C,KAAKpE,GACLA,CACT,C+B6BmB,CAAYgE,GAAU,IAE1BG,GACPD,GAAW,EACXN,EAAW,GAAgBI,GAAU,IAGrCJ,EAAW,GfpBnB,SAAuBvzB,GACrB,IAAK,GAAaA,IA5CJ,mBA4Cc,GAAWA,GACrC,OAAO,EAET,IAAI2xB,EAAQ,GAAa3xB,GACzB,GAAc,OAAV2xB,EACF,OAAO,EAET,IAAII,EAAO,GAAenyB,KAAK+xB,EAAO,gBAAkBA,EAAML,YAC9D,MAAsB,mBAARS,GAAsBA,aAAgBA,GAClD,GAAanyB,KAAKmyB,IAASG,EAC/B,CeYa,CAAcyB,IAAa,GAAYA,IAC9CJ,EAAWX,EACP,GAAYA,GACdW,EAAW,GAAcX,GAEjB,GAASA,KAAa,GAAWA,KACzCW,EGlER,SAAyBnD,GACvB,MAAqC,mBAAtBA,EAAOkB,aAA8B,GAAYlB,GAE5D,CAAC,EADD,GAAW,GAAaA,GAE9B,CH8DmB,CAAgBuD,KAI7BE,GAAW,CAEf,CACIA,IAEFH,EAAM1E,IAAI2E,EAAUJ,GACpBE,EAAUF,EAAUI,EAAUH,EAAUH,EAAYK,GACpDA,EAAc,OAAEC,IAElB,GAAiBvD,EAAQxxB,EAAK20B,EAnD9B,CAoDF,EIlDA,GAtBA,SAASS,EAAU5D,EAAQzkB,EAAQ6nB,EAAUH,EAAYK,GACnDtD,IAAWzkB,GAGf,GAAQA,GAAQ,SAASgoB,EAAU/0B,GAEjC,GADA80B,IAAUA,EAAQ,IAAI,IAClB,GAASC,GACX,GAAcvD,EAAQzkB,EAAQ/M,EAAK40B,EAAUQ,EAAWX,EAAYK,OAEjE,CACH,IAAIH,EAAWF,EACXA,EAAW,GAAQjD,EAAQxxB,GAAM+0B,EAAW/0B,EAAM,GAAKwxB,EAAQzkB,EAAQ+nB,QACvE9vB,OAEaA,IAAb2vB,IACFA,EAAWI,GAEb,GAAiBvD,EAAQxxB,EAAK20B,EAChC,CACF,GAAG,GACL,ECnBA,GAJA,SAAkBvzB,GAChB,OAAOA,CACT,ECfA,IAAIi0B,GAAYrU,KAAKsU,IAgCrB,MCdA,GATuB,GAA4B,SAAS5kB,EAAMxE,GAChE,OAAO,GAAewE,EAAM,WAAY,CACtC,cAAgB,EAChB,YAAc,EACd,OCGctP,EDHI8K,ECIb,WACL,OAAO9K,CACT,GDLE,UAAY,ICEhB,IAAkBA,CDAlB,EAPwC,GEXxC,IAIIm0B,GAAYC,KAAKC,ICQrB,SDGA,SAAkB/kB,GAChB,IAAIglB,EAAQ,EACRC,EAAa,EAEjB,OAAO,WACL,IAAIC,EAAQL,KACRM,EApBO,IAoBiBD,EAAQD,GAGpC,GADAA,EAAaC,EACTC,EAAY,GACd,KAAMH,GAzBI,IA0BR,OAAO1yB,UAAU,QAGnB0yB,EAAQ,EAEV,OAAOhlB,EAAKiN,WAAM3Y,EAAWhC,UAC/B,CACF,CCvBkB,CAAS,ICK3B,GAJA,SAAkB0N,EAAM3G,GACtB,OAAO,GLCT,SAAkB2G,EAAM3G,EAAOkpB,GAE7B,OADAlpB,EAAQsrB,QAAoBrwB,IAAV+E,EAAuB2G,EAAKzN,OAAS,EAAK8G,EAAO,GAC5D,WAML,IALA,IAAIhH,EAAOC,UACPqI,GAAS,EACTpI,EAASoyB,GAAUtyB,EAAKE,OAAS8G,EAAO,GACxCimB,EAAQ9sB,MAAMD,KAEToI,EAAQpI,GACf+sB,EAAM3kB,GAAStI,EAAKgH,EAAQsB,GAE9BA,GAAS,EAET,IADA,IAAIyqB,EAAY5yB,MAAM6G,EAAQ,KACrBsB,EAAQtB,GACf+rB,EAAUzqB,GAAStI,EAAKsI,GAG1B,OADAyqB,EAAU/rB,GAASkpB,EAAUjD,GMpBjC,SAAetf,EAAMqlB,EAAShzB,GAC5B,OAAQA,EAAKE,QACX,KAAK,EAAG,OAAOyN,EAAK1P,KAAK+0B,GACzB,KAAK,EAAG,OAAOrlB,EAAK1P,KAAK+0B,EAAShzB,EAAK,IACvC,KAAK,EAAG,OAAO2N,EAAK1P,KAAK+0B,EAAShzB,EAAK,GAAIA,EAAK,IAChD,KAAK,EAAG,OAAO2N,EAAK1P,KAAK+0B,EAAShzB,EAAK,GAAIA,EAAK,GAAIA,EAAK,IAE3D,OAAO2N,EAAKiN,MAAMoY,EAAShzB,EAC7B,CNaW,CAAM2N,EAAMlQ,KAAMs1B,EAC3B,CACF,CKpBqB,CAASplB,EAAM3G,EAAO,IAAW2G,EAAO,GAC7D,EEwBA,IC5BwBslB,GDwBG,SAASxE,EAAQzkB,EAAQ6nB,GAClD,GAAUpD,EAAQzkB,EAAQ6nB,EAC5B,ECzBS,IAAS,SAASpD,EAAQyE,GAC/B,IAAI5qB,GAAS,EACTpI,EAASgzB,EAAQhzB,OACjBwxB,EAAaxxB,EAAS,EAAIgzB,EAAQhzB,EAAS,QAAK+B,EAChDkxB,EAAQjzB,EAAS,EAAIgzB,EAAQ,QAAKjxB,EAWtC,IATAyvB,EAAcuB,GAAS/yB,OAAS,GAA0B,mBAAdwxB,GACvCxxB,IAAUwxB,QACXzvB,EAEAkxB,GCNR,SAAwB90B,EAAOiK,EAAOmmB,GACpC,IAAK,GAASA,GACZ,OAAO,EAET,IAAI5vB,SAAcyJ,EAClB,SAAY,UAARzJ,EACK,GAAY4vB,IAAW,GAAQnmB,EAAOmmB,EAAOvuB,QACrC,UAARrB,GAAoByJ,KAASmmB,IAE7B,GAAGA,EAAOnmB,GAAQjK,EAG7B,CDNiB,CAAe60B,EAAQ,GAAIA,EAAQ,GAAIC,KAClDzB,EAAaxxB,EAAS,OAAI+B,EAAYyvB,EACtCxxB,EAAS,GAEXuuB,EAAStxB,OAAOsxB,KACPnmB,EAAQpI,GAAQ,CACvB,IAAI8J,EAASkpB,EAAQ5qB,GACjB0B,GACFipB,GAASxE,EAAQzkB,EAAQ1B,EAE7B,CACA,OAAOmmB,CACT,KAvBF,IAAwBwE,G,2qBERxB,IAMqBG,GAAiB,WAInC,O,EAFD,SAAAA,EAAaC,I,4FAAmBnyB,CAAA,KAAAkyB,GAC9B31B,KAAK41B,kBAAoBA,CAC3B,G,EAAC,EAAAp2B,IAAA,QAAAoB,MAED,SAAOqC,EAAM4c,GACX,IAAK5c,EAAM,OAAO4c,EAAS,MAE3B,IAAMgW,EAAgB/e,GAA4B7T,GAElDjD,KAAK41B,kBAAkBC,GAAe,SAACC,GACrC,OAAIA,GAAmBA,EAAgBrzB,OAAS,EACvCod,EAAS,KAAMiW,GAEjBjW,EAAS,KAClB,GACF,M,8EAAC,CAjBmC,G,kxBCNtC,IAAMkW,GAAa,CACjB,GAAM,iBACN,IAAQ,UACR,KAAQ,UACR,KAAQ,WACR,KAAQ,WACR,KAAQ,qBACR,KAAQ,oBACR,KAAQ,mBACR,KAAQ,eACR,KAAQ,oBACR,KAAQ,aACR,OAAQ,aACR,OAAQ,wBACR,OAAQ,4BACR,IAAQ,qBAQJC,GAA8B,IAAI3S,OAAO,IAAD1Y,OADf,uCAC0C,KAAK,KAEzDsrB,GAAsB,WAIxC,O,EAFD,SAAAA,EAAarP,I,4FAAYnjB,CAAA,KAAAwyB,GACvBj2B,KAAK+hB,OAAS6E,CAChB,G,EAAC,EAAApnB,IAAA,cAAAoB,MAED,SAAaqC,GAAM,IAAAkf,EAAA,KACjB,GAAKlf,EAGL,O,ynBADaizB,CAAOjzB,EAAK0U,SAASqe,KACnBriB,KAAI,SAACuG,GAAK,OAAKiI,EAAKgU,aAAajc,EAAM,GACxD,GAAC,CAAA1a,IAAA,eAAAoB,MAED,SAAcgX,GACZ,IAcIwe,EAdE7U,EAAa3J,EAAM/M,MACnBwrB,GAaFD,EAbuBxe,EAAM,GAaZ0e,WAAW,GAC3B,GAAP3rB,OAAUyrB,EAAKtzB,SAAS,IAAIqQ,gBAbpBojB,EAAcR,GAAWM,GAC/B,MAAO,CACL9U,WAAAA,EACAC,SAAUD,EAAa3J,EAAMnV,OAC7BmV,MAAOA,EAAM,GACboK,MAAO,GAAFrX,OAAK4rB,EAAW,SAAA5rB,OAAQ0rB,EAAO,KACpCtU,OAAQ/hB,KAAK+hB,OAEjB,M,8EAAC,CAxBwC,G,+qBC3BtByU,GAAe,WAIjC,O,EAFD,SAAAA,K,4FAAe/yB,CAAA,KAAA+yB,GACbx2B,KAAKoV,QAAU,EACjB,E,EAAC,EAAA5V,IAAA,aAAAoB,MAED,SAAYwU,GACLA,SAAAA,EAAS3S,SACdzC,KAAKoV,QAQT,SAAuBqhB,EAAUC,GAc/B,IAbA,IAAI3yB,EACE4yB,EAAUF,EAASh0B,OACnBm0B,EAAUF,EAASj0B,OACrBo0B,GAAgB,EACdC,EAAS,GAET3gB,EAAQ,CACZ4gB,GAAIN,EACJO,GAAI,EACJC,GAAIP,EACJQ,GAAI,GAGC/gB,EAAM6gB,GAAKL,GAAWxgB,EAAM+gB,GAAKN,IACtC7yB,EAAOozB,GAAShhB,IACPoL,YAAcsV,GACrBC,EAAO3vB,KAAKpD,GAEd8yB,EAAe9yB,EAAKyd,SAGtB,OAAOsV,CACT,CA/BmBM,CAAap3B,KAAKoV,QAASA,GAC5C,I,iFAAC,CATiC,GAyCpC,SAAS+hB,GAAUhhB,GACjB,IAAM6gB,EAAK7gB,EAAM6gB,GACXE,EAAK/gB,EAAM+gB,GACXG,EAAQlhB,EAAM4gB,GAAGC,GACjBM,EAAQnhB,EAAM8gB,GAAGC,GAEvB,OAAIG,GAASC,GAASD,EAAM9V,WAAa+V,EAAM/V,YAC7CpL,EAAM6gB,GAAKA,EAAK,EACTK,GACEA,GAASC,GAClBnhB,EAAM+gB,GAAKA,EAAK,EACTI,GACED,GACTlhB,EAAM6gB,GAAKA,EAAK,EACTK,GACEC,GACTnhB,EAAM+gB,GAAKA,EAAK,EACTI,QAEP,CAEJ,C,oqDC9CA,IACqBC,GAAqB,WA4CxC,O,EA1CA,SAAAA,EAAatL,EAAUuL,EAAeC,I,4FAAkBh0B,CAAA,KAAA8zB,GACtDv3B,KAAKisB,SAAWA,EAChBjsB,KAAKsd,IAAM2O,EAAS3O,IACpBtd,KAAK03B,yBAAsBlzB,EAC3BxE,KAAK23B,kCAA+BnzB,EACpCxE,KAAK43B,QAAU,CAAC,EAoBhB53B,KAAKsC,OAASu1B,GAAO,CAAC,EAlBA,CACpBC,aAAa,EACbC,cAAc,EACdC,eAAe,EAEfC,SAAU,IAEVC,oBAAoB,EACpBC,WAAY,CACVpW,OAAQ,6CACRkW,SAAU,IACVrC,kBAAmB,WAAa,GAElCwC,WAAY,CACVrW,OAAQ,+CAI4ByV,GAExC,IAAM5B,EAAoB51B,KAAKsC,OAAO61B,WAAWvC,kBAC3CyC,EAAmBr4B,KAAKsC,OAAO61B,WAAWpW,OAC1CuW,EAAmBt4B,KAAKsC,OAAO81B,WAAWrW,OAC1CwW,EAAuB/U,GAC1BQ,iBAAiBsU,EAAkB,aAAct4B,KAAKsd,KACzDtd,KAAKw4B,qBAAuBhV,GACzBQ,iBAAiBqU,EAAkB,aAAcr4B,KAAKsd,KAEzDtd,KAAK41B,kBAAoB,IAAID,GAAkBC,GAC/C51B,KAAKo4B,WAAa,IAAInC,GAAuBsC,GAE7Cv4B,KAAKy4B,gBACP,E,EAGA,EAAAj5B,IAAA,iBAAAoB,MAEA,WAAkB,IAAAuhB,EAAA,KACZniB,KAAKsC,OAAOy1B,eACd/3B,KAAKisB,SAASxP,GAAG,SAAS,kBAAa0F,EAAKuW,QAAOvb,MAAZgF,EAAI3f,UAAiB,IAC5DxC,KAAKisB,SAASxP,GAAG,QAAQ,kBAAa0F,EAAKwW,OAAMxb,MAAXgF,EAAI3f,UAAgB,MAExDxC,KAAKsC,OAAO01B,eAAiBh4B,KAAKsC,OAAO41B,qBAC3Cl4B,KAAKisB,SAASxP,GAAG,UAAU,kBAAa0F,EAAKyW,SAAQzb,MAAbgF,EAAI3f,UAAkB,IAE5DxC,KAAKsC,OAAOw1B,aACd93B,KAAKisB,SAASxP,GAAG,QAAQ,kBAAa0F,EAAK0W,OAAM1b,MAAXgF,EAAI3f,UAAgB,GAE9D,GAAC,CAAAhD,IAAA,SAAAoB,MAED,SAAQmd,GACN/d,KAAK84B,UAAU/a,EACjB,GAAC,CAAAve,IAAA,UAAAoB,MAED,SAASmd,GACH/d,KAAK03B,sBAAwB3Z,IAC/B/d,KAAK03B,oBAAsB3Z,EAC3B/d,KAAK+4B,mBAAmBhb,GAE5B,GAAC,CAAAve,IAAA,SAAAoB,MAED,SAAQmd,GACF/d,KAAK03B,sBAAwB3Z,IAC/B/d,KAAK03B,yBAAsBlzB,EAE/B,GAAC,CAAAhF,IAAA,WAAAoB,MAED,SAAUmd,GACJ/d,KAAKsC,OAAO01B,eACdh4B,KAAK+4B,mBAAmBhb,EAAc/d,KAAKsC,OAAO21B,UAEhDj4B,KAAKsC,OAAO41B,oBACdl4B,KAAKg5B,yBAAyBjb,EAElC,GAGA,CAAAve,IAAA,qBAAAoB,MAEA,SAAoBmd,EAAcka,GAAU,IAAA1I,EAAA,KACtCvvB,KAAK43B,QAAQzpB,IAAMnO,KAAK43B,QAAQ7Z,eAAiBA,GACnDkb,aAAaj5B,KAAK43B,QAAQzpB,IAG5B,IAAM+qB,EAAY5K,YAAW,WAC3BiB,EAAKuJ,UAAU/a,GAEfwR,EAAKqI,QAAU,CAAC,CAClB,GAAGK,GAAY,GAEfj4B,KAAK43B,QAAU,CACbzpB,GAAI+qB,EACJnb,aAAcA,EAElB,GAAC,CAAAve,IAAA,YAAAoB,MAED,SAAWmd,GAAc,IAAAob,EAAA,KACjBzS,EAAajD,GAAc/C,YAAY3C,GAG7C/d,KAAK41B,kBAAkBwD,MAAM1S,GAAY,SAACtb,EAAK0qB,GAC7C,IAAI1qB,GAAQ2S,EAAasb,YAAzB,CAGA,IAAMp2B,EAAOwgB,GAAc/C,YAAY3C,GAEjCub,EAAkB,IAAI9C,GAExBphB,E3G5HH,SAAyBnS,EAAMs2B,EAAOxX,GAE3C,OAAOO,GAAYrf,EAAMs2B,EADP,OACyBxX,EAC7C,C2GyHoByX,CAAev2B,EAAM6yB,EAAiBqD,EAAKX,sBACzDc,EAAgBG,WAAWrkB,GAE3BA,EAAU+jB,EAAKf,WAAW9V,YAAYrf,GACtCq2B,EAAgBG,WAAWrkB,GAE3B+jB,EAAKO,qBAAqB3b,EAAcub,EAAgBlkB,QAbT,CAcjD,GACF,GAGA,CAAA5V,IAAA,uBAAAoB,MACA,SAAsBmd,EAAc3I,GAAS,IAAAukB,EAAA,KACrC3a,EAAYhf,KAAKisB,SAAShmB,aAAa8X,GACzCiB,EACFA,EAAU6O,wBAAuB,WAC/B8L,EAAK7Y,iBAAiB/C,EAAc3I,EACtC,IAEApV,KAAK8gB,iBAAiB/C,EAAc3I,GAElCpV,KAAKisB,SAAStI,YAChB3jB,KAAKisB,SAAStI,WAAW5G,OAAO,oBAAqBgB,EAEzD,GAAC,CAAAve,IAAA,mBAAAoB,MAED,SAAkBmd,EAAc3I,GAE9BpV,KAAK45B,iBAAiB7b,GAGlB3I,GAAWA,EAAQ3S,OAAS,GAE9BghB,GAAc3C,iBAAiB/C,EAAc3I,EAEjD,GAAC,CAAA5V,IAAA,mBAAAoB,MAED,SAAkBmd,GAChBA,EAAezY,EAAYyY,EAAc/d,KAAKsd,IAAIpY,UAAS,IAC8C6F,EAD9CC,EAAAC,GACxCjG,EAAS,+DAAgE+Y,IAAa,IAAzG,IAAA/S,EAAAE,MAAAH,EAAAC,EAAA1G,KAAAD,MACEyS,GADa/L,EAAAnK,MAEd,OAAAwK,GAAAJ,EAAA9K,EAAAkL,EAAA,SAAAJ,EAAAK,GAAA,CACH,GAAC,CAAA7L,IAAA,2BAAAoB,MAED,SAA0Bmd,GACxBA,EAAezY,EAAYyY,EAAc/d,KAAKsd,IAAIpY,UAClD,IAAM8Z,EAAYhf,KAAKisB,SAAShmB,aAAa8X,GAC7C,GAAIiB,GAAaA,EAAUf,SAAU,CACnC,IAKI+C,EALA6Y,EAAkB7a,EAAU7Y,MAAMkB,eAClCwyB,EAAgB51B,WAAaA,IAC/B41B,EAAkBA,EAAgBj1B,YAIpC,EAAG,CACD,GAAIi1B,IAAoB9b,EAAc,OACtC,IAAMqH,EAAgByU,EAAgBn1B,aAAa,kBACnD,GAAsB,eAAlB0gB,GAAoD,eAAlBA,EAAgC,CACpEpE,EAAS6Y,EAAgBn1B,aAAa,gBACtC,KACF,CACF,OAAUm1B,EAAkBA,EAAgBj1B,YAExCoc,GACFhC,EAAU6O,wBAAuB,WAAM,IACkC5c,EADlCC,EAAAjG,GAClBjG,EAAS,kBAAD2F,OAAmBqW,EAAM,MAAMjD,IAAa,IAAvE,IAAA7M,EAAAhG,MAAA+F,EAAAC,EAAA5M,KAAAD,MACEyS,GADa7F,EAAArQ,MAEd,OAAAwK,GAAA8F,EAAAhR,EAAAkL,EAAA,SAAA8F,EAAA7F,GAAA,CACH,GAEJ,CACF,I,iFAAC,CA5LuC,GCZ3B,SAASxK,KACtB,IAAmB,IAAfyB,EAAOzB,KAEN+B,EAAAA,EAAOC,QAAZ,CAEA,IAAMN,EAA4B,IAArBC,UAAUC,OAAeD,UAAU,GAAKE,MAAMC,KAAKH,WAOhE,OALyB,IAArBA,UAAUC,QAA0C,UAA1BF,EAAKA,EAAKE,OAAS,KAC/CF,EAAK8f,MACDxf,QAAQi3B,OAAOj3B,QAAQi3B,SAGtBj3B,QAAQhC,IAAI0B,EATQ,CAU7B,CClBY,SAAAw3B,GAAAt5B,EAAA6f,IAAA,MAAAA,GAAAA,EAAA7f,EAAAgC,UAAA6d,EAAA7f,EAAAgC,QAAA,QAAAvC,EAAA,EAAAoE,EAAA5B,MAAA4d,GAAApgB,EAAAogB,EAAApgB,IAAAoE,EAAApE,GAAAO,EAAAP,GAAA,OAAAoE,CAAA,CAGL,SAAS01B,GAAgBlzB,GAE9B,OALU,SAAArG,GAAA,GAAAiC,MAAA2C,QAAA5E,GAAA,OAAAs5B,GAAAt5B,EAAA,CAAAw5B,CAAAx5B,EAIO,IAAI8C,EAAauD,EAAM,qBAJ9B,SAAArG,GAAA,uBAAAC,QAAA,MAAAD,EAAAC,OAAAoD,WAAA,MAAArD,EAAA,qBAAAiC,MAAAC,KAAAlC,EAAA,CAAAy5B,CAAAz5B,IAAA,SAAAA,EAAA6f,GAAA,GAAA7f,EAAA,qBAAAA,EAAA,OAAAs5B,GAAAt5B,EAAA6f,GAAA,IAAA6Z,EAAA,GAAAr3B,SAAAtC,KAAAC,GAAA8X,MAAA,uBAAA4hB,GAAA15B,EAAAyxB,cAAAiI,EAAA15B,EAAAyxB,YAAA7wB,MAAA,QAAA84B,GAAA,QAAAA,EAAAz3B,MAAAC,KAAAlC,GAAA,cAAA05B,GAAA,2CAAA1nB,KAAA0nB,GAAAJ,GAAAt5B,EAAA6f,QAAA,GAAA8Z,CAAA35B,IAAA,qBAAA45B,UAAA,wIAAAC,GAAA,IAAA75B,CAMZ,CAIO,SAAS85B,GAA4B1wB,GAI1C,IAJoE,IAGhE2wB,EAHyCC,EAAS5wB,EAAT4wB,UAAWC,EAAS7wB,EAAT6wB,UACpDC,EAAmB,EACnBC,EAAiB,EAEZpuB,EAAI,EAAGA,EAAIiuB,EAAUh4B,OAAQ+J,IAAK,CACzC,IAAM1F,EAAO2zB,EAAUjuB,GACvB,GAAIkuB,GAAaC,EAAmB7zB,EAAKgK,YAAYrO,OAAQ,CAC3D+3B,EAAa1zB,EACb8zB,EAAiBF,EAAYC,EAC7B,KACF,CACAA,GAAoB7zB,EAAKgK,YAAYrO,MACvC,CACA,MAAO,CAACqE,KAAM0zB,EAAYI,eAAAA,EAC5B,CCoDA,SAASC,GAAU32B,GACjBA,EAAK42B,WAAa52B,EAAK62B,cACvB72B,EAAK62B,cAAgBva,KAAKwa,OAAO92B,EAAK62B,cAAgB72B,EAAK+2B,WAAa,EAC1E,CAEA,SAASC,GAAWh3B,GAClBA,EAAK+2B,UAAY/2B,EAAK62B,cACtB72B,EAAK62B,cAAgBva,KAAK2a,MAAMj3B,EAAK62B,cAAgB72B,EAAK42B,YAAc,EAC1E,CAEA,SAASM,GAA4B/wB,GAAuB,IAC1DgxB,EAA+Bd,GAA6B,CAACE,UADdpwB,EAATowB,UACkCC,UADjBrwB,EAAN3B,SAC1C5B,EAAIu0B,EAAJv0B,KAAM8zB,EAAcS,EAAdT,eAEPU,EAAWx0B,EAAKiH,cAAc/H,cAIpC,OAHAs1B,EAAStyB,SAASlC,EAAM8zB,GACxBU,EAASvsB,UAAS,GAEXusB,CACT,C,oqDC3DO,IAAMC,GAAQ,WAoBnB,O,EAlBA,SAAAA,EAAaC,I,4FAAgB/3B,CAAA,KAAA83B,GAC3B,ICnCIE,EDmCEC,EAAwB,CAC5Bv7B,OACAw7B,iBAAiB,EACjBtM,2BAA2B,EAC3BuM,mBAAmB,GAGrB57B,KAAKsC,OAAS5C,OAAOm8B,OAAOH,EAAuBF,GACnDx7B,KAAKsd,IAAMtd,KAAKsC,OAAOnC,OACvBH,KAAKksB,iBAAmB,IAAHvhB,OAAOrI,EAAOvB,eAEnCf,KAAK2jB,WAAa,IAAIqI,GAAWhsB,OACG,IAAhCA,KAAKsC,OAAOq5B,iBACd37B,KAAK2jB,WAAWlH,IChDdgf,ECaO,SAAgCxP,GAC7C,IAAM/mB,EAAW+mB,EAAS3O,IAAIpY,SAQ9B,MAAO,CAEL42B,MAAK,SAAE5uB,GACA8D,EAAc9D,IAKnBA,EAAQqB,YAAYrJ,EAASsJ,eAAe,UAC9C,EAEAutB,KAAI,SAAE7uB,GAMAhI,EAAS0Z,gBAAkB1R,GAE/B4J,GAAuB5J,EACzB,EAEA8R,UAAS,SAAE9R,EAAS8R,GAClBne,GAAIme,EAAY,6BAA+B,mCACjD,EAEAzF,OAAM,SAAErM,EAASqM,GACf1Y,GAAI0Y,EAAS,0BAA4B,gCAC3C,EAEAyiB,QAAO,SAAE9uB,EAASqM,GAGhB,GAAIA,EAAOyV,cAAe,KAAAiN,EAClBC,EAAKh3B,EAASM,cAAc,MAClC+T,EAAO3K,aAAastB,IAKJ,QAAdD,EAAAC,EAAGv3B,mBAAW,IAAAs3B,OAAA,EAAdA,EAAgBh4B,YAAaA,GACK,WAAlCi4B,EAAGv3B,YAAYmM,YAAY,IAE3ByI,EAAO4iB,YAAYj3B,EAASsJ,eAAe,UAE/C,MACE+K,EAAO3K,aAAa1J,EAASM,cAAc,OAG7C+T,EAAOoF,qBACT,EAEAyd,OAAM,SAAElvB,EAASqhB,EAAWhV,GAC1B,IAAM7L,EAASR,EAAQtI,WACjBy3B,EAAanvB,EAAQkE,WAAU,GAGrC,OAFIirB,EAAWluB,IAAIkuB,EAAWhiB,gBAAgB,MAEtCkU,GACN,IAAK,SACH7gB,EAAOkB,aAAaytB,EAAYnvB,GAChCA,EAAQ4uB,QACR,MACF,IAAK,QACHpuB,EAAOkB,aAAaytB,EAAYnvB,EAAQvI,aACxC03B,EAAWP,QAGjB,EAEA7hB,MAAK,SAAE/M,EAAS4K,EAAQC,EAAOwB,GAC7B,IAAM+iB,EAAUpvB,EAAQkE,WAAU,GAMlC,IALAkrB,EAAQ/tB,YAAYuJ,GAEL5K,EAAQtI,WAChBgK,aAAa0tB,EAASpvB,GAEtBA,EAAQzI,YAAYyI,EAAQmE,YAAYnE,EAAQzI,YAEvDyI,EAAQqB,YAAYwJ,GACpBjB,GAAiBwlB,GACjBxlB,GAAiB5J,GACjBA,EAAQ4uB,OACV,EAEAS,MAAK,SAAErvB,EAASqhB,EAAWhV,GACzB,IAAIrQ,EAAWszB,EAEf,OAAQjO,GACN,IAAK,SACHrlB,EAAYoQ,GAAepM,GAC3BsvB,EAAStvB,EACT,MACF,IAAK,QACHhE,EAAYgE,EACZsvB,EAASljB,GAAWpM,GAIlBhE,GAAaszB,IAEnBjjB,EAASrQ,EAAUa,WAAWtH,OAAS,EACnCwpB,EAASwQ,SAASvzB,EAAWszB,EAAO72B,WACpCsmB,EAASyQ,UAAUxzB,EAAWszB,EAAO72B,WAGzC62B,EAAOptB,SAEPmK,EAAOlK,OACPyH,GAAiB5N,GACjBqQ,EAAOzJ,UACPyJ,EAAOoF,sBACT,EAEAge,MAAK,SAAEzvB,GACLrM,GAAI,yBACN,EAAC,gBAEOqM,EAASqhB,EAAWhV,GAC1B,OAAQgV,GACN,IAAK,SACH,IAAM5qB,EAAW2V,GAAepM,GAC5BvJ,IACF4V,EAAOqjB,cAAcj5B,GACrB4V,EAAOoF,uBAET,MACF,IAAK,QACH,IAAM5a,EAAOuV,GAAWpM,GACpBnJ,IACFwV,EAAOsjB,gBAAgB94B,GACvBwV,EAAOoF,uBAIf,EAEAme,KAAI,SAAE5vB,EAAS8R,EAAWuP,GACxB1tB,GAAI,wBACN,EAEAwY,MAAK,SAAEnM,EAAS4M,EAAQP,GACtB,GAAsB,IAAlBO,EAAOrX,OAAX,CAGA,GADA8W,EAAO3K,aAAakL,EAAOoD,SACL,IAAlBpD,EAAOrX,OAAc,OAAO8W,EAAOoF,sBAEvC,IAAMjR,EAASR,EAAQtI,WACnBm4B,EAAiB7vB,EAErB4M,EAAO3E,SAAQ,SAACa,GACd,IAAMqmB,EAAanvB,EAAQkE,WAAU,GACjCirB,EAAWluB,IAAIkuB,EAAWhiB,gBAAgB,MAC9C,IAAMrN,EAAW8J,GAAiCd,GAClDqmB,EAAW9tB,YAAYvB,GACvBU,EAAOkB,aAAaytB,EAAYU,EAAep4B,aAC/Co4B,EAAiBV,CACnB,IAGApQ,EAAS+Q,kBAAkBD,GACxBpe,qBAnB4B,CAoBjC,EAEAgP,UAAS,SAAEzgB,EAAS+vB,EAAQ1jB,GAC1B1Y,GAAI,6BACN,EAEAq8B,WAAU,SAAEle,GACVA,EAAUke,YACZ,EAEAC,eAAc,SAAEne,GACdA,EAAUme,gBACZ,EAEJ,CDrMmBC,CDgD0Bp9B,MC9CpC,CAQL87B,MAAK,SAAE5uB,GACLuuB,EAASK,MAAM5uB,EACjB,EASA6uB,KAAI,SAAE7uB,GACJuuB,EAASM,KAAK7uB,EAChB,EAUAmwB,KAAI,SAAEnwB,EAAS+vB,GACbxB,EAAS4B,KAAKnwB,EAAS+vB,EACzB,EAWAje,UAAS,SAAE9R,EAAS8R,GAClByc,EAASzc,UAAU9R,EAAS8R,EAC9B,EAUAzF,OAAM,SAAErM,EAASqM,GACfkiB,EAASliB,OAAOrM,EAASqM,EAC3B,EAWAyiB,QAAO,SAAE9uB,EAASqM,GAChBkiB,EAASO,QAAQ9uB,EAASqM,EAC5B,EAaAU,MAAK,SAAE/M,EAAS4K,EAAQC,EAAOwB,GAC7BkiB,EAASxhB,MAAM/M,EAAS4K,EAAQC,EAAOwB,EACzC,EAaA6iB,OAAM,SAAElvB,EAASqhB,EAAWhV,GAC1BkiB,EAASW,OAAOlvB,EAASqhB,EAAWhV,EACtC,EAcAgjB,MAAK,SAAErvB,EAASqhB,EAAWhV,GACzBkiB,EAASc,MAAMrvB,EAASqhB,EAAWhV,EACrC,EASAojB,MAAK,SAAEzvB,GACLuuB,EAASkB,MAAMzvB,EACjB,EAEA,gBAUQA,EAASqhB,EAAWhV,GAC1BkiB,EAAQ,OAAQvuB,EAASqhB,EAAWhV,EACtC,EAaAujB,KAAI,SAAE5vB,EAAS8R,EAAWuP,GACxBkN,EAASqB,KAAK5vB,EAAS8R,EAAWuP,EACpC,EAWAZ,UAAS,SAAEzgB,EAAS+vB,EAAQje,GAC1Byc,EAAS9N,UAAUzgB,EAAS+vB,EAAQje,EACtC,EAUA3F,MAAK,SAAEnM,EAAS4M,EAAQP,GACtBkiB,EAASpiB,MAAMnM,EAAS4M,EAAQP,EAClC,EAQA2jB,WAAU,SAAEle,GACVyc,EAASyB,WAAWle,EACtB,EAQAme,eAAc,SAAEne,GACdyc,EAAS0B,eAAene,EAC1B,ID1JF,E,EAEA,EAAAxf,IAAA,MAAAoB,MAqCA,SAAKqE,EAAQqV,GAGX,OAFAta,KAAKs9B,OAAOr4B,EAAQqV,GAEbta,IACT,GAEA,CAAAR,IAAA,SAAAoB,MAUA,SAAQqE,GACN,IAAMs4B,EAAUv4B,EAASC,EAAQjF,KAAKsd,IAAIpY,UAE1ClF,KAAKw9B,QAAQD,GAAQ,IAEQxyB,EAFRC,EAAAC,GAECsyB,GAAO,IAA7B,IAAAvyB,EAAAE,MAAAH,EAAAC,EAAA1G,KAAAD,MAAkB0G,EAAAnK,MACRgW,UAAUxH,OAAO9M,EAAOtB,sBACjC,OAAAoK,GAAAJ,EAAA9K,EAAAkL,EAAA,SAAAJ,EAAAK,GAAA,CAED,OAAOrL,IACT,GAEA,CAAAR,IAAA,UAAAoB,MASA,SAASqE,GACP,IAE6BgM,EvH7GRnL,EuH2G4DoL,EAAAjG,GAAjEjG,EAASC,GAAU,IAAJ0F,OAAQrI,EAAOvB,eAAiBf,KAAKsd,IAAIpY,WAE3C,IAA7B,IAAAgM,EAAAhG,MAAA+F,EAAAC,EAAA5M,KAAAD,OvH7GqByB,EuH6GHmL,EAAArQ,OvH5GfyZ,gBAAgB,mBACrBvU,EAAKuU,gBAAgB,cACrBvU,EAAKuU,gBAAgB,kBA4BhB,SAAmBvU,GACxB,GAAIA,EAAK2Q,aAAa,iBAAkB,CACtC,IAAMtI,EAAKrI,EAAKpB,aAAa,iBAC7ByR,GAAMhI,QA7BO3J,CA8Bf,CACF,CA/BEi5B,CAAS33B,GAETA,EAAK8Q,UAAUxH,OAAO9M,EAAOvB,eAC7B+E,EAAK8Q,UAAUC,IAAIvU,EAAOtB,sBuHuGvB,OAAAoK,GAAA8F,EAAAhR,EAAAkL,EAAA,SAAA8F,EAAA7F,GAAA,CAED,OAAOrL,IACT,GAEA,CAAAR,IAAA,SAAAoB,MAWA,SAAQqE,EAAQqV,GACd,IAO6BqK,EAP7B9a,EAGIyQ,QAAAA,EAAW,CAAC,EAACojB,EAAA7zB,EAFfyM,UAAAA,OAAS,IAAAonB,EAAsB,kBAAZpjB,GAAwBA,EAAeojB,EAAA3jB,EAAAlQ,EAC1D0M,UAAAA,OAAS,IAAAwD,GAAQA,EAEbvD,EAAmBxW,KAAKsC,OAAOs5B,kBACoD/W,EAAA5Z,GAAzEjG,EAASC,GAAU,IAAJ0F,OAAQrI,EAAOtB,uBAAyBhB,KAAKsd,IAAIpY,WAEnD,IAA7B,IAAA2f,EAAA3Z,MAAAyZ,EAAAE,EAAAvgB,KAAAD,MAA+B,KAApB6I,EAAOyX,EAAA/jB,MAChB0Y,GAAWpM,EAAS,CAACoJ,UAAAA,EAAWC,UAAAA,EAAWC,iBAAAA,IAC3CxW,KAAK2jB,WAAW5G,OAAO,OAAQ7P,EACjC,CAAC,OAAA9B,GAAAyZ,EAAA3kB,EAAAkL,EAAA,SAAAyZ,EAAAxZ,GAAA,CAED,OAAOrL,IACT,GAEA,CAAAR,IAAA,UAAAoB,MAQA,SAASqE,GACP,IAE6BogB,EAFoDC,EAAAra,GAAjEjG,EAASC,GAAU,IAAJ0F,OAAQrI,EAAOvB,eAAiBf,KAAKsd,IAAIpY,WAE3C,IAA7B,IAAAogB,EAAApa,MAAAma,EAAAC,EAAAhhB,KAAAD,MAAkBghB,EAAAzkB,MACRyZ,gBAAgB,kBACzB,OAAAjP,GAAAka,EAAAplB,EAAAkL,EAAA,SAAAka,EAAAja,GAAA,CAGD,OADArL,KAAK2jB,WAAWga,UACT39B,IACT,GAEA,CAAAR,IAAA,WAAAoB,MAMA,SAAUqE,GACR,IAE6B24B,EAFoDC,EAAA5yB,GAAjEjG,EAASC,GAAU,IAAJ0F,OAAQrI,EAAOvB,eAAiBf,KAAKsd,IAAIpY,WAE3C,IAA7B,IAAA24B,EAAA3yB,MAAA0yB,EAAAC,EAAAv5B,KAAAD,MAAkBu5B,EAAAh9B,MACRwN,aAAa,mBAAmB,EACzC,OAAAhD,GAAAyyB,EAAA39B,EAAAkL,EAAA,SAAAyyB,EAAAxyB,GAAA,CAGD,OADArL,KAAK2jB,WAAU,WACR3jB,IACT,GACA,CAAAR,IAAA,eAAAoB,MAQA,SAAcsM,GAAiC,IAAxBiL,EAAQ3V,UAAAC,OAAA,QAAA+B,IAAAhC,UAAA,GAAAA,UAAA,GAAG,YAC1BuJ,EAAO+R,GAAOggB,SAAS5wB,EAASlN,KAAKksB,kBAC3C,GAAKngB,EAAL,CAEA,IAAM5F,EAAQH,IAiBd,MAfiB,cAAbmS,GAAyC,QAAbA,GAC9BhS,EAAM4B,mBAAmBmF,GACzB/G,EAAM4I,SAAsB,cAAboJ,IACNjL,IAAYnB,EACJ,WAAboM,GACFhS,EAAMuB,eAAewF,GACrB/G,EAAMyJ,aAAa1C,IACG,UAAbiL,IACThS,EAAM0J,cAAc3C,GACpB/G,EAAMyB,YAAYsF,IAGpB7K,EAAM,kEAGD,IAAIyb,GAAO/R,EAAM5F,EAnBG,CAoB7B,GAAC,CAAA3G,IAAA,gCAAAoB,MAED,SAA6ByJ,GAAqB,IAAlB6C,EAAO7C,EAAP6C,QAASxE,EAAM2B,EAAN3B,OAEvC2yB,EAA+Bd,GAA6B,CAACE,UAD3CT,GAAe9sB,GACuCwtB,UAAWhyB,IAA5E5B,EAAIu0B,EAAJv0B,KAAM8zB,EAAcS,EAAdT,eACPU,EAAWt1B,IACjBs1B,EAAStyB,SAASlC,EAAM8zB,GACxBU,EAASvsB,UAAS,GAElB,IAAMhD,EAAO+R,GAAOggB,SAAS5wB,EAASlN,KAAKksB,kBACrC6R,EAAa,IAAIjgB,GAAO/R,EAAMuvB,GAGpC,OADAyC,EAAWpf,sBACJof,CACT,GAAC,CAAAv+B,IAAA,0BAAAoB,MAED,SAAyBsM,GACvB,OAAOlN,KAAKg+B,aAAa9wB,EAAS,YACpC,GAAC,CAAA1N,IAAA,oBAAAoB,MAED,SAAmBsM,GACjB,OAAOlN,KAAKg+B,aAAa9wB,EAAS,MACpC,GAAC,CAAA1N,IAAA,qBAAAoB,MAED,SAAoBsM,GAClB,OAAOlN,KAAKg+B,aAAa9wB,EAAS,SACpC,GAAC,CAAA1N,IAAA,oBAAAoB,MAED,SAAmBsM,GACjB,OAAOlN,KAAKg+B,aAAa9wB,EAAS,QACpC,GAEA,CAAA1N,IAAA,aAAAoB,MAOA,SAAYsM,GACV,OAAO4J,GAAuB5J,EAChC,GAEA,CAAA1N,IAAA,WAAAoB,MAIA,SAAUq9B,EAAcC,GACtB,IAAMhxB,EAAU4J,GAAqBmnB,EAAcj+B,KAAKsd,IAAIpY,UAEtDqU,EAASvZ,KAAKg+B,aAAa9wB,EAAS,OAM1C,OAJAqM,EAAO4iB,YAAuC,iBAApB+B,EACtBpnB,GAAiConB,GACjCA,GAEG3kB,CACT,GAEA,CAAA/Z,IAAA,YAAAoB,MAIA,SAAWq9B,EAAcE,GACvB,IAAMjxB,EAAU4J,GAAqBmnB,EAAcj+B,KAAKsd,IAAIpY,UAEtDqU,EAASvZ,KAAKg+B,aAAa9wB,EAAS,aAM1C,OAJAqM,EAAO3K,aAAyC,iBAArBuvB,EACvBrnB,GAAiCqnB,GACjCA,GAEG5kB,CACT,GAEA,CAAA/Z,IAAA,eAAAoB,MASA,SAAcmd,GACZ,IAAMiB,EAAYhf,KAAK2jB,WAAWoF,iBAAiBuE,oBACnD,IAAKvP,IAAiBiB,EAAW,OAAOA,EAExC,IAAM7Y,EAAQ6Y,EAAU7Y,MAGxB,OAAI4X,SAAAA,EAAcsb,a3H/KW,SAACvyB,EAAMX,GACtC,IAAM2B,EAAY5C,SAASc,cAC3B8B,EAAUC,mBAAmBjB,GAC7B,IAAMkB,EAAkB7B,EAAM8B,sBAAsBC,MAAMC,eAAgBL,GACpEM,EAAgBjC,EAAM8B,sBAAsBC,MAAMG,WAAYP,GACpE,OAAOE,GAAmB,GAAKI,GAAiB,CAClD,C2HyKqCg2B,CAAkBrgB,EAAc5X,GACxD6Y,OADT,CAGF,GAEA,CAAAxf,IAAA,oBAAAoB,MAKA,SAAmBy9B,GAGjB,OAFAr+B,KAAKs+B,aAAe,IAAI/G,GAAsBv3B,KAAMq+B,GAE7Cr+B,IACT,GAEA,CAAAR,IAAA,kBAAAoB,MACA,SAAiBuY,GAAM,IACjB4I,EADiBI,EAAA,KAGjBhJ,EAAKyN,aACP7E,EAAS5I,EAAKyN,WAAW2X,WAG3Bv+B,KAAKw+B,kBAAkB,CACrBvG,SAAU9e,EAAK8e,SACfE,WAAY,CACVpW,OAAQA,EACR6T,kBAAmBzc,EAAKyc,qBAI5B51B,KAAKm4B,WAAa,CAChBsG,cAAe,SAAC34B,GACdqc,EAAKmc,aAAaxF,UAAUhzB,EAC9B,EAEJ,GAEA,CAAAtG,IAAA,YAAAoB,MAqBA,SAASimB,GAA+E,IAA5E9I,EAAY8I,EAAZ9I,aAAc9a,EAAI4jB,EAAJ5jB,KAAMygB,EAAWmD,EAAXnD,YAAauB,EAAS4B,EAAT5B,UAAWyZ,EAAW7X,EAAX6X,YAAWC,EAAA9X,EAAEzlB,KAAAA,OAAI,IAAAu9B,EAAG,UAASA,EACnF,OAAK1Z,EAG0B,iBAApBA,EAAU1b,OAA+C,iBAAlB0b,EAAUzb,KAC1DnH,EACE,iIAEM,GAEN4iB,EAAU1b,QAAU0b,EAAUzb,KAChCnH,EACE,yKAEM,GAEHmhB,GAAiBS,eAAelG,EAAc9a,EAAMygB,EAAauB,EAAU1b,MAAO0b,EAAUzb,IAAKk1B,EAAc1+B,KAAK2jB,gBAAanf,EAAWpD,GAd1IoiB,GAAiBC,cAAc1F,EAAc9a,EAAMygB,EAAatiB,EAAMs9B,EAAc1+B,KAAK2jB,gBAAanf,EAejH,GAEA,CAAAhF,IAAA,wBAAAoB,MAcA,SAAqBqmB,GAAwB,IAArBlJ,EAAYkJ,EAAZlJ,aAAc3c,EAAI6lB,EAAJ7lB,KACpC,OAAOoiB,GAAiBgB,yBACtBzG,EACA3c,EAEJ,GAAC,CAAA5B,IAAA,kBAAAoB,MAED,SAAeg+B,GAA4C,IAAzC7gB,EAAY6gB,EAAZ7gB,aAAc2F,EAAWkb,EAAXlb,YAAagb,EAAWE,EAAXF,YAC3Clb,GAAiBU,gBAAgBnG,EAAc2F,EAAagb,EAAc1+B,KAAK2jB,gBAAanf,EAC9F,GAAC,CAAAhF,IAAA,oBAAAoB,MAED,SAAiBi+B,GAA4D,IAAzD9gB,EAAY8gB,EAAZ9gB,aAAc2F,EAAWmb,EAAXnb,YAAaY,EAAWua,EAAXva,YAAaC,EAAcsa,EAAdta,eAC1Df,GAAiBa,gBAAgBtG,EAAc2F,EAAaY,EAAaC,EAC3E,GAEA,CAAA/kB,IAAA,KAAAoB,MASA,SAAI2b,EAAOuiB,GAIT,OADA9+B,KAAK2jB,WAAWlH,GAAGF,EAAOuiB,GACnB9+B,IACT,GAEA,CAAAR,IAAA,MAAAoB,MAUA,WAAc,QAAAm+B,EAAAv8B,UAAAC,OAANF,EAAI,IAAAG,MAAAq8B,GAAAC,EAAA,EAAAA,EAAAD,EAAAC,IAAJz8B,EAAIy8B,GAAAx8B,UAAAw8B,GAEV,OADAh/B,KAAK2jB,WAAWhH,IAAIQ,MAAMnd,KAAK2jB,WAAYphB,GACpCvC,IACT,GAEA,CAAAR,IAAA,SAAAoB,MAKA,WAEE,OADAZ,KAAK2jB,WAAWsb,SACTj/B,IACT,GAEA,CAAAR,IAAA,0BAAAoB,MAqBA,SAAuBs+B,GAKpB,IAJDhyB,EAAOgyB,EAAPhyB,QACAiyB,EAAeD,EAAfC,gBAAeC,EAAAF,EACfG,oBAAAA,OAAmB,IAAAD,GAAQA,EAAAE,EAAAJ,EAC3BK,mBAMA,ODxeG,SAA2B11B,GAK/B,IAJDkC,EAAIlC,EAAJkC,KACAszB,EAAmBx1B,EAAnBw1B,oBACAE,EAAkB11B,EAAlB01B,mBACA9Q,EAAS5kB,EAAT4kB,UAEMvQ,EAAYnS,EAAKgC,cAAc/H,cACrCkY,EAAUnW,mBAAmBgE,GAC7B,IAAMoS,EAAaD,EAAUiB,wBACvBqgB,EDIYxF,GCJuBjuB,GDMxBwO,QADD,SAACklB,EAAK34B,GAAI,OAAK24B,EAAM34B,EAAKgK,YAAYrO,MAAM,GAC3B,GCL3Bg4B,EAAYT,GAAejuB,GAGjC,GAAuB,IAAnByzB,EAAsB,MAAO,CAACE,UAAU,GAW5C,IATA,IAOIC,EAPEz7B,EAAO,CACX62B,cAAeva,KAAKwa,MAAMwE,EAAiB,GAC3CvE,UAAW,EACXH,WAAY0E,GAGV92B,EAASxE,EAAK62B,cAEd6E,EAAS,GACN17B,EAAK+2B,UAAY/2B,EAAK42B,YAAc8E,EAAS,GAAG,CACrDA,EAASA,GAAU,EACnBl3B,EAASxE,EAAK62B,cACd,IACM1b,EADQ+b,GAA6B,CAACX,UAAAA,EAAW/xB,OAAQxE,EAAK62B,gBAC/C5b,wBACrBwgB,EAAWnf,KAAKC,IAAIpB,EAAOE,KAAOkP,GAG9B4Q,GAAuBlhB,EAAWK,MAAQa,EAAOb,IACnDqc,GAAS32B,GAEAq7B,GAAsBphB,EAAWI,SAAWc,EAAOd,OAC5D2c,GAAUh3B,GAKRuqB,EAAYpP,EAAOE,KACrBsb,GAAS32B,GAETg3B,GAAUh3B,EAEd,CAEA,IACMmb,EADQ+b,GAA6B,CAACX,UAAAA,EAAW/xB,OAAQxE,EAAK62B,gBAC/C5b,wBACf0gB,EAAgBrf,KAAKC,IAAIpB,EAAOE,KAAOkP,GAQ7C,OALIoR,EAAgBF,IAClBA,EAAWE,EACXn3B,EAASxE,EAAK62B,eAGT,CAAC4E,SAAAA,EAAUj3B,OAAAA,EAAQg3B,UAAU,EACtC,CC6aWI,CAAmB,CACxB/zB,KAAMmB,EACNmyB,oBAAAA,EACAE,wBATgB,IAAAD,GAAQA,EAUxB7Q,UARgBzuB,KAAK2jB,WAAW1G,cAC9Bjd,KAAK2jB,WAAW1G,cAAcwR,UAC9B0Q,EAAgB5f,MAQtB,I,EAAC,EAAA/f,IAAA,kBAAAoB,MAlcD,WACE,OAAO0B,CACT,GAEA,CAAA9C,IAAA,eAAAoB,MAaA,SAAqBm/B,GACnBrgC,OAAOm8B,OAAOv5B,EAAQy9B,GACtBpS,GAAuBrrB,EACzB,I,8FAAC,CA3CkB,G,OA6drBi5B,GAASvqB,OAASA,EAClBuqB,GAASzkB,QAAUA,EAGlB,CAAC,QAAS,OAAQ,OAAQ,YAAa,SAAU,UAChD,SAAU,QAAS,QAAS,QAAS,SAAU,SAC/C,OAAQ,YAAa,QAAS,oBAAqB,oBACnD3B,SAAQ,SAAC9T,GAETk6B,GAASj7B,UAAUe,GAAQ,SAAUy9B,GACnC,OAAO9+B,KAAKyc,GAAGpb,EAAMy9B,EACvB,CACF,I","sources":["webpack://Editable/webpack/universalModuleDefinition","webpack://Editable/webpack/bootstrap","webpack://Editable/webpack/runtime/define property getters","webpack://Editable/webpack/runtime/global","webpack://Editable/webpack/runtime/hasOwnProperty shorthand","webpack://Editable/webpack/runtime/make namespace object","webpack://Editable/./src/config.js","webpack://Editable/./src/util/error.js","webpack://Editable/./src/util/string.js","webpack://Editable/./src/node-type.js","webpack://Editable/./src/node-iterator.js","webpack://Editable/./src/util/dom.js","webpack://Editable/./src/parser.js","webpack://Editable/./src/range-save-restore.js","webpack://Editable/./src/content.js","webpack://Editable/./src/block.js","webpack://Editable/./src/quotes.js","webpack://Editable/./src/clipboard.js","webpack://Editable/./src/feature-detection.js","webpack://Editable/./src/eventable.js","webpack://Editable/./src/util/viewport.js","webpack://Editable/./src/cursor.js","webpack://Editable/./src/highlight-text.js","webpack://Editable/./src/plugins/highlighting/text-search.js","webpack://Editable/./src/highlight-support.js","webpack://Editable/./src/selection.js","webpack://Editable/./src/range-container.js","webpack://Editable/./src/selection-watcher.js","webpack://Editable/./src/keyboard.js","webpack://Editable/./src/smartQuotes.js","webpack://Editable/./src/dispatcher.js","webpack://Editable/./node_modules/lodash-es/_listCacheClear.js","webpack://Editable/./node_modules/lodash-es/eq.js","webpack://Editable/./node_modules/lodash-es/_assocIndexOf.js","webpack://Editable/./node_modules/lodash-es/_listCacheDelete.js","webpack://Editable/./node_modules/lodash-es/_ListCache.js","webpack://Editable/./node_modules/lodash-es/_listCacheGet.js","webpack://Editable/./node_modules/lodash-es/_listCacheHas.js","webpack://Editable/./node_modules/lodash-es/_listCacheSet.js","webpack://Editable/./node_modules/lodash-es/_freeGlobal.js","webpack://Editable/./node_modules/lodash-es/_root.js","webpack://Editable/./node_modules/lodash-es/_Symbol.js","webpack://Editable/./node_modules/lodash-es/_getRawTag.js","webpack://Editable/./node_modules/lodash-es/_objectToString.js","webpack://Editable/./node_modules/lodash-es/_baseGetTag.js","webpack://Editable/./node_modules/lodash-es/isObject.js","webpack://Editable/./node_modules/lodash-es/isFunction.js","webpack://Editable/./node_modules/lodash-es/_coreJsData.js","webpack://Editable/./node_modules/lodash-es/_isMasked.js","webpack://Editable/./node_modules/lodash-es/_toSource.js","webpack://Editable/./node_modules/lodash-es/_baseIsNative.js","webpack://Editable/./node_modules/lodash-es/_getNative.js","webpack://Editable/./node_modules/lodash-es/_getValue.js","webpack://Editable/./node_modules/lodash-es/_Map.js","webpack://Editable/./node_modules/lodash-es/_nativeCreate.js","webpack://Editable/./node_modules/lodash-es/_hashGet.js","webpack://Editable/./node_modules/lodash-es/_hashHas.js","webpack://Editable/./node_modules/lodash-es/_Hash.js","webpack://Editable/./node_modules/lodash-es/_hashClear.js","webpack://Editable/./node_modules/lodash-es/_hashDelete.js","webpack://Editable/./node_modules/lodash-es/_hashSet.js","webpack://Editable/./node_modules/lodash-es/_getMapData.js","webpack://Editable/./node_modules/lodash-es/_isKeyable.js","webpack://Editable/./node_modules/lodash-es/_MapCache.js","webpack://Editable/./node_modules/lodash-es/_mapCacheClear.js","webpack://Editable/./node_modules/lodash-es/_mapCacheDelete.js","webpack://Editable/./node_modules/lodash-es/_mapCacheGet.js","webpack://Editable/./node_modules/lodash-es/_mapCacheHas.js","webpack://Editable/./node_modules/lodash-es/_mapCacheSet.js","webpack://Editable/./node_modules/lodash-es/_Stack.js","webpack://Editable/./node_modules/lodash-es/_stackClear.js","webpack://Editable/./node_modules/lodash-es/_stackDelete.js","webpack://Editable/./node_modules/lodash-es/_stackGet.js","webpack://Editable/./node_modules/lodash-es/_stackHas.js","webpack://Editable/./node_modules/lodash-es/_stackSet.js","webpack://Editable/./node_modules/lodash-es/_defineProperty.js","webpack://Editable/./node_modules/lodash-es/_baseAssignValue.js","webpack://Editable/./node_modules/lodash-es/_assignMergeValue.js","webpack://Editable/./node_modules/lodash-es/_baseFor.js","webpack://Editable/./node_modules/lodash-es/_createBaseFor.js","webpack://Editable/./node_modules/lodash-es/_cloneBuffer.js","webpack://Editable/./node_modules/lodash-es/_Uint8Array.js","webpack://Editable/./node_modules/lodash-es/_cloneTypedArray.js","webpack://Editable/./node_modules/lodash-es/_cloneArrayBuffer.js","webpack://Editable/./node_modules/lodash-es/_baseCreate.js","webpack://Editable/./node_modules/lodash-es/_getPrototype.js","webpack://Editable/./node_modules/lodash-es/_overArg.js","webpack://Editable/./node_modules/lodash-es/_isPrototype.js","webpack://Editable/./node_modules/lodash-es/isObjectLike.js","webpack://Editable/./node_modules/lodash-es/_baseIsArguments.js","webpack://Editable/./node_modules/lodash-es/isArguments.js","webpack://Editable/./node_modules/lodash-es/isArray.js","webpack://Editable/./node_modules/lodash-es/isLength.js","webpack://Editable/./node_modules/lodash-es/isArrayLike.js","webpack://Editable/./node_modules/lodash-es/isBuffer.js","webpack://Editable/./node_modules/lodash-es/stubFalse.js","webpack://Editable/./node_modules/lodash-es/isPlainObject.js","webpack://Editable/./node_modules/lodash-es/_baseIsTypedArray.js","webpack://Editable/./node_modules/lodash-es/_nodeUtil.js","webpack://Editable/./node_modules/lodash-es/isTypedArray.js","webpack://Editable/./node_modules/lodash-es/_baseUnary.js","webpack://Editable/./node_modules/lodash-es/_safeGet.js","webpack://Editable/./node_modules/lodash-es/_assignValue.js","webpack://Editable/./node_modules/lodash-es/_isIndex.js","webpack://Editable/./node_modules/lodash-es/_arrayLikeKeys.js","webpack://Editable/./node_modules/lodash-es/_baseTimes.js","webpack://Editable/./node_modules/lodash-es/_baseKeysIn.js","webpack://Editable/./node_modules/lodash-es/_nativeKeysIn.js","webpack://Editable/./node_modules/lodash-es/keysIn.js","webpack://Editable/./node_modules/lodash-es/toPlainObject.js","webpack://Editable/./node_modules/lodash-es/_copyObject.js","webpack://Editable/./node_modules/lodash-es/_baseMergeDeep.js","webpack://Editable/./node_modules/lodash-es/isArrayLikeObject.js","webpack://Editable/./node_modules/lodash-es/_copyArray.js","webpack://Editable/./node_modules/lodash-es/_initCloneObject.js","webpack://Editable/./node_modules/lodash-es/_baseMerge.js","webpack://Editable/./node_modules/lodash-es/identity.js","webpack://Editable/./node_modules/lodash-es/_overRest.js","webpack://Editable/./node_modules/lodash-es/_baseSetToString.js","webpack://Editable/./node_modules/lodash-es/constant.js","webpack://Editable/./node_modules/lodash-es/_shortOut.js","webpack://Editable/./node_modules/lodash-es/_setToString.js","webpack://Editable/./node_modules/lodash-es/_baseRest.js","webpack://Editable/./node_modules/lodash-es/_apply.js","webpack://Editable/./node_modules/lodash-es/merge.js","webpack://Editable/./node_modules/lodash-es/_createAssigner.js","webpack://Editable/./node_modules/lodash-es/_isIterateeCall.js","webpack://Editable/./src/plugins/highlighting/spellcheck-service.js","webpack://Editable/./src/plugins/highlighting/whitespace-highlighting.js","webpack://Editable/./src/plugins/highlighting/match-collection.js","webpack://Editable/./src/monitored-highlighting.js","webpack://Editable/./src/util/log.js","webpack://Editable/./src/util/element.js","webpack://Editable/./src/util/binary_search.js","webpack://Editable/./src/core.js","webpack://Editable/./src/create-default-events.js","webpack://Editable/./src/create-default-behavior.js"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"Editable\"] = factory();\n\telse\n\t\troot[\"Editable\"] = factory();\n})(self, () => {\nreturn ","// The require scope\nvar __webpack_require__ = {};\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","/**\n * Defines all supported event types by Editable.JS and provides default\n * implementations for them defined in {{#crossLink \"Behavior\"}}{{/crossLink}}\n *\n * @type {Object}\n */\nexport default {\n log: false,\n logErrors: true,\n editableClass: 'js-editable',\n editableDisabledClass: 'js-editable-disabled',\n pastingAttribute: 'data-editable-is-pasting',\n trimLeadingAndTrailingWhitespaces: true,\n boldMarkup: {\n type: 'tag',\n name: 'strong',\n attribs: {},\n trim: true\n },\n italicMarkup: {\n type: 'tag',\n name: 'em',\n attribs: {},\n trim: true\n },\n underlineMarkup: {\n type: 'tag',\n name: 'u',\n attribs: {},\n trim: false\n },\n linkMarkup: {\n type: 'tag',\n name: 'a',\n attribs: {},\n trim: true\n },\n\n // Rules that are applied when filtering pasted content\n pastedHtmlRules: {\n // Elements and their attributes to keep in pasted text\n // Note that elements not explicitly allowed here will not be removed, their\n // tags will get stripped but their content will be kept. Use `blacklistedElements`\n // to get rid of a whole element (tag+content)\n allowedElements: {\n 'a': {\n 'href': true,\n 'rel': true,\n 'target': true\n },\n 'strong': {},\n 'em': {},\n 'br': {}\n },\n allowedPlainTextElements: {\n 'br': {}\n },\n\n // Elements that have required attributes.\n // If these are not present the elements are filtered out.\n // Required attributes have to be present in the 'allowed' object\n // as well if they should not be filtered out.\n requiredAttributes: {\n 'a': ['href']\n },\n\n // Elements that should be transformed into other elements\n transformElements: {\n 'b': 'strong',\n 'i': 'em'\n },\n\n // A list of elements which should be split into paragraphs.\n splitIntoBlocks: ['h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'p', 'blockquote'],\n\n // A list of HTML block level elements.\n blockLevelElements: [\n 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'div', 'p', 'pre', 'hr', 'blockquote',\n 'article', 'figure', 'header', 'footer', 'ul', 'ol', 'li', 'section', 'table', 'video'\n ],\n\n // A list of elements that will get completely removed when pasted. Their tags\n // and content (text content and child elements) will get removed.\n blacklistedElements: ['style', 'script'],\n\n keepInternalRelativeLinks: false,\n\n // Replace quotes in a pasted content with quotes from config.\n replaceQuotes: {\n // quotes: ['“', '”'],\n // singleQuotes: ['‘', '’'],\n // apostrophe: '’'\n }\n }\n}\n","import config from '../config.js'\n\n// Allows for safe error logging\n// Falls back to console.log if console.error is not available\nexport default function error () {\n if (config.logErrors === false) return\n\n const args = arguments.length === 1 ? arguments[0] : Array.from(arguments)\n\n if (!global.console) return\n\n if (typeof console.error === 'function') return console.error(args)\n\n console.log(args)\n}\n","const toString = Object.prototype.toString\nconst htmlCharacters = {\n '&': '&',\n '<': '<',\n '>': '>',\n '\"': '"',\n \"'\": '''\n}\n\n// TODO: replace with lodash methods\nexport function trimRight (text) {\n return text.replace(/\\s+$/, '')\n}\n\nexport function trimLeft (text) {\n return text.replace(/^\\s+/, '')\n}\n\nexport function trim (text) {\n return text.replace(/^\\s+|\\s+$/g, '')\n}\n\nexport function isString (obj) {\n return toString.call(obj) === '[object String]'\n}\n\n/**\n * Turn any string into a regular expression.\n * This can be used to search or replace a string conveniently.\n */\n\nexport function regexp (str, flags) {\n if (!flags) flags = 'g'\n const escapedStr = str.replace(/[-[\\]{}()*+?.,\\\\^$|#\\s]/g, '\\\\$&')\n return new RegExp(escapedStr, flags)\n}\n\n/**\n * Escape HTML characters <, > and &\n * Usage: escapeHtml('<div>')\n *\n * @param { String }\n * @param { Boolean } Optional. If true \" and ' will also be escaped.\n * @return { String } Escaped Html you can assign to innerHTML of an element.\n */\n\n// TODO: replace with npm.im/he\n\nexport function escapeHtml (s, forAttribute) {\n return s.replace(forAttribute ? /[&<>'\"]/g : /[&<>]/g, function (c) { // \"'\n return htmlCharacters[c]\n })\n}\n\n/**\n * Escape a string the browser way.\n */\n\nexport function browserEscapeHtml (str) {\n const div = document.createElement('div')\n div.appendChild(document.createTextNode(str))\n return div.innerHTML\n}\n\nexport function replaceLast (text, searchValue, replaceValue) {\n if (!text) return ''\n text = `${text}`\n if (!searchValue || replaceValue == null) return text\n const lastOccurrenceIndex = text.lastIndexOf(searchValue)\n if (lastOccurrenceIndex === -1) return text\n return `${\n text.slice(0, lastOccurrenceIndex)\n }${\n replaceValue\n }${\n text.slice(lastOccurrenceIndex + searchValue.length)\n }`\n}\n\nexport function endsWithSingleSpace (text) {\n return /\\S+\\s{1}$/.test(text)\n}\n","// DOM node types\n// https://developer.mozilla.org/en-US/docs/Web/API/Node.nodeType\n\nexport const elementNode = 1\nexport const attributeNode = 2\nexport const textNode = 3\nexport const cdataSectionNode = 4\nexport const entityReferenceNode = 5\nexport const entityNode = 6\nexport const processingInstructionNode = 7\nexport const commentNode = 8\nexport const documentNode = 9\nexport const documentTypeNode = 10\nexport const documentFragmentNode = 11\nexport const notationNode = 12\n","import {textNode} from './node-type.js'\n\n// A DOM node iterator.\n//\n// Has the ability to replace nodes on the fly and continue\n// the iteration.\nexport default class NodeIterator {\n\n constructor (root, method) {\n this.current = this.previous = this.nextNode = this.root = root\n this.iteratorFunc = this[method || 'getNext']\n }\n\n [Symbol.iterator] () {\n return this\n }\n\n getNextTextNode () {\n let next\n while ((next = this.getNext())) {\n if (next.nodeType === textNode && next.data !== '') return next\n }\n }\n\n getPreviousTextNode () {\n let prev\n while ((prev = this.getPrevious())) {\n if (prev.nodeType === textNode && prev.data !== '') return prev\n }\n }\n\n next () {\n const value = this.iteratorFunc()\n return value ? {value} : {done: true}\n }\n\n getNext () {\n let n = this.current = this.nextNode\n let child = this.nextNode = undefined\n if (this.current) {\n child = n.firstChild\n\n // Skip the children of elements with the attribute data-editable=\"remove\"\n // This prevents text nodes that are not part of the content to be included.\n if (child && n.getAttribute('data-editable') !== 'remove') {\n this.nextNode = child\n } else {\n while ((n !== this.root) && !(this.nextNode = n.nextSibling)) {\n n = n.parentNode\n }\n }\n }\n return this.current\n }\n\n getPrevious () {\n let n = this.current = this.previous\n let child = this.previous = undefined\n if (this.current) {\n child = n.lastChild\n\n // Skip the children of elements with the attribute data-editable=\"remove\"\n // This prevents text nodes that are not part of the content to be included.\n if (child && n.getAttribute('data-editable') !== 'remove') {\n this.previous = child\n } else {\n while ((n !== this.root) && !(this.previous = n.previousSibling)) {\n n = n.parentNode\n }\n }\n }\n return this.current\n }\n\n replaceCurrent (replacement) {\n this.current = replacement\n this.nextNode = undefined\n this.previous = undefined\n let n = this.current\n while ((n !== this.root) && !(this.nextNode = n.nextSibling)) {\n n = n.parentNode\n }\n }\n}\n","import NodeIterator from '../node-iterator.js'\nimport {textNode} from '../node-type.js'\n\n/**\n * @param {HTMLElement | Array | String} target\n * @param {Document} document\n */\nexport const domArray = (target, document) => {\n if (typeof target === 'string') return Array.from(document.querySelectorAll(target))\n if (target.tagName) return [target]\n if (Array.isArray(target)) return target\n // Support NodeList and jQuery arrays\n return Array.from(target)\n}\n\n/**\n * @param { HTMLElement | String } target\n * @param { Document } document\n * @returns { HTMLElement }\n */\nexport const domSelector = (target, document) => {\n if (typeof target === 'string') return document.querySelector(target)\n if (target.tagName) return target\n // Support NodeList and jQuery arrays\n if (target[0]) return target[0]\n return target\n}\n\nexport const createElement = (html, win = window) => {\n const el = win.document.createElement('div')\n el.innerHTML = html\n return el.firstElementChild\n}\n\n/**\n* Get the closest dom element matching a selector\n* @description\n* - If a textNode is passed, it will still find the correct element\n* - If a document is passed, it will return undefined\n* @param {Node} elem\n* @param {String} selector\n* @returns {HTMLElement|undefined}\n*/\nexport const closest = (elem, selector) => {\n if (!elem.closest) elem = elem.parentNode\n if (elem && elem.closest) return elem.closest(selector)\n}\n\nexport const createRange = (win = window) => {\n return win.document.createRange()\n}\n\nexport const getSelection = (win = window) => {\n return win.document.getSelection()\n}\n\nexport const getNodes = (range, nodeTypes, filterFunc, win = window) => {\n const nodes = []\n\n const nodeIterator = win.document.createNodeIterator(\n range.commonAncestorContainer,\n NodeFilter.SHOW_ALL,\n {\n acceptNode (node) {\n if (\n range.intersectsNode(node) &&\n nodeTypes.includes(node.nodeType) &&\n node !== range.commonAncestorContainer // Exclude the common ancestor container\n ) {\n if (typeof filterFunc === 'function') {\n return filterFunc(node) ? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_SKIP\n }\n return NodeFilter.FILTER_ACCEPT\n }\n return NodeFilter.FILTER_SKIP\n }\n },\n false\n )\n\n let currentNode\n while ((currentNode = nodeIterator.nextNode())) {\n nodes.push(currentNode)\n }\n\n return nodes\n}\n\n// export const getNodes = (range, nodeTypes, filterFunc, win = window) => {\n// const nodes = []\n\n// const nodeIterator = win.document.createNodeIterator(\n// range.startContainer,\n// NodeFilter.SHOW_ALL,\n// {\n// acceptNode (node) {\n// if (\n// range.intersectsNode(node) &&\n// nodeTypes.includes(node.nodeType)\n// ) {\n// if (typeof filterFunc === 'function') {\n// return filterFunc(node) ? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_SKIP\n// }\n// return NodeFilter.FILTER_ACCEPT\n// }\n// return NodeFilter.FILTER_SKIP\n// }\n// },\n// false\n// )\n\n// let currentNode\n// while ((currentNode = nodeIterator.nextNode())) {\n// if (range.intersectsNode(currentNode)) {\n// nodes.push(currentNode)\n// }\n// }\n\n// return nodes\n// }\n\n\nexport const normalizeBoundaries = (range) => {\n if (range.startContainer.compareDocumentPosition(range.endContainer) === Node.DOCUMENT_POSITION_FOLLOWING) {\n range.setStartBefore(range.endContainer)\n }\n\n if (range.endContainer.compareDocumentPosition(range.startContainer) === Node.DOCUMENT_POSITION_PRECEDING) {\n range.setEndAfter(range.startContainer)\n }\n}\n\nexport const containsRange = (containerRange, testRange) => {\n return (\n containerRange.compareBoundaryPoints(Range.START_TO_START, testRange) <= 0 &&\n containerRange.compareBoundaryPoints(Range.END_TO_END, testRange) >= 0\n )\n}\n\nexport const containsNodeText = (range, node) => {\n const nodeRange = document.createRange()\n nodeRange.selectNodeContents(node)\n const comparisonStart = range.compareBoundaryPoints(Range.START_TO_START, nodeRange)\n const comparisonEnd = range.compareBoundaryPoints(Range.END_TO_END, nodeRange)\n return comparisonStart <= 0 && comparisonEnd >= 0\n}\n\nexport const nodeContainsRange = (node, range) => {\n const nodeRange = document.createRange()\n nodeRange.selectNodeContents(node)\n const comparisonStart = range.compareBoundaryPoints(Range.START_TO_START, nodeRange)\n const comparisonEnd = range.compareBoundaryPoints(Range.END_TO_END, nodeRange)\n return comparisonStart >= 0 && comparisonEnd <= 0\n}\n\nconst isCharacterDataNode = (node) => {\n return node && (node.nodeType === Node.TEXT_NODE || node.nodeType === Node.COMMENT_NODE)\n}\n\nconst splitDataNode = (node, offset) => {\n return node.splitText(offset)\n}\n\nexport const splitBoundaries = (range) => {\n const startContainer = range.startContainer\n const startOffset = range.startOffset\n const endContainer = range.endContainer\n const endOffset = range.endOffset\n\n if (isCharacterDataNode(endContainer) && endOffset > 0 && endOffset < endContainer.length) {\n splitDataNode(endContainer, endOffset)\n }\n\n if (isCharacterDataNode(startContainer) && startOffset > 0 && startOffset < startContainer.length) {\n const newStartContainer = splitDataNode(startContainer, startOffset)\n range.setStart(newStartContainer, 0)\n }\n}\n\nexport const toCharacterRange = (range, container) => {\n const startRange = range.cloneRange()\n startRange.setStart(container, 0)\n startRange.setEnd(range.startContainer, range.startOffset)\n\n const rangeText = range.toString()\n const start = startRange.toString().length\n const end = start + rangeText.length\n\n return {start, end, text: rangeText}\n}\n\nexport const rangesAreEqual = (range1, range2) => {\n return (\n range1.startContainer === range2.startContainer &&\n range1.startOffset === range2.startOffset &&\n range1.endContainer === range2.endContainer &&\n range1.endOffset === range2.endOffset\n )\n}\n\nexport const rangeToHtml = (range, win = window) => {\n const div = win.document.createElement('div')\n div.appendChild(range.cloneContents())\n return div.innerHTML\n}\n\nexport const getSelectionCoordinates = (selection) => {\n const range = selection.getRangeAt(0) // Assuming you want coordinates of the first range\n\n const rects = range.getClientRects()\n const coordinates = []\n\n for (let i = 0; i < rects.length; i++) {\n const rect = rects[i]\n coordinates.push({\n top: rect.top,\n left: rect.left,\n bottom: rect.bottom,\n right: rect.right,\n width: rect.width,\n height: rect.height\n })\n }\n\n return coordinates\n}\n\nexport const createRangeFromCharacterRange = (element, actualStartIndex, actualEndIndex) => {\n const walker = document.createTreeWalker(element, NodeFilter.SHOW_TEXT, null, false)\n let currentIndex = 0\n let startNode, endNode, startOffset, endOffset\n\n while (walker.nextNode()) {\n const node = walker.currentNode\n const nodeLength = node.nodeValue.length\n\n if (currentIndex + nodeLength <= actualStartIndex) {\n currentIndex += nodeLength\n continue\n }\n\n if (!startNode) {\n startNode = node\n startOffset = actualStartIndex - currentIndex\n }\n\n if (currentIndex + nodeLength >= actualEndIndex) {\n endNode = node\n endOffset = actualEndIndex - currentIndex\n break\n }\n\n currentIndex += nodeLength\n }\n\n if (startNode && endNode) {\n const range = createRange()\n range.setStart(startNode, startOffset)\n range.setEnd(endNode, endOffset)\n return range\n } else {\n throw new Error('Invalid character offsets.')\n }\n}\n\nexport function findStartExcludingWhitespace ({root, startContainer, startOffset, whitespacesOnTheLeft}) {\n const isTextNode = startContainer.nodeType === textNode\n if (!isTextNode) {\n return findStartExcludingWhitespace({\n root,\n startContainer: startContainer.childNodes[startOffset],\n startOffset: 0,\n whitespacesOnTheLeft\n })\n }\n\n const offsetAfterWhitespace = startOffset + whitespacesOnTheLeft\n if (startContainer.length > offsetAfterWhitespace) {\n return [startContainer, offsetAfterWhitespace]\n }\n\n // Pass the root so that the iterator can traverse to siblings\n const iterator = new NodeIterator(root)\n // Set the position to the node which is selected\n iterator.nextNode = startContainer\n // Iterate once to avoid returning self\n iterator.getNextTextNode()\n\n const container = iterator.getNextTextNode()\n if (!container) {\n // No more text nodes - use the end of the last text node\n const previousTextNode = iterator.getPreviousTextNode()\n return [previousTextNode, previousTextNode.length]\n }\n\n return findStartExcludingWhitespace({\n root,\n startContainer: container,\n startOffset: 0,\n whitespacesOnTheLeft: offsetAfterWhitespace - startContainer.length\n })\n}\n\nexport function findEndExcludingWhitespace ({root, endContainer, endOffset, whitespacesOnTheRight}) {\n const isTextNode = endContainer.nodeType === textNode\n if (!isTextNode) {\n const isFirstNode = !endContainer.childNodes[endOffset - 1]\n const container = isFirstNode\n ? endContainer.childNodes[endOffset]\n : endContainer.childNodes[endOffset - 1]\n let offset = 0\n if (!isFirstNode) {\n offset = container.nodeType === textNode\n ? container.length\n : container.childNodes.length\n }\n return findEndExcludingWhitespace({\n root,\n endContainer: container,\n endOffset: offset,\n whitespacesOnTheRight\n })\n }\n\n const offsetBeforeWhitespace = endOffset - whitespacesOnTheRight\n if (offsetBeforeWhitespace > 0) {\n return [endContainer, offsetBeforeWhitespace]\n }\n\n // Pass the root so that the iterator can traverse to siblings\n const iterator = new NodeIterator(root)\n // Set the position to the node which is selected\n iterator.previous = endContainer\n // Iterate once to avoid returning self\n iterator.getPreviousTextNode()\n\n const container = iterator.getPreviousTextNode()\n if (!container) {\n // No more text nodes - use the start of the first text node\n return [iterator.getNextTextNode(), 0]\n }\n\n return findEndExcludingWhitespace({\n root,\n endContainer: container,\n endOffset: container.length,\n whitespacesOnTheRight: whitespacesOnTheRight - endOffset\n })\n}\n","import * as string from './util/string.js'\nimport * as nodeType from './node-type.js'\nimport config from './config.js'\nimport {closest} from './util/dom.js'\n\n/**\n * The parser module provides helper methods to parse html-chunks\n * manipulations and helpers for common tasks.\n * Provides DOM lookup helpers\n *\n * @module core\n * @submodule parser\n */\n\n/**\n * Get the editableJS host block of a node.\n *\n * @method getHost\n * @param {DOM Node}\n * @return {DOM Node}\n */\nexport function getHost (node) {\n node = (node.jquery ? node[0] : node)\n return closest(node, `.${config.editableClass}`)\n}\n\n/**\n * Get the index of a node so that\n * parent.childNodes[ getNodeIndex(node) ] would return the node again.\n *\n * @method getNodeIndex\n * @param {HTMLElement}\n */\nexport function getNodeIndex (node) {\n let index = 0\n while ((node = node.previousSibling) !== null) index++\n return index\n}\n\n/**\n * Check if node contains text or element nodes\n * whitespace counts too!\n *\n * @method isVoid\n * @param {HTMLElement}\n */\nexport function isVoid (node) {\n for (const child of node.childNodes) {\n if (child.nodeType === nodeType.textNode && !isVoidTextNode(child)) {\n return false\n }\n if (child.nodeType === nodeType.elementNode) {\n return false\n }\n }\n return true\n}\n\n/**\n * Check if node is a text node and completely empty without any whitespace\n *\n * @method isVoidTextNode\n * @param {HTMLElement}\n */\nexport function isVoidTextNode (node) {\n return node.nodeType === nodeType.textNode && !node.nodeValue\n}\n\n/**\n * Check if node is a text node and contains nothing but whitespace\n *\n * @method isWhitespaceOnly\n * @param {HTMLElement}\n */\nexport function isWhitespaceOnly (node) {\n return node.nodeType === nodeType.textNode && lastOffsetWithContent(node) === 0\n}\n\nexport function isLinebreak (node) {\n return node.nodeType === nodeType.elementNode && node.tagName === 'BR'\n}\n\n/**\n * Returns the last offset where the cursor can be positioned to\n * be at the visible end of its container.\n * Currently works only for empty text nodes (not empty tags)\n *\n * @method isWhitespaceOnly\n * @param {HTMLElement}\n */\nexport function lastOffsetWithContent (elem) {\n if (elem.nodeType === nodeType.textNode) return string.trimRight(elem.nodeValue).length\n\n let lastOffset = 0\n Array.from(elem.childNodes).reverse().every((node, index, nodes) => {\n if (isWhitespaceOnly(node) || isLinebreak(node)) return true\n\n lastOffset = nodes.length - index\n return false\n })\n return lastOffset\n}\n\nexport function isBeginningOfHost (host, container, offset) {\n if (container === host) return isStartOffset(container, offset)\n\n if (isStartOffset(container, offset)) {\n // The index of the element simulates a range offset\n // right before the element.\n const offsetInParent = getNodeIndex(container)\n return isBeginningOfHost(host, container.parentNode, offsetInParent)\n }\n\n return false\n}\n\nexport function isEndOfHost (host, container, offset) {\n if (container === host) return isEndOffset(container, offset)\n\n if (isEndOffset(container, offset)) {\n // The index of the element plus one simulates a range offset\n // right after the element.\n const offsetInParent = getNodeIndex(container) + 1\n return isEndOfHost(host, container.parentNode, offsetInParent)\n }\n\n return false\n}\n\nexport function isStartOffset (container, offset) {\n if (container.nodeType === nodeType.textNode) return offset === 0\n\n if (container.childNodes.length === 0) return true\n\n if (\n container.childNodes.length === 1 &&\n container.firstChild.nodeType === nodeType.elementNode &&\n container.firstChild.getAttribute('data-editable') === 'remove'\n ) return true\n\n return container.childNodes[offset] === container.firstChild\n}\n\nexport function isEndOffset (container, offset) {\n if (container.nodeType === nodeType.textNode) return offset === container.length\n\n if (container.childNodes.length === 0) return true\n\n if (offset > 0) return container.childNodes[offset - 1] === container.lastChild\n\n return false\n}\n\nexport function isTextEndOfHost (host, container, offset) {\n if (container === host) return isTextEndOffset(container, offset)\n\n if (isTextEndOffset(container, offset)) {\n // The index of the element plus one simulates a range offset\n // right after the element.\n const offsetInParent = getNodeIndex(container) + 1\n return isTextEndOfHost(host, container.parentNode, offsetInParent)\n }\n\n return false\n}\n\nexport function isTextEndOffset (container, offset) {\n if (container.nodeType === nodeType.textNode) {\n const text = string.trimRight(container.nodeValue)\n return offset >= text.length\n }\n\n if (container.childNodes.length === 0) return true\n\n return offset >= lastOffsetWithContent(container)\n}\n\nexport function isSameNode (target, source) {\n let i, len, attr\n\n if (target.nodeType !== source.nodeType) return false\n\n if (target.nodeName !== source.nodeName) return false\n\n for (i = 0, len = target.attributes.length; i < len; i++) {\n attr = target.attributes[i]\n if (source.getAttribute(attr.name) !== attr.value) return false\n }\n\n return true\n}\n\n/**\n * Return the deepest last child of a node.\n *\n * @method lastChild\n * @param {HTMLElement} container The container to iterate on.\n * @return {HTMLElement} The deepest last child in the container.\n */\nexport function lastChild (container) {\n return container.lastChild\n ? lastChild(container.lastChild)\n : container\n}\n\n/**\n * Obsolete version of {{#crossLink \"lastChild\"}}{{/crossLink}}.\n */\nexport function latestChild (container) {\n console.warn('Editable.js: Using obsolete function parser.latestCild(), use lastChild() instead')\n return lastChild(container)\n}\n\n/**\n * Checks if a documentFragment has no children.\n * Fragments without children can cause errors if inserted into ranges.\n *\n * @method isDocumentFragmentWithoutChildren\n * @param {HTMLElement} DOM node.\n * @return {Boolean}\n */\nexport function isDocumentFragmentWithoutChildren (fragment) {\n return fragment &&\n fragment.nodeType === nodeType.documentFragmentNode &&\n fragment.childNodes.length === 0\n}\n\n/**\n * Determine if an element behaves like an inline element.\n */\nexport function isInlineElement (window, element) {\n const styles = element.currentStyle || window.getComputedStyle(element, '')\n const display = styles.display\n switch (display) {\n case 'inline':\n case 'inline-block':\n return true\n default:\n return false\n }\n}\n","import error from './util/error.js'\nimport * as nodeType from './node-type.js'\nimport {createRange, normalizeBoundaries} from './util/dom.js'\n\n/**\n * Inspired by the Selection save and restore module for Rangy by Tim Down\n * Saves and restores ranges using invisible marker elements in the DOM.\n */\nlet boundaryMarkerId = 0\n\n// (U+FEFF) zero width no-break space\nconst markerTextChar = '\\ufeff'\n\nfunction isSecondChildOfCommonAncestor (range, rangeContainer) {\n const parent = range.commonAncestorContainer\n if (parent.nodeType === 3) return false // if we are on the text node it can't be a parent\n const possibleChild = rangeContainer.parentElement\n return possibleChild?.parentElement === parent\n}\n\nexport function insertRangeBoundaryMarker (range, atStart) {\n const container = range.commonAncestorContainer\n\n // If ownerDocument is null the commonAncestorContainer is window.document\n if (!container.ownerDocument) {\n error('Cannot save range: range is empty')\n }\n\n // Create the marker element containing a single\n // invisible character using DOM methods and insert it\n const doc = container.ownerDocument.defaultView.document\n const markerEl = doc.createElement('span')\n markerEl.id = `editable-range-boundary-${++boundaryMarkerId}`\n markerEl.setAttribute('data-editable', 'remove')\n markerEl.style.lineHeight = '0'\n markerEl.style.display = 'none'\n markerEl.appendChild(doc.createTextNode(markerTextChar))\n\n // This logic can expand the selection by inserting the marker before the element\n // of the start or end container. In some cases this prevents breaking up existing tags.\n // The solution is not perfect, but has been here a while.\n // And it is somewhat inconsistent as it check if the container is a second grade child\n // of the common ancestor.\n // It can help to prevent the nuking of e.g. comments when formatting like bold\n // is applied.\n const directlyBeforeFormatTag = atStart && isSecondChildOfCommonAncestor(range, range.startContainer)\n const directlyAfterFormatTag = !atStart && isSecondChildOfCommonAncestor(range, range.endContainer)\n if (directlyBeforeFormatTag) {\n const startParentElem = range.startContainer.parentElement\n startParentElem.parentElement.insertBefore(markerEl, startParentElem)\n } else if (directlyAfterFormatTag) {\n const endParentElem = range.endContainer.parentElement\n endParentElem.parentElement.insertBefore(markerEl, endParentElem.nextSibling)\n } else {\n // Clone the Range and collapse to the appropriate boundary point\n const boundaryRange = range.cloneRange()\n boundaryRange.collapse(atStart)\n boundaryRange.insertNode(markerEl)\n }\n\n return markerEl\n}\n\nexport function setRangeBoundary (host, range, markerId, atStart) {\n const markerEl = getMarker(host, markerId)\n if (!markerEl) return console.log('Marker element has been removed. Cannot restore selection.')\n range[atStart ? 'setStartBefore' : 'setEndBefore'](markerEl)\n markerEl.remove()\n}\n\nexport function save (range) {\n let rangeInfo, startEl, endEl\n\n // insert markers\n if (range.collapsed) {\n endEl = insertRangeBoundaryMarker(range, false)\n rangeInfo = {\n markerId: endEl.id,\n collapsed: true\n }\n } else {\n endEl = insertRangeBoundaryMarker(range, false)\n startEl = insertRangeBoundaryMarker(range, true)\n\n rangeInfo = {\n startMarkerId: startEl.id,\n endMarkerId: endEl.id,\n collapsed: false\n }\n }\n\n // Adjust each range's boundaries to lie between its markers\n if (range.collapsed) {\n range.setStartBefore(endEl)\n range.collapse(true)\n } else {\n range.setEndBefore(endEl)\n range.setStartAfter(startEl)\n }\n\n return rangeInfo\n}\n\nexport function restore (host, rangeInfo) {\n if (rangeInfo.restored) return\n\n const range = createRange()\n if (rangeInfo.collapsed) {\n const markerEl = getMarker(host, rangeInfo.markerId)\n if (markerEl) {\n markerEl.style.display = 'inline'\n const previousNode = markerEl.previousSibling\n\n // Workaround for rangy issue 17\n if (previousNode && previousNode.nodeType === nodeType.textNode) {\n markerEl.remove()\n range.setStart(previousNode, previousNode.length)\n } else {\n range.setStartBefore(markerEl)\n range.collapse(true)\n markerEl.remove()\n }\n } else {\n console.log('Marker element has been removed. Cannot restore selection.')\n }\n } else {\n setRangeBoundary(host, range, rangeInfo.startMarkerId, true)\n setRangeBoundary(host, range, rangeInfo.endMarkerId, false)\n }\n\n normalizeBoundaries(range)\n return range\n}\n\nfunction getMarker (host, id) {\n return host.querySelector(`#${id}`)\n}\n","import * as nodeType from './node-type.js'\nimport * as rangeSaveRestore from './range-save-restore.js'\nimport * as parser from './parser.js'\nimport * as string from './util/string.js'\nimport {createElement, createRange, getNodes, normalizeBoundaries, splitBoundaries, containsNodeText} from './util/dom.js'\nimport config from './config.js'\n\nfunction restoreRange (host, range, func) {\n range = rangeSaveRestore.save(range)\n func()\n return rangeSaveRestore.restore(host, range)\n}\n\nconst zeroWidthSpace = /\\u200B/g\nconst zeroWidthNonBreakingSpace = /\\uFEFF/g\nconst whitespaceExceptSpace = /[^\\S ]/g\n\nconst everythingWhitespace = /^\\s+$/\nconst leadingWhitespace = /^\\s+/\nconst trailingWhitespace = /\\s+$/\n\n// Clean up the Html.\nexport function tidyHtml (element) {\n // if (element.normalize) element.normalize()\n normalizeTags(element)\n}\n\n// Remove empty tags and merge consecutive tags (they must have the same\n// attributes).\n//\n// @method normalizeTags\n// @param {HTMLElement} element The element to process.\nexport function normalizeTags (element) {\n const fragment = document.createDocumentFragment()\n\n // Remove line breaks at the beginning of a content block\n removeWhitespaces(element, 'firstChild')\n\n // Remove line breaks at the end of a content block\n removeWhitespaces(element, 'lastChild')\n\n for (const node of element.childNodes) {\n // skip empty tags, so they'll get removed\n if (node.nodeName !== 'BR' && !node.textContent) continue\n\n if (node.nodeType === nodeType.elementNode && node.nodeName !== 'BR') {\n let sibling = node\n while ((sibling = sibling.nextSibling) !== null) {\n if (!parser.isSameNode(sibling, node)) break\n\n for (const siblingChild of sibling.childNodes) {\n node.appendChild(siblingChild.cloneNode(true))\n }\n\n sibling.remove()\n }\n\n normalizeTags(node)\n }\n\n fragment.appendChild(node.cloneNode(true))\n }\n\n while (element.firstChild) element.removeChild(element.firstChild)\n\n element.appendChild(fragment)\n}\n\nexport function normalizeWhitespace (text) {\n return text.replace(whitespaceExceptSpace, ' ')\n}\n\n// Clean the element from character, tags, etc... added by the plugin logic.\n//\n// @method cleanInternals\n// @param {HTMLElement} element The element to process.\nexport function cleanInternals (element) {\n // Uses extract content for simplicity. A custom method\n // that does not clone the element could be faster if needed.\n element.innerHTML = extractContent(element, true)\n}\n\n// Extracts the content from a host element.\n// Does not touch or change the host. Just returns\n// the content and removes elements marked for removal by editable.\n//\n// @param {DOM node or document fragment} Element where to clean out the innerHTML.\n// If you pass a document fragment it will be empty after this call.\n// @param {Boolean} Flag whether to keep ui elements like spellchecking highlights.\n// @returns {String} The cleaned innerHTML of the passed element or document fragment.\nexport function extractContent (element, keepUiElements) {\n const innerHtml = (element.nodeType === nodeType.documentFragmentNode\n ? getInnerHtmlOfFragment(element)\n : element.innerHTML\n )\n .replace(zeroWidthNonBreakingSpace, '') // Used for forcing inline elements to have a height\n .replace(zeroWidthSpace, '<br>') // Used for cross-browser newlines\n\n const clone = document.createElement('div')\n clone.innerHTML = innerHtml\n unwrapInternalNodes(clone, keepUiElements)\n\n // Remove line breaks at the beginning of a content block\n removeWhitespaces(clone, 'firstChild')\n\n // Remove line breaks at the end of a content block\n removeWhitespaces(clone, 'lastChild')\n\n return clone.innerHTML\n}\n\nexport function getInnerHtmlOfFragment (documentFragment) {\n const div = document.createElement('div')\n div.appendChild(documentFragment)\n return div.innerHTML\n}\n\n// Create a document fragment from an html string\n// @param {String} e.g. 'some html <span>text</span>.'\nexport function createFragmentFromString (htmlString) {\n const wrapper = document.createElement('div')\n wrapper.innerHTML = htmlString\n\n const fragment = document.createDocumentFragment()\n while (wrapper.firstChild) fragment.appendChild(wrapper.firstChild)\n return fragment\n}\n\nexport function adoptElement (node, doc) {\n return node.ownerDocument !== doc\n ? doc.adoptNode(node)\n : node\n}\n\n// It will return a fragment with the cloned contents of the range\n// without the commonAncestorElement.\n//\n// @param {Range}\n// @return {DocumentFragment}\nexport function cloneRangeContents (range) {\n const rangeFragment = range.cloneContents()\n const parent = rangeFragment.childNodes[0]\n const fragment = document.createDocumentFragment()\n while (parent.childNodes.length) fragment.appendChild(parent.childNodes[0])\n return fragment\n}\n\nfunction removeWhitespaces (node, type, firstCall = true) {\n let elem\n // loop through all children:\n // from left to right if type = 'firstChild',\n // from right to left if type = 'lastChild'\n while ((elem = node[type])) {\n if (elem.nodeType === nodeType.textNode) {\n // Just remove text nodes if they consist only of whitespace\n if (everythingWhitespace.test(elem.textContent)) node.removeChild(elem)\n else break\n } else if (elem.nodeName === 'BR') {\n elem.remove()\n } else {\n // For element nodes (e.g. <strong> tags), we repeat the logic recursively\n // to remove empty text nodes or <br> tags.\n if (elem[type]) removeWhitespaces(elem, type, false)\n break\n }\n }\n\n // Text nodes with leading/trailing whitespace can be trimmed if config allows.\n // We only do it to the outermost text node. Once a text was wrapped in\n // another element, we preserve the whitespace.\n if (!firstCall) return\n elem = node[type]\n if (elem?.nodeType !== nodeType.textNode) return\n // Remove whitespaces at the end or start of a block with content\n // e.g. ' Hello world' > 'Hello World'\n if (config.trimLeadingAndTrailingWhitespaces) {\n elem.textContent = elem.textContent.replace(type.startsWith('last') ? trailingWhitespace : leadingWhitespace, '')\n }\n}\n\n// Remove elements that were inserted for internal or user interface purposes\n//\n// @param {DOM node}\n// @param {Boolean} whether to keep ui elements like spellchecking highlights\n// Currently:\n// - Saved ranges\nexport function unwrapInternalNodes (sibling, keepUiElements) {\n while (sibling) {\n const nextSibling = sibling.nextSibling\n\n if (sibling.nodeType !== nodeType.elementNode) {\n sibling = nextSibling\n continue\n }\n\n const attr = sibling.getAttribute('data-editable')\n\n if (sibling.firstChild) unwrapInternalNodes(sibling.firstChild, keepUiElements)\n\n if (attr === 'remove' || (attr === 'ui-remove' && !keepUiElements)) {\n sibling.remove()\n } if (attr === 'unwrap' || (attr === 'ui-unwrap' && !keepUiElements)) {\n unwrap(sibling)\n }\n\n sibling = nextSibling\n }\n}\n\n// Get all tags that start or end inside the range\nexport function getTags (host, range, filterFunc) {\n const innerTags = getInnerTags(range, filterFunc)\n const ancestorTags = getAncestorTags(host, range, filterFunc)\n return innerTags.concat(ancestorTags)\n}\n\n// Get all ancestor tags that start or end inside the range\nexport function getAncestorTags (host, range, filterFunc) {\n const tags = []\n let node = range.commonAncestorContainer\n while (node !== host) {\n if (!filterFunc || filterFunc(node)) tags.push(node)\n node = node.parentNode\n }\n\n return tags\n}\n\nexport function getTagsByName (host, range, tagName) {\n return getTags(host, range, (node) => {\n return node.nodeName.toUpperCase() === tagName.toUpperCase()\n })\n}\n\nexport function getTagsByNameAndAttributes (host, range, elem) {\n return getTags(host, range, (node) => {\n return node.nodeName.toUpperCase() === elem.nodeName.toUpperCase() &&\n areSameAttributes(node.attributes, elem.attributes)\n })\n}\n\nexport function areSameAttributes (attrs1, attrs2) {\n if (attrs1.length !== attrs2.length) return false\n\n for (let i = 0; i < attrs1.length; i++) {\n const attr = attrs2[attrs1[i].name]\n if (!(attr && attr.value === attrs1[i].value)) return false\n }\n\n return true\n}\n\n// Get all tags that start or end inside the range\nexport function getInnerTags (range, filterFunc) {\n return getNodes(range, [nodeType.elementNode], filterFunc)\n}\n\n// Get all tags whose text is completely within the current selection.\nexport function getContainedTags (range, filterFunc) {\n return getNodes(range, [nodeType.elementNode], filterFunc)\n .filter(elem => containsNodeText(range, elem))\n}\n\n// Transform an array of elements into an array\n// of tagnames in uppercase\n//\n// @return example: ['STRONG', 'B']\nexport function getTagNames (elements = []) {\n return elements.map((element) => element.nodeName)\n}\n\nexport function isAffectedBy (host, range, tagName) {\n return getTags(host, range)\n .some((elem) => elem.nodeName === tagName.toUpperCase())\n}\n\n// select a whole element\nexport function selectNodeContents (element) {\n const range = createRange()\n range.selectNodeContents(element)\n return range\n}\n\nfunction intersectsRange (range1, range2) {\n return range1.compareBoundaryPoints(Range.END_TO_START, range2) === -1 &&\n range2.compareBoundaryPoints(Range.END_TO_START, range1) === -1\n}\n\n// Check if the range selects all of the elements contents,\n// not less or more.\n//\n// @param visible: Only compare visible text. That way it does not\n// matter if the user selects an additional whitespace or not.\nexport function isExactSelection (range, elem, visible) {\n const elemRange = createRange()\n elemRange.selectNodeContents(elem)\n\n if (!intersectsRange(range, elemRange)) return false\n\n let rangeText = range.toString()\n let elemText = (elem.jquery ? elem[0] : elem).textContent\n\n if (visible) {\n rangeText = string.trim(rangeText)\n elemText = string.trim(elemText)\n }\n\n return rangeText !== '' && rangeText === elemText\n}\n\nexport function expandTo (host, range, elem) {\n range.selectNodeContents(elem)\n return range\n}\n\nexport function toggleTag (host, range, elem) {\n const elems = getTagsByNameAndAttributes(host, range, elem)\n\n if (elems.length === 1 &&\n isExactSelection(range, elems[0], 'visible')) {\n return removeFormattingElem(host, range, elem)\n }\n\n return forceWrap(host, range, elem)\n}\n\nexport function isWrappable (range) {\n return canSurroundContents(range)\n}\n\nexport function forceWrap (host, range, elem) {\n let restoredRange = restoreRange(host, range, () => {\n nukeElem(host, range, elem)\n })\n\n // remove all tags if the range is not wrappable\n if (!isWrappable(restoredRange)) {\n restoredRange = restoreRange(host, restoredRange, () => {\n nuke(host, restoredRange)\n })\n }\n\n wrap(restoredRange, elem)\n return restoredRange\n}\n\nexport function wrap (range, elem) {\n if (!isWrappable(range)) {\n console.log('content.wrap(): can not surround range')\n return\n }\n\n if (typeof elem === 'string') elem = createElement(elem)\n range.surroundContents(elem)\n}\n\nexport function unwrap (elem) {\n elem = elem.jquery ? elem[0] : elem\n const parent = elem.parentNode\n while (elem.firstChild) parent.insertBefore(elem.firstChild, elem)\n parent.removeChild(elem)\n}\n\nexport function removeFormattingElem (host, range, elem) {\n return restoreRange(host, range, () => {\n nukeElem(host, range, elem)\n })\n}\n\nexport function removeFormatting (host, range, selector) {\n return restoreRange(host, range, () => {\n nuke(host, range, selector)\n })\n}\n\n// Unwrap all tags this range is affected by.\n// Can also affect content outside of the range.\nexport function nuke (host, range, selector) {\n getTags(host, range).forEach((elem) => {\n if (elem.nodeName.toUpperCase() !== 'BR' && (!selector || elem.matches(selector))) {\n unwrap(elem)\n }\n })\n}\n\n// Unwrap all tags this range is affected by.\n// Can also affect content outside of the range.\nexport function nukeElem (host, range, node) {\n getTags(host, range).forEach((elem) => {\n if (elem.nodeName.toUpperCase() !== 'BR' && (!node ||\n (elem.nodeName.toUpperCase() === node.nodeName.toUpperCase() &&\n areSameAttributes(elem.attributes, node.attributes)))) {\n unwrap(elem)\n }\n })\n}\n\n// Insert a single character (or string) before or after\n// the range.\nexport function insertCharacter (range, character, atStart) {\n const insertEl = document.createTextNode(character)\n const boundaryRange = range.cloneRange()\n boundaryRange.collapse(atStart)\n boundaryRange.insertNode(insertEl)\n range[atStart ? 'setStartBefore' : 'setEndAfter'](insertEl)\n normalizeBoundaries(range)\n}\n\n// Surround the range with characters like start and end quotes.\n//\n// @method surround\nexport function surround (host, range, startCharacter, endCharacter) {\n insertCharacter(range, endCharacter || startCharacter, false)\n insertCharacter(range, startCharacter, true)\n return range\n}\n\n// Removes a character from the text within a range.\n//\n// @method deleteCharacter\nexport function deleteCharacter (host, range, character) {\n if (!containsString(range, character)) return range\n\n // check for selection.rangeCount > 0 ?\n if (window.getSelection().rangeCount > 0) splitBoundaries(range)\n const restoredRange = restoreRange(host, range, () => {\n getNodes(range, [nodeType.textNode], (node) => {\n return node.nodeValue.indexOf(character) >= 0\n })\n .forEach((node) => {\n node.nodeValue = node.nodeValue.replaceAll(character, '')\n })\n })\n\n normalizeBoundaries(restoredRange)\n return restoredRange\n}\n\nexport function containsString (range, str) {\n return range.toString().indexOf(str) >= 0\n}\n\n// Unwrap all tags this range is affected by.\n// Can also affect content outside of the range.\nexport function nukeTag (host, range, tagName) {\n getTags(host, range).forEach((elem) => {\n if (elem.nodeName.toUpperCase() === tagName.toUpperCase()) unwrap(elem)\n })\n}\n\nfunction createNodeIterator (root, filter) {\n let currentNode = root\n let previousNode = null\n\n function nextNode () {\n if (!currentNode) {\n return null\n }\n\n if (currentNode.firstChild && previousNode !== currentNode.firstChild) {\n previousNode = currentNode\n currentNode = currentNode.firstChild\n } else if (currentNode.nextSibling) {\n previousNode = currentNode\n currentNode = currentNode.nextSibling\n } else {\n let parent = currentNode.parentNode\n while (parent && parent !== root) {\n if (parent.nextSibling) {\n previousNode = currentNode = parent.nextSibling\n break\n }\n parent = parent.parentNode\n }\n if (!parent || parent === root) {\n previousNode = currentNode = null\n }\n }\n\n return currentNode\n }\n\n return {\n next: nextNode\n }\n}\n\nfunction isNodeFullyContained (node, range) {\n const nodeRange = document.createRange()\n nodeRange.selectNodeContents(node)\n return range.compareBoundaryPoints(Range.START_TO_START, nodeRange) <= 0 &&\n range.compareBoundaryPoints(Range.END_TO_END, nodeRange) >= 0\n}\n\nfunction canSurroundContents (range) {\n if (!range || !range.startContainer || !range.endContainer) {\n return false\n }\n\n if (range.startContainer === range.endContainer) return true\n\n // Create a custom node iterator for the common ancestor container\n const iterator = createNodeIterator(range.commonAncestorContainer, function (node) {\n return range.isPointInRange(node, 0)\n })\n\n let currentNode\n let boundariesInvalid = false\n\n while ((currentNode = iterator.next())) {\n if (currentNode.nodeType === Node.ELEMENT_NODE) {\n if (!isNodeFullyContained(currentNode, range)) {\n boundariesInvalid = true\n break\n }\n }\n }\n\n return !boundariesInvalid\n}\n","import config from './config.js'\nimport * as content from './content.js'\n\nlet nextBlockId = 1\nconst state = {}\n\nexport const next = getSibling('nextElementSibling')\nexport const previous = getSibling('previousElementSibling')\n\nexport function init (elem, {normalize, plainText, shouldSpellcheck}) {\n setBlockId(elem)\n\n elem.setAttribute('contenteditable', true)\n elem.setAttribute('spellcheck', Boolean(shouldSpellcheck))\n elem.setAttribute('data-plaintext', Boolean(plainText))\n\n elem.classList.remove(config.editableDisabledClass)\n elem.classList.add(config.editableClass)\n\n if (normalize) content.tidyHtml(elem)\n}\n\n\nexport function disable (elem) {\n elem.removeAttribute('contenteditable')\n elem.removeAttribute('spellcheck')\n elem.removeAttribute('data-plaintext')\n\n setState(elem, undefined)\n\n elem.classList.remove(config.editableClass)\n elem.classList.add(config.editableDisabledClass)\n}\n\nexport function isPlainTextBlock (elem) {\n return elem.getAttribute('data-plaintext') === 'true'\n}\n\nexport function setBlockId (elem) {\n if (!elem.hasAttribute('data-editable')) {\n elem.setAttribute('data-editable', `id-${nextBlockId}`)\n nextBlockId += 1\n }\n}\n\n\nexport function getState (elem) {\n if (elem.hasAttribute('data-editable')) {\n const id = elem.getAttribute('data-editable')\n return state[id]\n }\n}\n\n\nexport function setState (elem, data) {\n if (elem.hasAttribute('data-editable')) {\n const id = elem.getAttribute('data-editable')\n state[id] = data\n }\n}\n\n\n// Helpers\n// -------\n\nfunction getSibling (type) {\n return function (element) {\n const sibling = element[type]\n return sibling && sibling.getAttribute('contenteditable')\n ? sibling\n : null\n }\n}\n","const doubleQuotePairs = [\n ['«', '»'], // ch german, french\n ['»', '«'], // danish\n ['\"', '\"'], // danish, not specified\n ['“', '”'], // english US\n ['”', '”'], // swedish\n ['“', '“'], // chinese simplified\n ['„', '“'] // german\n]\nconst singleQuotePairs = [\n ['‘', '’'], // english UK\n ['‹', '›'], // ch german, french\n ['‚', '‘'], // german\n ['’', '’'], // swedish\n ['›', '‹'], // danish\n [`'`, `'`], // danish, not specified\n [`‘`, `’`] // chinese simplified\n]\n\nconst apostrophe = [\n '’', // german\n `'` // default\n]\nconst quotesRegex = /([‘’‹›‚'«»\"“”„])(?![^<]*?>)/g\n// whitespace end of tag, or any dash (normal, en or em-dash)\n// or any opening double quote\nconst beforeOpeningQuote = /\\s|[>\\-–—«»”\"“„]/\n\n// whitespace begin of tag, or any dash (normal, en or em-dash)\n// or any closing quote, or any punctuation\nconst afterClosingQuote = /\\s|[<\\-–—«»”\"“‘’‹›'.;?:,]/\nlet replacements\n\nexport function replaceAllQuotes (str, replaceQuotesRules) {\n replacements = replaceQuotesRules || {}\n replacements.quotes = replacements.quotes || [undefined, undefined]\n replacements.singleQuotes = replacements.singleQuotes || [undefined, undefined]\n\n const matches = getAllQuotes(str)\n if (matches.length > 0) {\n replaceMatchedQuotes(matches, 0)\n return replaceExistingQuotes(str, matches)\n }\n\n return str\n}\n\nfunction replaceMatchedQuotes (matches, position) {\n\n while (position < matches.length) {\n const closingTag = findClosingQuote(matches, position)\n\n if (closingTag) {\n matches[position].replace = closingTag.type === 'double'\n ? replacements.quotes[0]\n : replacements.singleQuotes[0]\n\n matches[closingTag.position].replace = closingTag.type === 'double'\n ? replacements.quotes[1]\n : replacements.singleQuotes[1]\n\n if (closingTag.position !== position + 1) {\n const nestedMatches = matches.slice(position + 1, closingTag.position)\n if (nestedMatches) {\n replaceMatchedQuotes(nestedMatches, 0)\n }\n }\n\n position = closingTag.position + 1\n } else {\n matches[position].replace = replaceApostrophe(matches[position].char)\n position += 1\n }\n }\n}\n\nfunction findClosingQuote (matches, position) {\n if (position === matches.length - 1) return\n const current = matches[position]\n const openingQuote = current.char\n\n if (current.before && !beforeOpeningQuote.test(current.before)) return\n\n const possibleClosingSingleQuotes = getPossibleClosingQuotes(openingQuote, singleQuotePairs)\n const possibleClosingDoubleQuotes = getPossibleClosingQuotes(openingQuote, doubleQuotePairs)\n for (let i = position + 1; i < matches.length; i++) {\n if ((matches[i].after && afterClosingQuote.test(matches[i].after)) || !matches[i].after) {\n if (possibleClosingSingleQuotes.includes(matches[i].char)) {\n return {position: i, type: 'single'}\n }\n if (possibleClosingDoubleQuotes.includes(matches[i].char)) {\n return {position: i, type: 'double'}\n }\n }\n }\n}\n\nfunction getPossibleClosingQuotes (openingQuote, pairs) {\n return pairs.filter(quotePair => quotePair[0] === openingQuote).map((quotePair) => quotePair[1])\n}\n\nfunction replaceApostrophe (quote) {\n if (apostrophe.includes(quote)) {\n return replacements.apostrophe\n }\n}\n\nfunction getAllQuotes (str) {\n return [...str.matchAll(quotesRegex)].map((match) => {\n const index = match.index\n return {\n char: match[1],\n before: index > 0 ? str[index - 1] : '',\n after: (index + 1) < str.length ? str[index + 1] : ''\n }\n })\n}\n\nfunction replaceExistingQuotes (str, matches) {\n let index = 0\n return str.replace(quotesRegex, (match) => {\n const replacement = matches[index].replace || matches[index].char\n index += 1\n return replacement\n })\n}\n","import config from './config.js'\nimport * as string from './util/string.js'\nimport * as nodeType from './node-type.js'\nimport * as quotes from './quotes.js'\nimport {isPlainTextBlock} from './block.js'\n\nlet allowedElements, allowedPlainTextElements, requiredAttributes, transformElements, blockLevelElements, replaceQuotes\nlet splitIntoBlocks, blacklistedElements\nconst whitespaceOnly = /^\\s*$/\nconst blockPlaceholder = '<!-- BLOCK -->'\nlet keepInternalRelativeLinks\n\nupdateConfig(config)\nexport function updateConfig (conf) {\n const rules = conf.pastedHtmlRules\n allowedElements = rules.allowedElements || {}\n allowedPlainTextElements = rules.allowedPlainTextElements || {}\n requiredAttributes = rules.requiredAttributes || {}\n transformElements = rules.transformElements || {}\n blacklistedElements = rules.blacklistedElements || []\n keepInternalRelativeLinks = rules.keepInternalRelativeLinks || false\n replaceQuotes = rules.replaceQuotes || {}\n\n blockLevelElements = {}\n rules.blockLevelElements.forEach((name) => { blockLevelElements[name] = true })\n splitIntoBlocks = {}\n rules.splitIntoBlocks.forEach((name) => { splitIntoBlocks[name] = true })\n}\n\nexport function paste (block, cursor, clipboardContent) {\n const document = block.ownerDocument\n block.setAttribute(config.pastingAttribute, true)\n\n if (cursor.isSelection) {\n cursor = cursor.deleteExactSurroundingTags()\n .deleteContainedTags()\n .deleteContent()\n }\n\n // Create a placeholder to help parse HTML\n const pasteHolder = document.createElement('div')\n pasteHolder.innerHTML = clipboardContent\n\n const isPlainText = isPlainTextBlock(block)\n const blocks = parseContent(pasteHolder, {plainText: isPlainText})\n\n block.removeAttribute(config.pastingAttribute)\n return {blocks, cursor}\n}\n\n/**\n * - Parse pasted content\n * - Split it up into blocks\n * - clean and normalize every block\n * - optionally strip the host location an anchorTag-href\n * www.livindocs.io/internalLink -> /internalLink\n *\n * @param {DOM node} A container where the pasted content is located.\n * @returns {Array of Strings} An array of cleaned innerHTML like strings.\n */\nexport function parseContent (element, {plainText = false} = {}) {\n const options = {\n allowedElements: plainText ? allowedPlainTextElements : allowedElements,\n keepInternalRelativeLinks: plainText ? false : keepInternalRelativeLinks\n }\n\n // Filter pasted content\n return filterHtmlElements(element, options)\n // Handle Blocks\n .split(blockPlaceholder)\n .map((entry) => string.trim(cleanWhitespace(replaceAllQuotes(entry))))\n .filter((entry) => !whitespaceOnly.test(entry))\n}\n\nfunction filterHtmlElements (elem, options) {\n return Array.from(elem.childNodes).reduce((content, child) => {\n if (blacklistedElements.indexOf(child.nodeName.toLowerCase()) !== -1) {\n return ''\n }\n\n // Keep internal relative links relative (on paste).\n if (options.keepInternalRelativeLinks && child.nodeName === 'A' && child.href) {\n const stripInternalHost = child.getAttribute('href').replace(window.location.origin, '')\n child.setAttribute('href', stripInternalHost)\n }\n\n if (child.nodeType === nodeType.elementNode) {\n const childContent = filterHtmlElements(child, options)\n return content + conditionalNodeWrap(child, childContent, options)\n }\n\n // Escape HTML characters <, > and &\n if (child.nodeType === nodeType.textNode) return content + string.escapeHtml(child.nodeValue)\n return content\n }, '')\n}\n\nfunction conditionalNodeWrap (child, content, options) {\n let nodeName = child.nodeName.toLowerCase()\n nodeName = transformNodeName(nodeName)\n\n if (shouldKeepNode(nodeName, child, options)) {\n const attributes = filterAttributes(nodeName, child)\n\n if (nodeName === 'br') return `<${nodeName + attributes}>`\n\n if (!whitespaceOnly.test(content)) {\n return `<${nodeName + attributes}>${content}</${nodeName}>`\n }\n\n return content\n }\n\n if (splitIntoBlocks[nodeName]) {\n return blockPlaceholder + content + blockPlaceholder\n }\n\n // prevent missing whitespace between text when block-level\n // elements are removed.\n if (blockLevelElements[nodeName]) return `${content} `\n\n return content\n}\n\n// returns string of concatenated attributes e.g. 'target=\"_blank\" rel=\"nofollow\" href=\"/test.com\"'\nfunction filterAttributes (nodeName, node) {\n return Array.from(node.attributes).reduce((attributes, {name, value}) => {\n if (allowedElements[nodeName]?.[name] && value) {\n return `${attributes} ${name}=\"${value}\"`\n }\n return attributes\n }, '')\n}\n\nfunction transformNodeName (nodeName) {\n return transformElements[nodeName] || nodeName\n}\n\nfunction hasRequiredAttributes (nodeName, node) {\n const requiredAttrs = requiredAttributes[nodeName]\n if (!requiredAttrs) return true\n\n return !requiredAttrs.some((name) => !node.getAttribute(name))\n}\n\nfunction shouldKeepNode (nodeName, node, options) {\n return options.allowedElements[nodeName] && hasRequiredAttributes(nodeName, node)\n}\n\nfunction cleanWhitespace (str) {\n return str\n .replace(/\\n/g, ' ')\n .replace(/ {2,}/g, ' ')\n .replace(/(.)\\u00A0/g, (match, group) => group + (/[\\u0020]/.test(group)\n ? '\\u00A0'\n : ' '\n ))\n}\n\nfunction replaceAllQuotes (str) {\n if (replaceQuotes.quotes || replaceQuotes.singleQuotes || replaceQuotes.apostrophe) {\n return quotes.replaceAllQuotes(str, replaceQuotes)\n }\n\n return str\n}\n","/**\n* Check for contenteditable support\n*\n* (from Modernizr)\n* this is known to false positive in some mobile browsers\n* here is a whitelist of verified working browsers:\n* https://github.com/NielsLeenheer/html5test/blob/549f6eac866aa861d9649a0707ff2c0157895706/scripts/engine.js#L2083\n*/\nexport const contenteditable = typeof document.documentElement.contentEditable !== 'undefined'\n\n// Detect webkit browser engine\n// That way we can detect the contenteditable span bug on safari, but exclude chrome\n// Regex taken from: https://github.com/lancedikson/bowser/blob/f09411489ced05811c91cc6670a8e4ca9cbe39a7/src/parser-engines.js#L93-L106\n// Attention, this might be error prone as any engine version change breaks this.\nconst isBlink = /(apple)?webkit\\/537\\.36/i.test(window.navigator.userAgent)\nconst isWebkit = /(apple)?webkit/i.test(window.navigator.userAgent)\nconst webKit = !isBlink && isWebkit\n\n/**\n * Check selectionchange event (supported in IE, Chrome, Firefox and Safari)\n * Firefox supports it since version 52 (2017).\n * Opera has no support as of 2021.\n */\nconst hasNativeSelectionchangeSupport = (document) => {\n const doc = document\n const osc = doc.onselectionchange\n if (osc !== undefined) {\n try {\n doc.onselectionchange = 0\n return doc.onselectionchange === null\n } catch (e) {\n } finally {\n doc.onselectionchange = osc\n }\n }\n return false\n}\n\nexport const selectionchange = hasNativeSelectionchangeSupport(document)\n\n// See Keyboard.prototype.preventContenteditableBug for more information.\nexport const contenteditableSpanBug = !!webKit\n","// Eventable Mixin.\n//\n// Simple mixin to add event emitter methods to an object (Publish/Subscribe).\n//\n// Add on, off and notify methods to an object:\n// eventable(obj)\n//\n// publish an event:\n// obj.notify(context, 'action', param1, param2)\n//\n// Optionally pass a context that will be applied to every event:\n// eventable(obj, context)\n//\n// With this publishing can omit the context argument:\n// obj.notify('action', param1, param2)\n//\n// Subscribe to a 'channel'\n// obj.on('action', funtion(param1, param2){ ... })\n//\n// Unsubscribe an individual listener:\n// obj.off('action', method)\n//\n// Unsubscribe all listeners of a channel:\n// obj.off('action')\n//\n// Unsubscribe all listeners of all channels:\n// obj.off()\n\nexport default function eventable (obj, notifyContext) {\n const events = getEventableModule(notifyContext)\n obj.on = events.on\n obj.off = events.off\n obj.notify = events.notify\n}\n\nfunction getEventableModule (notifyContext) {\n let listeners = {}\n\n function addListener (events, listener) {\n events.split(' ').forEach(event => {\n listeners[event] = listeners[event] || []\n listeners[event].unshift(listener)\n })\n }\n\n function removeListener (event, listener) {\n const eventListeners = listeners[event]\n if (!eventListeners) return\n\n const index = eventListeners.indexOf(listener)\n if (index < 0) return\n\n eventListeners.splice(index, 1)\n }\n\n // Public Methods\n return {\n on (event, listener) {\n if (arguments.length === 2) {\n addListener(event, listener)\n } else if (arguments.length === 1) {\n for (const eventType in event) addListener(eventType, event[eventType])\n }\n return this\n },\n\n off (event, listener) {\n if (arguments.length === 2) {\n removeListener(event, listener)\n } else if (arguments.length === 1) {\n listeners[event] = []\n } else {\n listeners = {}\n }\n },\n\n notify (context, event) {\n const args = Array.from(arguments)\n\n if (notifyContext) {\n event = context\n context = notifyContext\n args.splice(0, 1)\n } else {\n args.splice(0, 2)\n }\n\n if (this.switchContext) {\n const nextEvent = this.switchContext.events.shift()\n if (event !== nextEvent) this.switchContext = undefined\n }\n\n const eventListeners = listeners[event]\n if (!eventListeners) return\n\n // Execute the newest listeners first.\n // Stop if a listener returns false.\n eventListeners.every((listener) => listener.apply(context, args) !== false)\n }\n }\n}\n","// code from mdn: https://developer.mozilla.org/en-US/docs/Web/API/window.scrollX\nfunction getScrollPosition (win) {\n const x = (win.pageXOffset !== undefined) ? win.pageXOffset : (win.document.documentElement || win.document.body.parentNode || win.document.body).scrollLeft\n const y = (win.pageYOffset !== undefined) ? win.pageYOffset : (win.document.documentElement || win.document.body.parentNode || win.document.body).scrollTop\n return {x, y}\n}\n\nexport {getScrollPosition}\n","import * as viewport from './util/viewport.js'\n\nimport * as content from './content.js'\nimport * as parser from './parser.js'\nimport * as string from './util/string.js'\nimport {elementNode, documentFragmentNode} from './node-type.js'\nimport error from './util/error.js'\nimport * as rangeSaveRestore from './range-save-restore.js'\nimport {closest, getSelection, rangesAreEqual} from './util/dom.js'\n\n/**\n * The Cursor module provides a cross-browser abstraction layer for cursor.\n *\n * @module core\n * @submodule cursor\n */\n\nexport default class Cursor {\n\n static findHost (elem, selector) {\n return closest(elem, selector)\n }\n\n /**\n * Class for the Cursor module.\n *\n * @class Cursor\n * @constructor\n */\n constructor (editableHost, range) {\n this.setHost(editableHost)\n this.range = range\n this.isCursor = true\n }\n\n // Get all tags that affect the current selection. Optionally pass a\n // method to filter the returned elements.\n //\n // @param {Function filter(node)} [Optional] Method to filter the returned\n // DOM Nodes.\n // @return {Array of DOM Nodes}\n getTags (filterFunc) {\n return content.getTags(this.host, this.range, filterFunc)\n }\n\n // Get the names of all tags that affect the current selection. Optionally\n // pass a method to filter the returned elements.\n //\n // @param {Function filter(node)} [Optional] Method to filter the DOM\n // Nodes whose names are returned.\n // @return {Array<String> of tag names}\n getTagNames (filterFunc) {\n return content.getTagNames(this.getTags(filterFunc))\n }\n\n // Get all tags of the specified type that affect the current selection.\n //\n // @method getTagsByName\n // @param {String} tagName. E.g. 'a' to get all links.\n // @return {Array of DOM Nodes}\n getTagsByName (tagName) {\n return content.getTagsByName(this.host, this.range, tagName)\n }\n\n // Get all tags that are completely within the current selection.\n getInnerTags (filterFunc) {\n return content.getInnerTags(this.range, filterFunc)\n }\n\n // Get all tags whose text is completely within the current selection.\n getContainedTags (filterFunc) {\n return content.getContainedTags(this.range, filterFunc)\n }\n\n // Get all tags that surround the current selection.\n getAncestorTags (filterFunc) {\n return content.getAncestorTags(this.host, this.range, filterFunc)\n }\n\n isAtEnd () {\n return parser.isEndOfHost(\n this.host,\n this.range.endContainer,\n this.range.endOffset\n )\n }\n\n isAtTextEnd () {\n return parser.isTextEndOfHost(\n this.host,\n this.range.endContainer,\n this.range.endOffset\n )\n }\n\n isAtLastLine () {\n const hostRange = this.win.document.createRange()\n hostRange.selectNodeContents(this.host)\n hostRange.collapse(false)\n const hostCoords = getRangeBoundingClientRect(hostRange, this.win)\n const cursorCoords = getRangeBoundingClientRect(this.range, this.win)\n return isCloseTo(hostCoords.bottom, cursorCoords.bottom)\n }\n\n isAtFirstLine () {\n const hostRange = this.win.document.createRange()\n hostRange.selectNodeContents(this.host)\n hostRange.collapse(true)\n const hostCoords = getRangeBoundingClientRect(hostRange, this.win)\n const cursorCoords = getRangeBoundingClientRect(this.range, this.win)\n return isCloseTo(hostCoords.top, cursorCoords.top)\n }\n\n isAtBeginning () {\n return parser.isBeginningOfHost(\n this.host,\n this.range.startContainer,\n this.range.startOffset\n )\n }\n\n // Insert content before the cursor\n //\n // @param {String, DOM node or document fragment}\n insertBefore (element) {\n if (string.isString(element)) element = content.createFragmentFromString(element)\n if (parser.isDocumentFragmentWithoutChildren(element)) return\n\n element = this.adoptElement(element)\n\n let preceedingElement = element\n if (element.nodeType === documentFragmentNode) {\n const lastIndex = element.childNodes.length - 1\n preceedingElement = element.childNodes[lastIndex]\n }\n\n this.range.insertNode(element)\n this.range.setStartAfter(preceedingElement)\n this.range.setEndAfter(preceedingElement)\n this.host.normalize() // mend text nodes\n }\n\n // Insert content after the cursor\n //\n // @param {String, DOM node or document fragment}\n insertAfter (element) {\n if (string.isString(element)) element = content.createFragmentFromString(element)\n if (parser.isDocumentFragmentWithoutChildren(element)) return\n\n element = this.adoptElement(element)\n\n const after = this.range.cloneRange()\n after.setStart(after.endContainer, after.endOffset)\n after.collapse(true)\n after.insertNode(element)\n this.host.normalize() // mend text nodes\n }\n\n // Alias for #setVisibleSelection()\n setSelection () {\n this.setVisibleSelection()\n }\n\n setVisibleSelection () {\n if (this.win.document.activeElement !== this.host) {\n const {x, y} = viewport.getScrollPosition(this.win)\n this.win.scrollTo(x, y)\n }\n\n const selection = getSelection(this.win)\n selection.removeAllRanges()\n selection.addRange(this.range)\n }\n\n // Take the following example:\n // (The character '|' represents the cursor position)\n //\n // <div contenteditable=\"true\">fo|o</div>\n // before() will return a document fragment containing a text node 'fo'.\n //\n // @returns {Document Fragment} content before the cursor or selection.\n before () {\n const range = this.range.cloneRange()\n range.collapse(true)\n range.setStartBefore(this.host)\n return content.cloneRangeContents(range)\n }\n\n textBefore () {\n const range = this.range.cloneRange()\n range.collapse(true)\n range.setStartBefore(this.host)\n return range.toString()\n }\n\n // Same as before() but returns a string.\n beforeHtml () {\n return content.getInnerHtmlOfFragment(this.before())\n }\n\n // Take the following example:\n // (The character '|' represents the cursor position)\n //\n // <div contenteditable=\"true\">fo|o</div>\n // after() will return a document fragment containing a text node 'o'.\n //\n // @returns {Document Fragment} content after the cursor or selection.\n after () {\n const range = this.range.cloneRange()\n range.collapse(false)\n range.setEndAfter(this.host)\n return content.cloneRangeContents(range)\n }\n\n textAfter () {\n const range = this.range.cloneRange()\n range.collapse(false)\n range.setEndAfter(this.host)\n return range.toString()\n }\n\n // Same as after() but returns a string.\n afterHtml () {\n return content.getInnerHtmlOfFragment(this.after())\n }\n\n getBoundingClientRect () {\n return this.range.getBoundingClientRect()\n }\n\n // Get the BoundingClientRect of the cursor.\n // The returned values are transformed to be absolute\n // (relative to the document).\n getCoordinates (positioning = 'absolute') {\n const coords = this.range.getBoundingClientRect()\n if (positioning === 'fixed') return coords\n\n // translate into absolute positions\n const {x, y} = viewport.getScrollPosition(this.win)\n return {\n top: coords.top + y,\n bottom: coords.bottom + y,\n left: coords.left + x,\n right: coords.right + x,\n height: coords.height,\n width: coords.width\n }\n }\n\n moveBefore (element) {\n this.updateHost(element)\n this.range.setStartBefore(element)\n this.range.setEndBefore(element)\n if (this.isSelection) return new Cursor(this.host, this.range)\n }\n\n moveAfter (element) {\n this.updateHost(element)\n this.range.setStartAfter(element)\n this.range.setEndAfter(element)\n if (this.isSelection) return new Cursor(this.host, this.range)\n }\n\n // Move the cursor to the beginning of the host.\n moveAtBeginning (element = this.host) {\n this.updateHost(element)\n this.range.selectNodeContents(element)\n this.range.collapse(true)\n if (this.isSelection) return new Cursor(this.host, this.range)\n }\n\n // Move the cursor to the end of the host.\n moveAtEnd (element = this.host) {\n this.updateHost(element)\n this.range.selectNodeContents(element)\n this.range.collapse(false)\n if (this.isSelection) return new Cursor(this.host, this.range)\n }\n\n // Move the cursor after the last visible character of the host.\n moveAtTextEnd (element) {\n return this.moveAtEnd(parser.lastChild(element))\n }\n\n setHost (element) {\n if (element.jquery) element = element[0]\n this.host = element\n this.win = (element === undefined || element === null) ? window : element.ownerDocument.defaultView\n }\n\n updateHost (element) {\n const host = parser.getHost(element)\n if (!host) error('Can not set cursor outside of an editable block')\n this.setHost(host)\n }\n\n retainVisibleSelection (callback) {\n this.save()\n callback() // eslint-disable-line callback-return\n this.restore()\n this.setVisibleSelection()\n }\n\n save () {\n this.savedRangeInfo = rangeSaveRestore.save(this.range)\n this.savedRangeInfo.host = this.host\n }\n\n restore () {\n if (!this.savedRangeInfo) error('Could not restore selection')\n\n this.host = this.savedRangeInfo.host\n this.range = rangeSaveRestore.restore(this.host, this.savedRangeInfo)\n this.savedRangeInfo = undefined\n }\n\n equals (cursor) {\n if (!cursor) return false\n\n if (!cursor.host) return false\n if (!cursor.host.isEqualNode(this.host)) return false\n\n if (!cursor.range) return false\n if (!rangesAreEqual(cursor.range, this.range)) return false\n\n return true\n }\n\n // Create an element with the correct ownerWindow\n // (see: http://www.w3.org/DOM/faq.html#ownerdoc)\n createElement (tagName, attributes = {}) {\n const element = this.win.document.createElement(tagName)\n for (const attributeName in attributes) {\n const attributeValue = attributes[attributeName]\n element.setAttribute(attributeName, attributeValue)\n }\n return element\n }\n\n createTextNode (text) {\n return this.win.document.createTextNode(text)\n }\n\n // Make sure a node has the correct ownerWindow\n // (see: https://developer.mozilla.org/en-US/docs/Web/API/Document/importNode)\n adoptElement (node) {\n return content.adoptElement(node, this.win.document)\n }\n\n // Currently we call triggerChange manually after format changes.\n // This is to prevent excessive triggering of the change event during\n // merge or split operations or other manipulations by scripts.\n triggerChange () {\n const event = new Event('formatEditable', {bubbles: true, cancelable: false})\n this.host.dispatchEvent(event)\n }\n}\n\n\n/**\n* Get position of the range or cursor\n*\n* Can be used to reliably get the boundingClientRect without\n* some any of the drawbacks that the native range has.\n*\n* With the native range.getClientBoundingRect(), newlines are\n* not considered when calculating the position\n*\n* @param {Range} range\n* @param {Window} win\n*/\nfunction getRangeBoundingClientRect (range, win) {\n if (range.startContainer.nodeType !== elementNode) return range.getBoundingClientRect()\n const el = win.document.createElement('span')\n el.setAttribute('doc-editable', 'unwrap')\n range.insertNode(el)\n const coords = el.getBoundingClientRect()\n el.remove()\n return coords\n}\n\nfunction isCloseTo (a, b) {\n if (a === b) return true\n if (Math.abs(a - b) <= 2) return true\n return false\n}\n","import NodeIterator from './node-iterator.js'\nimport * as nodeType from './node-type.js'\nimport {createRange} from './util/dom.js'\n\nexport default {\n\n // Get the text from an editable block with a NodeIterator.\n // This must work the same as when later iterating over the text\n // in highlightMatches().\n extractText (element, convertBRs = true) {\n let text = ''\n getText(element, convertBRs, (part) => { text += part })\n return text\n },\n\n // Go through the element to highlight the matches while keeping the\n // existing html valid (highlighting a match may require inserting multiple\n // elements).\n //\n // @params\n // - matches\n // Array of positions in the string to highlight:\n // e.g [{\n // startIndex: 0,\n // endIndex: 1,\n // match: 'The', // not used, only the indexes are used for highlighting)\n // marker: DOMNode, // A clone of this element will be inserted\n // id: 'a7382', // used in word-id attribute\n // title: 'The World' // used in title attribute (optional)\n // }]\n highlightMatches (element, matches, countBRs = true) {\n if (!matches || matches.length === 0) {\n return\n }\n\n element.normalize() // mend text nodes\n\n const iterator = new NodeIterator(element)\n let currentMatchIndex = 0\n let totalOffset = 0\n let currentMatch = matches[currentMatchIndex]\n let portions = []\n let next\n let wordId\n let textNode\n while ((next = iterator.getNext())) {\n // Account for <br> elements\n if (next.nodeType === nodeType.textNode && next.data !== '') {\n textNode = next\n } else if (countBRs && next.nodeType === nodeType.elementNode && next.nodeName === 'BR') {\n totalOffset += 1\n continue\n } else {\n continue\n }\n\n const nodeText = textNode.data\n let nodeEndOffset = totalOffset + nodeText.length\n if (currentMatch.startIndex < nodeEndOffset && totalOffset < currentMatch.endIndex) {\n // get portion position (fist, last or in the middle)\n const isFirstPortion = totalOffset <= currentMatch.startIndex\n const isLastPortion = nodeEndOffset >= currentMatch.endIndex\n\n if (isFirstPortion) {\n wordId = currentMatch.id || currentMatch.startIndex\n }\n\n // calculate offset and length\n let offset\n if (isFirstPortion) {\n offset = currentMatch.startIndex - totalOffset\n } else {\n offset = 0\n }\n\n let length\n if (isLastPortion) {\n length = (currentMatch.endIndex - totalOffset) - offset\n } else {\n length = nodeText.length - offset\n }\n\n // create portion object\n const portion = {\n element: textNode,\n text: nodeText.substring(offset, offset + length),\n offset,\n length,\n isLastPortion,\n wordId\n }\n\n portions.push(portion)\n\n if (isLastPortion) {\n const lastNode = this.wrapMatch(portions, currentMatch.marker, currentMatch.title)\n iterator.replaceCurrent(lastNode)\n\n // recalculate nodeEndOffset if we have to replace the current node.\n nodeEndOffset = totalOffset + portion.length + portion.offset\n\n portions = []\n currentMatchIndex += 1\n if (currentMatchIndex < matches.length) {\n currentMatch = matches[currentMatchIndex]\n }\n }\n }\n\n totalOffset = nodeEndOffset\n }\n },\n\n // @return the last wrapped element\n wrapMatch (portions, stencilElement, title) {\n return portions.map((portion) => this.wrapPortion(portion, stencilElement, title)).pop()\n },\n\n wrapPortion (portion, stencilElement, title) {\n const range = createRange()\n range.setStart(portion.element, portion.offset)\n range.setEnd(portion.element, portion.offset + portion.length)\n const node = stencilElement.cloneNode(true)\n node.setAttribute('data-word-id', portion.wordId)\n if (title) node.setAttribute('title', title)\n range.surroundContents(node)\n\n // Fix a weird behaviour where an empty text node is inserted after the range\n if (node.nextSibling) {\n const next = node.nextSibling\n if (next.nodeType === nodeType.textNode && next.data === '') {\n next.remove()\n }\n }\n\n return node\n }\n\n}\n\n// Extract the text of an element.\n// This has two notable behaviours:\n// - It uses a NodeIterator which will skip elements\n// with data-editable=\"remove\"\n// - It returns a \\n for <br> elements\n// (The only block level element allowed inside of editables)\nfunction getText (element, convertBRs, func) {\n const iterator = new NodeIterator(element)\n let next\n while ((next = iterator.getNext())) {\n if (next.nodeType === nodeType.textNode && next.data !== '') {\n func(next.data)\n } else if (convertBRs && next.nodeType === nodeType.elementNode && next.nodeName === 'BR') {\n func('\\n')\n }\n }\n}\n","export function searchText (text, searchTerm, marker) {\n const matchMode = 'text'\n return findMatches(text, [searchTerm], matchMode, marker)\n}\n\nexport function searchWord (text, word, marker) {\n const matchMode = 'word'\n return findMatches(text, [word], matchMode, marker)\n}\n\nexport function searchAllWords (text, words, marker) {\n const matchMode = 'word'\n return findMatches(text, words, matchMode, marker)\n}\n\nfunction findMatches (text, searchTexts, matchMode, marker) {\n if (!text || text === '') return []\n if (marker && !isElement(marker)) return []\n if (!searchTexts?.length) return []\n\n const createRegex = matchMode === 'word'\n ? createWordRegex\n : createHighlightRegex\n\n const regex = createRegex(searchTexts)\n const matches = [...text.matchAll(regex)]\n\n return matches.map((match) => {\n let startIndex\n let matchedText\n if (matchMode === 'word') {\n startIndex = match.index + match[1].length\n matchedText = match[2]\n } else {\n startIndex = match.index\n matchedText = match[0]\n }\n\n return {\n startIndex,\n endIndex: startIndex + matchedText.length,\n match: matchedText,\n marker\n }\n })\n}\n\nfunction isElement (obj) {\n try {\n if (!obj) return false\n return obj instanceof obj.ownerDocument?.defaultView.HTMLElement\n } catch (e) {\n // Browsers not supporting W3 DOM2 don't have HTMLElement and\n // an exception is thrown and we end up here. Testing some\n // properties that all elements have (works on IE7)\n return (typeof obj === 'object') &&\n (obj.nodeType === 1) && (typeof obj.style === 'object') &&\n (typeof obj.ownerDocument === 'object')\n }\n}\n\nfunction createHighlightRegex (words = []) {\n const escapedWords = words.map((word) => escapeRegEx(word))\n\n const regex = `(${escapedWords.join('|')})`\n return new RegExp(regex, 'g')\n}\n\n// Regex to find whole words within a string\n//\n// Unicode character blocks for letters.\n// See: http://jrgraphix.net/research/unicode_blocks.php\n//\n// \\\\u0041-\\\\u005A A-Z (Basic Latin)\n// \\\\u0061-\\\\u007A a-z (Basic Latin)\n// \\\\u0030-\\\\u0039 0-9 (Basic Latin)\n// \\\\u00AA ª (Latin-1 Supplement)\n// \\\\u00B5 µ (Latin-1 Supplement)\n// \\\\u00BA º (Latin-1 Supplement)\n// \\\\u00C0-\\\\u00D6 À-Ö (Latin-1 Supplement)\n// \\\\u00D8-\\\\u00F6 Ø-ö (Latin-1 Supplement)\n// \\\\u00F8-\\\\u00FF ø-ÿ (Latin-1 Supplement)\n// \\\\u0100-\\\\u017F Ā-ſ (Latin Extended-A)\n// \\\\u0180-\\\\u024F ƀ-ɏ (Latin Extended-B)\nconst letterChars = '\\\\u0041-\\\\u005A\\\\u0061-\\\\u007A\\\\u0030-\\\\u0039\\\\u00AA\\\\u00B5\\\\u00BA\\\\u00C0-\\\\u00D6\\\\u00D8-\\\\u00F6\\\\u00F8-\\\\u00FF\\\\u0100-\\\\u017F\\\\u0180-\\\\u024F'\n\nfunction createWordRegex (words = []) {\n const escapedWords = words.map((word) => escapeRegEx(word))\n\n // (notLetter|^)(words)(?=notLetter|$)\n const regex = `([^${letterChars}]|^)` +\n `(${escapedWords.join('|')})` +\n `(?=[^${letterChars}]|$)`\n\n return new RegExp(regex, 'g')\n}\n\nfunction escapeRegEx (s) {\n return String(s).replace(/([.*+?^=!:${}()|[\\]/\\\\])/g, '\\\\$1')\n}\n","import * as content from './content.js'\nimport highlightText from './highlight-text.js'\nimport {searchText} from './plugins/highlighting/text-search.js'\nimport {createElement, createRange, toCharacterRange} from './util/dom.js'\n\nconst highlightSupport = {\n\n // Used to highlight arbitrary text in an editable. All occurrences\n // will be highlighted.\n highlightText (editableHost, text, highlightId, type, dispatcher) {\n if (this.hasHighlight(editableHost, highlightId)) return\n const blockText = highlightText.extractText(editableHost)\n\n const marker = `<span class=\"highlight-${type}\"></span>`\n const markerNode = highlightSupport.createMarkerNode(marker, type, this.win)\n\n const matches = searchText(blockText, text, markerNode)\n\n if (matches && matches.length) {\n if (highlightId) matches[0].id = highlightId\n highlightText.highlightMatches(editableHost, matches)\n if (dispatcher) dispatcher.notify('change', editableHost)\n return matches[0].startIndex\n }\n },\n\n // Used to highlight comments.\n // This function was changed to track matches when text is added to the start\n // of a component, but multiple white spaces break it in a strict sense\n // The function works in the editor and in browsers, but tests with\n // multiple white spaces will fail.\n // Browsers change the white spaces to   and the function works,\n // and the tests in highlight.spec.js have been updated to represent this.\n highlightRange (editableHost, text, highlightId, startIndex, endIndex, dispatcher, type = 'comment') {\n if (this.hasHighlight(editableHost, highlightId)) {\n this.removeHighlight(editableHost, highlightId)\n }\n\n const blockText = highlightText.extractText(editableHost, false)\n if (blockText === '') return -1 // the text was deleted so we can't highlight anything\n\n const marker = highlightSupport.createMarkerNode(\n `<span class=\"highlight-${type}\"></span>`,\n type,\n this.win\n )\n\n const actualStartIndex = startIndex\n const actualEndIndex = endIndex\n\n highlightText.highlightMatches(editableHost, [{\n startIndex: actualStartIndex,\n endIndex: actualEndIndex,\n id: highlightId,\n marker\n }], false)\n\n if (dispatcher) dispatcher.notify('change', editableHost)\n\n return actualStartIndex\n },\n\n updateHighlight (editableHost, highlightId, addCssClass, removeCssClass) {\n if (!document.documentElement.classList) return\n\n const elems = editableHost.querySelectorAll(`[data-word-id=\"${highlightId}\"]`)\n for (const elem of elems) {\n if (removeCssClass) elem.classList.remove(removeCssClass)\n if (addCssClass) elem.classList.add(addCssClass)\n }\n },\n\n removeHighlight (editableHost, highlightId, dispatcher) {\n const elems = editableHost.querySelectorAll(`[data-word-id=\"${highlightId}\"]`)\n for (const elem of elems) {\n content.unwrap(elem)\n }\n\n // remove empty text nodes, combine adjacent text nodes\n editableHost.normalize()\n\n if (dispatcher) dispatcher.notify('change', editableHost)\n },\n\n hasHighlight (editableHost, highlightId) {\n const matches = editableHost.querySelectorAll(`[data-word-id=\"${highlightId}\"]`)\n return !!matches.length\n },\n\n extractHighlightedRanges (editableHost, type) {\n let findMarkersQuery = '[data-word-id]'\n if (type) findMarkersQuery += `[data-highlight=\"${type}\"]`\n const markers = editableHost.querySelectorAll(findMarkersQuery)\n if (!markers.length) return\n\n const groups = {}\n for (const marker of markers) {\n const highlightId = marker.getAttribute('data-word-id')\n if (!groups[highlightId]) {\n groups[highlightId] = editableHost.querySelectorAll(`[data-word-id=\"${highlightId}\"]`)\n }\n }\n\n const res = {}\n for (const highlightId in groups) {\n const position = this.extractMarkerNodePosition(editableHost, groups[highlightId])\n if (position) res[highlightId] = position\n }\n\n return res\n },\n\n extractMarkerNodePosition (editableHost, markers) {\n const range = createRange()\n if (markers.length > 1) {\n range.setStartBefore(markers[0])\n range.setEndAfter(markers[markers.length - 1])\n } else {\n range.selectNode(markers[0])\n }\n\n const textRange = toCharacterRange(range, editableHost)\n return {\n start: textRange.start,\n end: textRange.end,\n text: textRange.text, // browser range result (does whitespace normalization)\n nativeRange: range\n }\n },\n\n cleanupStaleMarkerNodes (editableHost, highlightType) {\n const nodes = editableHost.querySelectorAll(`span[data-highlight=\"${highlightType}\"]`)\n for (const node of nodes) {\n if (!node.textContent.length) {\n node.remove()\n }\n }\n },\n\n createMarkerNode (markerMarkup, highlightType, win) {\n const marker = createElement(markerMarkup, win)\n marker.setAttribute('data-editable', 'ui-unwrap')\n marker.setAttribute('data-highlight', highlightType)\n return marker\n }\n}\n\nexport default highlightSupport\n","import Cursor from './cursor.js'\nimport * as content from './content.js'\nimport * as parser from './parser.js'\nimport * as block from './block.js'\nimport config from './config.js'\nimport highlightSupport from './highlight-support.js'\nimport highlightText from './highlight-text.js'\nimport {\n toCharacterRange,\n rangeToHtml,\n findStartExcludingWhitespace,\n findEndExcludingWhitespace\n} from './util/dom.js'\n\n/**\n * The Selection module provides a cross-browser abstraction layer for range\n * and selection.\n *\n * @module core\n * @submodule selection\n */\n/**\n * Class that represents a selection and provides functionality to access or\n * modify the selection.\n *\n * @class Selection\n * @constructor\n */\n\nexport default class Selection extends Cursor {\n constructor () {\n super(...arguments)\n delete this.isCursor\n this.isSelection = true\n }\n\n // Get the text inside the selection.\n text () {\n return this.range.toString()\n }\n\n // Get the html inside the selection.\n html () {\n return rangeToHtml(this.range)\n }\n\n isAllSelected () {\n return parser.isBeginningOfHost(\n this.host,\n this.range.startContainer,\n this.range.startOffset\n ) && parser.isTextEndOfHost(\n this.host,\n this.range.endContainer,\n this.range.endOffset\n )\n }\n\n getTextRange () {\n return toCharacterRange(this.range, this.host)\n }\n\n // Return a plain string of the current selection content.\n toString () {\n return this.range.toString()\n }\n\n // Return true if the selection can be wrapped, i.e. all open nodes\n // are closed within this selection.\n isWrappable () {\n return content.isWrappable(this.range)\n }\n\n // Get the ClientRects of this selection.\n // Use this if you want more precision than getBoundingClientRect can give.\n getRects () {\n // consider: translate into absolute positions\n // just like Cursor#getCoordinates()\n return this.range.getClientRects()\n }\n\n link (href, attrs = {}) {\n if (href) attrs.href = href\n const link = this.createElement(config.linkMarkup.name, config.linkMarkup.attribs)\n for (const key in attrs) {\n const value = attrs[key]\n if (value === undefined) continue\n if (value === null) {\n link.removeAttribute(key)\n } else {\n link.setAttribute(key, value)\n }\n }\n if (config.linkMarkup.trim) this.trimRange()\n\n this.forceWrap(link)\n }\n\n // trims whitespaces on the left and right of a selection, i.e. what you want in case of links\n trimRange () {\n const textToTrim = this.range.toString()\n const whitespacesOnTheLeft = textToTrim.search(/\\S|$/)\n const lastNonWhitespace = textToTrim.search(/\\S[\\s]+$/)\n const whitespacesOnTheRight = lastNonWhitespace === -1\n ? 0\n : textToTrim.length - (lastNonWhitespace + 1)\n\n const [startContainer, startOffset] = findStartExcludingWhitespace({\n root: this.range.commonAncestorContainer,\n startContainer: this.range.startContainer,\n startOffset: this.range.startOffset,\n whitespacesOnTheLeft\n })\n this.range.setStart(startContainer, startOffset)\n\n const [endContainer, endOffset] = findEndExcludingWhitespace({\n root: this.range.commonAncestorContainer,\n endContainer: this.range.endContainer,\n endOffset: this.range.endOffset,\n whitespacesOnTheRight\n })\n this.range.setEnd(endContainer, endOffset)\n }\n\n unlink () {\n this.removeFormatting(config.linkMarkup.name)\n }\n\n toggleLink (href, attrs) {\n const links = this.getTagsByName(config.linkMarkup.name)\n if (links.length >= 1) {\n const firstLink = links[0]\n if (this.isExactSelection(firstLink, 'visible')) {\n this.unlink()\n } else {\n this.expandTo(firstLink)\n }\n } else {\n this.link(href, attrs)\n }\n }\n\n highlightComment ({highlightId, textRange}) {\n highlightSupport.highlightRange(\n this.host,\n highlightId,\n textRange.text,\n textRange.start,\n textRange.end,\n undefined, // dispatcher\n 'comment'\n )\n }\n\n // Manually add a highlight\n // Note: the current code does not work with newlines (LP)\n highlight ({highlightId}) {\n const textBefore = this.textBefore()\n const currentTextContent = this.text()\n\n const marker = '<span class=\"highlight-comment\"></span>'\n const markerNode = highlightSupport.createMarkerNode(marker, this.win)\n\n markerNode.setAttribute('data-match', currentTextContent)\n\n const match = {\n startIndex: textBefore.length,\n endIndex: textBefore.length + currentTextContent.length,\n match: currentTextContent,\n marker: markerNode\n }\n\n // Note: highlighting won't retain the selection\n highlightText.highlightMatches(this.host, [match])\n }\n\n // e.g. toggle('<em>')\n toggle (elem) {\n if (block.isPlainTextBlock(this.host)) return\n if (this.range.collapsed) return\n elem = this.adoptElement(elem)\n this.range = content.toggleTag(this.host, this.range, elem)\n this.setVisibleSelection()\n }\n\n toggleCustom ({tagName, attributes, trim = false}) {\n const customElem = this.createElement(tagName, attributes)\n if (trim) this.trimRange()\n this.toggle(customElem)\n }\n\n makeCustom ({tagName, attributes, trim = false}) {\n const customElem = this.createElement(tagName, attributes)\n if (trim) this.trimRange()\n this.forceWrap(customElem)\n }\n\n makeBold () {\n const bold = this.createElement(config.boldMarkup.name, config.boldMarkup.attribs)\n if (config.boldMarkup.trim) this.trimRange()\n this.forceWrap(bold)\n }\n\n toggleBold () {\n const bold = this.createElement(config.boldMarkup.name, config.boldMarkup.attribs)\n if (config.boldMarkup.trim) this.trimRange()\n this.toggle(bold)\n }\n\n giveEmphasis () {\n const em = this.createElement(config.italicMarkup.name, config.italicMarkup.attribs)\n if (config.italicMarkup.trim) this.trimRange()\n this.forceWrap(em)\n }\n\n toggleEmphasis () {\n const em = this.createElement(config.italicMarkup.name, config.italicMarkup.attribs)\n if (config.italicMarkup.trim) this.trimRange()\n this.toggle(em)\n }\n\n makeUnderline () {\n const u = this.createElement(config.underlineMarkup.name, config.underlineMarkup.attribs)\n if (config.underlineMarkup.trim) this.trimRange()\n this.forceWrap(u)\n }\n\n toggleUnderline () {\n const u = this.createElement(config.underlineMarkup.name, config.underlineMarkup.attribs)\n if (config.underlineMarkup.trim) this.trimRange()\n this.toggle(u)\n }\n\n insertCharacter (character) {\n const cursor = this.deleteContent()\n const textNode = cursor.createTextNode(character)\n cursor.insertBefore(textNode)\n cursor.setVisibleSelection()\n return cursor\n }\n\n // Surround the selection with characters like quotes.\n //\n // @param {String} E.g. '«'\n // @param {String} E.g. '»'\n surround (startCharacter, endCharacter) {\n this.range = content.surround(this.host, this.range, startCharacter, endCharacter)\n this.setVisibleSelection()\n }\n\n removeSurround (startCharacter, endCharacter) {\n this.range = content.deleteCharacter(this.host, this.range, startCharacter)\n this.range = content.deleteCharacter(this.host, this.range, endCharacter)\n this.setVisibleSelection()\n }\n\n removeChars (chars = []) {\n for (let i = 0; i < chars.length; i++) {\n const char = chars[i]\n this.range = content.deleteCharacter(this.host, this.range, char)\n }\n this.setVisibleSelection()\n }\n\n toggleSurround (startCharacter, endCharacter) {\n if (this.containsString(startCharacter) &&\n this.containsString(endCharacter)) {\n this.removeSurround(startCharacter, endCharacter)\n } else {\n this.surround(startCharacter, endCharacter)\n }\n }\n\n // @param {String} selector. An element selector, e.g. 'a' or 'span.some-class'\n // that represents elements to be removed; if undefined,\n // remove all.\n removeFormatting (selector) {\n this.range = content.removeFormatting(this.host, this.range, selector)\n this.setVisibleSelection()\n }\n\n // Delete the farest ancestor that is an exact selection\n //\n // @return Selection instance\n deleteExactSurroundingTags () {\n const ancestorTags = this.getAncestorTags().reverse()\n for (const ancestorTag of ancestorTags) {\n if (this.isExactSelection(ancestorTag)) {\n ancestorTag.remove()\n break\n }\n }\n return new Selection(this.host, this.range)\n }\n\n // Delete all the tags whose text is completely within the current selection.\n //\n // @return Selection instance\n deleteContainedTags () {\n const containedTags = this.getContainedTags()\n containedTags.forEach(containedTag => containedTag.remove())\n return new Selection(this.host, this.range)\n }\n\n // Delete the contents inside the range and exact surrounding markups.\n // After that the selection will be a cursor.\n //\n // @return Cursor instance\n deleteContent () {\n this.range.deleteContents()\n return new Cursor(this.host, this.range)\n }\n\n // Expand the current selection.\n //\n // @param {DOM Node}\n expandTo (elem) {\n this.range = content.expandTo(this.host, this.range, elem)\n this.setVisibleSelection()\n }\n\n // Collapse the selection at the beginning of the selection\n //\n // @return Cursor instance\n collapseAtBeginning (elem) {\n this.range.collapse(true)\n this.setVisibleSelection()\n return new Cursor(this.host, this.range)\n }\n\n // Collapse the selection at the end of the selection\n //\n // @return Cursor instance\n collapseAtEnd (elem) {\n this.range.collapse(false)\n this.setVisibleSelection()\n return new Cursor(this.host, this.range)\n }\n\n // Wrap the selection with the specified tag. If any other tag with\n // the same tagName is affecting the selection this tag will be\n // remove first.\n forceWrap (elem) {\n if (block.isPlainTextBlock(this.host)) return\n if (this.range.collapsed) return\n elem = this.adoptElement(elem)\n this.range = content.forceWrap(this.host, this.range, elem)\n this.setVisibleSelection()\n }\n\n // Check if the selection is the same as the elements contents.\n //\n // @method isExactSelection\n // @param {DOM Node}\n // @param {flag: undefined or 'visible'} if 'visible' is passed\n // whitespaces at the beginning or end of the selection will\n // be ignored.\n // @return {Boolean}\n isExactSelection (elem, onlyVisible) {\n return content.isExactSelection(this.range, elem, onlyVisible)\n }\n\n // Check if the selection contains the passed string.\n //\n // @method containsString\n // @return {Boolean}\n containsString (str) {\n return content.containsString(this.range, str)\n }\n\n // Delete all occurrences of the specified character from the\n // selection.\n deleteCharacter (character) {\n this.range = content.deleteCharacter(this.host, this.range, character)\n this.setVisibleSelection()\n }\n}\n","import Cursor from './cursor.js'\nimport Selection from './selection.js'\nimport {rangesAreEqual} from './util/dom.js'\n\n/** RangeContainer\n *\n * primarily used to compare ranges\n * its designed to work with undefined ranges as well\n * so we can easily compare them without checking for undefined\n * all the time\n */\n\nexport default class RangeContainer {\n constructor (editableHost, range) {\n this.host = editableHost && editableHost.jquery\n ? editableHost[0]\n : editableHost\n // Safari 17 seems to modify the range instance on the fly which breaks later comparisons.\n // We clone the range at the time of the RangeContainer creation.\n // https://developer.apple.com/documentation/safari-release-notes/safari-17-release-notes#New-Features\n this.range = range?.cloneRange()\n this.isAnythingSelected = (range !== undefined)\n this.isCursor = (this.isAnythingSelected && range.collapsed)\n this.isSelection = (this.isAnythingSelected && !this.isCursor)\n }\n\n getCursor () {\n if (this.isCursor) return new Cursor(this.host, this.range)\n }\n\n getSelection () {\n if (this.isSelection) return new Selection(this.host, this.range)\n }\n\n forceCursor () {\n if (!this.isSelection) return this.getCursor()\n return this.getSelection().deleteContent()\n }\n\n isDifferentFrom (otherRangeContainer = new RangeContainer()) {\n const self = this.range\n const other = otherRangeContainer.range\n if (self && other) return !rangesAreEqual(self, other)\n if (!self && !other) return false\n return true\n }\n}\n","import * as parser from './parser.js'\nimport RangeContainer from './range-container.js'\nimport Cursor from './cursor.js'\nimport Selection from './selection.js'\nimport {getSelection} from './util/dom.js'\n\n/**\n * The SelectionWatcher module watches for selection changes inside\n * of editable blocks.\n *\n * @module core\n * @submodule selectionWatcher\n */\n\nexport default class SelectionWatcher {\n constructor (dispatcher, win) {\n this.dispatcher = dispatcher\n this.win = win || window\n this.selection = undefined\n this.currentSelection = undefined\n this.currentRange = undefined\n }\n\n /**\n * Updates the internal selection pointer to the current selection.\n * Returns true if no exception occurred.\n */\n syncSelection () {\n // Note: the try catch was introduced because of rangy exceptions with nativeSelections\n try {\n this.selection = getSelection(this.win)\n } catch (err) {\n return false\n }\n\n return true\n }\n\n /**\n * Return a RangeContainer if the current selection is within an editable\n * otherwise return an empty RangeContainer\n */\n getRangeContainer () {\n const successfulSync = this.syncSelection()\n\n // rangeCount is 0 or 1 in all browsers except firefox\n // firefox can work with multiple ranges\n // (on a mac hold down the command key to select multiple ranges)\n if (this.selection?.rangeCount && successfulSync) {\n const range = this.selection.getRangeAt(0)\n const hostNode = parser.getHost(range.commonAncestorContainer)\n if (hostNode) return new RangeContainer(hostNode, range)\n }\n\n // return an empty range container\n return new RangeContainer()\n }\n\n /**\n * Gets a fresh RangeContainer with the current selection or cursor.\n *\n * @return RangeContainer instance\n */\n getFreshRange () {\n return this.getRangeContainer()\n }\n\n /**\n * Gets a fresh RangeContainer with the current selection or cursor.\n *\n * @return Either a Cursor or Selection instance or undefined if\n * there is neither a selection or cursor.\n */\n getFreshSelection () {\n const rangeContainer = this.getRangeContainer()\n\n return rangeContainer.isCursor\n ? rangeContainer.getCursor(this.win)\n : rangeContainer.getSelection(this.win)\n }\n\n /**\n * Get the selection set by the last selectionChanged event.\n * Sometimes the event does not fire fast enough and the selection\n * you get is not the one the user sees.\n * In those cases use #getFreshSelection()\n *\n * @return Either a Cursor or Selection instance or undefined if\n * there is neither a selection or cursor.\n */\n getSelection () {\n return this.currentSelection\n }\n\n forceCursor () {\n const rangeContainer = this.getRangeContainer()\n return rangeContainer.forceCursor()\n }\n\n selectionChanged () {\n const newRangeContainer = this.getRangeContainer()\n if (newRangeContainer.isDifferentFrom(this.currentRange)) {\n const lastSelection = this.currentSelection\n this.currentRange = newRangeContainer\n\n // empty selection or cursor\n if (lastSelection) {\n if (lastSelection.isCursor && !this.currentRange.isCursor) {\n this.dispatcher.notify('cursor', lastSelection.host)\n } else if (lastSelection.isSelection && !this.currentRange.isSelection) {\n this.dispatcher.notify('selection', lastSelection.host)\n }\n }\n\n // set new selection or cursor and fire event\n if (this.currentRange.isCursor) {\n this.currentSelection = new Cursor(this.currentRange.host, this.currentRange.range)\n this.dispatcher.notify('cursor', this.currentSelection.host, this.currentSelection)\n } else if (this.currentRange.isSelection) {\n this.currentSelection = new Selection(this.currentRange.host, this.currentRange.range)\n this.dispatcher.notify('selection', this.currentSelection.host, this.currentSelection)\n } else {\n this.currentSelection = undefined\n }\n }\n }\n}\n","import {createRange, containsRange} from './util/dom.js'\nimport {contenteditableSpanBug} from './feature-detection.js'\nimport * as nodeType from './node-type.js'\nimport eventable from './eventable.js'\n\n/**\n * The Keyboard module defines an event API for key events.\n */\n\nexport default class Keyboard {\n constructor (selectionWatcher) {\n eventable(this)\n this.selectionWatcher = selectionWatcher\n }\n\n dispatchKeyEvent (event, target, notifyCharacterEvent) {\n switch (event.keyCode) {\n case this.key.left:\n return this.notify(target, 'left', event)\n\n case this.key.right:\n return this.notify(target, 'right', event)\n\n case this.key.up:\n return this.notify(target, 'up', event)\n\n case this.key.down:\n return this.notify(target, 'down', event)\n\n case this.key.tab:\n if (event.shiftKey) return this.notify(target, 'shiftTab', event)\n return this.notify(target, 'tab', event)\n\n case this.key.esc:\n return this.notify(target, 'esc', event)\n\n case this.key.backspace:\n this.preventContenteditableBug(target, event)\n return this.notify(target, 'backspace', event)\n\n case this.key.delete:\n this.preventContenteditableBug(target, event)\n return this.notify(target, 'delete', event)\n\n case this.key.enter:\n if (event.shiftKey) return this.notify(target, 'shiftEnter', event)\n return this.notify(target, 'enter', event)\n\n case this.key.ctrl:\n case this.key.shift:\n case this.key.alt:\n return\n\n // Metakey\n case 224: // Firefox: 224\n case 17: // Opera: 17\n case 91: // Chrome/Safari: 91 (Left)\n case 93: // Chrome/Safari: 93 (Right)\n return\n\n default:\n // Added here to avoid using fall-through in the switch\n // when b or i are pressed without ctrlKey or metaKey\n if (event.keyCode === this.key.b && (event.ctrlKey || event.metaKey)) {\n return this.notify(target, 'bold', event)\n }\n if (event.keyCode === this.key.i && (event.ctrlKey || event.metaKey)) {\n return this.notify(target, 'italic', event)\n }\n\n this.preventContenteditableBug(target, event)\n if (!notifyCharacterEvent) return\n // Don't notify character events as long as either the ctrl or\n // meta key are pressed.\n // see: https://github.com/livingdocsIO/editable.js/pull/125\n if (!event.ctrlKey && !event.metaKey) return this.notify(target, 'character', event)\n }\n }\n\n preventContenteditableBug (target, event) {\n if (!contenteditableSpanBug) return\n if (event.ctrlKey || event.metaKey) return\n\n // This fixes a strange webkit bug that can be reproduced as follows:\n //\n // 1. A node used within a contenteditable has some style, e.g through the\n // following CSS:\n //\n // strong {\n // color: red\n // }\n //\n // 2. A selection starts with the first character of a styled node and ends\n // outside of that node, e.g: \"big beautiful\" is selected in the following\n // html:\n //\n // <p contenteditable=\"true\">\n // Hello <strong>big</strong> beautiful world\n // </p>\n //\n // 3. The user types a letter character to replace \"big beautiful\", e.g. \"x\"\n //\n // Result: Webkits adds <font> and <b> tags:\n //\n // <p contenteditable=\"true\">\n // Hello\n // <font color=\"#ff0000\">\n // <b>f</b>\n // </font>\n // world\n // </p>\n //\n // This bug ONLY happens, if the first character of the node is selected and\n // the selection goes further than the node.\n //\n // Solution:\n //\n // Manually remove the element that would be removed anyway before inserting\n // the new letter.\n const rangeContainer = this.selectionWatcher.getFreshRange()\n if (!rangeContainer.isSelection) return\n\n const nodeToRemove = Keyboard.getNodeToRemove(rangeContainer.range, target)\n if (nodeToRemove) nodeToRemove.remove()\n }\n\n static getNodeToRemove (selectionRange, target) {\n // This function is only used by preventContenteditableBug. It is exposed on\n // the Keyboard constructor for testing purpose only.\n\n // Let's make sure we are in the edge-case, in which the bug happens.\n // The selection does not start at the beginning of a node. We have\n // nothing to do.\n if (selectionRange.startOffset !== 0) return\n\n let startNodeElement = selectionRange.startContainer\n\n // If the node is a textNode, we select its parent.\n if (startNodeElement.nodeType === nodeType.textNode) startNodeElement = startNodeElement.parentNode\n\n // The target is the contenteditable element, which we do not want to replace\n if (startNodeElement === target) return\n\n // We get a range that contains everything within the sartNodeElement to test\n // if the selectionRange is within the startNode, we have nothing to do.\n const startNodeRange = createRange()\n startNodeRange.setStartBefore(startNodeElement.firstChild)\n startNodeRange.setEndAfter(startNodeElement.lastChild)\n if (containsRange(startNodeRange, selectionRange)) return\n\n // If the selectionRange.startContainer was a textNode, we have to make sure\n // that its parent's content starts with this node. Content is either a\n // text node or an element. This is done to avoid false positives like the\n // following one:\n // <strong>foo<em>bar</em>|baz</strong>quux|\n if (selectionRange.startContainer.nodeType === nodeType.textNode) {\n const contentNodeTypes = [nodeType.textNode, nodeType.elementNode]\n let firstContentNode = startNodeElement.firstChild\n\n do {\n if (contentNodeTypes.indexOf(firstContentNode.nodeType) !== -1) break\n } while ((firstContentNode = firstContentNode.nextSibling))\n\n if (firstContentNode !== selectionRange.startContainer) return\n }\n\n // Now we know, that we have to return at least the startNodeElement for\n // removal. But it could be, that we also need to remove its parent, e.g.\n // we need to remove <strong> in the following example:\n // <strong><em>|foo</em>bar</strong>baz|\n const rangeStartingBeforeCurrentElement = selectionRange.cloneRange()\n rangeStartingBeforeCurrentElement.setStartBefore(startNodeElement)\n\n return Keyboard.getNodeToRemove(\n rangeStartingBeforeCurrentElement,\n target\n ) || startNodeElement\n }\n}\n\nKeyboard.key = Keyboard.prototype.key = {\n left: 37,\n up: 38,\n right: 39,\n down: 40,\n tab: 9,\n esc: 27,\n backspace: 8,\n delete: 46,\n enter: 13,\n shift: 16,\n ctrl: 17,\n alt: 18,\n b: 66,\n i: 73\n}\n","const isValidQuotePairConfig = (quotePair) => Array.isArray(quotePair) && quotePair.length === 2\n\nexport const shouldApplySmartQuotes = (config, target) => {\n const {smartQuotes, quotes, singleQuotes} = config\n return !!smartQuotes && isValidQuotePairConfig(quotes) && isValidQuotePairConfig(singleQuotes) && target.isContentEditable\n}\n\nexport const isDoubleQuote = (char) => /^[«»\"“”„]$/.test(char)\nexport const isSingleQuote = (char) => /^[‘’‹›‚']$/.test(char)\nexport const isApostrophe = (char) => /^[’']$/.test(char)\nexport const isWhitespace = (char) => /^\\s$/.test(char)\nexport const isSeparatorOrWhitespace = (char) => /\\s|[>\\-–—]/.test(char)\n\nconst shouldBeOpeningQuote = (text, indexCharBefore) => indexCharBefore < 0 || isSeparatorOrWhitespace(text[indexCharBefore])\nconst shouldBeClosingQuote = (text, indexCharBefore) => !!text[indexCharBefore] && !isSeparatorOrWhitespace(text[indexCharBefore])\nconst hasCharAfter = (textArr, indexCharAfter) => !!textArr[indexCharAfter] && !isWhitespace(textArr[indexCharAfter])\nconst shouldBeSingleOpeningQuote = (text, indexCharBefore) => !!text[indexCharBefore] && isDoubleQuote(text[indexCharBefore])\n\nexport const replaceQuote = (range, index, quoteType) => {\n const startContainer = range?.startContainer\n const nodeValue = startContainer?.nodeValue\n if (!nodeValue) {\n return null\n }\n const newText = `${nodeValue.substring(0, index)}${quoteType}${nodeValue.substring(index + 1)}`\n const newTextNode = document.createTextNode(newText)\n startContainer.replaceWith(newTextNode)\n return newTextNode\n}\n\nconst hasSingleOpeningQuote = (textArr, offset, singleOpeningQuote) => {\n if (offset <= 0) {\n return false\n }\n for (let i = offset - 1; i >= 0; i--) {\n if (isSingleQuote(textArr[i]) && (!isApostrophe(singleOpeningQuote) && !isApostrophe(textArr[i]))) {\n return textArr[i] === singleOpeningQuote\n }\n }\n return false\n}\n\nexport const applySmartQuotes = (range, config, char, target, cursorOffset) => {\n const isCharSingleQuote = isSingleQuote(char)\n const isCharDoubleQuote = isDoubleQuote(char)\n\n if (!isCharDoubleQuote && !isCharSingleQuote) {\n return\n }\n\n const {quotes, singleQuotes} = config\n if (char === quotes[0] || char === quotes[1] || char === singleQuotes[0] || char === singleQuotes[1]) {\n return\n }\n\n const offset = range.startOffset\n const textArr = [...range.startContainer.textContent]\n let newTextNode\n\n // Special case for a single quote following a double quote,\n // which should be transformed into a single opening quote\n if (isCharSingleQuote && shouldBeSingleOpeningQuote(textArr, offset - 2)) {\n newTextNode = replaceQuote(range, offset - 1, singleQuotes[0])\n } else if (shouldBeClosingQuote(textArr, offset - 2)) {\n if (isCharSingleQuote) {\n // Don't transform apostrophes\n if (hasCharAfter(textArr, offset)) {\n return\n }\n // Don't transform single-quote if there is no respective single-opening-quote\n if (!hasSingleOpeningQuote(textArr, offset, singleQuotes[0])) {\n return\n }\n }\n const closingQuote = isCharSingleQuote ? singleQuotes[1] : quotes[1]\n newTextNode = replaceQuote(range, offset - 1, closingQuote)\n } else if (shouldBeOpeningQuote(textArr, offset - 2)) {\n const openingQuote = isCharSingleQuote ? singleQuotes[0] : quotes[0]\n newTextNode = replaceQuote(range, offset - 1, openingQuote)\n }\n\n if (!newTextNode) {\n return\n }\n\n // Resets the cursor to the currentPosition after applying the smart-quote\n const window = target.ownerDocument.defaultView\n const selection = window.getSelection()\n selection.collapse(newTextNode, cursorOffset ?? offset)\n}\n\n","import {selectionchange} from './feature-detection.js'\nimport * as clipboard from './clipboard.js'\nimport eventable from './eventable.js'\nimport SelectionWatcher from './selection-watcher.js'\nimport config from './config.js'\nimport Keyboard from './keyboard.js'\nimport {closest} from './util/dom.js'\nimport {replaceLast, endsWithSingleSpace} from './util/string.js'\nimport {applySmartQuotes, shouldApplySmartQuotes} from './smartQuotes.js'\n\n/**\n * The Dispatcher module is responsible for dealing with events and their handlers.\n *\n * @module core\n * @submodule dispatcher\n */\nexport default class Dispatcher {\n\n constructor (editable) {\n const win = editable.win\n eventable(this, editable)\n this.document = win.document\n this.config = editable.config\n this.editable = editable\n this.editableSelector = editable.editableSelector\n this.selectionWatcher = new SelectionWatcher(this, win)\n this.keyboard = new Keyboard(this.selectionWatcher)\n this.activeListeners = []\n this.setup()\n this.getEditableBlockByEvent = (evt) => closest(evt.target, editable.editableSelector)\n }\n\n setupDocumentListener (event, func, capture = false) {\n const listener = {event, listener: func.bind(this), capture}\n this.activeListeners.push(listener)\n\n this.document.addEventListener(event, listener.listener, capture)\n return this\n }\n\n /**\n * Sets up all events that Editable.JS is catching.\n *\n * @method setup\n */\n setup () {\n // setup all events listeners and keyboard handlers\n this.setupKeyboardEvents()\n this.setupEventListeners()\n }\n\n unload () {\n this.off()\n for (const l of this.activeListeners) {\n this.document.removeEventListener(l.event, l.listener, l.capture)\n }\n this.activeListeners.length = 0\n }\n\n suspend () {\n if (this.suspended) return\n this.suspended = true\n for (const l of this.activeListeners) {\n this.document.removeEventListener(l.event, l.listener, l.capture)\n }\n this.activeListeners.length = 0\n }\n\n continue () {\n if (!this.suspended) return\n this.suspended = false\n this.setupEventListeners()\n }\n\n setupEventListeners () {\n this.setupElementListeners()\n this.setupKeydownListener()\n\n if (selectionchange) {\n this.setupSelectionChangeListeners()\n } else {\n this.setupSelectionChangeFallbackListeners()\n }\n }\n\n /**\n * Sets up events that are triggered on modifying an element.\n *\n * @method setupElementListeners\n */\n setupElementListeners () {\n const currentInput = {offset: undefined}\n this\n .setupDocumentListener('focus', function focusListener (evt) {\n const block = this.getEditableBlockByEvent(evt)\n if (!block) return\n if (evt.target.getAttribute(config.pastingAttribute)) return\n this.selectionWatcher.syncSelection()\n this.notify('focus', block)\n }, true)\n .setupDocumentListener('blur', function blurListener (evt) {\n const block = this.getEditableBlockByEvent(evt)\n if (!block) return\n if (block.getAttribute(config.pastingAttribute)) return\n this.notify('blur', block)\n }, true)\n .setupDocumentListener('copy', function copyListener (evt) {\n const block = this.getEditableBlockByEvent(evt)\n if (!block) return\n const selection = this.selectionWatcher.getFreshSelection()\n if (selection && selection.isSelection) {\n this.notify('clipboard', block, 'copy', selection)\n }\n })\n .setupDocumentListener('cut', function cutListener (evt) {\n const block = this.getEditableBlockByEvent(evt)\n if (!block) return\n const selection = this.selectionWatcher.getFreshSelection()\n if (selection && selection.isSelection) {\n this.notify('clipboard', block, 'cut', selection)\n }\n })\n .setupDocumentListener('paste', function pasteListener (evt) {\n const block = this.getEditableBlockByEvent(evt)\n if (!block) return\n\n evt.preventDefault()\n const selection = this.selectionWatcher.getFreshSelection()\n const clipboardContent = evt.clipboardData.getData('text/html') || evt.clipboardData.getData('text/plain')\n\n const {blocks, cursor} = clipboard.paste(block, selection, clipboardContent)\n if (blocks.length) {\n if (endsWithSingleSpace(evt.target.innerText)) {\n cursor.retainVisibleSelection(() => {\n block.innerHTML = replaceLast(block.innerHTML, ' ', ' ')\n })\n }\n this.notify('paste', block, blocks, cursor)\n // The input event does not fire when we process the content manually\n // and insert it via script\n this.notify('change', block)\n } else {\n cursor.setVisibleSelection()\n }\n })\n .setupDocumentListener('input', function inputListener (evt) {\n const block = this.getEditableBlockByEvent(evt)\n if (!block) return\n\n if (shouldApplySmartQuotes(config, evt.target)) {\n const selection = this.selectionWatcher.getFreshSelection()\n // Save offset of new input, to reset cursor correctly after timeout delay\n currentInput.offset = selection.range?.startOffset\n setTimeout(() => {\n applySmartQuotes(selection.range, config, evt.data, evt.target, currentInput.offset)\n }, 300\n )\n }\n\n this.notify('change', block)\n })\n\n .setupDocumentListener('formatEditable', function formatEditableListener (evt) {\n const block = this.getEditableBlockByEvent(evt)\n if (!block) return\n this.notify('change', block)\n })\n }\n\n dispatchSwitchEvent (event, element, direction) {\n if (event.altKey || event.ctrlKey || event.metaKey || event.shiftKey) return\n const cursor = this.selectionWatcher.getFreshSelection()\n if (!cursor || cursor.isSelection) return\n\n // store position\n if (!this.switchContext) {\n this.switchContext = {\n positionX: cursor.getBoundingClientRect().left,\n events: ['cursor']\n }\n } else {\n this.switchContext.events = ['cursor']\n }\n\n if (direction === 'up' && cursor.isAtFirstLine()) {\n event.preventDefault()\n event.stopPropagation()\n this.switchContext.events = ['switch', 'blur', 'focus', 'cursor']\n this.notify('switch', element, direction, cursor)\n }\n\n if (direction === 'down' && cursor.isAtLastLine()) {\n event.preventDefault()\n event.stopPropagation()\n this.switchContext.events = ['switch', 'blur', 'focus', 'cursor']\n this.notify('switch', element, direction, cursor)\n }\n }\n\n /**\n * Sets up listener for keydown event which forwards events to\n * the Keyboard instance.\n *\n * @method setupKeydownListener\n */\n setupKeydownListener () {\n this.setupDocumentListener('keydown', function (evt) {\n const block = this.getEditableBlockByEvent(evt)\n if (!block) return\n this.keyboard.dispatchKeyEvent(evt, block, false)\n }, true)\n }\n\n /**\n * Sets up handlers for the keyboard events.\n * Keyboard definitions are in {{#crossLink \"Keyboard\"}}{{/crossLink}}.\n *\n * @method setupKeyboardEvents\n */\n setupKeyboardEvents () {\n const self = this\n\n this.keyboard\n .on('up', function (event) {\n self.dispatchSwitchEvent(event, this, 'up')\n })\n\n .on('down', function (event) {\n self.dispatchSwitchEvent(event, this, 'down')\n })\n\n .on('backspace', function (event) {\n const rangeContainer = self.selectionWatcher.getFreshRange()\n if (!rangeContainer.isCursor) return\n\n const cursor = rangeContainer.getCursor()\n if (!cursor.isAtBeginning()) return\n\n event.preventDefault()\n event.stopPropagation()\n self.notify('merge', this, 'before', cursor)\n })\n\n .on('delete', function (event) {\n const rangeContainer = self.selectionWatcher.getFreshRange()\n if (!rangeContainer.isCursor) return\n\n const cursor = rangeContainer.getCursor()\n if (!cursor.isAtTextEnd()) return\n\n event.preventDefault()\n event.stopPropagation()\n self.notify('merge', this, 'after', cursor)\n })\n\n .on('enter', function (event) {\n event.preventDefault()\n event.stopPropagation()\n const rangeContainer = self.selectionWatcher.getFreshRange()\n const cursor = rangeContainer.forceCursor()\n\n if (cursor.isAtTextEnd()) {\n self.notify('insert', this, 'after', cursor)\n } else if (cursor.isAtBeginning()) {\n self.notify('insert', this, 'before', cursor)\n } else {\n self.notify('split', this, cursor.before(), cursor.after(), cursor)\n }\n })\n\n .on('shiftEnter', function (event) {\n event.preventDefault()\n event.stopPropagation()\n const cursor = self.selectionWatcher.forceCursor()\n self.notify('newline', this, cursor)\n })\n\n .on('bold', function (event) {\n event.preventDefault()\n event.stopPropagation()\n const selection = self.selectionWatcher.getFreshSelection()\n if (selection.isSelection) {\n self.notify('toggleBold', selection)\n }\n })\n\n .on('italic', function (event) {\n event.preventDefault()\n event.stopPropagation()\n const selection = self.selectionWatcher.getFreshSelection()\n if (selection.isSelection) {\n self.notify('toggleEmphasis', selection)\n }\n })\n\n .on('character', function (event) {\n self.notify('change', this)\n })\n }\n\n /**\n * Sets up events that are triggered on a selection change.\n *\n * @method setupSelectionChangeListeners\n */\n setupSelectionChangeListeners () {\n let selectionDirty = false\n let suppressSelectionChanges = false\n const selectionWatcher = this.selectionWatcher\n\n // fires on mousemove (thats probably a bit too much)\n // catches changes like 'select all' from context menu\n this.setupDocumentListener('selectionchange', (evt) => {\n const cursor = this.selectionWatcher.getFreshSelection()\n\n if (cursor && cursor.isSelection && cursor.isAtBeginning() && cursor.isAtEnd()) {\n this.notify('selectToBoundary', cursor.host, evt, 'both')\n } else if (cursor && cursor.isSelection && cursor.isAtBeginning()) {\n this.notify('selectToBoundary', cursor.host, evt, 'start')\n } else if (cursor && cursor.isSelection && cursor.isAtEnd()) {\n this.notify('selectToBoundary', cursor.host, evt, 'end')\n }\n\n if (suppressSelectionChanges) {\n selectionDirty = true\n } else {\n selectionWatcher.selectionChanged()\n }\n })\n\n // listen for selection changes by mouse so we can\n // suppress the selectionchange event and only fire the\n // change event on mouseup\n this.setupDocumentListener('mousedown', function (evt) {\n if (!this.getEditableBlockByEvent(evt)) return\n if (this.config.mouseMoveSelectionChanges === false) {\n suppressSelectionChanges = true\n\n // Without this timeout the previous selection is active\n // until the mouseup event (no. not good).\n setTimeout(() => selectionWatcher.selectionChanged(), 0)\n }\n\n this.document.addEventListener('mouseup', () => {\n suppressSelectionChanges = false\n\n if (selectionDirty) {\n selectionDirty = false\n selectionWatcher.selectionChanged()\n }\n }, {\n capture: true,\n once: true\n })\n })\n }\n\n /**\n * Fallback solution to support selection change events on browsers that don't\n * support selectionChange.\n *\n * @method setupSelectionChangeFallbackListeners\n */\n setupSelectionChangeFallbackListeners () {\n // listen for selection changes by mouse\n this.setupDocumentListener('mouseup', () => {\n // In Opera when clicking outside of a block\n // it does not update the selection as it should\n // without the timeout\n setTimeout(() => this.selectionWatcher.selectionChanged(), 0)\n })\n\n // listen for selection changes by keys\n this.setupDocumentListener('keyup', (evt) => {\n if (!this.getEditableBlockByEvent(evt)) return\n // when pressing Command + Shift + Left for example the keyup is only triggered\n // after at least two keys are released. Strange. The culprit seems to be the\n // Command key. Do we need a workaround?\n this.selectionWatcher.selectionChanged()\n })\n }\n}\n","/**\n * Removes all key-value entries from the list cache.\n *\n * @private\n * @name clear\n * @memberOf ListCache\n */\nfunction listCacheClear() {\n this.__data__ = [];\n this.size = 0;\n}\n\nexport default listCacheClear;\n","/**\n * Performs a\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * comparison between two values to determine if they are equivalent.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n * @example\n *\n * var object = { 'a': 1 };\n * var other = { 'a': 1 };\n *\n * _.eq(object, object);\n * // => true\n *\n * _.eq(object, other);\n * // => false\n *\n * _.eq('a', 'a');\n * // => true\n *\n * _.eq('a', Object('a'));\n * // => false\n *\n * _.eq(NaN, NaN);\n * // => true\n */\nfunction eq(value, other) {\n return value === other || (value !== value && other !== other);\n}\n\nexport default eq;\n","import eq from './eq.js';\n\n/**\n * Gets the index at which the `key` is found in `array` of key-value pairs.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} key The key to search for.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction assocIndexOf(array, key) {\n var length = array.length;\n while (length--) {\n if (eq(array[length][0], key)) {\n return length;\n }\n }\n return -1;\n}\n\nexport default assocIndexOf;\n","import assocIndexOf from './_assocIndexOf.js';\n\n/** Used for built-in method references. */\nvar arrayProto = Array.prototype;\n\n/** Built-in value references. */\nvar splice = arrayProto.splice;\n\n/**\n * Removes `key` and its value from the list cache.\n *\n * @private\n * @name delete\n * @memberOf ListCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction listCacheDelete(key) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n if (index < 0) {\n return false;\n }\n var lastIndex = data.length - 1;\n if (index == lastIndex) {\n data.pop();\n } else {\n splice.call(data, index, 1);\n }\n --this.size;\n return true;\n}\n\nexport default listCacheDelete;\n","import listCacheClear from './_listCacheClear.js';\nimport listCacheDelete from './_listCacheDelete.js';\nimport listCacheGet from './_listCacheGet.js';\nimport listCacheHas from './_listCacheHas.js';\nimport listCacheSet from './_listCacheSet.js';\n\n/**\n * Creates an list cache object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction ListCache(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n// Add methods to `ListCache`.\nListCache.prototype.clear = listCacheClear;\nListCache.prototype['delete'] = listCacheDelete;\nListCache.prototype.get = listCacheGet;\nListCache.prototype.has = listCacheHas;\nListCache.prototype.set = listCacheSet;\n\nexport default ListCache;\n","import assocIndexOf from './_assocIndexOf.js';\n\n/**\n * Gets the list cache value for `key`.\n *\n * @private\n * @name get\n * @memberOf ListCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction listCacheGet(key) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n return index < 0 ? undefined : data[index][1];\n}\n\nexport default listCacheGet;\n","import assocIndexOf from './_assocIndexOf.js';\n\n/**\n * Checks if a list cache value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf ListCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction listCacheHas(key) {\n return assocIndexOf(this.__data__, key) > -1;\n}\n\nexport default listCacheHas;\n","import assocIndexOf from './_assocIndexOf.js';\n\n/**\n * Sets the list cache `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf ListCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the list cache instance.\n */\nfunction listCacheSet(key, value) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n if (index < 0) {\n ++this.size;\n data.push([key, value]);\n } else {\n data[index][1] = value;\n }\n return this;\n}\n\nexport default listCacheSet;\n","/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\nexport default freeGlobal;\n","import freeGlobal from './_freeGlobal.js';\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\nexport default root;\n","import root from './_root.js';\n\n/** Built-in value references. */\nvar Symbol = root.Symbol;\n\nexport default Symbol;\n","import Symbol from './_Symbol.js';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the raw `toStringTag`.\n */\nfunction getRawTag(value) {\n var isOwn = hasOwnProperty.call(value, symToStringTag),\n tag = value[symToStringTag];\n\n try {\n value[symToStringTag] = undefined;\n var unmasked = true;\n } catch (e) {}\n\n var result = nativeObjectToString.call(value);\n if (unmasked) {\n if (isOwn) {\n value[symToStringTag] = tag;\n } else {\n delete value[symToStringTag];\n }\n }\n return result;\n}\n\nexport default getRawTag;\n","/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/**\n * Converts `value` to a string using `Object.prototype.toString`.\n *\n * @private\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n */\nfunction objectToString(value) {\n return nativeObjectToString.call(value);\n}\n\nexport default objectToString;\n","import Symbol from './_Symbol.js';\nimport getRawTag from './_getRawTag.js';\nimport objectToString from './_objectToString.js';\n\n/** `Object#toString` result references. */\nvar nullTag = '[object Null]',\n undefinedTag = '[object Undefined]';\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * The base implementation of `getTag` without fallbacks for buggy environments.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nfunction baseGetTag(value) {\n if (value == null) {\n return value === undefined ? undefinedTag : nullTag;\n }\n return (symToStringTag && symToStringTag in Object(value))\n ? getRawTag(value)\n : objectToString(value);\n}\n\nexport default baseGetTag;\n","/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n var type = typeof value;\n return value != null && (type == 'object' || type == 'function');\n}\n\nexport default isObject;\n","import baseGetTag from './_baseGetTag.js';\nimport isObject from './isObject.js';\n\n/** `Object#toString` result references. */\nvar asyncTag = '[object AsyncFunction]',\n funcTag = '[object Function]',\n genTag = '[object GeneratorFunction]',\n proxyTag = '[object Proxy]';\n\n/**\n * Checks if `value` is classified as a `Function` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a function, else `false`.\n * @example\n *\n * _.isFunction(_);\n * // => true\n *\n * _.isFunction(/abc/);\n * // => false\n */\nfunction isFunction(value) {\n if (!isObject(value)) {\n return false;\n }\n // The use of `Object#toString` avoids issues with the `typeof` operator\n // in Safari 9 which returns 'object' for typed arrays and other constructors.\n var tag = baseGetTag(value);\n return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;\n}\n\nexport default isFunction;\n","import root from './_root.js';\n\n/** Used to detect overreaching core-js shims. */\nvar coreJsData = root['__core-js_shared__'];\n\nexport default coreJsData;\n","import coreJsData from './_coreJsData.js';\n\n/** Used to detect methods masquerading as native. */\nvar maskSrcKey = (function() {\n var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');\n return uid ? ('Symbol(src)_1.' + uid) : '';\n}());\n\n/**\n * Checks if `func` has its source masked.\n *\n * @private\n * @param {Function} func The function to check.\n * @returns {boolean} Returns `true` if `func` is masked, else `false`.\n */\nfunction isMasked(func) {\n return !!maskSrcKey && (maskSrcKey in func);\n}\n\nexport default isMasked;\n","/** Used for built-in method references. */\nvar funcProto = Function.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/**\n * Converts `func` to its source code.\n *\n * @private\n * @param {Function} func The function to convert.\n * @returns {string} Returns the source code.\n */\nfunction toSource(func) {\n if (func != null) {\n try {\n return funcToString.call(func);\n } catch (e) {}\n try {\n return (func + '');\n } catch (e) {}\n }\n return '';\n}\n\nexport default toSource;\n","import isFunction from './isFunction.js';\nimport isMasked from './_isMasked.js';\nimport isObject from './isObject.js';\nimport toSource from './_toSource.js';\n\n/**\n * Used to match `RegExp`\n * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).\n */\nvar reRegExpChar = /[\\\\^$.*+?()[\\]{}|]/g;\n\n/** Used to detect host constructors (Safari). */\nvar reIsHostCtor = /^\\[object .+?Constructor\\]$/;\n\n/** Used for built-in method references. */\nvar funcProto = Function.prototype,\n objectProto = Object.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Used to detect if a method is native. */\nvar reIsNative = RegExp('^' +\n funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\\\$&')\n .replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g, '$1.*?') + '$'\n);\n\n/**\n * The base implementation of `_.isNative` without bad shim checks.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a native function,\n * else `false`.\n */\nfunction baseIsNative(value) {\n if (!isObject(value) || isMasked(value)) {\n return false;\n }\n var pattern = isFunction(value) ? reIsNative : reIsHostCtor;\n return pattern.test(toSource(value));\n}\n\nexport default baseIsNative;\n","import baseIsNative from './_baseIsNative.js';\nimport getValue from './_getValue.js';\n\n/**\n * Gets the native function at `key` of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {string} key The key of the method to get.\n * @returns {*} Returns the function if it's native, else `undefined`.\n */\nfunction getNative(object, key) {\n var value = getValue(object, key);\n return baseIsNative(value) ? value : undefined;\n}\n\nexport default getNative;\n","/**\n * Gets the value at `key` of `object`.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {string} key The key of the property to get.\n * @returns {*} Returns the property value.\n */\nfunction getValue(object, key) {\n return object == null ? undefined : object[key];\n}\n\nexport default getValue;\n","import getNative from './_getNative.js';\nimport root from './_root.js';\n\n/* Built-in method references that are verified to be native. */\nvar Map = getNative(root, 'Map');\n\nexport default Map;\n","import getNative from './_getNative.js';\n\n/* Built-in method references that are verified to be native. */\nvar nativeCreate = getNative(Object, 'create');\n\nexport default nativeCreate;\n","import nativeCreate from './_nativeCreate.js';\n\n/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Gets the hash value for `key`.\n *\n * @private\n * @name get\n * @memberOf Hash\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction hashGet(key) {\n var data = this.__data__;\n if (nativeCreate) {\n var result = data[key];\n return result === HASH_UNDEFINED ? undefined : result;\n }\n return hasOwnProperty.call(data, key) ? data[key] : undefined;\n}\n\nexport default hashGet;\n","import nativeCreate from './_nativeCreate.js';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Checks if a hash value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Hash\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction hashHas(key) {\n var data = this.__data__;\n return nativeCreate ? (data[key] !== undefined) : hasOwnProperty.call(data, key);\n}\n\nexport default hashHas;\n","import hashClear from './_hashClear.js';\nimport hashDelete from './_hashDelete.js';\nimport hashGet from './_hashGet.js';\nimport hashHas from './_hashHas.js';\nimport hashSet from './_hashSet.js';\n\n/**\n * Creates a hash object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction Hash(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n// Add methods to `Hash`.\nHash.prototype.clear = hashClear;\nHash.prototype['delete'] = hashDelete;\nHash.prototype.get = hashGet;\nHash.prototype.has = hashHas;\nHash.prototype.set = hashSet;\n\nexport default Hash;\n","import nativeCreate from './_nativeCreate.js';\n\n/**\n * Removes all key-value entries from the hash.\n *\n * @private\n * @name clear\n * @memberOf Hash\n */\nfunction hashClear() {\n this.__data__ = nativeCreate ? nativeCreate(null) : {};\n this.size = 0;\n}\n\nexport default hashClear;\n","/**\n * Removes `key` and its value from the hash.\n *\n * @private\n * @name delete\n * @memberOf Hash\n * @param {Object} hash The hash to modify.\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction hashDelete(key) {\n var result = this.has(key) && delete this.__data__[key];\n this.size -= result ? 1 : 0;\n return result;\n}\n\nexport default hashDelete;\n","import nativeCreate from './_nativeCreate.js';\n\n/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/**\n * Sets the hash `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Hash\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the hash instance.\n */\nfunction hashSet(key, value) {\n var data = this.__data__;\n this.size += this.has(key) ? 0 : 1;\n data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value;\n return this;\n}\n\nexport default hashSet;\n","import isKeyable from './_isKeyable.js';\n\n/**\n * Gets the data for `map`.\n *\n * @private\n * @param {Object} map The map to query.\n * @param {string} key The reference key.\n * @returns {*} Returns the map data.\n */\nfunction getMapData(map, key) {\n var data = map.__data__;\n return isKeyable(key)\n ? data[typeof key == 'string' ? 'string' : 'hash']\n : data.map;\n}\n\nexport default getMapData;\n","/**\n * Checks if `value` is suitable for use as unique object key.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is suitable, else `false`.\n */\nfunction isKeyable(value) {\n var type = typeof value;\n return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')\n ? (value !== '__proto__')\n : (value === null);\n}\n\nexport default isKeyable;\n","import mapCacheClear from './_mapCacheClear.js';\nimport mapCacheDelete from './_mapCacheDelete.js';\nimport mapCacheGet from './_mapCacheGet.js';\nimport mapCacheHas from './_mapCacheHas.js';\nimport mapCacheSet from './_mapCacheSet.js';\n\n/**\n * Creates a map cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction MapCache(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n// Add methods to `MapCache`.\nMapCache.prototype.clear = mapCacheClear;\nMapCache.prototype['delete'] = mapCacheDelete;\nMapCache.prototype.get = mapCacheGet;\nMapCache.prototype.has = mapCacheHas;\nMapCache.prototype.set = mapCacheSet;\n\nexport default MapCache;\n","import Hash from './_Hash.js';\nimport ListCache from './_ListCache.js';\nimport Map from './_Map.js';\n\n/**\n * Removes all key-value entries from the map.\n *\n * @private\n * @name clear\n * @memberOf MapCache\n */\nfunction mapCacheClear() {\n this.size = 0;\n this.__data__ = {\n 'hash': new Hash,\n 'map': new (Map || ListCache),\n 'string': new Hash\n };\n}\n\nexport default mapCacheClear;\n","import getMapData from './_getMapData.js';\n\n/**\n * Removes `key` and its value from the map.\n *\n * @private\n * @name delete\n * @memberOf MapCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction mapCacheDelete(key) {\n var result = getMapData(this, key)['delete'](key);\n this.size -= result ? 1 : 0;\n return result;\n}\n\nexport default mapCacheDelete;\n","import getMapData from './_getMapData.js';\n\n/**\n * Gets the map value for `key`.\n *\n * @private\n * @name get\n * @memberOf MapCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction mapCacheGet(key) {\n return getMapData(this, key).get(key);\n}\n\nexport default mapCacheGet;\n","import getMapData from './_getMapData.js';\n\n/**\n * Checks if a map value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf MapCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction mapCacheHas(key) {\n return getMapData(this, key).has(key);\n}\n\nexport default mapCacheHas;\n","import getMapData from './_getMapData.js';\n\n/**\n * Sets the map `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf MapCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the map cache instance.\n */\nfunction mapCacheSet(key, value) {\n var data = getMapData(this, key),\n size = data.size;\n\n data.set(key, value);\n this.size += data.size == size ? 0 : 1;\n return this;\n}\n\nexport default mapCacheSet;\n","import ListCache from './_ListCache.js';\nimport stackClear from './_stackClear.js';\nimport stackDelete from './_stackDelete.js';\nimport stackGet from './_stackGet.js';\nimport stackHas from './_stackHas.js';\nimport stackSet from './_stackSet.js';\n\n/**\n * Creates a stack cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction Stack(entries) {\n var data = this.__data__ = new ListCache(entries);\n this.size = data.size;\n}\n\n// Add methods to `Stack`.\nStack.prototype.clear = stackClear;\nStack.prototype['delete'] = stackDelete;\nStack.prototype.get = stackGet;\nStack.prototype.has = stackHas;\nStack.prototype.set = stackSet;\n\nexport default Stack;\n","import ListCache from './_ListCache.js';\n\n/**\n * Removes all key-value entries from the stack.\n *\n * @private\n * @name clear\n * @memberOf Stack\n */\nfunction stackClear() {\n this.__data__ = new ListCache;\n this.size = 0;\n}\n\nexport default stackClear;\n","/**\n * Removes `key` and its value from the stack.\n *\n * @private\n * @name delete\n * @memberOf Stack\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction stackDelete(key) {\n var data = this.__data__,\n result = data['delete'](key);\n\n this.size = data.size;\n return result;\n}\n\nexport default stackDelete;\n","/**\n * Gets the stack value for `key`.\n *\n * @private\n * @name get\n * @memberOf Stack\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction stackGet(key) {\n return this.__data__.get(key);\n}\n\nexport default stackGet;\n","/**\n * Checks if a stack value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Stack\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction stackHas(key) {\n return this.__data__.has(key);\n}\n\nexport default stackHas;\n","import ListCache from './_ListCache.js';\nimport Map from './_Map.js';\nimport MapCache from './_MapCache.js';\n\n/** Used as the size to enable large array optimizations. */\nvar LARGE_ARRAY_SIZE = 200;\n\n/**\n * Sets the stack `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Stack\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the stack cache instance.\n */\nfunction stackSet(key, value) {\n var data = this.__data__;\n if (data instanceof ListCache) {\n var pairs = data.__data__;\n if (!Map || (pairs.length < LARGE_ARRAY_SIZE - 1)) {\n pairs.push([key, value]);\n this.size = ++data.size;\n return this;\n }\n data = this.__data__ = new MapCache(pairs);\n }\n data.set(key, value);\n this.size = data.size;\n return this;\n}\n\nexport default stackSet;\n","import getNative from './_getNative.js';\n\nvar defineProperty = (function() {\n try {\n var func = getNative(Object, 'defineProperty');\n func({}, '', {});\n return func;\n } catch (e) {}\n}());\n\nexport default defineProperty;\n","import defineProperty from './_defineProperty.js';\n\n/**\n * The base implementation of `assignValue` and `assignMergeValue` without\n * value checks.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {string} key The key of the property to assign.\n * @param {*} value The value to assign.\n */\nfunction baseAssignValue(object, key, value) {\n if (key == '__proto__' && defineProperty) {\n defineProperty(object, key, {\n 'configurable': true,\n 'enumerable': true,\n 'value': value,\n 'writable': true\n });\n } else {\n object[key] = value;\n }\n}\n\nexport default baseAssignValue;\n","import baseAssignValue from './_baseAssignValue.js';\nimport eq from './eq.js';\n\n/**\n * This function is like `assignValue` except that it doesn't assign\n * `undefined` values.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {string} key The key of the property to assign.\n * @param {*} value The value to assign.\n */\nfunction assignMergeValue(object, key, value) {\n if ((value !== undefined && !eq(object[key], value)) ||\n (value === undefined && !(key in object))) {\n baseAssignValue(object, key, value);\n }\n}\n\nexport default assignMergeValue;\n","import createBaseFor from './_createBaseFor.js';\n\n/**\n * The base implementation of `baseForOwn` which iterates over `object`\n * properties returned by `keysFunc` and invokes `iteratee` for each property.\n * Iteratee functions may exit iteration early by explicitly returning `false`.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @param {Function} keysFunc The function to get the keys of `object`.\n * @returns {Object} Returns `object`.\n */\nvar baseFor = createBaseFor();\n\nexport default baseFor;\n","/**\n * Creates a base function for methods like `_.forIn` and `_.forOwn`.\n *\n * @private\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Function} Returns the new base function.\n */\nfunction createBaseFor(fromRight) {\n return function(object, iteratee, keysFunc) {\n var index = -1,\n iterable = Object(object),\n props = keysFunc(object),\n length = props.length;\n\n while (length--) {\n var key = props[fromRight ? length : ++index];\n if (iteratee(iterable[key], key, iterable) === false) {\n break;\n }\n }\n return object;\n };\n}\n\nexport default createBaseFor;\n","import root from './_root.js';\n\n/** Detect free variable `exports`. */\nvar freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n/** Detect free variable `module`. */\nvar freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n/** Detect the popular CommonJS extension `module.exports`. */\nvar moduleExports = freeModule && freeModule.exports === freeExports;\n\n/** Built-in value references. */\nvar Buffer = moduleExports ? root.Buffer : undefined,\n allocUnsafe = Buffer ? Buffer.allocUnsafe : undefined;\n\n/**\n * Creates a clone of `buffer`.\n *\n * @private\n * @param {Buffer} buffer The buffer to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Buffer} Returns the cloned buffer.\n */\nfunction cloneBuffer(buffer, isDeep) {\n if (isDeep) {\n return buffer.slice();\n }\n var length = buffer.length,\n result = allocUnsafe ? allocUnsafe(length) : new buffer.constructor(length);\n\n buffer.copy(result);\n return result;\n}\n\nexport default cloneBuffer;\n","import root from './_root.js';\n\n/** Built-in value references. */\nvar Uint8Array = root.Uint8Array;\n\nexport default Uint8Array;\n","import cloneArrayBuffer from './_cloneArrayBuffer.js';\n\n/**\n * Creates a clone of `typedArray`.\n *\n * @private\n * @param {Object} typedArray The typed array to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Object} Returns the cloned typed array.\n */\nfunction cloneTypedArray(typedArray, isDeep) {\n var buffer = isDeep ? cloneArrayBuffer(typedArray.buffer) : typedArray.buffer;\n return new typedArray.constructor(buffer, typedArray.byteOffset, typedArray.length);\n}\n\nexport default cloneTypedArray;\n","import Uint8Array from './_Uint8Array.js';\n\n/**\n * Creates a clone of `arrayBuffer`.\n *\n * @private\n * @param {ArrayBuffer} arrayBuffer The array buffer to clone.\n * @returns {ArrayBuffer} Returns the cloned array buffer.\n */\nfunction cloneArrayBuffer(arrayBuffer) {\n var result = new arrayBuffer.constructor(arrayBuffer.byteLength);\n new Uint8Array(result).set(new Uint8Array(arrayBuffer));\n return result;\n}\n\nexport default cloneArrayBuffer;\n","import isObject from './isObject.js';\n\n/** Built-in value references. */\nvar objectCreate = Object.create;\n\n/**\n * The base implementation of `_.create` without support for assigning\n * properties to the created object.\n *\n * @private\n * @param {Object} proto The object to inherit from.\n * @returns {Object} Returns the new object.\n */\nvar baseCreate = (function() {\n function object() {}\n return function(proto) {\n if (!isObject(proto)) {\n return {};\n }\n if (objectCreate) {\n return objectCreate(proto);\n }\n object.prototype = proto;\n var result = new object;\n object.prototype = undefined;\n return result;\n };\n}());\n\nexport default baseCreate;\n","import overArg from './_overArg.js';\n\n/** Built-in value references. */\nvar getPrototype = overArg(Object.getPrototypeOf, Object);\n\nexport default getPrototype;\n","/**\n * Creates a unary function that invokes `func` with its argument transformed.\n *\n * @private\n * @param {Function} func The function to wrap.\n * @param {Function} transform The argument transform.\n * @returns {Function} Returns the new function.\n */\nfunction overArg(func, transform) {\n return function(arg) {\n return func(transform(arg));\n };\n}\n\nexport default overArg;\n","/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Checks if `value` is likely a prototype object.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.\n */\nfunction isPrototype(value) {\n var Ctor = value && value.constructor,\n proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto;\n\n return value === proto;\n}\n\nexport default isPrototype;\n","/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n return value != null && typeof value == 'object';\n}\n\nexport default isObjectLike;\n","import baseGetTag from './_baseGetTag.js';\nimport isObjectLike from './isObjectLike.js';\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]';\n\n/**\n * The base implementation of `_.isArguments`.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n */\nfunction baseIsArguments(value) {\n return isObjectLike(value) && baseGetTag(value) == argsTag;\n}\n\nexport default baseIsArguments;\n","import baseIsArguments from './_baseIsArguments.js';\nimport isObjectLike from './isObjectLike.js';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Built-in value references. */\nvar propertyIsEnumerable = objectProto.propertyIsEnumerable;\n\n/**\n * Checks if `value` is likely an `arguments` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n * else `false`.\n * @example\n *\n * _.isArguments(function() { return arguments; }());\n * // => true\n *\n * _.isArguments([1, 2, 3]);\n * // => false\n */\nvar isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsArguments : function(value) {\n return isObjectLike(value) && hasOwnProperty.call(value, 'callee') &&\n !propertyIsEnumerable.call(value, 'callee');\n};\n\nexport default isArguments;\n","/**\n * Checks if `value` is classified as an `Array` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array, else `false`.\n * @example\n *\n * _.isArray([1, 2, 3]);\n * // => true\n *\n * _.isArray(document.body.children);\n * // => false\n *\n * _.isArray('abc');\n * // => false\n *\n * _.isArray(_.noop);\n * // => false\n */\nvar isArray = Array.isArray;\n\nexport default isArray;\n","/** Used as references for various `Number` constants. */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/**\n * Checks if `value` is a valid array-like length.\n *\n * **Note:** This method is loosely based on\n * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n * @example\n *\n * _.isLength(3);\n * // => true\n *\n * _.isLength(Number.MIN_VALUE);\n * // => false\n *\n * _.isLength(Infinity);\n * // => false\n *\n * _.isLength('3');\n * // => false\n */\nfunction isLength(value) {\n return typeof value == 'number' &&\n value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n}\n\nexport default isLength;\n","import isFunction from './isFunction.js';\nimport isLength from './isLength.js';\n\n/**\n * Checks if `value` is array-like. A value is considered array-like if it's\n * not a function and has a `value.length` that's an integer greater than or\n * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\n * @example\n *\n * _.isArrayLike([1, 2, 3]);\n * // => true\n *\n * _.isArrayLike(document.body.children);\n * // => true\n *\n * _.isArrayLike('abc');\n * // => true\n *\n * _.isArrayLike(_.noop);\n * // => false\n */\nfunction isArrayLike(value) {\n return value != null && isLength(value.length) && !isFunction(value);\n}\n\nexport default isArrayLike;\n","import root from './_root.js';\nimport stubFalse from './stubFalse.js';\n\n/** Detect free variable `exports`. */\nvar freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n/** Detect free variable `module`. */\nvar freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n/** Detect the popular CommonJS extension `module.exports`. */\nvar moduleExports = freeModule && freeModule.exports === freeExports;\n\n/** Built-in value references. */\nvar Buffer = moduleExports ? root.Buffer : undefined;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined;\n\n/**\n * Checks if `value` is a buffer.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a buffer, else `false`.\n * @example\n *\n * _.isBuffer(new Buffer(2));\n * // => true\n *\n * _.isBuffer(new Uint8Array(2));\n * // => false\n */\nvar isBuffer = nativeIsBuffer || stubFalse;\n\nexport default isBuffer;\n","/**\n * This method returns `false`.\n *\n * @static\n * @memberOf _\n * @since 4.13.0\n * @category Util\n * @returns {boolean} Returns `false`.\n * @example\n *\n * _.times(2, _.stubFalse);\n * // => [false, false]\n */\nfunction stubFalse() {\n return false;\n}\n\nexport default stubFalse;\n","import baseGetTag from './_baseGetTag.js';\nimport getPrototype from './_getPrototype.js';\nimport isObjectLike from './isObjectLike.js';\n\n/** `Object#toString` result references. */\nvar objectTag = '[object Object]';\n\n/** Used for built-in method references. */\nvar funcProto = Function.prototype,\n objectProto = Object.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Used to infer the `Object` constructor. */\nvar objectCtorString = funcToString.call(Object);\n\n/**\n * Checks if `value` is a plain object, that is, an object created by the\n * `Object` constructor or one with a `[[Prototype]]` of `null`.\n *\n * @static\n * @memberOf _\n * @since 0.8.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * }\n *\n * _.isPlainObject(new Foo);\n * // => false\n *\n * _.isPlainObject([1, 2, 3]);\n * // => false\n *\n * _.isPlainObject({ 'x': 0, 'y': 0 });\n * // => true\n *\n * _.isPlainObject(Object.create(null));\n * // => true\n */\nfunction isPlainObject(value) {\n if (!isObjectLike(value) || baseGetTag(value) != objectTag) {\n return false;\n }\n var proto = getPrototype(value);\n if (proto === null) {\n return true;\n }\n var Ctor = hasOwnProperty.call(proto, 'constructor') && proto.constructor;\n return typeof Ctor == 'function' && Ctor instanceof Ctor &&\n funcToString.call(Ctor) == objectCtorString;\n}\n\nexport default isPlainObject;\n","import baseGetTag from './_baseGetTag.js';\nimport isLength from './isLength.js';\nimport isObjectLike from './isObjectLike.js';\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]',\n arrayTag = '[object Array]',\n boolTag = '[object Boolean]',\n dateTag = '[object Date]',\n errorTag = '[object Error]',\n funcTag = '[object Function]',\n mapTag = '[object Map]',\n numberTag = '[object Number]',\n objectTag = '[object Object]',\n regexpTag = '[object RegExp]',\n setTag = '[object Set]',\n stringTag = '[object String]',\n weakMapTag = '[object WeakMap]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n dataViewTag = '[object DataView]',\n float32Tag = '[object Float32Array]',\n float64Tag = '[object Float64Array]',\n int8Tag = '[object Int8Array]',\n int16Tag = '[object Int16Array]',\n int32Tag = '[object Int32Array]',\n uint8Tag = '[object Uint8Array]',\n uint8ClampedTag = '[object Uint8ClampedArray]',\n uint16Tag = '[object Uint16Array]',\n uint32Tag = '[object Uint32Array]';\n\n/** Used to identify `toStringTag` values of typed arrays. */\nvar typedArrayTags = {};\ntypedArrayTags[float32Tag] = typedArrayTags[float64Tag] =\ntypedArrayTags[int8Tag] = typedArrayTags[int16Tag] =\ntypedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =\ntypedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =\ntypedArrayTags[uint32Tag] = true;\ntypedArrayTags[argsTag] = typedArrayTags[arrayTag] =\ntypedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =\ntypedArrayTags[dataViewTag] = typedArrayTags[dateTag] =\ntypedArrayTags[errorTag] = typedArrayTags[funcTag] =\ntypedArrayTags[mapTag] = typedArrayTags[numberTag] =\ntypedArrayTags[objectTag] = typedArrayTags[regexpTag] =\ntypedArrayTags[setTag] = typedArrayTags[stringTag] =\ntypedArrayTags[weakMapTag] = false;\n\n/**\n * The base implementation of `_.isTypedArray` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n */\nfunction baseIsTypedArray(value) {\n return isObjectLike(value) &&\n isLength(value.length) && !!typedArrayTags[baseGetTag(value)];\n}\n\nexport default baseIsTypedArray;\n","import freeGlobal from './_freeGlobal.js';\n\n/** Detect free variable `exports`. */\nvar freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n/** Detect free variable `module`. */\nvar freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n/** Detect the popular CommonJS extension `module.exports`. */\nvar moduleExports = freeModule && freeModule.exports === freeExports;\n\n/** Detect free variable `process` from Node.js. */\nvar freeProcess = moduleExports && freeGlobal.process;\n\n/** Used to access faster Node.js helpers. */\nvar nodeUtil = (function() {\n try {\n // Use `util.types` for Node.js 10+.\n var types = freeModule && freeModule.require && freeModule.require('util').types;\n\n if (types) {\n return types;\n }\n\n // Legacy `process.binding('util')` for Node.js < 10.\n return freeProcess && freeProcess.binding && freeProcess.binding('util');\n } catch (e) {}\n}());\n\nexport default nodeUtil;\n","import baseIsTypedArray from './_baseIsTypedArray.js';\nimport baseUnary from './_baseUnary.js';\nimport nodeUtil from './_nodeUtil.js';\n\n/* Node.js helper references. */\nvar nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray;\n\n/**\n * Checks if `value` is classified as a typed array.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n * @example\n *\n * _.isTypedArray(new Uint8Array);\n * // => true\n *\n * _.isTypedArray([]);\n * // => false\n */\nvar isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray;\n\nexport default isTypedArray;\n","/**\n * The base implementation of `_.unary` without support for storing metadata.\n *\n * @private\n * @param {Function} func The function to cap arguments for.\n * @returns {Function} Returns the new capped function.\n */\nfunction baseUnary(func) {\n return function(value) {\n return func(value);\n };\n}\n\nexport default baseUnary;\n","/**\n * Gets the value at `key`, unless `key` is \"__proto__\" or \"constructor\".\n *\n * @private\n * @param {Object} object The object to query.\n * @param {string} key The key of the property to get.\n * @returns {*} Returns the property value.\n */\nfunction safeGet(object, key) {\n if (key === 'constructor' && typeof object[key] === 'function') {\n return;\n }\n\n if (key == '__proto__') {\n return;\n }\n\n return object[key];\n}\n\nexport default safeGet;\n","import baseAssignValue from './_baseAssignValue.js';\nimport eq from './eq.js';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Assigns `value` to `key` of `object` if the existing value is not equivalent\n * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {string} key The key of the property to assign.\n * @param {*} value The value to assign.\n */\nfunction assignValue(object, key, value) {\n var objValue = object[key];\n if (!(hasOwnProperty.call(object, key) && eq(objValue, value)) ||\n (value === undefined && !(key in object))) {\n baseAssignValue(object, key, value);\n }\n}\n\nexport default assignValue;\n","/** Used as references for various `Number` constants. */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/** Used to detect unsigned integer values. */\nvar reIsUint = /^(?:0|[1-9]\\d*)$/;\n\n/**\n * Checks if `value` is a valid array-like index.\n *\n * @private\n * @param {*} value The value to check.\n * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.\n * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.\n */\nfunction isIndex(value, length) {\n var type = typeof value;\n length = length == null ? MAX_SAFE_INTEGER : length;\n\n return !!length &&\n (type == 'number' ||\n (type != 'symbol' && reIsUint.test(value))) &&\n (value > -1 && value % 1 == 0 && value < length);\n}\n\nexport default isIndex;\n","import baseTimes from './_baseTimes.js';\nimport isArguments from './isArguments.js';\nimport isArray from './isArray.js';\nimport isBuffer from './isBuffer.js';\nimport isIndex from './_isIndex.js';\nimport isTypedArray from './isTypedArray.js';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Creates an array of the enumerable property names of the array-like `value`.\n *\n * @private\n * @param {*} value The value to query.\n * @param {boolean} inherited Specify returning inherited property names.\n * @returns {Array} Returns the array of property names.\n */\nfunction arrayLikeKeys(value, inherited) {\n var isArr = isArray(value),\n isArg = !isArr && isArguments(value),\n isBuff = !isArr && !isArg && isBuffer(value),\n isType = !isArr && !isArg && !isBuff && isTypedArray(value),\n skipIndexes = isArr || isArg || isBuff || isType,\n result = skipIndexes ? baseTimes(value.length, String) : [],\n length = result.length;\n\n for (var key in value) {\n if ((inherited || hasOwnProperty.call(value, key)) &&\n !(skipIndexes && (\n // Safari 9 has enumerable `arguments.length` in strict mode.\n key == 'length' ||\n // Node.js 0.10 has enumerable non-index properties on buffers.\n (isBuff && (key == 'offset' || key == 'parent')) ||\n // PhantomJS 2 has enumerable non-index properties on typed arrays.\n (isType && (key == 'buffer' || key == 'byteLength' || key == 'byteOffset')) ||\n // Skip index properties.\n isIndex(key, length)\n ))) {\n result.push(key);\n }\n }\n return result;\n}\n\nexport default arrayLikeKeys;\n","/**\n * The base implementation of `_.times` without support for iteratee shorthands\n * or max array length checks.\n *\n * @private\n * @param {number} n The number of times to invoke `iteratee`.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the array of results.\n */\nfunction baseTimes(n, iteratee) {\n var index = -1,\n result = Array(n);\n\n while (++index < n) {\n result[index] = iteratee(index);\n }\n return result;\n}\n\nexport default baseTimes;\n","import isObject from './isObject.js';\nimport isPrototype from './_isPrototype.js';\nimport nativeKeysIn from './_nativeKeysIn.js';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * The base implementation of `_.keysIn` which doesn't treat sparse arrays as dense.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction baseKeysIn(object) {\n if (!isObject(object)) {\n return nativeKeysIn(object);\n }\n var isProto = isPrototype(object),\n result = [];\n\n for (var key in object) {\n if (!(key == 'constructor' && (isProto || !hasOwnProperty.call(object, key)))) {\n result.push(key);\n }\n }\n return result;\n}\n\nexport default baseKeysIn;\n","/**\n * This function is like\n * [`Object.keys`](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n * except that it includes inherited enumerable properties.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction nativeKeysIn(object) {\n var result = [];\n if (object != null) {\n for (var key in Object(object)) {\n result.push(key);\n }\n }\n return result;\n}\n\nexport default nativeKeysIn;\n","import arrayLikeKeys from './_arrayLikeKeys.js';\nimport baseKeysIn from './_baseKeysIn.js';\nimport isArrayLike from './isArrayLike.js';\n\n/**\n * Creates an array of the own and inherited enumerable property names of `object`.\n *\n * **Note:** Non-object values are coerced to objects.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.keysIn(new Foo);\n * // => ['a', 'b', 'c'] (iteration order is not guaranteed)\n */\nfunction keysIn(object) {\n return isArrayLike(object) ? arrayLikeKeys(object, true) : baseKeysIn(object);\n}\n\nexport default keysIn;\n","import copyObject from './_copyObject.js';\nimport keysIn from './keysIn.js';\n\n/**\n * Converts `value` to a plain object flattening inherited enumerable string\n * keyed properties of `value` to own properties of the plain object.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {Object} Returns the converted plain object.\n * @example\n *\n * function Foo() {\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.assign({ 'a': 1 }, new Foo);\n * // => { 'a': 1, 'b': 2 }\n *\n * _.assign({ 'a': 1 }, _.toPlainObject(new Foo));\n * // => { 'a': 1, 'b': 2, 'c': 3 }\n */\nfunction toPlainObject(value) {\n return copyObject(value, keysIn(value));\n}\n\nexport default toPlainObject;\n","import assignValue from './_assignValue.js';\nimport baseAssignValue from './_baseAssignValue.js';\n\n/**\n * Copies properties of `source` to `object`.\n *\n * @private\n * @param {Object} source The object to copy properties from.\n * @param {Array} props The property identifiers to copy.\n * @param {Object} [object={}] The object to copy properties to.\n * @param {Function} [customizer] The function to customize copied values.\n * @returns {Object} Returns `object`.\n */\nfunction copyObject(source, props, object, customizer) {\n var isNew = !object;\n object || (object = {});\n\n var index = -1,\n length = props.length;\n\n while (++index < length) {\n var key = props[index];\n\n var newValue = customizer\n ? customizer(object[key], source[key], key, object, source)\n : undefined;\n\n if (newValue === undefined) {\n newValue = source[key];\n }\n if (isNew) {\n baseAssignValue(object, key, newValue);\n } else {\n assignValue(object, key, newValue);\n }\n }\n return object;\n}\n\nexport default copyObject;\n","import assignMergeValue from './_assignMergeValue.js';\nimport cloneBuffer from './_cloneBuffer.js';\nimport cloneTypedArray from './_cloneTypedArray.js';\nimport copyArray from './_copyArray.js';\nimport initCloneObject from './_initCloneObject.js';\nimport isArguments from './isArguments.js';\nimport isArray from './isArray.js';\nimport isArrayLikeObject from './isArrayLikeObject.js';\nimport isBuffer from './isBuffer.js';\nimport isFunction from './isFunction.js';\nimport isObject from './isObject.js';\nimport isPlainObject from './isPlainObject.js';\nimport isTypedArray from './isTypedArray.js';\nimport safeGet from './_safeGet.js';\nimport toPlainObject from './toPlainObject.js';\n\n/**\n * A specialized version of `baseMerge` for arrays and objects which performs\n * deep merges and tracks traversed objects enabling objects with circular\n * references to be merged.\n *\n * @private\n * @param {Object} object The destination object.\n * @param {Object} source The source object.\n * @param {string} key The key of the value to merge.\n * @param {number} srcIndex The index of `source`.\n * @param {Function} mergeFunc The function to merge values.\n * @param {Function} [customizer] The function to customize assigned values.\n * @param {Object} [stack] Tracks traversed source values and their merged\n * counterparts.\n */\nfunction baseMergeDeep(object, source, key, srcIndex, mergeFunc, customizer, stack) {\n var objValue = safeGet(object, key),\n srcValue = safeGet(source, key),\n stacked = stack.get(srcValue);\n\n if (stacked) {\n assignMergeValue(object, key, stacked);\n return;\n }\n var newValue = customizer\n ? customizer(objValue, srcValue, (key + ''), object, source, stack)\n : undefined;\n\n var isCommon = newValue === undefined;\n\n if (isCommon) {\n var isArr = isArray(srcValue),\n isBuff = !isArr && isBuffer(srcValue),\n isTyped = !isArr && !isBuff && isTypedArray(srcValue);\n\n newValue = srcValue;\n if (isArr || isBuff || isTyped) {\n if (isArray(objValue)) {\n newValue = objValue;\n }\n else if (isArrayLikeObject(objValue)) {\n newValue = copyArray(objValue);\n }\n else if (isBuff) {\n isCommon = false;\n newValue = cloneBuffer(srcValue, true);\n }\n else if (isTyped) {\n isCommon = false;\n newValue = cloneTypedArray(srcValue, true);\n }\n else {\n newValue = [];\n }\n }\n else if (isPlainObject(srcValue) || isArguments(srcValue)) {\n newValue = objValue;\n if (isArguments(objValue)) {\n newValue = toPlainObject(objValue);\n }\n else if (!isObject(objValue) || isFunction(objValue)) {\n newValue = initCloneObject(srcValue);\n }\n }\n else {\n isCommon = false;\n }\n }\n if (isCommon) {\n // Recursively merge objects and arrays (susceptible to call stack limits).\n stack.set(srcValue, newValue);\n mergeFunc(newValue, srcValue, srcIndex, customizer, stack);\n stack['delete'](srcValue);\n }\n assignMergeValue(object, key, newValue);\n}\n\nexport default baseMergeDeep;\n","import isArrayLike from './isArrayLike.js';\nimport isObjectLike from './isObjectLike.js';\n\n/**\n * This method is like `_.isArrayLike` except that it also checks if `value`\n * is an object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array-like object,\n * else `false`.\n * @example\n *\n * _.isArrayLikeObject([1, 2, 3]);\n * // => true\n *\n * _.isArrayLikeObject(document.body.children);\n * // => true\n *\n * _.isArrayLikeObject('abc');\n * // => false\n *\n * _.isArrayLikeObject(_.noop);\n * // => false\n */\nfunction isArrayLikeObject(value) {\n return isObjectLike(value) && isArrayLike(value);\n}\n\nexport default isArrayLikeObject;\n","/**\n * Copies the values of `source` to `array`.\n *\n * @private\n * @param {Array} source The array to copy values from.\n * @param {Array} [array=[]] The array to copy values to.\n * @returns {Array} Returns `array`.\n */\nfunction copyArray(source, array) {\n var index = -1,\n length = source.length;\n\n array || (array = Array(length));\n while (++index < length) {\n array[index] = source[index];\n }\n return array;\n}\n\nexport default copyArray;\n","import baseCreate from './_baseCreate.js';\nimport getPrototype from './_getPrototype.js';\nimport isPrototype from './_isPrototype.js';\n\n/**\n * Initializes an object clone.\n *\n * @private\n * @param {Object} object The object to clone.\n * @returns {Object} Returns the initialized clone.\n */\nfunction initCloneObject(object) {\n return (typeof object.constructor == 'function' && !isPrototype(object))\n ? baseCreate(getPrototype(object))\n : {};\n}\n\nexport default initCloneObject;\n","import Stack from './_Stack.js';\nimport assignMergeValue from './_assignMergeValue.js';\nimport baseFor from './_baseFor.js';\nimport baseMergeDeep from './_baseMergeDeep.js';\nimport isObject from './isObject.js';\nimport keysIn from './keysIn.js';\nimport safeGet from './_safeGet.js';\n\n/**\n * The base implementation of `_.merge` without support for multiple sources.\n *\n * @private\n * @param {Object} object The destination object.\n * @param {Object} source The source object.\n * @param {number} srcIndex The index of `source`.\n * @param {Function} [customizer] The function to customize merged values.\n * @param {Object} [stack] Tracks traversed source values and their merged\n * counterparts.\n */\nfunction baseMerge(object, source, srcIndex, customizer, stack) {\n if (object === source) {\n return;\n }\n baseFor(source, function(srcValue, key) {\n stack || (stack = new Stack);\n if (isObject(srcValue)) {\n baseMergeDeep(object, source, key, srcIndex, baseMerge, customizer, stack);\n }\n else {\n var newValue = customizer\n ? customizer(safeGet(object, key), srcValue, (key + ''), object, source, stack)\n : undefined;\n\n if (newValue === undefined) {\n newValue = srcValue;\n }\n assignMergeValue(object, key, newValue);\n }\n }, keysIn);\n}\n\nexport default baseMerge;\n","/**\n * This method returns the first argument it receives.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Util\n * @param {*} value Any value.\n * @returns {*} Returns `value`.\n * @example\n *\n * var object = { 'a': 1 };\n *\n * console.log(_.identity(object) === object);\n * // => true\n */\nfunction identity(value) {\n return value;\n}\n\nexport default identity;\n","import apply from './_apply.js';\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max;\n\n/**\n * A specialized version of `baseRest` which transforms the rest array.\n *\n * @private\n * @param {Function} func The function to apply a rest parameter to.\n * @param {number} [start=func.length-1] The start position of the rest parameter.\n * @param {Function} transform The rest array transform.\n * @returns {Function} Returns the new function.\n */\nfunction overRest(func, start, transform) {\n start = nativeMax(start === undefined ? (func.length - 1) : start, 0);\n return function() {\n var args = arguments,\n index = -1,\n length = nativeMax(args.length - start, 0),\n array = Array(length);\n\n while (++index < length) {\n array[index] = args[start + index];\n }\n index = -1;\n var otherArgs = Array(start + 1);\n while (++index < start) {\n otherArgs[index] = args[index];\n }\n otherArgs[start] = transform(array);\n return apply(func, this, otherArgs);\n };\n}\n\nexport default overRest;\n","import constant from './constant.js';\nimport defineProperty from './_defineProperty.js';\nimport identity from './identity.js';\n\n/**\n * The base implementation of `setToString` without support for hot loop shorting.\n *\n * @private\n * @param {Function} func The function to modify.\n * @param {Function} string The `toString` result.\n * @returns {Function} Returns `func`.\n */\nvar baseSetToString = !defineProperty ? identity : function(func, string) {\n return defineProperty(func, 'toString', {\n 'configurable': true,\n 'enumerable': false,\n 'value': constant(string),\n 'writable': true\n });\n};\n\nexport default baseSetToString;\n","/**\n * Creates a function that returns `value`.\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Util\n * @param {*} value The value to return from the new function.\n * @returns {Function} Returns the new constant function.\n * @example\n *\n * var objects = _.times(2, _.constant({ 'a': 1 }));\n *\n * console.log(objects);\n * // => [{ 'a': 1 }, { 'a': 1 }]\n *\n * console.log(objects[0] === objects[1]);\n * // => true\n */\nfunction constant(value) {\n return function() {\n return value;\n };\n}\n\nexport default constant;\n","/** Used to detect hot functions by number of calls within a span of milliseconds. */\nvar HOT_COUNT = 800,\n HOT_SPAN = 16;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeNow = Date.now;\n\n/**\n * Creates a function that'll short out and invoke `identity` instead\n * of `func` when it's called `HOT_COUNT` or more times in `HOT_SPAN`\n * milliseconds.\n *\n * @private\n * @param {Function} func The function to restrict.\n * @returns {Function} Returns the new shortable function.\n */\nfunction shortOut(func) {\n var count = 0,\n lastCalled = 0;\n\n return function() {\n var stamp = nativeNow(),\n remaining = HOT_SPAN - (stamp - lastCalled);\n\n lastCalled = stamp;\n if (remaining > 0) {\n if (++count >= HOT_COUNT) {\n return arguments[0];\n }\n } else {\n count = 0;\n }\n return func.apply(undefined, arguments);\n };\n}\n\nexport default shortOut;\n","import baseSetToString from './_baseSetToString.js';\nimport shortOut from './_shortOut.js';\n\n/**\n * Sets the `toString` method of `func` to return `string`.\n *\n * @private\n * @param {Function} func The function to modify.\n * @param {Function} string The `toString` result.\n * @returns {Function} Returns `func`.\n */\nvar setToString = shortOut(baseSetToString);\n\nexport default setToString;\n","import identity from './identity.js';\nimport overRest from './_overRest.js';\nimport setToString from './_setToString.js';\n\n/**\n * The base implementation of `_.rest` which doesn't validate or coerce arguments.\n *\n * @private\n * @param {Function} func The function to apply a rest parameter to.\n * @param {number} [start=func.length-1] The start position of the rest parameter.\n * @returns {Function} Returns the new function.\n */\nfunction baseRest(func, start) {\n return setToString(overRest(func, start, identity), func + '');\n}\n\nexport default baseRest;\n","/**\n * A faster alternative to `Function#apply`, this function invokes `func`\n * with the `this` binding of `thisArg` and the arguments of `args`.\n *\n * @private\n * @param {Function} func The function to invoke.\n * @param {*} thisArg The `this` binding of `func`.\n * @param {Array} args The arguments to invoke `func` with.\n * @returns {*} Returns the result of `func`.\n */\nfunction apply(func, thisArg, args) {\n switch (args.length) {\n case 0: return func.call(thisArg);\n case 1: return func.call(thisArg, args[0]);\n case 2: return func.call(thisArg, args[0], args[1]);\n case 3: return func.call(thisArg, args[0], args[1], args[2]);\n }\n return func.apply(thisArg, args);\n}\n\nexport default apply;\n","import baseMerge from './_baseMerge.js';\nimport createAssigner from './_createAssigner.js';\n\n/**\n * This method is like `_.assign` except that it recursively merges own and\n * inherited enumerable string keyed properties of source objects into the\n * destination object. Source properties that resolve to `undefined` are\n * skipped if a destination value exists. Array and plain object properties\n * are merged recursively. Other objects and value types are overridden by\n * assignment. Source objects are applied from left to right. Subsequent\n * sources overwrite property assignments of previous sources.\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @memberOf _\n * @since 0.5.0\n * @category Object\n * @param {Object} object The destination object.\n * @param {...Object} [sources] The source objects.\n * @returns {Object} Returns `object`.\n * @example\n *\n * var object = {\n * 'a': [{ 'b': 2 }, { 'd': 4 }]\n * };\n *\n * var other = {\n * 'a': [{ 'c': 3 }, { 'e': 5 }]\n * };\n *\n * _.merge(object, other);\n * // => { 'a': [{ 'b': 2, 'c': 3 }, { 'd': 4, 'e': 5 }] }\n */\nvar merge = createAssigner(function(object, source, srcIndex) {\n baseMerge(object, source, srcIndex);\n});\n\nexport default merge;\n","import baseRest from './_baseRest.js';\nimport isIterateeCall from './_isIterateeCall.js';\n\n/**\n * Creates a function like `_.assign`.\n *\n * @private\n * @param {Function} assigner The function to assign values.\n * @returns {Function} Returns the new assigner function.\n */\nfunction createAssigner(assigner) {\n return baseRest(function(object, sources) {\n var index = -1,\n length = sources.length,\n customizer = length > 1 ? sources[length - 1] : undefined,\n guard = length > 2 ? sources[2] : undefined;\n\n customizer = (assigner.length > 3 && typeof customizer == 'function')\n ? (length--, customizer)\n : undefined;\n\n if (guard && isIterateeCall(sources[0], sources[1], guard)) {\n customizer = length < 3 ? undefined : customizer;\n length = 1;\n }\n object = Object(object);\n while (++index < length) {\n var source = sources[index];\n if (source) {\n assigner(object, source, index, customizer);\n }\n }\n return object;\n });\n}\n\nexport default createAssigner;\n","import eq from './eq.js';\nimport isArrayLike from './isArrayLike.js';\nimport isIndex from './_isIndex.js';\nimport isObject from './isObject.js';\n\n/**\n * Checks if the given arguments are from an iteratee call.\n *\n * @private\n * @param {*} value The potential iteratee value argument.\n * @param {*} index The potential iteratee index or key argument.\n * @param {*} object The potential iteratee object argument.\n * @returns {boolean} Returns `true` if the arguments are from an iteratee call,\n * else `false`.\n */\nfunction isIterateeCall(value, index, object) {\n if (!isObject(object)) {\n return false;\n }\n var type = typeof index;\n if (type == 'number'\n ? (isArrayLike(object) && isIndex(index, object.length))\n : (type == 'string' && index in object)\n ) {\n return eq(object[index], value);\n }\n return false;\n}\n\nexport default isIterateeCall;\n","import * as content from '../../content.js'\n\n/**\n* Spellcheck class.\n*\n* @class Spellcheck\n* @constructor\n*/\nexport default class SpellcheckService {\n\n constructor (spellcheckService) {\n this.spellcheckService = spellcheckService\n }\n\n check (text, callback) {\n if (!text) return callback(null)\n\n const condensedText = content.normalizeWhitespace(text)\n\n this.spellcheckService(condensedText, (misspelledWords) => {\n if (misspelledWords && misspelledWords.length > 0) {\n return callback(null, misspelledWords)\n }\n return callback(null)\n })\n }\n\n}\n","// See: https://en.wikipedia.org/wiki/Whitespace_character\n\nconst characters = {\n 'A0': 'no-break space', // \\\\u00A0\n '2000': 'en quad', // \\\\u2000\n '2001': 'em quad', // \\\\u2001\n '2002': 'en space', // \\\\u2002\n '2003': 'em space', // \\\\u2003\n '2004': 'three-per-em space', // \\\\u2004\n '2005': 'four-per-em space', // \\\\u2005\n '2006': 'six-per-em space', // \\\\u2006\n '2007': 'figure space', // \\\\u2007\n '2008': 'punctuation space', // \\\\u2008\n '2009': 'thin space', // \\\\u2009\n '200A': 'hair space', // \\\\u200A\n '202F': 'narrow no-break space', // \\\\u202F\n '205F': 'medium mathematical space', // \\\\u205F\n '3000': 'ideographic space' // \\\\u3000\n}\n\n// The no-break space is not highlighted as this can cause problems.\n// Browser can insert no-break spaces when typing at the end of\n// a paragraph and the highlighting prevents browsers from converting\n// the no-break space back to a normal space when the user keeps typing.\nconst specialWhitespaceChars = '\\\\u2000-\\\\u200A\\\\u202F\\\\u205F\\\\u3000'\nconst specialWhitespaceCharsRegex = new RegExp(`[${specialWhitespaceChars}]`, 'g')\n\nexport default class WhitespaceHighlighting {\n\n constructor (markerNode) {\n this.marker = markerNode\n }\n\n findMatches (text) {\n if (!text) return\n\n const matches = [...text.matchAll(specialWhitespaceCharsRegex)]\n return matches.map((entry) => this.prepareMatch(entry))\n }\n\n prepareMatch (match) {\n const startIndex = match.index\n const unicode = getUnicode(match[0])\n const description = characters[unicode]\n return {\n startIndex,\n endIndex: startIndex + match.length,\n match: match[0],\n title: `${description} (\\\\u${unicode})`,\n marker: this.marker\n }\n }\n}\n\nfunction getUnicode (character) {\n const code = character.charCodeAt(0)\n return `${code.toString(16).toUpperCase()}`\n}\n","export default class MatchCollection {\n\n constructor () {\n this.matches = []\n }\n\n addMatches (matches) {\n if (!matches?.length) return\n this.matches = mergeMatches(this.matches, matches)\n }\n\n}\n\n// Private Helpers\n// ---------------\n\nfunction mergeMatches (matches1, matches2) {\n let next\n const length1 = matches1.length\n const length2 = matches2.length\n let lastEndIndex = -1\n const output = []\n\n const state = {\n a1: matches1,\n i1: 0,\n a2: matches2,\n i2: 0\n }\n\n while (state.i1 < length1 || state.i2 < length2) {\n next = pickNext(state)\n if (next.startIndex >= lastEndIndex) {\n output.push(next)\n }\n lastEndIndex = next.endIndex\n }\n\n return output\n}\n\nfunction pickNext (state) {\n const i1 = state.i1\n const i2 = state.i2\n const item1 = state.a1[i1]\n const item2 = state.a2[i2]\n\n if (item1 && item2 && item1.startIndex < item2.startIndex) {\n state.i1 = i1 + 1\n return item1\n } else if (item1 && item2) {\n state.i2 = i2 + 1\n return item2\n } else if (item1) {\n state.i1 = i1 + 1\n return item1\n } else if (item2) {\n state.i2 = i2 + 1\n return item2\n } else {\n return undefined\n }\n}\n","import _merge from 'lodash-es/merge'\nimport * as nodeType from './node-type.js'\nimport * as content from './content.js'\nimport highlightText from './highlight-text.js'\nimport SpellcheckService from './plugins/highlighting/spellcheck-service.js'\nimport WhitespaceHighlighting from './plugins/highlighting/whitespace-highlighting.js'\nimport {searchAllWords} from './plugins/highlighting/text-search.js'\nimport MatchCollection from './plugins/highlighting/match-collection.js'\nimport highlightSupport from './highlight-support.js'\nimport {domArray, domSelector} from './util/dom.js'\n\n// Spellcheck and Whitespace Highlighting\n// --------------------------------------\n//\n// This instance monitors an editable block for changes and\n// updates highlights accordingly. It also calls the spellcheck\n// service after the content has changed.\nexport default class MonitoredHighlighting {\n\n constructor (editable, configuration, spellcheckConfig) {\n this.editable = editable\n this.win = editable.win\n this.focusedEditableHost = undefined\n this.currentlyCheckedEditableHost = undefined\n this.timeout = {}\n\n const defaultConfig = {\n checkOnInit: false,\n checkOnFocus: false,\n checkOnChange: true,\n // unbounce rate in ms before calling the spellcheck service after changes\n throttle: 1000,\n // remove highlights after a change if the cursor is inside a highlight\n removeOnCorrection: true,\n spellcheck: {\n marker: '<span class=\"highlight-spellcheck\"></span>',\n throttle: 1000,\n spellcheckService: function () {}\n },\n whitespace: {\n marker: '<span class=\"highlight-whitespace\"></span>'\n }\n }\n\n this.config = _merge({}, defaultConfig, configuration)\n\n const spellcheckService = this.config.spellcheck.spellcheckService\n const spellcheckMarker = this.config.spellcheck.marker\n const whitespaceMarker = this.config.whitespace.marker\n const whitespaceMarkerNode = highlightSupport\n .createMarkerNode(whitespaceMarker, 'whitespace', this.win)\n this.spellcheckMarkerNode = highlightSupport\n .createMarkerNode(spellcheckMarker, 'spellcheck', this.win)\n\n this.spellcheckService = new SpellcheckService(spellcheckService)\n this.whitespace = new WhitespaceHighlighting(whitespaceMarkerNode)\n\n this.setupListeners()\n }\n\n // Events\n // ------\n\n setupListeners () {\n if (this.config.checkOnFocus) {\n this.editable.on('focus', (...args) => this.onFocus(...args))\n this.editable.on('blur', (...args) => this.onBlur(...args))\n }\n if (this.config.checkOnChange || this.config.removeOnCorrection) {\n this.editable.on('change', (...args) => this.onChange(...args))\n }\n if (this.config.checkOnInit) {\n this.editable.on('init', (...args) => this.onInit(...args))\n }\n }\n\n onInit (editableHost) {\n this.highlight(editableHost)\n }\n\n onFocus (editableHost) {\n if (this.focusedEditableHost !== editableHost) {\n this.focusedEditableHost = editableHost\n this.editableHasChanged(editableHost)\n }\n }\n\n onBlur (editableHost) {\n if (this.focusedEditableHost === editableHost) {\n this.focusedEditableHost = undefined\n }\n }\n\n onChange (editableHost) {\n if (this.config.checkOnChange) {\n this.editableHasChanged(editableHost, this.config.throttle)\n }\n if (this.config.removeOnCorrection) {\n this.removeHighlightsAtCursor(editableHost)\n }\n }\n\n // Manage Highlights\n // -----------------\n\n editableHasChanged (editableHost, throttle) {\n if (this.timeout.id && this.timeout.editableHost === editableHost) {\n clearTimeout(this.timeout.id)\n }\n\n const timeoutId = setTimeout(() => {\n this.highlight(editableHost)\n\n this.timeout = {}\n }, throttle || 0)\n\n this.timeout = {\n id: timeoutId,\n editableHost: editableHost\n }\n }\n\n highlight (editableHost) {\n const textBefore = highlightText.extractText(editableHost)\n\n // getSpellcheck\n this.spellcheckService.check(textBefore, (err, misspelledWords) => {\n if (err || !editableHost.isConnected) { return } // return in case the host was removed from the dom\n\n // refresh the text\n const text = highlightText.extractText(editableHost)\n\n const matchCollection = new MatchCollection()\n\n let matches = searchAllWords(text, misspelledWords, this.spellcheckMarkerNode)\n matchCollection.addMatches(matches)\n\n matches = this.whitespace.findMatches(text)\n matchCollection.addMatches(matches)\n\n this.safeHighlightMatches(editableHost, matchCollection.matches)\n })\n }\n\n // Calls highlightMatches internally but ensures\n // that the selection stays the same\n safeHighlightMatches (editableHost, matches) {\n const selection = this.editable.getSelection(editableHost)\n if (selection) {\n selection.retainVisibleSelection(() => {\n this.highlightMatches(editableHost, matches)\n })\n } else {\n this.highlightMatches(editableHost, matches)\n }\n if (this.editable.dispatcher) {\n this.editable.dispatcher.notify('spellcheckUpdated', editableHost)\n }\n }\n\n highlightMatches (editableHost, matches) {\n // Remove old highlights\n this.removeHighlights(editableHost)\n\n // Create new highlights\n if (matches && matches.length > 0) {\n // const span = this.createMarkerNode()\n highlightText.highlightMatches(editableHost, matches)\n }\n }\n\n removeHighlights (editableHost) {\n editableHost = domSelector(editableHost, this.win.document)\n for (const elem of domArray('[data-highlight=\"spellcheck\"], [data-highlight=\"whitespace\"]', editableHost)) {\n content.unwrap(elem)\n }\n }\n\n removeHighlightsAtCursor (editableHost) {\n editableHost = domSelector(editableHost, this.win.document)\n const selection = this.editable.getSelection(editableHost)\n if (selection && selection.isCursor) {\n let elementAtCursor = selection.range.startContainer\n if (elementAtCursor.nodeType === nodeType.textNode) {\n elementAtCursor = elementAtCursor.parentNode\n }\n\n let wordId\n do {\n if (elementAtCursor === editableHost) return\n const highlightType = elementAtCursor.getAttribute('data-highlight')\n if (highlightType === 'spellcheck' || highlightType === 'whitespace') {\n wordId = elementAtCursor.getAttribute('data-word-id')\n break\n }\n } while ((elementAtCursor = elementAtCursor.parentNode))\n\n if (wordId) {\n selection.retainVisibleSelection(() => {\n for (const elem of domArray(`[data-word-id=\"${wordId}\"]`, editableHost)) {\n content.unwrap(elem)\n }\n })\n }\n }\n }\n\n}\n","import config from '../config.js'\n\n// Allows for safe console logging\n// If the last param is the string \"trace\" console.trace will be called\n// configuration: disable with config.log = false\nexport default function log () {\n if (config.log === false) return\n\n if (!global.console) return\n\n const args = arguments.length === 1 ? arguments[0] : Array.from(arguments)\n\n if (arguments.length !== 1 && args[args.length - 1] === 'trace') {\n args.pop()\n if (console.trace) console.trace()\n }\n\n return console.log(args)\n}\n","'use strict'\nimport NodeIterator from '../node-iterator.js'\n\nexport function textNodesUnder (node) {\n const iterator = new NodeIterator(node, 'getNextTextNode')\n return [...iterator]\n}\n\n// NOTE: if there is only one text node, then just that node and\n// the abs offset are returned\nexport function getTextNodeAndRelativeOffset ({textNodes, absOffset}) {\n let cumulativeOffset = 0\n let relativeOffset = 0\n let targetNode\n for (let i = 0; i < textNodes.length; i++) {\n const node = textNodes[i]\n if (absOffset <= cumulativeOffset + node.textContent.length) {\n targetNode = node\n relativeOffset = absOffset - cumulativeOffset\n break\n }\n cumulativeOffset += node.textContent.length\n }\n return {node: targetNode, relativeOffset}\n}\n\nexport function getTotalCharCount (element) {\n const textNodes = textNodesUnder(element)\n const reducer = (acc, node) => acc + node.textContent.length\n return textNodes.reduce(reducer, 0)\n}\n","'use strict'\nimport {getTotalCharCount, textNodesUnder, getTextNodeAndRelativeOffset} from './element.js'\n\n/**\n * This is a binary search algorithm implementation aimed at finding\n * a character offset position in a consecutive strings of characters\n * over several lines.\n *\n * Refer to this page in order to learn more about binary search:\n * https://en.wikipedia.org/wiki/Binary_search_algorithm\n *\n * @returns {object}\n * - object with boolean `wasFound` indicating if the binary search found an offset and `offset` to indicate the actual character offset\n */\nexport function binaryCursorSearch ({\n host,\n requiredOnFirstLine,\n requiredOnLastLine,\n positionX // coordinates relative to viewport (e.g. from getBoundingClientRect())\n}) {\n const hostRange = host.ownerDocument.createRange()\n hostRange.selectNodeContents(host)\n const hostCoords = hostRange.getBoundingClientRect()\n const totalCharCount = getTotalCharCount(host)\n const textNodes = textNodesUnder(host)\n\n // early terminate on empty editables\n if (totalCharCount === 0) return {wasFound: false}\n\n const data = {\n currentOffset: Math.floor(totalCharCount / 2),\n leftLimit: 0,\n rightLimit: totalCharCount\n }\n\n let offset = data.currentOffset\n let distance\n let safety = 20\n while (data.leftLimit < data.rightLimit && safety > 0) {\n safety = safety -= 1\n offset = data.currentOffset\n const range = createRangeAtCharacterOffset({textNodes, offset: data.currentOffset})\n const coords = range.getBoundingClientRect()\n distance = Math.abs(coords.left - positionX)\n\n // up / down axis\n if (requiredOnFirstLine && hostCoords.top !== coords.top) {\n moveLeft(data)\n continue\n } else if (requiredOnLastLine && hostCoords.bottom !== coords.bottom) {\n moveRight(data)\n continue\n }\n\n // left / right axis\n if (positionX < coords.left) {\n moveLeft(data)\n } else {\n moveRight(data)\n }\n }\n\n const range = createRangeAtCharacterOffset({textNodes, offset: data.currentOffset})\n const coords = range.getBoundingClientRect()\n const finalDistance = Math.abs(coords.left - positionX)\n\n // Decide if last or second last offset is closest\n if (finalDistance < distance) {\n distance = finalDistance\n offset = data.currentOffset\n }\n\n return {distance, offset, wasFound: true}\n}\n\n// move the binary search index in between the current position and the left limit\nfunction moveLeft (data) {\n data.rightLimit = data.currentOffset\n data.currentOffset = Math.floor((data.currentOffset + data.leftLimit) / 2)\n}\n// move the binary search index in between the current position and the right limit\nfunction moveRight (data) {\n data.leftLimit = data.currentOffset\n data.currentOffset = Math.ceil((data.currentOffset + data.rightLimit) / 2)\n}\n\nfunction createRangeAtCharacterOffset ({textNodes, offset}) {\n const {node, relativeOffset} = getTextNodeAndRelativeOffset({textNodes, absOffset: offset})\n\n const newRange = node.ownerDocument.createRange()\n newRange.setStart(node, relativeOffset)\n newRange.collapse(true)\n\n return newRange\n}\n","import config from './config.js'\nimport error from './util/error.js'\nimport * as parser from './parser.js'\nimport * as block from './block.js'\nimport * as content from './content.js'\nimport * as clipboard from './clipboard.js'\nimport Dispatcher from './dispatcher.js'\nimport Cursor from './cursor.js'\nimport highlightSupport from './highlight-support.js'\nimport MonitoredHighlighting from './monitored-highlighting.js'\nimport createDefaultEvents from './create-default-events.js'\nimport {textNodesUnder, getTextNodeAndRelativeOffset} from './util/element.js'\nimport {binaryCursorSearch} from './util/binary_search.js'\nimport {domArray, createRange, nodeContainsRange} from './util/dom.js'\n\n/**\n * The Core module provides the Editable class that defines the Editable.JS\n * API and is the main entry point for Editable.JS.\n * It also provides the cursor module for cross-browser cursors, and the dom\n * submodule.\n *\n * @module core\n */\n\n/**\n * Constructor for the Editable.JS API that is externally visible.\n *\n * @param {Object} configuration for this editable instance.\n * window: The window where to attach the editable events.\n * defaultBehavior: {Boolean} Load default-behavior.js.\n * mouseMoveSelectionChanges: {Boolean} Whether to get cursor and selection events on mousemove.\n * browserSpellcheck: {Boolean} Set the spellcheck attribute on editable elements\n *\n * @class Editable\n */\nexport class Editable {\n\n constructor (instanceConfig) {\n const defaultInstanceConfig = {\n window: window,\n defaultBehavior: true,\n mouseMoveSelectionChanges: false,\n browserSpellcheck: true\n }\n\n this.config = Object.assign(defaultInstanceConfig, instanceConfig)\n this.win = this.config.window\n this.editableSelector = `.${config.editableClass}`\n\n this.dispatcher = new Dispatcher(this)\n if (this.config.defaultBehavior === true) {\n this.dispatcher.on(createDefaultEvents(this))\n }\n }\n\n /**\n * @returns the default Editable configs from config.js\n */\n static getGlobalConfig () {\n return config\n }\n\n /**\n * Set configuration options that affect all editable\n * instances.\n *\n * @param {Object} global configuration options (defaults are defined in config.js)\n * log: {Boolean}\n * logErrors: {Boolean}\n * editableClass: {String} e.g. 'js-editable'\n * editableDisabledClass: {String} e.g. 'js-editable-disabled'\n * pastingAttribute: {String} default: e.g. 'data-editable-is-pasting'\n * boldTag: e.g. '<strong>'\n * italicTag: e.g. '<em>'\n */\n static globalConfig (globalConfig) {\n Object.assign(config, globalConfig)\n clipboard.updateConfig(config)\n }\n\n /**\n * Adds the Editable.JS API to the given target elements.\n * Opposite of {{#crossLink \"Editable/remove\"}}{{/crossLink}}.\n * Calls dispatcher.setup to setup all event listeners.\n *\n * @method add\n * @param {HTMLElement|Array(HTMLElement)|String} target A HTMLElement, an\n * array of HTMLElement or a query selector representing the target where\n * the API should be added on.\n * @param {normalize, plainText} options Block specific configuration\n * @chainable\n */\n add (target, options) {\n this.enable(target, options)\n // TODO check css whitespace settings\n return this\n }\n\n /**\n * Removes the Editable.JS API from the given target elements.\n * Opposite of {{#crossLink \"Editable/add\"}}{{/crossLink}}.\n *\n * @method remove\n * @param {HTMLElement|Array(HTMLElement)|String} target A HTMLElement, an\n * array of HTMLElement or a query selector representing the target where\n * the API should be removed from.\n * @chainable\n */\n remove (target) {\n const targets = domArray(target, this.win.document)\n\n this.disable(targets)\n\n for (const element of targets) {\n element.classList.remove(config.editableDisabledClass)\n }\n\n return this\n }\n\n /**\n * Removes the Editable.JS API from the given target elements.\n * The target elements are marked as disabled.\n *\n * @method disable\n * @param { HTMLElement | undefined } elem editable root element(s)\n * If no param is specified all editables are disabled.\n * @chainable\n */\n disable (target) {\n const targets = domArray(target || `.${config.editableClass}`, this.win.document)\n\n for (const element of targets) {\n block.disable(element)\n }\n\n return this\n }\n\n /**\n * Adds the Editable.JS API to the given target elements.\n *\n * @method enable\n * @param { HTMLElement | undefined } target editable root element(s)\n * If no param is specified all editables marked as disabled are enabled.\n * @param {boolean} normalize normalizes target content (legacy param)\n * @param {boolean} options.normalize normalizes target content\n * @param {boolean} options.plainText prevents text formatting for block\n * @chainable\n */\n enable (target, options) {\n const {\n normalize = typeof options === 'boolean' ? options : false,\n plainText = false\n } = options ?? {}\n const shouldSpellcheck = this.config.browserSpellcheck\n const targets = domArray(target || `.${config.editableDisabledClass}`, this.win.document)\n\n for (const element of targets) {\n block.init(element, {normalize, plainText, shouldSpellcheck})\n this.dispatcher.notify('init', element)\n }\n\n return this\n }\n\n /**\n * Temporarily disable an editable.\n * Can be used to prevent text selection while dragging an element\n * for example.\n *\n * @method suspend\n * @param { HTMLElement | undefined } target\n */\n suspend (target) {\n const targets = domArray(target || `.${config.editableClass}`, this.win.document)\n\n for (const element of targets) {\n element.removeAttribute('contenteditable')\n }\n\n this.dispatcher.suspend()\n return this\n }\n\n /**\n * Reverse the effects of suspend()\n *\n * @method continue\n * @param { HTMLElement | undefined } target\n */\n continue (target) {\n const targets = domArray(target || `.${config.editableClass}`, this.win.document)\n\n for (const element of targets) {\n element.setAttribute('contenteditable', true)\n }\n\n this.dispatcher.continue()\n return this\n }\n /**\n * Set the cursor inside of an editable block.\n *\n * @method createCursor\n * @param { HTMLElement } element\n * @param { 'beginning' | 'end' | 'before' | 'after' } position\n */\n\n createCursor (element, position = 'beginning') {\n const host = Cursor.findHost(element, this.editableSelector)\n if (!host) return undefined\n\n const range = createRange()\n\n if (position === 'beginning' || position === 'end') {\n range.selectNodeContents(element)\n range.collapse(position === 'beginning')\n } else if (element !== host) {\n if (position === 'before') {\n range.setStartBefore(element)\n range.setEndBefore(element)\n } else if (position === 'after') {\n range.setStartAfter(element)\n range.setEndAfter(element)\n }\n } else {\n error('EditableJS: cannot create cursor outside of an editable block.')\n }\n\n return new Cursor(host, range)\n }\n\n createCursorAtCharacterOffset ({element, offset}) {\n const textNodes = textNodesUnder(element)\n const {node, relativeOffset} = getTextNodeAndRelativeOffset({textNodes, absOffset: offset})\n const newRange = createRange()\n newRange.setStart(node, relativeOffset)\n newRange.collapse(true)\n\n const host = Cursor.findHost(element, this.editableSelector)\n const nextCursor = new Cursor(host, newRange)\n\n nextCursor.setVisibleSelection()\n return nextCursor\n }\n\n createCursorAtBeginning (element) {\n return this.createCursor(element, 'beginning')\n }\n\n createCursorAtEnd (element) {\n return this.createCursor(element, 'end')\n }\n\n createCursorBefore (element) {\n return this.createCursor(element, 'before')\n }\n\n createCursorAfter (element) {\n return this.createCursor(element, 'after')\n }\n\n /**\n * Extract the content from an editable host or document fragment.\n * This method will remove all internal elements and ui-elements.\n *\n * @param {DOM node or Document Fragment} The innerHTML of this element or fragment will be extracted.\n * @returns {String} The cleaned innerHTML.\n */\n getContent (element) {\n return content.extractContent(element)\n }\n\n /**\n * @param {String | DocumentFragment} content to append.\n * @returns {Cursor} A new Cursor object just before the inserted content.\n */\n appendTo (inputElement, contentToAppend) {\n const element = content.adoptElement(inputElement, this.win.document)\n\n const cursor = this.createCursor(element, 'end')\n // TODO create content in the right window\n cursor.insertAfter(typeof contentToAppend === 'string'\n ? content.createFragmentFromString(contentToAppend)\n : contentToAppend\n )\n return cursor\n }\n\n /**\n * @param {String | DocumentFragment} content to prepend\n * @returns {Cursor} A new Cursor object just after the inserted content.\n */\n prependTo (inputElement, contentToPrepend) {\n const element = content.adoptElement(inputElement, this.win.document)\n\n const cursor = this.createCursor(element, 'beginning')\n // TODO create content in the right window\n cursor.insertBefore(typeof contentToPrepend === 'string'\n ? content.createFragmentFromString(contentToPrepend)\n : contentToPrepend\n )\n return cursor\n }\n\n /**\n * Get the current selection.\n * Only returns something if the selection is within an editable element.\n * If you pass an editable host as param it only returns something if the selection is inside this\n * very editable element.\n *\n * @param {DOMNode} Optional. An editable host where the selection needs to be contained.\n * @returns A Cursor or Selection object or undefined.\n */\n getSelection (editableHost) {\n const selection = this.dispatcher.selectionWatcher.getFreshSelection()\n if (!editableHost || !selection) return selection\n\n const range = selection.range\n\n // Check if the selection is inside the editableHost\n if (editableHost?.isConnected && nodeContainsRange(editableHost, range)) {\n return selection\n }\n }\n\n /**\n * Enable spellchecking\n *\n * @chainable\n */\n setupHighlighting (hightlightingConfig) {\n this.highlighting = new MonitoredHighlighting(this, hightlightingConfig)\n\n return this\n }\n\n // For backwards compatibility\n setupSpellcheck (conf) {\n let marker\n\n if (conf.markerNode) {\n marker = conf.markerNode.outerHTML\n }\n\n this.setupHighlighting({\n throttle: conf.throttle,\n spellcheck: {\n marker: marker,\n spellcheckService: conf.spellcheckService\n }\n })\n\n this.spellcheck = {\n checkSpelling: (elem) => {\n this.highlighting.highlight(elem)\n }\n }\n }\n\n /**\n * Highlight text within an editable.\n *\n * By default highlights all occurrences of `text`.\n * Pass it a `textRange` object to highlight a\n * specific text portion.\n *\n * The markup used for the highlighting will be removed\n * from the final content.\n *\n *\n * @param {Object} options\n * @param {DOMNode} options.editableHost\n * @param {String} options.text\n * @param {String} options.highlightId Added to the highlight markups in the property `data-word-id`\n * @param {Object} [options.textRange] An optional range which gets used to set the markers.\n * @param {Number} options.textRange.start\n * @param {Number} options.textRange.end\n * @param {Boolean} options.raiseEvents do throw change events\n * @return {Number} The text-based start offset of the newly applied highlight or `-1` if the range was considered invalid.\n */\n highlight ({editableHost, text, highlightId, textRange, raiseEvents, type = 'comment'}) {\n if (!textRange) {\n return highlightSupport.highlightText(editableHost, text, highlightId, type, raiseEvents ? this.dispatcher : undefined)\n }\n if (typeof textRange.start !== 'number' || typeof textRange.end !== 'number') {\n error(\n 'Error in Editable.highlight: You passed a textRange object with invalid keys. Expected shape: { start: Number, end: Number }'\n )\n return -1\n }\n if (textRange.start === textRange.end) {\n error(\n 'Error in Editable.highlight: You passed a textRange object with equal start and end offsets, which is considered a cursor and therefore unfit to create a highlight.'\n )\n return -1\n }\n return highlightSupport.highlightRange(editableHost, text, highlightId, textRange.start, textRange.end, raiseEvents ? this.dispatcher : undefined, type)\n }\n\n /**\n * Extracts positions of all DOMNodes that match `[data-word-id]` and the `[data-highlight]`\n *\n * Returns an object where the keys represent a highlight id and the value\n * a text range object of shape:\n * ```\n * { start: number, end: number, text: string}\n * ```\n *\n * @param {Object} options\n * @param {DOMNode} options.editableHost\n * @param {String} [options.type]\n * @return {Object} ranges\n */\n getHighlightPositions ({editableHost, type}) {\n return highlightSupport.extractHighlightedRanges(\n editableHost,\n type\n )\n }\n\n removeHighlight ({editableHost, highlightId, raiseEvents}) {\n highlightSupport.removeHighlight(editableHost, highlightId, raiseEvents ? this.dispatcher : undefined)\n }\n\n decorateHighlight ({editableHost, highlightId, addCssClass, removeCssClass}) {\n highlightSupport.updateHighlight(editableHost, highlightId, addCssClass, removeCssClass)\n }\n\n /**\n * Subscribe a callback function to a custom event fired by the API.\n *\n * @param {String} event The name of the event.\n * @param {Function} handler The callback to execute in response to the\n * event.\n *\n * @chainable\n */\n on (event, handler) {\n // TODO throw error if event is not one of EVENTS\n // TODO throw error if handler is not a function\n this.dispatcher.on(event, handler)\n return this\n }\n\n /**\n * Unsubscribe a callback function from a custom event fired by the API.\n * Opposite of {{#crossLink \"Editable/on\"}}{{/crossLink}}.\n *\n * @param {String} event The name of the event.\n * @param {Function} handler The callback to remove from the\n * event or the special value false to remove all callbacks.\n *\n * @chainable\n */\n off (...args) {\n this.dispatcher.off.apply(this.dispatcher, args)\n return this\n }\n\n /**\n * Unsubscribe all callbacks and event listeners.\n *\n * @chainable\n */\n unload () {\n this.dispatcher.unload()\n return this\n }\n\n /**\n * Takes coordinates and uses its left value to find out how to offset a character in a string to\n * closely match the coordinates.left value.\n * Takes conditions for the result being on the first line, used when navigating to a paragraph from\n * the above paragraph and being on the last line, used when navigating to a paragraph from the below\n * paragraph.\n *\n * Internally this sets up the methods used for a binary cursor search and calls this.\n *\n * @param {DomNode} element\n * - the editable hostDOM Node to which the cursor jumps\n * @param {object} coordinates\n * - The bounding rect of the preceding cursor to be matched\n * @param {boolean} requiredOnFirstLine\n * - set to true if you want to require the cursor to be on the first line of the paragraph\n * @param {boolean} requiredOnLastLine\n * - set to true if you want to require the cursor to be on the last line of the paragraph\n *\n * @return {Object}\n * - object with boolean `wasFound` indicating if the binary search found an offset and `offset` to indicate the actual character offset\n */\n findClosestCursorOffset ({\n element,\n origCoordinates,\n requiredOnFirstLine = false,\n requiredOnLastLine = false\n }) {\n const positionX = this.dispatcher.switchContext\n ? this.dispatcher.switchContext.positionX\n : origCoordinates.left\n\n return binaryCursorSearch({\n host: element,\n requiredOnFirstLine,\n requiredOnLastLine,\n positionX\n })\n }\n}\n\n// Expose modules and editable\nEditable.parser = parser\nEditable.content = content\n\n// Set up callback functions for several events.\n;['focus', 'blur', 'flow', 'selection', 'cursor', 'newline',\n 'insert', 'split', 'merge', 'empty', 'change', 'switch',\n 'move', 'clipboard', 'paste', 'spellcheckUpdated', 'selectToBoundary'\n].forEach((name) => {\n // Generate a callback function to subscribe to an event.\n Editable.prototype[name] = function (handler) {\n return this.on(name, handler)\n }\n})\n","import createDefaultBehavior from './create-default-behavior.js'\n\nexport default function createDefaultEvents (editable) {\n const behavior = createDefaultBehavior(editable)\n\n return {\n /**\n * The focus event is triggered when an element gains focus.\n * The default behavior is to... TODO\n *\n * @event focus\n * @param {HTMLElement} element The element triggering the event.\n */\n focus (element) {\n behavior.focus(element)\n },\n\n /**\n * The blur event is triggered when an element looses focus.\n * The default behavior is to... TODO\n *\n * @event blur\n * @param {HTMLElement} element The element triggering the event.\n */\n blur (element) {\n behavior.blur(element)\n },\n\n /**\n * The flow event is triggered when the user starts typing or pause typing.\n * The default behavior is to... TODO\n *\n * @event flow\n * @param {HTMLElement} element The element triggering the event.\n * @param {String} action The flow action: \"start\" or \"pause\".\n */\n flow (element, action) {\n behavior.flow(element, action)\n },\n\n /**\n * The selection event is triggered after the user has selected some\n * content.\n * The default behavior is to... TODO\n *\n * @event selection\n * @param {HTMLElement} element The element triggering the event.\n * @param {Selection} selection The actual Selection object.\n */\n selection (element, selection) {\n behavior.selection(element, selection)\n },\n\n /**\n * The cursor event is triggered after cursor position has changed.\n * The default behavior is to... TODO\n *\n * @event cursor\n * @param {HTMLElement} element The element triggering the event.\n * @param {Cursor} cursor The actual Cursor object.\n */\n cursor (element, cursor) {\n behavior.cursor(element, cursor)\n },\n\n /**\n * The newline event is triggered when a newline should be inserted. This\n * happens when SHIFT+ENTER key is pressed.\n * The default behavior is to add a <br />\n *\n * @event newline\n * @param {HTMLElement} element The element triggering the event.\n * @param {Cursor} cursor The actual cursor object.\n */\n newline (element, cursor) {\n behavior.newline(element, cursor)\n },\n\n /**\n * The split event is triggered when a block should be split into two\n * blocks. This happens when ENTER is pressed within a non-empty block.\n * The default behavior is to... TODO\n *\n * @event split\n * @param {HTMLElement} element The element triggering the event.\n * @param {String} before The HTML string before the split.\n * @param {String} after The HTML string after the split.\n * @param {Cursor} cursor The actual cursor object.\n */\n split (element, before, after, cursor) {\n behavior.split(element, before, after, cursor)\n },\n\n /**\n * The insert event is triggered when a new block should be inserted. This\n * happens when ENTER key is pressed at the beginning of a block (should\n * insert before) or at the end of a block (should insert after).\n * The default behavior is to... TODO\n *\n * @event insert\n * @param {HTMLElement} element The element triggering the event.\n * @param {String} direction The insert direction: \"before\" or \"after\".\n * @param {Cursor} cursor The actual cursor object.\n */\n insert (element, direction, cursor) {\n behavior.insert(element, direction, cursor)\n },\n\n /**\n * The merge event is triggered when two needs to be merged. This happens\n * when BACKSPACE is pressed at the beginning of a block (should merge with\n * the preceding block) or DEL is pressed at the end of a block (should\n * merge with the following block).\n * The default behavior is to... TODO\n *\n * @event merge\n * @param {HTMLElement} element The element triggering the event.\n * @param {String} direction The merge direction: \"before\" or \"after\".\n * @param {Cursor} cursor The actual cursor object.\n */\n merge (element, direction, cursor) {\n behavior.merge(element, direction, cursor)\n },\n\n /**\n * The empty event is triggered when a block is emptied.\n * The default behavior is to... TODO\n *\n * @event empty\n * @param {HTMLElement} element The element triggering the event.\n */\n empty (element) {\n behavior.empty(element)\n },\n\n /**\n * The switch event is triggered when the user switches to another block.\n * This happens when an ARROW key is pressed near the boundaries of a block.\n * The default behavior is to... TODO\n *\n * @event switch\n * @param {HTMLElement} element The element triggering the event.\n * @param {String} direction The switch direction: \"before\" or \"after\".\n * @param {Cursor} cursor The actual cursor object.*\n */\n switch (element, direction, cursor) {\n behavior.switch(element, direction, cursor)\n },\n\n /**\n * The move event is triggered when the user moves a selection in a block.\n * This happens when the user selects some (or all) content in a block and\n * an ARROW key is pressed (up: drag before, down: drag after).\n * The default behavior is to... TODO\n *\n * @event move\n * @param {HTMLElement} element The element triggering the event.\n * @param {Selection} selection The actual Selection object.\n * @param {String} direction The move direction: \"before\" or \"after\".\n */\n move (element, selection, direction) {\n behavior.move(element, selection, direction)\n },\n\n /**\n * The clipboard event is triggered when the user copies or cuts\n * a selection within a block.\n *\n * @event clipboard\n * @param {HTMLElement} element The element triggering the event.\n * @param {String} action The clipboard action: \"copy\" or \"cut\".\n * @param {Selection} selection A selection object around the copied content.\n */\n clipboard (element, action, selection) {\n behavior.clipboard(element, action, selection)\n },\n\n /**\n * The paste event is triggered when the user pastes text\n *\n * @event paste\n * @param {HTMLElement} The element triggering the event.\n * @param {Array of String} The pasted blocks\n * @param {Cursor} The cursor object.\n */\n paste (element, blocks, cursor) {\n behavior.paste(element, blocks, cursor)\n },\n\n /**\n * The toggleBold event is triggered when the bold keyboard shortcut is used\n *\n * @event toggleBold\n * @param {Selection} The selection object.\n */\n toggleBold (selection) {\n behavior.toggleBold(selection)\n },\n\n /**\n * The toggleEmphasis event is triggered when the italic keyboard shortcut is used\n *\n * @event toggleEmphasis\n * @param {Selection} The selection object.\n */\n toggleEmphasis (selection) {\n behavior.toggleEmphasis(selection)\n }\n }\n}\n","import * as parser from './parser.js'\nimport * as content from './content.js'\nimport log from './util/log.js'\nimport * as block from './block.js'\nimport * as nodeType from './node-type.js'\n\n/**\n * The Behavior module defines the behavior triggered in response to the Editable.JS\n * events (see {{#crossLink \"Editable\"}}{{/crossLink}}).\n * The behavior can be overwritten by a user with Editable.init() or on\n * Editable.add() per element.\n *\n * @module core\n * @submodule behavior\n */\n\nexport default function createDefaultBehavior (editable) {\n const document = editable.win.document\n /**\n * Factory for the default behavior.\n * Provides default behavior of the Editable.JS API.\n *\n * @static\n */\n\n return {\n /** @param {HTMLElement} element */\n focus (element) {\n if (!parser.isVoid(element)) return\n\n // Add an zero width space if the editable is empty to force it to have a height\n // E.g. Firefox does not render empty block elements\n // and most browsers do not render empty inline elements.\n element.appendChild(document.createTextNode('\\uFEFF'))\n },\n\n blur (element) {\n // Note: there is a special case when the tab is changed where\n // we can get a blur event even if the cursor is still in the editable.\n // This blur would cause us to loose the cursor position (cause of cleanInternals()).\n // To prevent this we check if the activeElement is still the editable.\n // (Note: document.getSelection() did not work reliably in this case.)\n if (document.activeElement === element) return\n\n content.cleanInternals(element)\n },\n\n selection (element, selection) {\n log(selection ? 'Default selection behavior' : 'Default selection empty behavior')\n },\n\n cursor (element, cursor) {\n log(cursor ? 'Default cursor behavior' : 'Default cursor empty behavior')\n },\n\n newline (element, cursor) {\n // When the cursor is at the text end, we'll need to add an empty text node\n // after the br tag to ensure that the cursor shows up on the next line\n if (cursor.isAtTextEnd()) {\n const br = document.createElement('br')\n cursor.insertBefore(br)\n\n // Only append a zero width space if there's none after the br tag\n // We don't need to remove them as they get cleaned up on blur\n if (\n br.nextSibling?.nodeType !== nodeType.textNode ||\n br.nextSibling.textContent[0] !== '\\uFEFF'\n ) {\n cursor.insertAfter(document.createTextNode('\\uFEFF'))\n }\n } else {\n cursor.insertBefore(document.createElement('br'))\n }\n\n cursor.setVisibleSelection()\n },\n\n insert (element, direction, cursor) {\n const parent = element.parentNode\n const newElement = element.cloneNode(false)\n if (newElement.id) newElement.removeAttribute('id')\n\n switch (direction) {\n case 'before':\n parent.insertBefore(newElement, element)\n element.focus()\n break\n case 'after':\n parent.insertBefore(newElement, element.nextSibling)\n newElement.focus()\n break\n }\n },\n\n split (element, before, after, cursor) {\n const newNode = element.cloneNode(false)\n newNode.appendChild(before)\n\n const parent = element.parentNode\n parent.insertBefore(newNode, element)\n\n while (element.firstChild) element.removeChild(element.firstChild)\n\n element.appendChild(after)\n content.tidyHtml(newNode)\n content.tidyHtml(element)\n element.focus()\n },\n\n merge (element, direction, cursor) {\n let container, merger\n\n switch (direction) {\n case 'before':\n container = block.previous(element)\n merger = element\n break\n case 'after':\n container = element\n merger = block.next(element)\n break\n }\n\n if (!(container && merger)) return\n\n cursor = container.childNodes.length > 0\n ? editable.appendTo(container, merger.innerHTML)\n : editable.prependTo(container, merger.innerHTML)\n\n // remove merged node\n merger.remove()\n\n cursor.save()\n content.tidyHtml(container)\n cursor.restore()\n cursor.setVisibleSelection()\n },\n\n empty (element) {\n log('Default empty behavior')\n },\n\n switch (element, direction, cursor) {\n switch (direction) {\n case 'before':\n const previous = block.previous(element)\n if (previous) {\n cursor.moveAtTextEnd(previous)\n cursor.setVisibleSelection()\n }\n break\n case 'after':\n const next = block.next(element)\n if (next) {\n cursor.moveAtBeginning(next)\n cursor.setVisibleSelection()\n }\n break\n }\n },\n\n move (element, selection, direction) {\n log('Default move behavior')\n },\n\n paste (element, blocks, cursor) {\n if (blocks.length === 0) return\n\n cursor.insertBefore(blocks.shift())\n if (blocks.length === 0) return cursor.setVisibleSelection()\n\n const parent = element.parentNode\n let currentElement = element\n\n blocks.forEach((str) => {\n const newElement = element.cloneNode(false)\n if (newElement.id) newElement.removeAttribute('id')\n const fragment = content.createFragmentFromString(str)\n newElement.appendChild(fragment)\n parent.insertBefore(newElement, currentElement.nextSibling)\n currentElement = newElement\n })\n\n // focus last element\n editable.createCursorAtEnd(currentElement)\n .setVisibleSelection()\n },\n\n clipboard (element, action, cursor) {\n log('Default clipboard behavior')\n },\n\n toggleBold (selection) {\n selection.toggleBold()\n },\n\n toggleEmphasis (selection) {\n selection.toggleEmphasis()\n }\n }\n}\n"],"names":["root","factory","exports","module","define","amd","self","__webpack_require__","definition","key","o","Object","defineProperty","enumerable","get","g","globalThis","this","Function","e","window","obj","prop","prototype","hasOwnProperty","call","r","Symbol","toStringTag","value","log","logErrors","editableClass","editableDisabledClass","pastingAttribute","trimLeadingAndTrailingWhitespaces","boldMarkup","type","name","attribs","trim","italicMarkup","underlineMarkup","linkMarkup","pastedHtmlRules","allowedElements","allowedPlainTextElements","requiredAttributes","transformElements","splitIntoBlocks","blockLevelElements","blacklistedElements","keepInternalRelativeLinks","replaceQuotes","error","config","args","arguments","length","Array","from","global","console","toString","htmlCharacters","trimRight","text","replace","isString","elementNode","textNode","documentFragmentNode","NodeIterator","method","_classCallCheck","current","previous","nextNode","iteratorFunc","iterator","next","getNext","nodeType","data","prev","getPrevious","done","n","child","undefined","firstChild","getAttribute","nextSibling","parentNode","lastChild","previousSibling","replacement","domArray","target","document","querySelectorAll","tagName","isArray","domSelector","querySelector","createElement","html","el","innerHTML","firstElementChild","closest","elem","selector","createRange","getSelection","getNodes","range","nodeTypes","filterFunc","currentNode","nodes","nodeIterator","createNodeIterator","commonAncestorContainer","NodeFilter","SHOW_ALL","acceptNode","node","intersectsNode","includes","FILTER_ACCEPT","FILTER_SKIP","push","normalizeBoundaries","startContainer","compareDocumentPosition","endContainer","Node","DOCUMENT_POSITION_FOLLOWING","setStartBefore","DOCUMENT_POSITION_PRECEDING","setEndAfter","containsNodeText","nodeRange","selectNodeContents","comparisonStart","compareBoundaryPoints","Range","START_TO_START","comparisonEnd","END_TO_END","isCharacterDataNode","TEXT_NODE","COMMENT_NODE","splitDataNode","offset","splitText","splitBoundaries","startOffset","endOffset","newStartContainer","setStart","toCharacterRange","container","startRange","cloneRange","setEnd","rangeText","start","end","rangesAreEqual","range1","range2","findStartExcludingWhitespace","_ref","whitespacesOnTheLeft","childNodes","offsetAfterWhitespace","getNextTextNode","previousTextNode","getPreviousTextNode","findEndExcludingWhitespace","_ref2","whitespacesOnTheRight","isFirstNode","offsetBeforeWhitespace","getHost","jquery","concat","getNodeIndex","index","isVoid","_step","_iterator","_createForOfIteratorHelper","s","isVoidTextNode","err","f","nodeValue","isWhitespaceOnly","lastOffsetWithContent","isLinebreak","string","lastOffset","reverse","every","isBeginningOfHost","host","isStartOffset","offsetInParent","isEndOfHost","isEndOffset","isTextEndOfHost","isTextEndOffset","isSameNode","source","i","len","attr","nodeName","attributes","latestChild","warn","isDocumentFragmentWithoutChildren","fragment","isInlineElement","element","currentStyle","getComputedStyle","display","boundaryMarkerId","markerTextChar","isSecondChildOfCommonAncestor","rangeContainer","parent","possibleChild","parentElement","insertRangeBoundaryMarker","atStart","ownerDocument","doc","defaultView","markerEl","id","setAttribute","style","lineHeight","appendChild","createTextNode","directlyBeforeFormatTag","directlyAfterFormatTag","startParentElem","insertBefore","endParentElem","boundaryRange","collapse","insertNode","setRangeBoundary","markerId","getMarker","remove","save","rangeInfo","startEl","endEl","collapsed","startMarkerId","endMarkerId","setEndBefore","setStartAfter","restore","restored","previousNode","restoreRange","func","rangeSaveRestore","zeroWidthSpace","zeroWidthNonBreakingSpace","whitespaceExceptSpace","everythingWhitespace","leadingWhitespace","trailingWhitespace","tidyHtml","normalizeTags","createDocumentFragment","removeWhitespaces","textContent","sibling","parser","_step2","_iterator2","siblingChild","cloneNode","removeChild","normalizeWhitespace","cleanInternals","extractContent","keepUiElements","innerHtml","getInnerHtmlOfFragment","clone","unwrapInternalNodes","documentFragment","div","createFragmentFromString","htmlString","wrapper","adoptElement","adoptNode","cloneRangeContents","cloneContents","_elem","firstCall","test","startsWith","unwrap","getTags","innerTags","getInnerTags","ancestorTags","getAncestorTags","tags","getTagsByName","toUpperCase","getTagsByNameAndAttributes","areSameAttributes","attrs1","attrs2","getContainedTags","filter","getTagNames","map","isAffectedBy","some","isExactSelection","visible","elemRange","END_TO_START","elemText","expandTo","toggleTag","elems","removeFormattingElem","forceWrap","isWrappable","boundariesInvalid","ELEMENT_NODE","isNodeFullyContained","canSurroundContents","restoredRange","nukeElem","nuke","wrap","surroundContents","removeFormatting","forEach","matches","insertCharacter","character","insertEl","surround","startCharacter","endCharacter","deleteCharacter","containsString","rangeCount","indexOf","replaceAll","str","nukeTag","nextBlockId","state","getSibling","init","normalize","plainText","shouldSpellcheck","hasAttribute","setBlockId","Boolean","classList","add","content","isPlainTextBlock","replacements","doubleQuotePairs","singleQuotePairs","apostrophe","quotesRegex","beforeOpeningQuote","afterClosingQuote","replaceAllQuotes","replaceQuotesRules","quotes","singleQuotes","matchAll","match","char","before","after","getAllQuotes","replaceMatchedQuotes","replaceExistingQuotes","position","closingTag","findClosingQuote","nestedMatches","slice","replaceApostrophe","openingQuote","possibleClosingSingleQuotes","getPossibleClosingQuotes","possibleClosingDoubleQuotes","pairs","quotePair","quote","whitespaceOnly","blockPlaceholder","updateConfig","conf","rules","paste","block","cursor","clipboardContent","isSelection","deleteExactSurroundingTags","deleteContainedTags","deleteContent","pasteHolder","blocks","_ref$plainText","filterHtmlElements","split","entry","group","parseContent","removeAttribute","options","reduce","toLowerCase","href","stripInternalHost","location","origin","requiredAttrs","hasRequiredAttributes","shouldKeepNode","transformNodeName","_allowedElements$node","filterAttributes","conditionalNodeWrap","c","documentElement","contentEditable","isBlink","navigator","userAgent","isWebkit","webKit","selectionchange","osc","onselectionchange","hasNativeSelectionchangeSupport","contenteditableSpanBug","eventable","notifyContext","events","listeners","addListener","listener","event","unshift","on","eventType","off","eventListeners","splice","removeListener","notify","context","switchContext","shift","apply","getEventableModule","getScrollPosition","win","x","pageXOffset","body","scrollLeft","y","pageYOffset","scrollTop","Cursor","editableHost","setHost","isCursor","hostRange","hostCoords","getRangeBoundingClientRect","cursorCoords","isCloseTo","bottom","top","preceedingElement","lastIndex","setVisibleSelection","activeElement","_viewport$getScrollPo","viewport","scrollTo","selection","removeAllRanges","addRange","getBoundingClientRect","positioning","coords","_viewport$getScrollPo2","left","right","height","width","updateHost","moveAtEnd","callback","savedRangeInfo","isEqualNode","attributeName","attributeValue","Event","bubbles","cancelable","dispatchEvent","a","b","Math","abs","extractText","convertBRs","getText","part","highlightMatches","countBRs","wordId","currentMatchIndex","totalOffset","currentMatch","portions","nodeText","nodeEndOffset","startIndex","endIndex","isFirstPortion","isLastPortion","portion","substring","lastNode","wrapMatch","marker","title","replaceCurrent","stencilElement","_this","wrapPortion","pop","findMatches","searchTexts","matchMode","_obj$ownerDocument","HTMLElement","_typeof","isElement","regex","createWordRegex","createHighlightRegex","matchedText","escapedWords","word","escapeRegEx","join","RegExp","letterChars","String","highlightSupport","highlightText","highlightId","dispatcher","hasHighlight","blockText","searchTerm","searchText","createMarkerNode","highlightRange","removeHighlight","actualStartIndex","actualEndIndex","updateHighlight","addCssClass","removeCssClass","extractHighlightedRanges","findMarkersQuery","markers","_step3","groups","_iterator3","res","extractMarkerNodePosition","selectNode","textRange","nativeRange","cleanupStaleMarkerNodes","highlightType","_step4","_iterator4","markerMarkup","Selection","_Cursor","_callSuper","_inherits","rangeToHtml","getClientRects","attrs","link","trimRange","textToTrim","search","lastNonWhitespace","_findStartExcludingWh2","_slicedToArray","_findEndExcludingWhit2","links","firstLink","unlink","textBefore","currentTextContent","markerNode","_ref3","_ref3$trim","customElem","toggle","_ref4","_ref4$trim","bold","em","u","chars","removeSurround","ancestorTag","containedTag","deleteContents","onlyVisible","RangeContainer","isAnythingSelected","getCursor","otherRangeContainer","other","SelectionWatcher","currentSelection","currentRange","_this$selection","successfulSync","syncSelection","getRangeAt","hostNode","getRangeContainer","forceCursor","newRangeContainer","isDifferentFrom","lastSelection","Keyboard","selectionWatcher","selectionRange","startNodeElement","startNodeRange","testRange","containerRange","contentNodeTypes","firstContentNode","rangeStartingBeforeCurrentElement","getNodeToRemove","notifyCharacterEvent","keyCode","up","down","tab","shiftKey","esc","backspace","preventContenteditableBug","enter","ctrl","alt","ctrlKey","metaKey","getFreshRange","nodeToRemove","delete","isValidQuotePairConfig","isDoubleQuote","isSingleQuote","isApostrophe","isSeparatorOrWhitespace","replaceQuote","quoteType","newText","newTextNode","replaceWith","applySmartQuotes","cursorOffset","isCharSingleQuote","indexCharBefore","textArr","shouldBeClosingQuote","indexCharAfter","hasCharAfter","singleOpeningQuote","hasSingleOpeningQuote","closingQuote","shouldBeOpeningQuote","Dispatcher","editable","editableSelector","keyboard","activeListeners","setup","getEditableBlockByEvent","evt","capture","bind","addEventListener","setupKeyboardEvents","setupEventListeners","l","removeEventListener","suspended","setupElementListeners","setupKeydownListener","setupSelectionChangeListeners","setupSelectionChangeFallbackListeners","currentInput","setupDocumentListener","getFreshSelection","preventDefault","clipboardData","getData","_clipboard$paste","clipboard","innerText","retainVisibleSelection","searchValue","lastOccurrenceIndex","lastIndexOf","replaceLast","smartQuotes","isContentEditable","shouldApplySmartQuotes","_selection$range","setTimeout","direction","altKey","positionX","isAtFirstLine","stopPropagation","isAtLastLine","dispatchKeyEvent","dispatchSwitchEvent","isAtBeginning","isAtTextEnd","selectionDirty","suppressSelectionChanges","isAtEnd","selectionChanged","mouseMoveSelectionChanges","once","_this2","array","ListCache","entries","clear","set","__data__","size","has","freeSelf","objectProto","nativeObjectToString","symToStringTag","isOwn","tag","unmasked","result","uid","maskSrcKey","exec","keys","IE_PROTO","funcToString","reIsHostCtor","reIsNative","object","Hash","MapCache","Stack","LARGE_ARRAY_SIZE","iteratee","keysFunc","iterable","props","freeExports","freeModule","Buffer","allocUnsafe","Uint8Array","typedArray","isDeep","arrayBuffer","buffer","constructor","byteLength","byteOffset","objectCreate","create","proto","getPrototypeOf","transform","arg","Ctor","propertyIsEnumerable","isBuffer","objectCtorString","typedArrayTags","freeProcess","process","nodeUtil","require","types","binding","nodeIsTypedArray","isTypedArray","objValue","reIsUint","inherited","isArr","isArg","isBuff","isType","skipIndexes","isProto","customizer","isNew","newValue","srcIndex","mergeFunc","stack","srcValue","stacked","isCommon","isTyped","copy","baseMerge","nativeMax","max","nativeNow","Date","now","count","lastCalled","stamp","remaining","otherArgs","thisArg","assigner","sources","guard","SpellcheckService","spellcheckService","condensedText","misspelledWords","characters","specialWhitespaceCharsRegex","WhitespaceHighlighting","_toConsumableArray","prepareMatch","code","unicode","charCodeAt","description","MatchCollection","matches1","matches2","length1","length2","lastEndIndex","output","a1","i1","a2","i2","pickNext","mergeMatches","item1","item2","MonitoredHighlighting","configuration","spellcheckConfig","focusedEditableHost","currentlyCheckedEditableHost","timeout","_merge","checkOnInit","checkOnFocus","checkOnChange","throttle","removeOnCorrection","spellcheck","whitespace","spellcheckMarker","whitespaceMarker","whitespaceMarkerNode","spellcheckMarkerNode","setupListeners","onFocus","onBlur","onChange","onInit","highlight","editableHasChanged","removeHighlightsAtCursor","clearTimeout","timeoutId","_this3","check","isConnected","matchCollection","words","searchAllWords","addMatches","safeHighlightMatches","_this4","removeHighlights","elementAtCursor","trace","_arrayLikeToArray","textNodesUnder","_arrayWithoutHoles","_iterableToArray","t","_unsupportedIterableToArray","TypeError","_nonIterableSpread","getTextNodeAndRelativeOffset","targetNode","textNodes","absOffset","cumulativeOffset","relativeOffset","moveLeft","rightLimit","currentOffset","floor","leftLimit","moveRight","ceil","createRangeAtCharacterOffset","_getTextNodeAndRelati","newRange","Editable","instanceConfig","behavior","defaultInstanceConfig","defaultBehavior","browserSpellcheck","assign","focus","blur","newline","_br$nextSibling","br","insertAfter","insert","newElement","newNode","merge","merger","appendTo","prependTo","empty","moveAtTextEnd","moveAtBeginning","move","currentElement","createCursorAtEnd","action","toggleBold","toggleEmphasis","createDefaultBehavior","flow","enable","targets","disable","setState","_ref$normalize","suspend","_step5","_iterator5","findHost","nextCursor","createCursor","inputElement","contentToAppend","contentToPrepend","nodeContainsRange","hightlightingConfig","highlighting","outerHTML","setupHighlighting","checkSpelling","raiseEvents","_ref3$type","_ref5","_ref6","handler","_len","_key","unload","_ref7","origCoordinates","_ref7$requiredOnFirst","requiredOnFirstLine","_ref7$requiredOnLastL","requiredOnLastLine","totalCharCount","acc","wasFound","distance","safety","finalDistance","binaryCursorSearch","globalConfig"],"ignoreList":[],"sourceRoot":""}
|