| Server IP : 85.214.143.32 / Your IP : 216.73.217.113 Web Server : nginx/1.24.0 System : Linux datensicherung.webdress.site 6.8.0-139-generic #139-Ubuntu SMP PREEMPT_DYNAMIC Sat Aug 1 03:52:05 UTC 2026 x86_64 User : www-data ( 33) PHP Version : 7.4.33 Disable Function : pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals,pcntl_unshare, MySQL : OFF | cURL : ON | WGET : ON | Perl : ON | Python : OFF | Sudo : ON | Pkexec : ON Directory : /var/www/nextcloud/dist/ |
Upload File : |
{"version":3,"file":"index-CQWytfr1.chunk.mjs","sources":["../node_modules/tributejs/dist/tribute.esm.js","../node_modules/@nextcloud/vue/dist/chunks/NcRichContenteditable-Qw614bJ5.mjs"],"sourcesContent":["if (!Array.prototype.find) {\n Array.prototype.find = function(predicate) {\n if (this === null) {\n throw new TypeError('Array.prototype.find called on null or undefined')\n }\n if (typeof predicate !== 'function') {\n throw new TypeError('predicate must be a function')\n }\n var list = Object(this);\n var length = list.length >>> 0;\n var thisArg = arguments[1];\n var value;\n\n for (var i = 0; i < length; i++) {\n value = list[i];\n if (predicate.call(thisArg, value, i, list)) {\n return value\n }\n }\n return undefined\n };\n}\n\nif (window && typeof window.CustomEvent !== \"function\") {\n function CustomEvent$1(event, params) {\n params = params || {\n bubbles: false,\n cancelable: false,\n detail: undefined\n };\n var evt = document.createEvent('CustomEvent');\n evt.initCustomEvent(event, params.bubbles, params.cancelable, params.detail);\n return evt\n }\n\n if (typeof window.Event !== 'undefined') {\n CustomEvent$1.prototype = window.Event.prototype;\n }\n\n window.CustomEvent = CustomEvent$1;\n}\n\nclass TributeEvents {\n constructor(tribute) {\n this.tribute = tribute;\n this.tribute.events = this;\n }\n\n static keys() {\n return [\n {\n key: 9,\n value: \"TAB\"\n },\n {\n key: 8,\n value: \"DELETE\"\n },\n {\n key: 13,\n value: \"ENTER\"\n },\n {\n key: 27,\n value: \"ESCAPE\"\n },\n {\n key: 32,\n value: \"SPACE\"\n },\n {\n key: 38,\n value: \"UP\"\n },\n {\n key: 40,\n value: \"DOWN\"\n }\n ];\n }\n\n bind(element) {\n element.boundKeydown = this.keydown.bind(element, this);\n element.boundKeyup = this.keyup.bind(element, this);\n element.boundInput = this.input.bind(element, this);\n\n element.addEventListener(\"keydown\", element.boundKeydown, false);\n element.addEventListener(\"keyup\", element.boundKeyup, false);\n element.addEventListener(\"input\", element.boundInput, false);\n }\n\n unbind(element) {\n element.removeEventListener(\"keydown\", element.boundKeydown, false);\n element.removeEventListener(\"keyup\", element.boundKeyup, false);\n element.removeEventListener(\"input\", element.boundInput, false);\n\n delete element.boundKeydown;\n delete element.boundKeyup;\n delete element.boundInput;\n }\n\n keydown(instance, event) {\n if (instance.shouldDeactivate(event)) {\n instance.tribute.isActive = false;\n instance.tribute.hideMenu();\n }\n\n let element = this;\n instance.commandEvent = false;\n\n TributeEvents.keys().forEach(o => {\n if (o.key === event.keyCode) {\n instance.commandEvent = true;\n instance.callbacks()[o.value.toLowerCase()](event, element);\n }\n });\n }\n\n input(instance, event) {\n instance.inputEvent = true;\n instance.keyup.call(this, instance, event);\n }\n\n click(instance, event) {\n let tribute = instance.tribute;\n if (tribute.menu && tribute.menu.contains(event.target)) {\n let li = event.target;\n event.preventDefault();\n event.stopPropagation();\n while (li.nodeName.toLowerCase() !== \"li\") {\n li = li.parentNode;\n if (!li || li === tribute.menu) {\n throw new Error(\"cannot find the <li> container for the click\");\n }\n }\n tribute.selectItemAtIndex(li.getAttribute(\"data-index\"), event);\n tribute.hideMenu();\n\n // TODO: should fire with externalTrigger and target is outside of menu\n } else if (tribute.current.element && !tribute.current.externalTrigger) {\n tribute.current.externalTrigger = false;\n setTimeout(() => tribute.hideMenu());\n }\n }\n\n keyup(instance, event) {\n if (instance.inputEvent) {\n instance.inputEvent = false;\n }\n instance.updateSelection(this);\n\n if (event.keyCode === 27) return;\n\n if (!instance.tribute.allowSpaces && instance.tribute.hasTrailingSpace) {\n instance.tribute.hasTrailingSpace = false;\n instance.commandEvent = true;\n instance.callbacks()[\"space\"](event, this);\n return;\n }\n\n if (!instance.tribute.isActive) {\n if (instance.tribute.autocompleteMode) {\n instance.callbacks().triggerChar(event, this, \"\");\n } else {\n let keyCode = instance.getKeyCode(instance, this, event);\n\n if (isNaN(keyCode) || !keyCode) return;\n\n let trigger = instance.tribute.triggers().find(trigger => {\n return trigger.charCodeAt(0) === keyCode;\n });\n\n if (typeof trigger !== \"undefined\") {\n instance.callbacks().triggerChar(event, this, trigger);\n }\n }\n }\n\n if (\n instance.tribute.current.mentionText.length <\n instance.tribute.current.collection.menuShowMinLength\n ) {\n return;\n }\n\n if (\n ((instance.tribute.current.trigger ||\n instance.tribute.autocompleteMode) &&\n instance.commandEvent === false) ||\n (instance.tribute.isActive && event.keyCode === 8)\n ) {\n instance.tribute.showMenuFor(this, true);\n }\n }\n\n shouldDeactivate(event) {\n if (!this.tribute.isActive) return false;\n\n if (this.tribute.current.mentionText.length === 0) {\n let eventKeyPressed = false;\n TributeEvents.keys().forEach(o => {\n if (event.keyCode === o.key) eventKeyPressed = true;\n });\n\n return !eventKeyPressed;\n }\n\n return false;\n }\n\n getKeyCode(instance, el, event) {\n let tribute = instance.tribute;\n let info = tribute.range.getTriggerInfo(\n false,\n tribute.hasTrailingSpace,\n true,\n tribute.allowSpaces,\n tribute.autocompleteMode\n );\n\n if (info) {\n return info.mentionTriggerChar.charCodeAt(0);\n } else {\n return false;\n }\n }\n\n updateSelection(el) {\n this.tribute.current.element = el;\n let info = this.tribute.range.getTriggerInfo(\n false,\n this.tribute.hasTrailingSpace,\n true,\n this.tribute.allowSpaces,\n this.tribute.autocompleteMode\n );\n\n if (info) {\n this.tribute.current.selectedPath = info.mentionSelectedPath;\n this.tribute.current.mentionText = info.mentionText;\n this.tribute.current.selectedOffset = info.mentionSelectedOffset;\n }\n }\n\n callbacks() {\n return {\n triggerChar: (e, el, trigger) => {\n let tribute = this.tribute;\n tribute.current.trigger = trigger;\n\n let collectionItem = tribute.collection.find(item => {\n return item.trigger === trigger;\n });\n\n tribute.current.collection = collectionItem;\n\n if (\n tribute.current.mentionText.length >=\n tribute.current.collection.menuShowMinLength &&\n tribute.inputEvent\n ) {\n tribute.showMenuFor(el, true);\n }\n },\n enter: (e, el) => {\n // choose selection\n if (this.tribute.isActive && this.tribute.current.filteredItems) {\n e.preventDefault();\n e.stopPropagation();\n setTimeout(() => {\n this.tribute.selectItemAtIndex(this.tribute.menuSelected, e);\n this.tribute.hideMenu();\n }, 0);\n }\n },\n escape: (e, el) => {\n if (this.tribute.isActive) {\n e.preventDefault();\n e.stopPropagation();\n this.tribute.isActive = false;\n this.tribute.hideMenu();\n }\n },\n tab: (e, el) => {\n // choose first match\n this.callbacks().enter(e, el);\n },\n space: (e, el) => {\n if (this.tribute.isActive) {\n if (this.tribute.spaceSelectsMatch) {\n this.callbacks().enter(e, el);\n } else if (!this.tribute.allowSpaces) {\n e.stopPropagation();\n setTimeout(() => {\n this.tribute.hideMenu();\n this.tribute.isActive = false;\n }, 0);\n }\n }\n },\n up: (e, el) => {\n // navigate up ul\n if (this.tribute.isActive && this.tribute.current.filteredItems) {\n e.preventDefault();\n e.stopPropagation();\n let count = this.tribute.current.filteredItems.length,\n selected = this.tribute.menuSelected;\n\n if (count > selected && selected > 0) {\n this.tribute.menuSelected--;\n this.setActiveLi();\n } else if (selected === 0) {\n this.tribute.menuSelected = count - 1;\n this.setActiveLi();\n this.tribute.menu.scrollTop = this.tribute.menu.scrollHeight;\n }\n }\n },\n down: (e, el) => {\n // navigate down ul\n if (this.tribute.isActive && this.tribute.current.filteredItems) {\n e.preventDefault();\n e.stopPropagation();\n let count = this.tribute.current.filteredItems.length - 1,\n selected = this.tribute.menuSelected;\n\n if (count > selected) {\n this.tribute.menuSelected++;\n this.setActiveLi();\n } else if (count === selected) {\n this.tribute.menuSelected = 0;\n this.setActiveLi();\n this.tribute.menu.scrollTop = 0;\n }\n }\n },\n delete: (e, el) => {\n if (\n this.tribute.isActive &&\n this.tribute.current.mentionText.length < 1\n ) {\n this.tribute.hideMenu();\n } else if (this.tribute.isActive) {\n this.tribute.showMenuFor(el);\n }\n }\n };\n }\n\n setActiveLi(index) {\n let lis = this.tribute.menu.querySelectorAll(\"li\"),\n length = lis.length >>> 0;\n\n if (index) this.tribute.menuSelected = parseInt(index);\n\n for (let i = 0; i < length; i++) {\n let li = lis[i];\n if (i === this.tribute.menuSelected) {\n li.classList.add(this.tribute.current.collection.selectClass);\n\n let liClientRect = li.getBoundingClientRect();\n let menuClientRect = this.tribute.menu.getBoundingClientRect();\n\n if (liClientRect.bottom > menuClientRect.bottom) {\n let scrollDistance = liClientRect.bottom - menuClientRect.bottom;\n this.tribute.menu.scrollTop += scrollDistance;\n } else if (liClientRect.top < menuClientRect.top) {\n let scrollDistance = menuClientRect.top - liClientRect.top;\n this.tribute.menu.scrollTop -= scrollDistance;\n }\n } else {\n li.classList.remove(this.tribute.current.collection.selectClass);\n }\n }\n }\n\n getFullHeight(elem, includeMargin) {\n let height = elem.getBoundingClientRect().height;\n\n if (includeMargin) {\n let style = elem.currentStyle || window.getComputedStyle(elem);\n return (\n height + parseFloat(style.marginTop) + parseFloat(style.marginBottom)\n );\n }\n\n return height;\n }\n}\n\nclass TributeMenuEvents {\n constructor(tribute) {\n this.tribute = tribute;\n this.tribute.menuEvents = this;\n this.menu = this.tribute.menu;\n }\n\n bind(menu) {\n this.menuClickEvent = this.tribute.events.click.bind(null, this);\n this.menuContainerScrollEvent = this.debounce(\n () => {\n if (this.tribute.isActive) {\n this.tribute.showMenuFor(this.tribute.current.element, false);\n }\n },\n 300,\n false\n );\n this.windowResizeEvent = this.debounce(\n () => {\n if (this.tribute.isActive) {\n this.tribute.range.positionMenuAtCaret(true);\n }\n },\n 300,\n false\n );\n\n // fixes IE11 issues with mousedown\n this.tribute.range\n .getDocument()\n .addEventListener(\"MSPointerDown\", this.menuClickEvent, false);\n this.tribute.range\n .getDocument()\n .addEventListener(\"mousedown\", this.menuClickEvent, false);\n window.addEventListener(\"resize\", this.windowResizeEvent);\n\n if (this.menuContainer) {\n this.menuContainer.addEventListener(\n \"scroll\",\n this.menuContainerScrollEvent,\n false\n );\n } else {\n window.addEventListener(\"scroll\", this.menuContainerScrollEvent);\n }\n }\n\n unbind(menu) {\n this.tribute.range\n .getDocument()\n .removeEventListener(\"mousedown\", this.menuClickEvent, false);\n this.tribute.range\n .getDocument()\n .removeEventListener(\"MSPointerDown\", this.menuClickEvent, false);\n window.removeEventListener(\"resize\", this.windowResizeEvent);\n\n if (this.menuContainer) {\n this.menuContainer.removeEventListener(\n \"scroll\",\n this.menuContainerScrollEvent,\n false\n );\n } else {\n window.removeEventListener(\"scroll\", this.menuContainerScrollEvent);\n }\n }\n\n debounce(func, wait, immediate) {\n var timeout;\n return () => {\n var context = this,\n args = arguments;\n var later = () => {\n timeout = null;\n if (!immediate) func.apply(context, args);\n };\n var callNow = immediate && !timeout;\n clearTimeout(timeout);\n timeout = setTimeout(later, wait);\n if (callNow) func.apply(context, args);\n };\n }\n}\n\n// Thanks to https://github.com/jeff-collins/ment.io\n\nclass TributeRange {\n constructor(tribute) {\n this.tribute = tribute;\n this.tribute.range = this;\n }\n\n getDocument() {\n let iframe;\n if (this.tribute.current.collection) {\n iframe = this.tribute.current.collection.iframe;\n }\n\n if (!iframe) {\n return document\n }\n\n return iframe.contentWindow.document\n }\n\n positionMenuAtCaret(scrollTo) {\n let context = this.tribute.current,\n coordinates;\n\n let info = this.getTriggerInfo(false, this.tribute.hasTrailingSpace, true, this.tribute.allowSpaces, this.tribute.autocompleteMode);\n\n if (typeof info !== 'undefined') {\n\n if(!this.tribute.positionMenu){\n this.tribute.menu.style.cssText = `display: block;`;\n return\n }\n\n if (!this.isContentEditable(context.element)) {\n coordinates = this.getTextAreaOrInputUnderlinePosition(this.tribute.current.element,\n info.mentionPosition);\n }\n else {\n coordinates = this.getContentEditableCaretPosition(info.mentionPosition);\n }\n\n this.tribute.menu.style.cssText = `top: ${coordinates.top}px;\n left: ${coordinates.left}px;\n right: ${coordinates.right}px;\n bottom: ${coordinates.bottom}px;\n position: absolute;\n display: block;`;\n\n if (coordinates.left === 'auto') {\n this.tribute.menu.style.left = 'auto';\n }\n\n if (coordinates.top === 'auto') {\n this.tribute.menu.style.top = 'auto';\n }\n\n if (scrollTo) this.scrollIntoView();\n\n window.setTimeout(() => {\n let menuDimensions = {\n width: this.tribute.menu.offsetWidth,\n height: this.tribute.menu.offsetHeight\n };\n let menuIsOffScreen = this.isMenuOffScreen(coordinates, menuDimensions);\n\n let menuIsOffScreenHorizontally = window.innerWidth > menuDimensions.width && (menuIsOffScreen.left || menuIsOffScreen.right);\n let menuIsOffScreenVertically = window.innerHeight > menuDimensions.height && (menuIsOffScreen.top || menuIsOffScreen.bottom);\n if (menuIsOffScreenHorizontally || menuIsOffScreenVertically) {\n this.tribute.menu.style.cssText = 'display: none';\n this.positionMenuAtCaret(scrollTo);\n }\n }, 0);\n\n } else {\n this.tribute.menu.style.cssText = 'display: none';\n }\n }\n\n get menuContainerIsBody() {\n return this.tribute.menuContainer === document.body || !this.tribute.menuContainer;\n }\n\n\n selectElement(targetElement, path, offset) {\n let range;\n let elem = targetElement;\n\n if (path) {\n for (var i = 0; i < path.length; i++) {\n elem = elem.childNodes[path[i]];\n if (elem === undefined) {\n return\n }\n while (elem.length < offset) {\n offset -= elem.length;\n elem = elem.nextSibling;\n }\n if (elem.childNodes.length === 0 && !elem.length) {\n elem = elem.previousSibling;\n }\n }\n }\n let sel = this.getWindowSelection();\n\n range = this.getDocument().createRange();\n range.setStart(elem, offset);\n range.setEnd(elem, offset);\n range.collapse(true);\n\n try {\n sel.removeAllRanges();\n } catch (error) {}\n\n sel.addRange(range);\n targetElement.focus();\n }\n\n replaceTriggerText(text, requireLeadingSpace, hasTrailingSpace, originalEvent, item) {\n let info = this.getTriggerInfo(true, hasTrailingSpace, requireLeadingSpace, this.tribute.allowSpaces, this.tribute.autocompleteMode);\n\n if (info !== undefined) {\n let context = this.tribute.current;\n let replaceEvent = new CustomEvent('tribute-replaced', {\n detail: {\n item: item,\n instance: context,\n context: info,\n event: originalEvent,\n }\n });\n\n if (!this.isContentEditable(context.element)) {\n let myField = this.tribute.current.element;\n let textSuffix = typeof this.tribute.replaceTextSuffix == 'string'\n ? this.tribute.replaceTextSuffix\n : ' ';\n text += textSuffix;\n let startPos = info.mentionPosition;\n let endPos = info.mentionPosition + info.mentionText.length + textSuffix.length;\n if (!this.tribute.autocompleteMode) {\n endPos += info.mentionTriggerChar.length - 1;\n }\n myField.value = myField.value.substring(0, startPos) + text +\n myField.value.substring(endPos, myField.value.length);\n myField.selectionStart = startPos + text.length;\n myField.selectionEnd = startPos + text.length;\n } else {\n // add a space to the end of the pasted text\n let textSuffix = typeof this.tribute.replaceTextSuffix == 'string'\n ? this.tribute.replaceTextSuffix\n : '\\xA0';\n text += textSuffix;\n let endPos = info.mentionPosition + info.mentionText.length;\n if (!this.tribute.autocompleteMode) {\n endPos += info.mentionTriggerChar.length;\n }\n this.pasteHtml(text, info.mentionPosition, endPos);\n }\n\n context.element.dispatchEvent(new CustomEvent('input', { bubbles: true }));\n context.element.dispatchEvent(replaceEvent);\n }\n }\n\n pasteHtml(html, startPos, endPos) {\n let range, sel;\n sel = this.getWindowSelection();\n range = this.getDocument().createRange();\n range.setStart(sel.anchorNode, startPos);\n range.setEnd(sel.anchorNode, endPos);\n range.deleteContents();\n\n let el = this.getDocument().createElement('div');\n el.innerHTML = html;\n let frag = this.getDocument().createDocumentFragment(),\n node, lastNode;\n while ((node = el.firstChild)) {\n lastNode = frag.appendChild(node);\n }\n range.insertNode(frag);\n\n // Preserve the selection\n if (lastNode) {\n range = range.cloneRange();\n range.setStartAfter(lastNode);\n range.collapse(true);\n sel.removeAllRanges();\n sel.addRange(range);\n }\n }\n\n getWindowSelection() {\n if (this.tribute.collection.iframe) {\n return this.tribute.collection.iframe.contentWindow.getSelection()\n }\n\n return window.getSelection()\n }\n\n getNodePositionInParent(element) {\n if (element.parentNode === null) {\n return 0\n }\n\n for (var i = 0; i < element.parentNode.childNodes.length; i++) {\n let node = element.parentNode.childNodes[i];\n\n if (node === element) {\n return i\n }\n }\n }\n\n getContentEditableSelectedPath(ctx) {\n let sel = this.getWindowSelection();\n let selected = sel.anchorNode;\n let path = [];\n let offset;\n\n if (selected != null) {\n let i;\n let ce = selected.contentEditable;\n while (selected !== null && ce !== 'true') {\n i = this.getNodePositionInParent(selected);\n path.push(i);\n selected = selected.parentNode;\n if (selected !== null) {\n ce = selected.contentEditable;\n }\n }\n path.reverse();\n\n // getRangeAt may not exist, need alternative\n offset = sel.getRangeAt(0).startOffset;\n\n return {\n selected: selected,\n path: path,\n offset: offset\n }\n }\n }\n\n getTextPrecedingCurrentSelection() {\n let context = this.tribute.current,\n text = '';\n\n if (!this.isContentEditable(context.element)) {\n let textComponent = this.tribute.current.element;\n if (textComponent) {\n let startPos = textComponent.selectionStart;\n if (textComponent.value && startPos >= 0) {\n text = textComponent.value.substring(0, startPos);\n }\n }\n\n } else {\n let selectedElem = this.getWindowSelection().anchorNode;\n\n if (selectedElem != null) {\n let workingNodeContent = selectedElem.textContent;\n let selectStartOffset = this.getWindowSelection().getRangeAt(0).startOffset;\n\n if (workingNodeContent && selectStartOffset >= 0) {\n text = workingNodeContent.substring(0, selectStartOffset);\n }\n }\n }\n\n return text\n }\n\n getLastWordInText(text) {\n text = text.replace(/\\u00A0/g, ' '); // https://stackoverflow.com/questions/29850407/how-do-i-replace-unicode-character-u00a0-with-a-space-in-javascript\n let wordsArray = text.split(/\\s+/);\n let worldsCount = wordsArray.length - 1;\n return wordsArray[worldsCount].trim()\n }\n\n getTriggerInfo(menuAlreadyActive, hasTrailingSpace, requireLeadingSpace, allowSpaces, isAutocomplete) {\n let ctx = this.tribute.current;\n let selected, path, offset;\n\n if (!this.isContentEditable(ctx.element)) {\n selected = this.tribute.current.element;\n } else {\n let selectionInfo = this.getContentEditableSelectedPath(ctx);\n\n if (selectionInfo) {\n selected = selectionInfo.selected;\n path = selectionInfo.path;\n offset = selectionInfo.offset;\n }\n }\n\n let effectiveRange = this.getTextPrecedingCurrentSelection();\n let lastWordOfEffectiveRange = this.getLastWordInText(effectiveRange);\n\n if (isAutocomplete) {\n return {\n mentionPosition: effectiveRange.length - lastWordOfEffectiveRange.length,\n mentionText: lastWordOfEffectiveRange,\n mentionSelectedElement: selected,\n mentionSelectedPath: path,\n mentionSelectedOffset: offset\n }\n }\n\n if (effectiveRange !== undefined && effectiveRange !== null) {\n let mostRecentTriggerCharPos = -1;\n let triggerChar;\n\n this.tribute.collection.forEach(config => {\n let c = config.trigger;\n let idx = config.requireLeadingSpace ?\n this.lastIndexWithLeadingSpace(effectiveRange, c) :\n effectiveRange.lastIndexOf(c);\n\n if (idx > mostRecentTriggerCharPos) {\n mostRecentTriggerCharPos = idx;\n triggerChar = c;\n requireLeadingSpace = config.requireLeadingSpace;\n }\n });\n\n if (mostRecentTriggerCharPos >= 0 &&\n (\n mostRecentTriggerCharPos === 0 ||\n !requireLeadingSpace ||\n /[\\xA0\\s]/g.test(\n effectiveRange.substring(\n mostRecentTriggerCharPos - 1,\n mostRecentTriggerCharPos)\n )\n )\n ) {\n let currentTriggerSnippet = effectiveRange.substring(mostRecentTriggerCharPos + triggerChar.length,\n effectiveRange.length);\n\n triggerChar = effectiveRange.substring(mostRecentTriggerCharPos, mostRecentTriggerCharPos + triggerChar.length);\n let firstSnippetChar = currentTriggerSnippet.substring(0, 1);\n let leadingSpace = currentTriggerSnippet.length > 0 &&\n (\n firstSnippetChar === ' ' ||\n firstSnippetChar === '\\xA0'\n );\n if (hasTrailingSpace) {\n currentTriggerSnippet = currentTriggerSnippet.trim();\n }\n\n let regex = allowSpaces ? /[^\\S ]/g : /[\\xA0\\s]/g;\n\n this.tribute.hasTrailingSpace = regex.test(currentTriggerSnippet);\n\n if (!leadingSpace && (menuAlreadyActive || !(regex.test(currentTriggerSnippet)))) {\n return {\n mentionPosition: mostRecentTriggerCharPos,\n mentionText: currentTriggerSnippet,\n mentionSelectedElement: selected,\n mentionSelectedPath: path,\n mentionSelectedOffset: offset,\n mentionTriggerChar: triggerChar\n }\n }\n }\n }\n }\n\n lastIndexWithLeadingSpace (str, trigger) {\n let reversedStr = str.split('').reverse().join('');\n let index = -1;\n\n for (let cidx = 0, len = str.length; cidx < len; cidx++) {\n let firstChar = cidx === str.length - 1;\n let leadingSpace = /\\s/.test(reversedStr[cidx + 1]);\n\n let match = true;\n for (let triggerIdx = trigger.length - 1; triggerIdx >= 0; triggerIdx--) {\n if (trigger[triggerIdx] !== reversedStr[cidx-triggerIdx]) {\n match = false;\n break\n }\n }\n\n if (match && (firstChar || leadingSpace)) {\n index = str.length - 1 - cidx;\n break\n }\n }\n\n return index\n }\n\n isContentEditable(element) {\n return element.nodeName !== 'INPUT' && element.nodeName !== 'TEXTAREA'\n }\n\n isMenuOffScreen(coordinates, menuDimensions) {\n let windowWidth = window.innerWidth;\n let windowHeight = window.innerHeight;\n let doc = document.documentElement;\n let windowLeft = (window.pageXOffset || doc.scrollLeft) - (doc.clientLeft || 0);\n let windowTop = (window.pageYOffset || doc.scrollTop) - (doc.clientTop || 0);\n\n let menuTop = typeof coordinates.top === 'number' ? coordinates.top : windowTop + windowHeight - coordinates.bottom - menuDimensions.height;\n let menuRight = typeof coordinates.right === 'number' ? coordinates.right : coordinates.left + menuDimensions.width;\n let menuBottom = typeof coordinates.bottom === 'number' ? coordinates.bottom : coordinates.top + menuDimensions.height;\n let menuLeft = typeof coordinates.left === 'number' ? coordinates.left : windowLeft + windowWidth - coordinates.right - menuDimensions.width;\n\n return {\n top: menuTop < Math.floor(windowTop),\n right: menuRight > Math.ceil(windowLeft + windowWidth),\n bottom: menuBottom > Math.ceil(windowTop + windowHeight),\n left: menuLeft < Math.floor(windowLeft)\n }\n }\n\n getMenuDimensions() {\n // Width of the menu depends of its contents and position\n // We must check what its width would be without any obstruction\n // This way, we can achieve good positioning for flipping the menu\n let dimensions = {\n width: null,\n height: null\n };\n\n this.tribute.menu.style.cssText = `top: 0px;\n left: 0px;\n position: fixed;\n display: block;\n visibility; hidden;`;\n dimensions.width = this.tribute.menu.offsetWidth;\n dimensions.height = this.tribute.menu.offsetHeight;\n\n this.tribute.menu.style.cssText = `display: none;`;\n\n return dimensions\n }\n\n getTextAreaOrInputUnderlinePosition(element, position, flipped) {\n let properties = ['direction', 'boxSizing', 'width', 'height', 'overflowX',\n 'overflowY', 'borderTopWidth', 'borderRightWidth',\n 'borderBottomWidth', 'borderLeftWidth', 'paddingTop',\n 'paddingRight', 'paddingBottom', 'paddingLeft',\n 'fontStyle', 'fontVariant', 'fontWeight', 'fontStretch',\n 'fontSize', 'fontSizeAdjust', 'lineHeight', 'fontFamily',\n 'textAlign', 'textTransform', 'textIndent',\n 'textDecoration', 'letterSpacing', 'wordSpacing'\n ];\n\n let isFirefox = (window.mozInnerScreenX !== null);\n\n let div = this.getDocument().createElement('div');\n div.id = 'input-textarea-caret-position-mirror-div';\n this.getDocument().body.appendChild(div);\n\n let style = div.style;\n let computed = window.getComputedStyle ? getComputedStyle(element) : element.currentStyle;\n\n style.whiteSpace = 'pre-wrap';\n if (element.nodeName !== 'INPUT') {\n style.wordWrap = 'break-word';\n }\n\n // position off-screen\n style.position = 'absolute';\n style.visibility = 'hidden';\n\n // transfer the element's properties to the div\n properties.forEach(prop => {\n style[prop] = computed[prop];\n });\n\n if (isFirefox) {\n style.width = `${(parseInt(computed.width) - 2)}px`;\n if (element.scrollHeight > parseInt(computed.height))\n style.overflowY = 'scroll';\n } else {\n style.overflow = 'hidden';\n }\n\n div.textContent = element.value.substring(0, position);\n\n if (element.nodeName === 'INPUT') {\n div.textContent = div.textContent.replace(/\\s/g, ' ');\n }\n\n let span = this.getDocument().createElement('span');\n span.textContent = element.value.substring(position) || '.';\n div.appendChild(span);\n\n let rect = element.getBoundingClientRect();\n let doc = document.documentElement;\n let windowLeft = (window.pageXOffset || doc.scrollLeft) - (doc.clientLeft || 0);\n let windowTop = (window.pageYOffset || doc.scrollTop) - (doc.clientTop || 0);\n\n let top = 0;\n let left = 0;\n if (this.menuContainerIsBody) {\n top = rect.top;\n left = rect.left;\n }\n\n let coordinates = {\n top: top + windowTop + span.offsetTop + parseInt(computed.borderTopWidth) + parseInt(computed.fontSize) - element.scrollTop,\n left: left + windowLeft + span.offsetLeft + parseInt(computed.borderLeftWidth)\n };\n\n let windowWidth = window.innerWidth;\n let windowHeight = window.innerHeight;\n\n let menuDimensions = this.getMenuDimensions();\n let menuIsOffScreen = this.isMenuOffScreen(coordinates, menuDimensions);\n\n if (menuIsOffScreen.right) {\n coordinates.right = windowWidth - coordinates.left;\n coordinates.left = 'auto';\n }\n\n let parentHeight = this.tribute.menuContainer\n ? this.tribute.menuContainer.offsetHeight\n : this.getDocument().body.offsetHeight;\n\n if (menuIsOffScreen.bottom) {\n let parentRect = this.tribute.menuContainer\n ? this.tribute.menuContainer.getBoundingClientRect()\n : this.getDocument().body.getBoundingClientRect();\n let scrollStillAvailable = parentHeight - (windowHeight - parentRect.top);\n\n coordinates.bottom = scrollStillAvailable + (windowHeight - rect.top - span.offsetTop);\n coordinates.top = 'auto';\n }\n\n menuIsOffScreen = this.isMenuOffScreen(coordinates, menuDimensions);\n if (menuIsOffScreen.left) {\n coordinates.left = windowWidth > menuDimensions.width\n ? windowLeft + windowWidth - menuDimensions.width\n : windowLeft;\n delete coordinates.right;\n }\n if (menuIsOffScreen.top) {\n coordinates.top = windowHeight > menuDimensions.height\n ? windowTop + windowHeight - menuDimensions.height\n : windowTop;\n delete coordinates.bottom;\n }\n\n this.getDocument().body.removeChild(div);\n return coordinates\n }\n\n getContentEditableCaretPosition(selectedNodePosition) {\n let range;\n let sel = this.getWindowSelection();\n\n range = this.getDocument().createRange();\n range.setStart(sel.anchorNode, selectedNodePosition);\n range.setEnd(sel.anchorNode, selectedNodePosition);\n\n range.collapse(false);\n\n let rect = range.getBoundingClientRect();\n let doc = document.documentElement;\n let windowLeft = (window.pageXOffset || doc.scrollLeft) - (doc.clientLeft || 0);\n let windowTop = (window.pageYOffset || doc.scrollTop) - (doc.clientTop || 0);\n\n let left = rect.left;\n let top = rect.top;\n\n let coordinates = {\n left: left + windowLeft,\n top: top + rect.height + windowTop\n };\n let windowWidth = window.innerWidth;\n let windowHeight = window.innerHeight;\n\n let menuDimensions = this.getMenuDimensions();\n let menuIsOffScreen = this.isMenuOffScreen(coordinates, menuDimensions);\n\n if (menuIsOffScreen.right) {\n coordinates.left = 'auto';\n coordinates.right = windowWidth - rect.left - windowLeft;\n }\n\n let parentHeight = this.tribute.menuContainer\n ? this.tribute.menuContainer.offsetHeight\n : this.getDocument().body.offsetHeight;\n\n if (menuIsOffScreen.bottom) {\n let parentRect = this.tribute.menuContainer\n ? this.tribute.menuContainer.getBoundingClientRect()\n : this.getDocument().body.getBoundingClientRect();\n let scrollStillAvailable = parentHeight - (windowHeight - parentRect.top);\n\n coordinates.top = 'auto';\n coordinates.bottom = scrollStillAvailable + (windowHeight - rect.top);\n }\n\n menuIsOffScreen = this.isMenuOffScreen(coordinates, menuDimensions);\n if (menuIsOffScreen.left) {\n coordinates.left = windowWidth > menuDimensions.width\n ? windowLeft + windowWidth - menuDimensions.width\n : windowLeft;\n delete coordinates.right;\n }\n if (menuIsOffScreen.top) {\n coordinates.top = windowHeight > menuDimensions.height\n ? windowTop + windowHeight - menuDimensions.height\n : windowTop;\n delete coordinates.bottom;\n }\n\n if (!this.menuContainerIsBody) {\n coordinates.left = coordinates.left ? coordinates.left - this.tribute.menuContainer.offsetLeft : coordinates.left;\n coordinates.top = coordinates.top ? coordinates.top - this.tribute.menuContainer.offsetTop : coordinates.top;\n }\n\n return coordinates\n }\n\n scrollIntoView(elem) {\n let reasonableBuffer = 20,\n clientRect;\n let maxScrollDisplacement = 100;\n let e = this.menu;\n\n if (typeof e === 'undefined') return;\n\n while (clientRect === undefined || clientRect.height === 0) {\n clientRect = e.getBoundingClientRect();\n\n if (clientRect.height === 0) {\n e = e.childNodes[0];\n if (e === undefined || !e.getBoundingClientRect) {\n return\n }\n }\n }\n\n let elemTop = clientRect.top;\n let elemBottom = elemTop + clientRect.height;\n\n if (elemTop < 0) {\n window.scrollTo(0, window.pageYOffset + clientRect.top - reasonableBuffer);\n } else if (elemBottom > window.innerHeight) {\n let maxY = window.pageYOffset + clientRect.top - reasonableBuffer;\n\n if (maxY - window.pageYOffset > maxScrollDisplacement) {\n maxY = window.pageYOffset + maxScrollDisplacement;\n }\n\n let targetY = window.pageYOffset - (window.innerHeight - elemBottom);\n\n if (targetY > maxY) {\n targetY = maxY;\n }\n\n window.scrollTo(0, targetY);\n }\n }\n}\n\n// Thanks to https://github.com/mattyork/fuzzy\nclass TributeSearch {\n constructor(tribute) {\n this.tribute = tribute;\n this.tribute.search = this;\n }\n\n simpleFilter(pattern, array) {\n return array.filter(string => {\n return this.test(pattern, string)\n })\n }\n\n test(pattern, string) {\n return this.match(pattern, string) !== null\n }\n\n match(pattern, string, opts) {\n opts = opts || {};\n let len = string.length,\n pre = opts.pre || '',\n post = opts.post || '',\n compareString = opts.caseSensitive && string || string.toLowerCase();\n\n if (opts.skip) {\n return {rendered: string, score: 0}\n }\n\n pattern = opts.caseSensitive && pattern || pattern.toLowerCase();\n\n let patternCache = this.traverse(compareString, pattern, 0, 0, []);\n if (!patternCache) {\n return null\n }\n return {\n rendered: this.render(string, patternCache.cache, pre, post),\n score: patternCache.score\n }\n }\n\n traverse(string, pattern, stringIndex, patternIndex, patternCache) {\n // if the pattern search at end\n if (pattern.length === patternIndex) {\n\n // calculate score and copy the cache containing the indices where it's found\n return {\n score: this.calculateScore(patternCache),\n cache: patternCache.slice()\n }\n }\n\n // if string at end or remaining pattern > remaining string\n if (string.length === stringIndex || pattern.length - patternIndex > string.length - stringIndex) {\n return undefined\n }\n\n let c = pattern[patternIndex];\n let index = string.indexOf(c, stringIndex);\n let best, temp;\n\n while (index > -1) {\n patternCache.push(index);\n temp = this.traverse(string, pattern, index + 1, patternIndex + 1, patternCache);\n patternCache.pop();\n\n // if downstream traversal failed, return best answer so far\n if (!temp) {\n return best\n }\n\n if (!best || best.score < temp.score) {\n best = temp;\n }\n\n index = string.indexOf(c, index + 1);\n }\n\n return best\n }\n\n calculateScore(patternCache) {\n let score = 0;\n let temp = 1;\n\n patternCache.forEach((index, i) => {\n if (i > 0) {\n if (patternCache[i - 1] + 1 === index) {\n temp += temp + 1;\n }\n else {\n temp = 1;\n }\n }\n\n score += temp;\n });\n\n return score\n }\n\n render(string, indices, pre, post) {\n var rendered = string.substring(0, indices[0]);\n\n indices.forEach((index, i) => {\n rendered += pre + string[index] + post +\n string.substring(index + 1, (indices[i + 1]) ? indices[i + 1] : string.length);\n });\n\n return rendered\n }\n\n filter(pattern, arr, opts) {\n opts = opts || {};\n return arr\n .reduce((prev, element, idx, arr) => {\n let str = element;\n\n if (opts.extract) {\n str = opts.extract(element);\n\n if (!str) { // take care of undefineds / nulls / etc.\n str = '';\n }\n }\n\n let rendered = this.match(pattern, str, opts);\n\n if (rendered != null) {\n prev[prev.length] = {\n string: rendered.rendered,\n score: rendered.score,\n index: idx,\n original: element\n };\n }\n\n return prev\n }, [])\n\n .sort((a, b) => {\n let compare = b.score - a.score;\n if (compare) return compare\n return a.index - b.index\n })\n }\n}\n\nclass Tribute {\n constructor({\n values = null,\n iframe = null,\n selectClass = \"highlight\",\n containerClass = \"tribute-container\",\n itemClass = \"\",\n trigger = \"@\",\n autocompleteMode = false,\n selectTemplate = null,\n menuItemTemplate = null,\n lookup = \"key\",\n fillAttr = \"value\",\n collection = null,\n menuContainer = null,\n noMatchTemplate = null,\n requireLeadingSpace = true,\n allowSpaces = false,\n replaceTextSuffix = null,\n positionMenu = true,\n spaceSelectsMatch = false,\n searchOpts = {},\n menuItemLimit = null,\n menuShowMinLength = 0\n }) {\n this.autocompleteMode = autocompleteMode;\n this.menuSelected = 0;\n this.current = {};\n this.inputEvent = false;\n this.isActive = false;\n this.menuContainer = menuContainer;\n this.allowSpaces = allowSpaces;\n this.replaceTextSuffix = replaceTextSuffix;\n this.positionMenu = positionMenu;\n this.hasTrailingSpace = false;\n this.spaceSelectsMatch = spaceSelectsMatch;\n\n if (this.autocompleteMode) {\n trigger = \"\";\n allowSpaces = false;\n }\n\n if (values) {\n this.collection = [\n {\n // symbol that starts the lookup\n trigger: trigger,\n\n // is it wrapped in an iframe\n iframe: iframe,\n\n // class applied to selected item\n selectClass: selectClass,\n\n // class applied to the Container\n containerClass: containerClass,\n\n // class applied to each item\n itemClass: itemClass,\n\n // function called on select that retuns the content to insert\n selectTemplate: (\n selectTemplate || Tribute.defaultSelectTemplate\n ).bind(this),\n\n // function called that returns content for an item\n menuItemTemplate: (\n menuItemTemplate || Tribute.defaultMenuItemTemplate\n ).bind(this),\n\n // function called when menu is empty, disables hiding of menu.\n noMatchTemplate: (t => {\n if (typeof t === \"string\") {\n if (t.trim() === \"\") return null;\n return t;\n }\n if (typeof t === \"function\") {\n return t.bind(this);\n }\n\n return (\n noMatchTemplate ||\n function() {\n return \"<li>No Match Found!</li>\";\n }.bind(this)\n );\n })(noMatchTemplate),\n\n // column to search against in the object\n lookup: lookup,\n\n // column that contains the content to insert by default\n fillAttr: fillAttr,\n\n // array of objects or a function returning an array of objects\n values: values,\n\n requireLeadingSpace: requireLeadingSpace,\n\n searchOpts: searchOpts,\n\n menuItemLimit: menuItemLimit,\n\n menuShowMinLength: menuShowMinLength\n }\n ];\n } else if (collection) {\n if (this.autocompleteMode)\n console.warn(\n \"Tribute in autocomplete mode does not work for collections\"\n );\n this.collection = collection.map(item => {\n return {\n trigger: item.trigger || trigger,\n iframe: item.iframe || iframe,\n selectClass: item.selectClass || selectClass,\n containerClass: item.containerClass || containerClass,\n itemClass: item.itemClass || itemClass,\n selectTemplate: (\n item.selectTemplate || Tribute.defaultSelectTemplate\n ).bind(this),\n menuItemTemplate: (\n item.menuItemTemplate || Tribute.defaultMenuItemTemplate\n ).bind(this),\n // function called when menu is empty, disables hiding of menu.\n noMatchTemplate: (t => {\n if (typeof t === \"string\") {\n if (t.trim() === \"\") return null;\n return t;\n }\n if (typeof t === \"function\") {\n return t.bind(this);\n }\n\n return (\n noMatchTemplate ||\n function() {\n return \"<li>No Match Found!</li>\";\n }.bind(this)\n );\n })(noMatchTemplate),\n lookup: item.lookup || lookup,\n fillAttr: item.fillAttr || fillAttr,\n values: item.values,\n requireLeadingSpace: item.requireLeadingSpace,\n searchOpts: item.searchOpts || searchOpts,\n menuItemLimit: item.menuItemLimit || menuItemLimit,\n menuShowMinLength: item.menuShowMinLength || menuShowMinLength\n };\n });\n } else {\n throw new Error(\"[Tribute] No collection specified.\");\n }\n\n new TributeRange(this);\n new TributeEvents(this);\n new TributeMenuEvents(this);\n new TributeSearch(this);\n }\n\n get isActive() {\n return this._isActive;\n }\n\n set isActive(val) {\n if (this._isActive != val) {\n this._isActive = val;\n if (this.current.element) {\n let noMatchEvent = new CustomEvent(`tribute-active-${val}`);\n this.current.element.dispatchEvent(noMatchEvent);\n }\n }\n }\n\n static defaultSelectTemplate(item) {\n if (typeof item === \"undefined\")\n return `${this.current.collection.trigger}${this.current.mentionText}`;\n if (this.range.isContentEditable(this.current.element)) {\n return (\n '<span class=\"tribute-mention\">' +\n (this.current.collection.trigger +\n item.original[this.current.collection.fillAttr]) +\n \"</span>\"\n );\n }\n\n return (\n this.current.collection.trigger +\n item.original[this.current.collection.fillAttr]\n );\n }\n\n static defaultMenuItemTemplate(matchItem) {\n return matchItem.string;\n }\n\n static inputTypes() {\n return [\"TEXTAREA\", \"INPUT\"];\n }\n\n triggers() {\n return this.collection.map(config => {\n return config.trigger;\n });\n }\n\n attach(el) {\n if (!el) {\n throw new Error(\"[Tribute] Must pass in a DOM node or NodeList.\");\n }\n\n // Check if it is a jQuery collection\n if (typeof jQuery !== \"undefined\" && el instanceof jQuery) {\n el = el.get();\n }\n\n // Is el an Array/Array-like object?\n if (\n el.constructor === NodeList ||\n el.constructor === HTMLCollection ||\n el.constructor === Array\n ) {\n let length = el.length;\n for (var i = 0; i < length; ++i) {\n this._attach(el[i]);\n }\n } else {\n this._attach(el);\n }\n }\n\n _attach(el) {\n if (el.hasAttribute(\"data-tribute\")) {\n console.warn(\"Tribute was already bound to \" + el.nodeName);\n }\n\n this.ensureEditable(el);\n this.events.bind(el);\n el.setAttribute(\"data-tribute\", true);\n }\n\n ensureEditable(element) {\n if (Tribute.inputTypes().indexOf(element.nodeName) === -1) {\n if (element.contentEditable) {\n element.contentEditable = true;\n } else {\n throw new Error(\"[Tribute] Cannot bind to \" + element.nodeName);\n }\n }\n }\n\n createMenu(containerClass) {\n let wrapper = this.range.getDocument().createElement(\"div\"),\n ul = this.range.getDocument().createElement(\"ul\");\n wrapper.className = containerClass;\n wrapper.appendChild(ul);\n\n if (this.menuContainer) {\n return this.menuContainer.appendChild(wrapper);\n }\n\n return this.range.getDocument().body.appendChild(wrapper);\n }\n\n showMenuFor(element, scrollTo) {\n // Only proceed if menu isn't already shown for the current element & mentionText\n if (\n this.isActive &&\n this.current.element === element &&\n this.current.mentionText === this.currentMentionTextSnapshot\n ) {\n return;\n }\n this.currentMentionTextSnapshot = this.current.mentionText;\n\n // create the menu if it doesn't exist.\n if (!this.menu) {\n this.menu = this.createMenu(this.current.collection.containerClass);\n element.tributeMenu = this.menu;\n this.menuEvents.bind(this.menu);\n }\n\n this.isActive = true;\n this.menuSelected = 0;\n\n if (!this.current.mentionText) {\n this.current.mentionText = \"\";\n }\n\n const processValues = values => {\n // Tribute may not be active any more by the time the value callback returns\n if (!this.isActive) {\n return;\n }\n\n let items = this.search.filter(this.current.mentionText, values, {\n pre: this.current.collection.searchOpts.pre || \"<span>\",\n post: this.current.collection.searchOpts.post || \"</span>\",\n skip: this.current.collection.searchOpts.skip,\n extract: el => {\n if (typeof this.current.collection.lookup === \"string\") {\n return el[this.current.collection.lookup];\n } else if (typeof this.current.collection.lookup === \"function\") {\n return this.current.collection.lookup(el, this.current.mentionText);\n } else {\n throw new Error(\n \"Invalid lookup attribute, lookup must be string or function.\"\n );\n }\n }\n });\n\n if (this.current.collection.menuItemLimit) {\n items = items.slice(0, this.current.collection.menuItemLimit);\n }\n\n this.current.filteredItems = items;\n\n let ul = this.menu.querySelector(\"ul\");\n\n this.range.positionMenuAtCaret(scrollTo);\n\n if (!items.length) {\n let noMatchEvent = new CustomEvent(\"tribute-no-match\", {\n detail: this.menu\n });\n this.current.element.dispatchEvent(noMatchEvent);\n if (\n (typeof this.current.collection.noMatchTemplate === \"function\" &&\n !this.current.collection.noMatchTemplate()) ||\n !this.current.collection.noMatchTemplate\n ) {\n this.hideMenu();\n } else {\n typeof this.current.collection.noMatchTemplate === \"function\"\n ? (ul.innerHTML = this.current.collection.noMatchTemplate())\n : (ul.innerHTML = this.current.collection.noMatchTemplate);\n }\n\n return;\n }\n\n ul.innerHTML = \"\";\n let fragment = this.range.getDocument().createDocumentFragment();\n\n items.forEach((item, index) => {\n let li = this.range.getDocument().createElement(\"li\");\n li.setAttribute(\"data-index\", index);\n li.className = this.current.collection.itemClass;\n li.addEventListener(\"mousemove\", e => {\n let [li, index] = this._findLiTarget(e.target);\n if (e.movementY !== 0) {\n this.events.setActiveLi(index);\n }\n });\n if (this.menuSelected === index) {\n li.classList.add(this.current.collection.selectClass);\n }\n li.innerHTML = this.current.collection.menuItemTemplate(item);\n fragment.appendChild(li);\n });\n ul.appendChild(fragment);\n };\n\n if (typeof this.current.collection.values === \"function\") {\n this.current.collection.values(this.current.mentionText, processValues);\n } else {\n processValues(this.current.collection.values);\n }\n }\n\n _findLiTarget(el) {\n if (!el) return [];\n const index = el.getAttribute(\"data-index\");\n return !index ? this._findLiTarget(el.parentNode) : [el, index];\n }\n\n showMenuForCollection(element, collectionIndex) {\n if (element !== document.activeElement) {\n this.placeCaretAtEnd(element);\n }\n\n this.current.collection = this.collection[collectionIndex || 0];\n this.current.externalTrigger = true;\n this.current.element = element;\n\n if (element.isContentEditable)\n this.insertTextAtCursor(this.current.collection.trigger);\n else this.insertAtCaret(element, this.current.collection.trigger);\n\n this.showMenuFor(element);\n }\n\n // TODO: make sure this works for inputs/textareas\n placeCaretAtEnd(el) {\n el.focus();\n if (\n typeof window.getSelection != \"undefined\" &&\n typeof document.createRange != \"undefined\"\n ) {\n var range = document.createRange();\n range.selectNodeContents(el);\n range.collapse(false);\n var sel = window.getSelection();\n sel.removeAllRanges();\n sel.addRange(range);\n } else if (typeof document.body.createTextRange != \"undefined\") {\n var textRange = document.body.createTextRange();\n textRange.moveToElementText(el);\n textRange.collapse(false);\n textRange.select();\n }\n }\n\n // for contenteditable\n insertTextAtCursor(text) {\n var sel, range;\n sel = window.getSelection();\n range = sel.getRangeAt(0);\n range.deleteContents();\n var textNode = document.createTextNode(text);\n range.insertNode(textNode);\n range.selectNodeContents(textNode);\n range.collapse(false);\n sel.removeAllRanges();\n sel.addRange(range);\n }\n\n // for regular inputs\n insertAtCaret(textarea, text) {\n var scrollPos = textarea.scrollTop;\n var caretPos = textarea.selectionStart;\n\n var front = textarea.value.substring(0, caretPos);\n var back = textarea.value.substring(\n textarea.selectionEnd,\n textarea.value.length\n );\n textarea.value = front + text + back;\n caretPos = caretPos + text.length;\n textarea.selectionStart = caretPos;\n textarea.selectionEnd = caretPos;\n textarea.focus();\n textarea.scrollTop = scrollPos;\n }\n\n hideMenu() {\n if (this.menu) {\n this.menu.style.cssText = \"display: none;\";\n this.isActive = false;\n this.menuSelected = 0;\n this.current = {};\n }\n }\n\n selectItemAtIndex(index, originalEvent) {\n index = parseInt(index);\n if (typeof index !== \"number\" || isNaN(index)) return;\n let item = this.current.filteredItems[index];\n let content = this.current.collection.selectTemplate(item);\n if (content !== null) this.replaceText(content, originalEvent, item);\n }\n\n replaceText(content, originalEvent, item) {\n this.range.replaceTriggerText(content, true, true, originalEvent, item);\n }\n\n _append(collection, newValues, replace) {\n if (typeof collection.values === \"function\") {\n throw new Error(\"Unable to append to values, as it is a function.\");\n } else if (!replace) {\n collection.values = collection.values.concat(newValues);\n } else {\n collection.values = newValues;\n }\n }\n\n append(collectionIndex, newValues, replace) {\n let index = parseInt(collectionIndex);\n if (typeof index !== \"number\")\n throw new Error(\"please provide an index for the collection to update.\");\n\n let collection = this.collection[index];\n\n this._append(collection, newValues, replace);\n }\n\n appendCurrent(newValues, replace) {\n if (this.isActive) {\n this._append(this.current.collection, newValues, replace);\n } else {\n throw new Error(\n \"No active state. Please use append instead and pass an index.\"\n );\n }\n }\n\n detach(el) {\n if (!el) {\n throw new Error(\"[Tribute] Must pass in a DOM node or NodeList.\");\n }\n\n // Check if it is a jQuery collection\n if (typeof jQuery !== \"undefined\" && el instanceof jQuery) {\n el = el.get();\n }\n\n // Is el an Array/Array-like object?\n if (\n el.constructor === NodeList ||\n el.constructor === HTMLCollection ||\n el.constructor === Array\n ) {\n let length = el.length;\n for (var i = 0; i < length; ++i) {\n this._detach(el[i]);\n }\n } else {\n this._detach(el);\n }\n }\n\n _detach(el) {\n this.events.unbind(el);\n if (el.tributeMenu) {\n this.menuEvents.unbind(el.tributeMenu);\n }\n\n setTimeout(() => {\n el.removeAttribute(\"data-tribute\");\n this.isActive = false;\n if (el.tributeMenu) {\n el.tributeMenu.remove();\n }\n });\n }\n}\n\n/**\n * Tribute.js\n * Native ES6 JavaScript @mention Plugin\n **/\n\nexport default Tribute;\n","import '../assets/NcRichContenteditable-BCUBhRqg.css';\nimport debounce from \"debounce\";\nimport Tribute from \"tributejs/dist/tribute.esm.js\";\nimport { useIsDarkTheme } from \"../composables/useIsDarkTheme/index.mjs\";\nimport { g as getAvatarUrl } from \"./NcMentionBubble.vue_vue_type_style_index_0_scoped_3c4a673d_lang-DyqakLm5.mjs\";\nimport { N as NcUserStatusIcon } from \"./NcUserStatusIcon-BF5OEQFU.mjs\";\nimport { openBlock, createElementBlock, normalizeClass, createElementVNode, normalizeStyle, toDisplayString, createApp, resolveComponent, createBlock, createCommentVNode, mergeProps, withModifiers, withKeys } from \"vue\";\nimport { _ as _export_sfc } from \"./_plugin-vue_export-helper-1tPrXgE0.mjs\";\nimport { a as emojiSearch, e as emojiAddRecent } from \"./emoji-C8k9NUlo.mjs\";\nimport { r as register, s as t37, J as t34, a as t, K as n } from \"./_l10n-wdIzZwir.mjs\";\nimport escapeHTML from \"escape-html\";\nimport stripTags from \"striptags\";\nimport { c as createElementId } from \"./createElementId-DhjFt1I9.mjs\";\nimport { l as logger } from \"./logger-D3RVzcfQ.mjs\";\nimport \"@nextcloud/auth\";\nimport \"@nextcloud/axios\";\nimport \"@nextcloud/router\";\nimport \"@nextcloud/sharing/public\";\nimport \"@vueuse/core\";\nimport \"vue-router\";\nimport \"./legacy-BoqDmOCa.mjs\";\nimport \"./NcButton-jvoYS2my.mjs\";\nimport { g as getLinkWithPicker, s as searchProvider } from \"./referencePickerModal-CnKdEDwu.mjs\";\nimport \"./customPickerElements-BqbDcaEu.mjs\";\nimport \"unist-builder\";\nimport \"unist-util-visit-parents\";\nimport \"./NcRichText-BO_4KtBA.mjs\";\nimport \"./NcEmptyContent-CGAPqk4S.mjs\";\nimport \"./NcHighlight.vue_vue_type_script_lang-DnWQDM_2.mjs\";\nimport \"./NcSelect--kERLlBK.mjs\";\nimport \"./NcLoadingIcon-BOVpFVQz.mjs\";\nimport \"./NcTextField.vue_vue_type_script_setup_true_lang-Bx2esFU2.mjs\";\nimport \"dompurify\";\nimport \"./NcIconSvgWrapper-g8ubWhoz.mjs\";\nimport \"./NcInputField-5Sg6EUP6.mjs\";\nimport \"@nextcloud/event-bus\";\nimport \"focus-trap\";\nimport \"./NcActions-C-wDqSrv.mjs\";\nimport \"../composables/useFormatDateTime/index.mjs\";\nimport \"../composables/useHotKey/index.mjs\";\nimport \"../composables/useIsFullscreen/index.mjs\";\nimport \"../composables/useIsMobile/index.mjs\";\nimport \"./NcModal-DiDvgcU8.mjs\";\nimport \"./rtl-v0UOPAM7.mjs\";\nconst _sfc_main$2 = {\n name: \"NcMentionBubble\",\n /* eslint vue/require-prop-comment: warn -- TODO: Add a proper doc block about what this props do */\n props: {\n /**\n * Id of the bubble\n */\n id: {\n type: String,\n required: true\n },\n /**\n * The main text\n */\n label: {\n type: String,\n required: false,\n default: null\n },\n /**\n * Icon to be applied\n */\n icon: {\n type: String,\n required: true\n },\n /**\n * URL of the icon\n */\n iconUrl: {\n type: [String, null],\n default: null\n },\n /**\n * The source of the bubble, e.g. \"users\" or \"groups\"\n */\n source: {\n type: String,\n required: true\n },\n /**\n * Is the bubble shown as primary\n */\n primary: {\n type: Boolean,\n default: false\n }\n },\n setup() {\n const isDarkTheme = useIsDarkTheme();\n return {\n isDarkTheme\n };\n },\n computed: {\n avatarUrl() {\n if (this.iconUrl) {\n return this.iconUrl;\n }\n return this.id && this.source === \"users\" ? getAvatarUrl(this.id, { isDarkTheme: this.isDarkTheme }) : null;\n },\n mentionText() {\n return !this.id.includes(\" \") && !this.id.includes(\"/\") ? `@${this.id}` : `@\"${this.id}\"`;\n }\n }\n};\nconst _hoisted_1$2 = { class: \"mention-bubble__wrapper\" };\nconst _hoisted_2$2 = { class: \"mention-bubble__content\" };\nconst _hoisted_3$1 = [\"title\"];\nconst _hoisted_4$1 = {\n role: \"none\",\n class: \"mention-bubble__select\"\n};\nfunction _sfc_render$2(_ctx, _cache, $props, $setup, $data, $options) {\n return openBlock(), createElementBlock(\"span\", {\n class: normalizeClass([\"mention-bubble\", { \"mention-bubble--primary\": $props.primary }]),\n contenteditable: \"false\"\n }, [\n createElementVNode(\"span\", _hoisted_1$2, [\n createElementVNode(\"span\", _hoisted_2$2, [\n createElementVNode(\"span\", {\n class: normalizeClass([[$props.icon, `mention-bubble__icon--${$options.avatarUrl ? \"with-avatar\" : \"\"}`], \"mention-bubble__icon\"]),\n style: normalizeStyle($options.avatarUrl ? { backgroundImage: `url(${$options.avatarUrl})` } : null)\n }, null, 6),\n createElementVNode(\"span\", {\n role: \"heading\",\n class: \"mention-bubble__title\",\n title: $props.label\n }, null, 8, _hoisted_3$1)\n ]),\n createElementVNode(\"span\", _hoisted_4$1, toDisplayString($options.mentionText), 1)\n ])\n ], 2);\n}\nconst NcMentionBubble = /* @__PURE__ */ _export_sfc(_sfc_main$2, [[\"render\", _sfc_render$2], [\"__scopeId\", \"data-v-3c4a673d\"]]);\nconst MENTION_START = /(?=[a-z0-9_\\-@.'])\\B/.source;\nconst MENTION_SIMPLE = /(@[a-z0-9_\\-@.']+)/.source;\nconst MENTION_GUEST = /@"(?:guest|email){1}\\/[a-f0-9]+"/.source;\nconst MENTION_PREFIXED = /@"(?:federated_)?(?:group|team|user){1}\\/[a-z0-9_\\-@.' /:]+"/.source;\nconst MENTION_WITH_SPACE = /@"[a-z0-9_\\-@.' ]+"/.source;\nconst MENTION_COMPLEX = `(${MENTION_GUEST}|${MENTION_PREFIXED}|${MENTION_WITH_SPACE})`;\nconst USERID_REGEX = new RegExp(`${MENTION_START}${MENTION_SIMPLE}`, \"gi\");\nconst USERID_REGEX_WITH_SPACE = new RegExp(`${MENTION_START}${MENTION_COMPLEX}`, \"gi\");\nconst richEditor = {\n props: {\n userData: {\n type: Object,\n default: () => ({})\n }\n },\n methods: {\n /**\n * Convert the value string to html for the inner content\n *\n * @param {string} value the content without html\n * @return {string} rendered html\n */\n renderContent(value) {\n const sanitizedValue = escapeHTML(value);\n const splitValue = sanitizedValue.split(USERID_REGEX).map((part) => part.split(USERID_REGEX_WITH_SPACE)).flat();\n return splitValue.map((part) => {\n if (!part.startsWith(\"@\")) {\n return part;\n }\n const id = part.slice(1).replace(/"/gi, \"\");\n return this.genSelectTemplate(id);\n }).join(\"\").replace(/\\n/gmi, \"<br>\").replace(/&/gmi, \"&\");\n },\n /**\n * Convert the innerHtml content to a string with mentions as text\n *\n * @param {string} content the content without html\n * @return {string}\n */\n parseContent(content) {\n let text = content;\n text = text.replace(/<br>/gmi, \"\\n\");\n text = text.replace(/ /gmi, \" \");\n text = text.replace(/&/gmi, \"&\");\n text = text.replace(/<\\/div>/gmi, \"\\n\");\n text = stripTags(text, \"<div>\");\n text = stripTags(text);\n return text;\n },\n /**\n * Generate an autocompletion popup entry template\n *\n * @param {string} value the value to match against the userData\n * @return {string}\n */\n genSelectTemplate(value) {\n if (typeof value === \"undefined\") {\n return `${this.autocompleteTribute.current.collection.trigger}${this.autocompleteTribute.current.mentionText}`;\n }\n const data = this.userData[value];\n if (!data) {\n return [\" \", \"/\", \":\"].every((char) => !value.includes(char)) ? `@${value}` : `@\"${value}\"`;\n }\n return this.renderComponentHtml(data, NcMentionBubble).replace(/[\\n\\t]/gmi, \"\").replace(/>\\s+</g, \"><\");\n },\n /**\n * Render a component and return its html content\n *\n * @param {object} props the props to pass to the component\n * @param {object} component the component to render\n * @return {string} the rendered html\n */\n renderComponentHtml(props, component) {\n const Item = createApp(component, {\n ...props\n });\n const mount = document.createElement(\"div\");\n mount.style.display = \"none\";\n document.body.appendChild(mount);\n Item.mount(mount);\n const renderedHtml = mount.innerHTML;\n Item.unmount();\n mount.remove();\n return renderedHtml;\n }\n }\n};\nconst _sfc_main$1 = {\n name: \"NcAutoCompleteResult\",\n components: {\n NcUserStatusIcon\n },\n /* eslint vue/require-prop-comment: warn -- TODO: Add a proper doc block about what this props do */\n props: {\n /**\n * The label text\n */\n label: {\n type: String,\n required: false,\n default: null\n },\n /**\n * The secondary line of text if any\n */\n subline: {\n type: String,\n default: null\n },\n /**\n * Unique id\n */\n id: {\n type: String,\n default: null\n },\n /**\n * The icon class\n */\n icon: {\n type: String,\n required: true\n },\n /**\n * Icon as external URL\n */\n iconUrl: {\n type: String,\n default: null\n },\n /**\n * The source of the bubble, e.g. \"users\" or \"groups\"\n */\n source: {\n type: String,\n required: true\n },\n /**\n * The user status of the result\n */\n status: {\n type: [Object, Array],\n default: () => ({})\n }\n },\n setup() {\n const isDarkTheme = useIsDarkTheme();\n return {\n isDarkTheme\n };\n },\n computed: {\n avatarUrl() {\n if (this.iconUrl) {\n return this.iconUrl;\n }\n return this.id && this.source === \"users\" ? getAvatarUrl(this.id, { isDarkTheme: this.isDarkTheme }) : null;\n }\n }\n};\nconst _hoisted_1$1 = { class: \"autocomplete-result\" };\nconst _hoisted_2$1 = {\n key: 0,\n class: \"autocomplete-result__status autocomplete-result__status--icon\"\n};\nconst _hoisted_3 = { class: \"autocomplete-result__content\" };\nconst _hoisted_4 = [\"title\"];\nconst _hoisted_5 = {\n key: 0,\n class: \"autocomplete-result__subline\"\n};\nfunction _sfc_render$1(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_NcUserStatusIcon = resolveComponent(\"NcUserStatusIcon\");\n return openBlock(), createElementBlock(\"div\", _hoisted_1$1, [\n createElementVNode(\"div\", {\n class: normalizeClass([[$props.icon, `autocomplete-result__icon--${$options.avatarUrl ? \"with-avatar\" : \"\"}`], \"autocomplete-result__icon\"]),\n style: normalizeStyle($options.avatarUrl ? { backgroundImage: `url(${$options.avatarUrl})` } : null)\n }, [\n $props.status.icon ? (openBlock(), createElementBlock(\"span\", _hoisted_2$1, toDisplayString($props.status && $props.status.icon || \"\"), 1)) : $props.status.status && $props.status.status !== \"offline\" ? (openBlock(), createBlock(_component_NcUserStatusIcon, {\n key: 1,\n class: \"autocomplete-result__status\",\n status: $props.status.status\n }, null, 8, [\"status\"])) : createCommentVNode(\"\", true)\n ], 6),\n createElementVNode(\"span\", _hoisted_3, [\n createElementVNode(\"span\", {\n class: \"autocomplete-result__title\",\n title: $props.label\n }, toDisplayString($props.label), 9, _hoisted_4),\n $props.subline ? (openBlock(), createElementBlock(\"span\", _hoisted_5, toDisplayString($props.subline), 1)) : createCommentVNode(\"\", true)\n ])\n ]);\n}\nconst NcAutoCompleteResult = /* @__PURE__ */ _export_sfc(_sfc_main$1, [[\"render\", _sfc_render$1], [\"__scopeId\", \"data-v-ed88a5f1\"]]);\nregister(t34, t37);\nconst style1 = {\n \"material-design-icon\": \"_material-design-icon_g5CUm\",\n \"tribute-container\": \"_tribute-container_vZo-i\",\n \"tribute-container__item\": \"_tribute-container__item_jsFSw\",\n \"tribute-container--focus-visible\": \"_tribute-container--focus-visible_2kxiD\",\n \"tribute-container-autocomplete\": \"_tribute-container-autocomplete_j-g-I\",\n \"tribute-container-emoji\": \"_tribute-container-emoji_x7KXk\",\n \"tribute-container-link\": \"_tribute-container-link_FguVk\",\n \"tribute-item\": \"_tribute-item_iNlZn\",\n \"tribute-item__title\": \"_tribute-item__title_UpDWk\",\n \"tribute-item__icon\": \"_tribute-item__icon_BwNUI\"\n};\nconst smilesCharacters = [\"d\", \"D\", \"p\", \"P\", \"s\", \"S\", \"x\", \"X\", \")\", \"(\", \"|\", \"/\"];\nconst textSmiles = [];\nsmilesCharacters.forEach((char) => {\n textSmiles.push(\":\" + char);\n textSmiles.push(\":-\" + char);\n});\nlet isPlaintextOnlySupported = null;\nconst _sfc_main = {\n name: \"NcRichContenteditable\",\n mixins: [richEditor],\n inheritAttrs: false,\n props: {\n /**\n * The ID attribute of the content editable\n */\n id: {\n type: String,\n default: () => createElementId()\n },\n /**\n * Visual label of the contenteditable\n */\n label: {\n type: String,\n default: \"\"\n },\n /**\n * The text content\n */\n modelValue: {\n type: String,\n required: true\n },\n /**\n * Placeholder to be shown if empty\n */\n placeholder: {\n type: String,\n default: t(\"Write a message …\")\n },\n /**\n * Auto complete function\n */\n autoComplete: {\n type: Function,\n default: () => []\n },\n /**\n * The containing element or selector for the tribute (menu popover)\n * Defaults to `body` element\n */\n menuContainer: {\n type: [String, Element, null],\n default: null\n },\n /**\n * Make the contenteditable looks like a textarea or not.\n * Default looks like a single-line input.\n * This also handle the default enter/shift+enter behaviour.\n * if multiline, enter = newline; otherwise enter = submit\n * shift+enter always add a new line. ctrl+enter always submits\n */\n multiline: {\n type: Boolean,\n default: false\n },\n /**\n * Is the content editable ?\n */\n contenteditable: {\n type: Boolean,\n default: true\n },\n /**\n * Disable the editing and show specific disabled design\n */\n disabled: {\n type: Boolean,\n default: false\n },\n /**\n * Max allowed length\n */\n maxlength: {\n type: Number,\n default: null\n },\n /**\n * Enable or disable emoji autocompletion\n */\n emojiAutocomplete: {\n type: Boolean,\n default: true\n },\n /**\n * Enable or disable link autocompletion\n */\n linkAutocomplete: {\n type: Boolean,\n default: true\n },\n /**\n * CSS class to apply to the root element.\n */\n class: {\n type: [String, Array, Object],\n default: \"\"\n }\n },\n emits: [\n \"paste\",\n \"update:modelValue\",\n \"smartPickerSubmit\",\n \"submit\"\n ],\n setup() {\n const segmenter = new Intl.Segmenter();\n if (isPlaintextOnlySupported === null) {\n try {\n document.createElement(\"div\").contentEditable = \"plaintext-only\";\n isPlaintextOnlySupported = true;\n } catch (error) {\n logger.debug(\"[NcRichContenteditable] Unsupported attribute value:\", { error });\n isPlaintextOnlySupported = false;\n }\n }\n return {\n // Constants\n labelId: createElementId(),\n tributeId: createElementId(),\n segmenter,\n /**\n * Non-reactive property to store Tribute instance\n *\n * @type {import('tributejs').default | null}\n */\n tribute: null,\n tributeStyleMutationObserver: null\n };\n },\n data() {\n return {\n // Represent the raw untrimmed text of the contenteditable\n // serves no other purpose than to check whether the\n // content is empty or not\n localValue: this.modelValue,\n // Is in text composition session in IME\n isComposing: false,\n // Tribute autocomplete\n isAutocompleteOpen: false,\n autocompleteActiveId: void 0,\n isTributeIntegrationDone: false\n };\n },\n computed: {\n /**\n * Is the current trimmed value empty?\n *\n * @return {boolean}\n */\n isEmptyValue() {\n return !this.localValue || this.localValue.trim() === \"\";\n },\n /**\n * Is the current value over maxlength?\n *\n * @return {boolean}\n */\n isOverMaxlength() {\n if (this.isEmptyValue || !this.maxlength) {\n return false;\n }\n const length = [...this.segmenter.segment(this.localValue)].length;\n return length > this.maxlength;\n },\n /**\n * Tooltip to show if characters count is over limit\n *\n * @return {string}\n */\n tooltipString() {\n if (!this.isOverMaxlength) {\n return null;\n }\n return n(\"Message limit of %n character reached\", \"Message limit of %n characters reached\", this.maxlength);\n },\n /**\n * Edit is only allowed when contenteditable is:\n * 'true' (all browsers since 2015)\n * 'plaintext-only' (most browsers since 2015, Firefox since 136+)\n *\n * @return {string}\n */\n contenteditableAttributeValue() {\n if (this.contenteditable && !this.disabled) {\n return isPlaintextOnlySupported ? \"plaintext-only\" : \"true\";\n }\n return \"false\";\n },\n /**\n * Compute debounce function for the autocomplete function\n */\n debouncedAutoComplete() {\n return debounce(async (search, callback) => {\n this.autoComplete(search, callback);\n }, 100);\n }\n },\n watch: {\n /**\n * If the parent value change, we compare the plain text rendering\n * If it's different, we render everything and update the main content\n */\n modelValue() {\n const html = this.$refs.contenteditable.innerHTML;\n if (this.modelValue.trim() !== this.parseContent(html).trim()) {\n this.updateContent(this.modelValue);\n }\n }\n },\n mounted() {\n this.initializeTribute();\n this.updateContent(this.modelValue);\n },\n beforeUnmount() {\n if (this.tribute) {\n this.tribute.detach(this.$refs.contenteditable);\n }\n if (this.tributeStyleMutationObserver) {\n this.tributeStyleMutationObserver.disconnect();\n }\n },\n methods: {\n /**\n * Focus the richContenteditable\n *\n * @public\n */\n focus() {\n this.$refs.contenteditable.focus();\n },\n initializeTribute() {\n const renderMenuItem = (content) => `<div id=\"${createElementId()}\" class=\"${this.$style[\"tribute-item\"]}\" role=\"option\">${content}</div>`;\n const tributesCollection = [];\n tributesCollection.push({\n fillAttr: \"id\",\n // Search against id and label (display name) (fallback to title for v8.0.0..8.6.1 compatibility)\n lookup: (result) => `${result.id} ${result.label ?? result.title}`,\n requireLeadingSpace: true,\n // Popup mention autocompletion templates\n menuItemTemplate: (item) => renderMenuItem(this.renderComponentHtml(item.original, NcAutoCompleteResult)),\n // Hide if no results\n noMatchTemplate: () => '<span class=\"hidden\"></span>',\n // Inner display of mentions\n selectTemplate: (item) => this.genSelectTemplate(item?.original?.id),\n // Autocompletion results\n values: this.debouncedAutoComplete,\n // Class added to the menu container\n containerClass: `${this.$style[\"tribute-container\"]} ${this.$style[\"tribute-container-autocomplete\"]}`,\n // Class added to each list item\n itemClass: this.$style[\"tribute-container__item\"]\n });\n if (this.emojiAutocomplete) {\n tributesCollection.push({\n trigger: \":\",\n // Don't use the tribute search function at all\n // We pass search results as values (see below)\n lookup: (result, query) => query,\n requireLeadingSpace: true,\n // Popup mention autocompletion templates\n menuItemTemplate: (item) => {\n if (textSmiles.includes(item.original)) {\n return item.original;\n }\n return renderMenuItem(`<span class=\"${this.$style[\"tribute-item__emoji\"]}\">${item.original.native}</span> :${item.original.short_name}`);\n },\n // Hide if no results\n noMatchTemplate: () => t(\"No emoji found\"),\n // Display raw emoji along with its name\n selectTemplate: (item) => {\n if (textSmiles.includes(item.original)) {\n return item.original;\n }\n emojiAddRecent(item.original);\n return item.original.native;\n },\n // Pass the search results as values\n values: (text, cb) => {\n const emojiResults = emojiSearch(text);\n if (textSmiles.includes(\":\" + text)) {\n emojiResults.unshift(\":\" + text);\n }\n cb(emojiResults);\n },\n // Class added to the menu container\n containerClass: `${this.$style[\"tribute-container\"]} ${this.$style[\"tribute-container-emoji\"]}`,\n // Class added to each list item\n itemClass: this.$style[\"tribute-container__item\"]\n });\n }\n if (this.linkAutocomplete) {\n tributesCollection.push({\n trigger: \"/\",\n // Don't use the tribute search function at all\n // We pass search results as values (see below)\n lookup: (result, query) => query,\n requireLeadingSpace: true,\n // Popup mention autocompletion templates\n menuItemTemplate: (item) => renderMenuItem(`<img class=\"${this.$style[\"tribute-item__icon\"]}\" src=\"${item.original.icon_url}\"> <span class=\"${this.$style[\"tribute-item__title\"]}\">${item.original.title}</span>`),\n // Hide if no results\n noMatchTemplate: () => t(\"No link provider found\"),\n selectTemplate: this.getLink,\n // Pass the search results as values\n values: (text, cb) => cb(searchProvider(text)),\n // Class added to the menu container\n containerClass: `${this.$style[\"tribute-container\"]} ${this.$style[\"tribute-container-link\"]}`,\n // Class added to each list item\n itemClass: this.$style[\"tribute-container__item\"]\n });\n }\n const menuContainer = typeof this.menuContainer === \"string\" ? document.querySelector(this.menuContainer) : this.menuContainer;\n this.tribute = new Tribute({\n collection: tributesCollection,\n // FIXME: tributejs doesn't support allowSpaces as a collection option, only as a global one\n // Requires to fork a library to allow spaces only in the middle of mentions ('@' trigger)\n allowSpaces: false,\n // Where to inject the menu popup\n menuContainer\n });\n this.tribute.attach(this.$refs.contenteditable);\n this.$refs.contenteditable.contentEditable = this.contenteditableAttributeValue;\n },\n getLink(item) {\n getLinkWithPicker(item.original.id).then((result) => {\n const tmpElem = document.getElementById(\"tmp-smart-picker-result-node\");\n const eventData = {\n result,\n insertText: true\n };\n this.$emit(\"smartPickerSubmit\", eventData);\n if (eventData.insertText) {\n const newElem = document.createTextNode(result);\n tmpElem.replaceWith(newElem);\n this.setCursorAfter(newElem);\n this.updateValue(this.$refs.contenteditable.innerHTML);\n } else {\n tmpElem.remove();\n }\n }).catch((error) => {\n logger.debug(\"[NcRichContenteditable] Smart picker promise rejected:\", { error });\n const tmpElem = document.getElementById(\"tmp-smart-picker-result-node\");\n this.setCursorAfter(tmpElem);\n tmpElem.remove();\n });\n return '<span id=\"tmp-smart-picker-result-node\"></span>';\n },\n setCursorAfter(element) {\n const range = document.createRange();\n range.setEndAfter(element);\n range.collapse();\n const selection = window.getSelection();\n selection.removeAllRanges();\n selection.addRange(range);\n },\n moveCursorToEnd() {\n if (!document.createRange) {\n return;\n }\n if (window.getSelection().rangeCount > 0 && this.$refs.contenteditable.contains(window.getSelection().getRangeAt(0).commonAncestorContainer)) {\n return;\n }\n const range = document.createRange();\n range.selectNodeContents(this.$refs.contenteditable);\n range.collapse(false);\n const selection = window.getSelection();\n selection.removeAllRanges();\n selection.addRange(range);\n },\n /**\n * Re-emit the input event to the parent\n *\n * @param {Event} event the input event\n */\n onInput(event) {\n this.updateValue(event.target.innerHTML);\n },\n /**\n * When pasting, sanitize the content, extract text\n * and render it again\n *\n * @param {Event} event the paste event\n * @fires Event paste the original paste event\n */\n onPaste(event) {\n if (!this.contenteditable || this.disabled) {\n return;\n }\n if (isPlaintextOnlySupported) {\n this.$emit(\"paste\", event);\n } else {\n event.preventDefault();\n const clipboardData = event.clipboardData;\n this.$emit(\"paste\", event);\n if (clipboardData.files.length !== 0 || !Object.values(clipboardData.items).find((item) => item?.type.startsWith(\"text\"))) {\n return;\n }\n const text = clipboardData.getData(\"text\");\n const selection = window.getSelection();\n const range = selection.getRangeAt(0);\n range.deleteContents();\n range.insertNode(document.createTextNode(text));\n range.collapse(false);\n }\n this.updateValue(this.$refs.contenteditable.innerHTML);\n },\n /**\n * Update the value text from the provided html\n *\n * @param {string} htmlOrText - The html content (or raw text with \\@mentions)\n */\n updateValue(htmlOrText) {\n const text = this.parseContent(htmlOrText).replace(/^\\n$/, \"\");\n this.localValue = text;\n this.$emit(\"update:modelValue\", text);\n },\n /**\n * Update content and local value\n *\n * @param {string} value the message value\n */\n updateContent(value) {\n const renderedContent = this.renderContent(value);\n this.$refs.contenteditable.innerHTML = renderedContent;\n this.localValue = value;\n },\n /**\n * Enter key pressed. Submits if not multiline\n *\n * @param {Event} event the keydown event\n */\n onEnter(event) {\n if (this.multiline || this.isOverMaxlength || this.tribute.isActive || this.isComposing) {\n return;\n }\n event.preventDefault();\n event.stopPropagation();\n this.$emit(\"submit\", event);\n },\n /**\n * Ctrl + Enter key pressed is used to submit\n *\n * @param {Event} event the keydown event\n */\n onCtrlEnter(event) {\n if (this.isOverMaxlength) {\n return;\n }\n this.$emit(\"submit\", event);\n },\n onKeyUp(event) {\n event.stopImmediatePropagation();\n },\n onKeyEsc(event) {\n if (this.tribute && this.isAutocompleteOpen) {\n event.stopImmediatePropagation();\n this.tribute.hideMenu();\n }\n },\n /**\n * Get HTML element with Tribute.js container\n *\n * @return {HTMLElement}\n */\n getTributeContainer() {\n return this.tribute.menu;\n },\n /**\n * Get the currently selected item element id in Tribute.js container\n *\n * @return {HTMLElement}\n */\n getTributeSelectedItem() {\n return this.getTributeContainer().querySelector('.highlight [id^=\"nc-rich-contenteditable-tribute-item-\"]');\n },\n /**\n * Handle Tribute activation\n *\n * @param {boolean} isActive - is active\n */\n onTributeActive(isActive) {\n this.isAutocompleteOpen = isActive;\n if (isActive) {\n this.getTributeContainer().setAttribute(\"class\", this.tribute.current.collection.containerClass || this.$style[\"tribute-container\"]);\n this.setupTributeIntegration();\n document.removeEventListener(\"click\", this.hideTribute, true);\n } else {\n this.debouncedAutoComplete.clear();\n this.autocompleteActiveId = void 0;\n this.setTributeFocusVisible(false);\n }\n },\n onTributeArrowKeyDown() {\n if (!this.isAutocompleteOpen) {\n return;\n }\n this.setTributeFocusVisible(true);\n this.onTributeSelectedItemWillChange();\n },\n onTributeSelectedItemWillChange() {\n requestAnimationFrame(() => {\n this.autocompleteActiveId = this.getTributeSelectedItem()?.id;\n });\n },\n setupTributeIntegration() {\n if (this.isTributeIntegrationDone) {\n return;\n }\n this.isTributeIntegrationDone = true;\n const tributeContainer = this.getTributeContainer();\n tributeContainer.id = this.tributeId;\n tributeContainer.setAttribute(\"role\", \"listbox\");\n const ul = tributeContainer.children[0];\n ul.setAttribute(\"role\", \"presentation\");\n this.tributeStyleMutationObserver = new MutationObserver(([{ target }]) => {\n if (target.style.display !== \"none\") {\n this.onTributeSelectedItemWillChange();\n }\n }).observe(tributeContainer, {\n attributes: true,\n attributeFilter: [\"style\"]\n });\n tributeContainer.addEventListener(\"mousemove\", () => {\n this.setTributeFocusVisible(false);\n this.onTributeSelectedItemWillChange();\n }, { passive: true });\n },\n /**\n * Set tribute-container--focus-visible class on the Tribute container when the user navigates the listbox via keyboard.\n *\n * Because the real focus is kept on the textbox, we cannot use the :focus-visible pseudo-class\n * to style selected options in the autocomplete listbox.\n *\n * @param {boolean} withFocusVisible - should the focus-visible class be added\n */\n setTributeFocusVisible(withFocusVisible) {\n if (withFocusVisible) {\n this.getTributeContainer().classList.add(this.$style[\"tribute-container--focus-visible\"]);\n } else {\n this.getTributeContainer().classList.remove(this.$style[\"tribute-container--focus-visible\"]);\n }\n },\n /**\n * Show tribute menu programmatically.\n *\n * @param {string} trigger - trigger character, can be '/', '@', or ':'\n *\n * @public\n */\n showTribute(trigger) {\n this.focus();\n const index = this.tribute.collection.findIndex((collection) => collection.trigger === trigger);\n this.tribute.showMenuForCollection(this.$refs.contenteditable, index);\n this.updateValue(this.$refs.contenteditable.innerHTML);\n document.addEventListener(\"click\", this.hideTribute, true);\n },\n /**\n * Hide tribute menu programmatically\n *\n */\n hideTribute() {\n this.tribute.hideMenu();\n document.removeEventListener(\"click\", this.hideTribute, true);\n }\n }\n};\nconst _hoisted_1 = [\"id\", \"contenteditable\", \"aria-labelledby\", \"aria-placeholder\", \"aria-controls\", \"aria-expanded\", \"aria-activedescendant\", \"title\"];\nconst _hoisted_2 = [\"id\"];\nfunction _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {\n return openBlock(), createElementBlock(\"div\", {\n class: normalizeClass([\"rich-contenteditable\", _ctx.$props.class])\n }, [\n createElementVNode(\"div\", mergeProps({\n id: $props.id,\n ref: \"contenteditable\",\n class: [{\n \"rich-contenteditable__input--empty\": $options.isEmptyValue,\n \"rich-contenteditable__input--multiline\": $props.multiline,\n \"rich-contenteditable__input--has-label\": $props.label,\n \"rich-contenteditable__input--overflow\": $options.isOverMaxlength,\n \"rich-contenteditable__input--disabled\": $props.disabled\n }, \"rich-contenteditable__input\"],\n contenteditable: $options.contenteditableAttributeValue,\n \"aria-labelledby\": $props.label ? $setup.labelId : void 0,\n \"aria-placeholder\": $props.placeholder,\n \"aria-multiline\": \"true\",\n role: \"textbox\",\n \"aria-haspopup\": \"listbox\",\n \"aria-autocomplete\": \"inline\",\n \"aria-controls\": $setup.tributeId,\n \"aria-expanded\": $data.isAutocompleteOpen ? \"true\" : \"false\",\n \"aria-activedescendant\": $data.autocompleteActiveId,\n title: $options.tooltipString\n }, _ctx.$attrs, {\n onFocus: _cache[0] || (_cache[0] = (...args) => $options.moveCursorToEnd && $options.moveCursorToEnd(...args)),\n onInput: _cache[1] || (_cache[1] = (...args) => $options.onInput && $options.onInput(...args)),\n onCompositionstart: _cache[2] || (_cache[2] = ($event) => $data.isComposing = true),\n onCompositionend: _cache[3] || (_cache[3] = ($event) => $data.isComposing = false),\n onKeydownCapture: _cache[4] || (_cache[4] = withKeys((...args) => $options.onKeyEsc && $options.onKeyEsc(...args), [\"esc\"])),\n onKeydown: [\n _cache[5] || (_cache[5] = withKeys(withModifiers((...args) => $options.onEnter && $options.onEnter(...args), [\"exact\"]), [\"enter\"])),\n _cache[6] || (_cache[6] = withKeys(withModifiers((...args) => $options.onCtrlEnter && $options.onCtrlEnter(...args), [\"ctrl\", \"exact\", \"stop\", \"prevent\"]), [\"enter\"])),\n _cache[9] || (_cache[9] = withKeys(withModifiers((...args) => $options.onTributeArrowKeyDown && $options.onTributeArrowKeyDown(...args), [\"exact\", \"stop\"]), [\"up\"])),\n _cache[10] || (_cache[10] = withKeys(withModifiers((...args) => $options.onTributeArrowKeyDown && $options.onTributeArrowKeyDown(...args), [\"exact\", \"stop\"]), [\"down\"]))\n ],\n onPaste: _cache[7] || (_cache[7] = (...args) => $options.onPaste && $options.onPaste(...args)),\n onKeyupCapture: _cache[8] || (_cache[8] = withModifiers((...args) => $options.onKeyUp && $options.onKeyUp(...args), [\"stop\", \"prevent\"])),\n onTributeActiveTrue: _cache[11] || (_cache[11] = ($event) => $options.onTributeActive(true)),\n onTributeActiveFalse: _cache[12] || (_cache[12] = ($event) => $options.onTributeActive(false))\n }), null, 16, _hoisted_1),\n $props.label ? (openBlock(), createElementBlock(\"div\", {\n key: 0,\n id: $setup.labelId,\n class: \"rich-contenteditable__label\"\n }, toDisplayString($props.label), 9, _hoisted_2)) : createCommentVNode(\"\", true)\n ], 2);\n}\nconst cssModules = {\n \"$style\": style1\n};\nconst NcRichContenteditable = /* @__PURE__ */ _export_sfc(_sfc_main, [[\"render\", _sfc_render], [\"__cssModules\", cssModules], [\"__scopeId\", \"data-v-94776745\"]]);\nexport {\n NcAutoCompleteResult as N,\n NcMentionBubble as a,\n NcRichContenteditable as b\n};\n//# sourceMappingURL=NcRichContenteditable-Qw614bJ5.mjs.map\n"],"names":["predicate","list","length","thisArg","value","i","CustomEvent$1","event","params","evt","TributeEvents","tribute","element","instance","o","li","keyCode","trigger","eventKeyPressed","el","info","e","collectionItem","item","count","selected","index","lis","liClientRect","menuClientRect","scrollDistance","elem","includeMargin","height","style","TributeMenuEvents","menu","func","wait","immediate","timeout","context","args","later","callNow","TributeRange","iframe","scrollTo","coordinates","menuDimensions","menuIsOffScreen","menuIsOffScreenHorizontally","menuIsOffScreenVertically","targetElement","path","offset","range","sel","text","requireLeadingSpace","hasTrailingSpace","originalEvent","replaceEvent","textSuffix","endPos","myField","startPos","html","frag","node","lastNode","ctx","ce","selectedElem","workingNodeContent","selectStartOffset","textComponent","wordsArray","worldsCount","menuAlreadyActive","allowSpaces","isAutocomplete","selectionInfo","effectiveRange","lastWordOfEffectiveRange","mostRecentTriggerCharPos","triggerChar","config","c","idx","currentTriggerSnippet","firstSnippetChar","leadingSpace","regex","str","reversedStr","cidx","len","firstChar","match","triggerIdx","windowWidth","windowHeight","doc","windowLeft","windowTop","menuTop","menuRight","menuBottom","menuLeft","dimensions","position","flipped","properties","isFirefox","div","computed","prop","span","rect","top","left","parentHeight","parentRect","scrollStillAvailable","selectedNodePosition","reasonableBuffer","clientRect","maxScrollDisplacement","elemTop","elemBottom","maxY","targetY","TributeSearch","pattern","array","string","opts","pre","post","compareString","patternCache","stringIndex","patternIndex","best","temp","score","indices","rendered","arr","prev","a","b","Tribute","values","selectClass","containerClass","itemClass","autocompleteMode","selectTemplate","menuItemTemplate","lookup","fillAttr","collection","menuContainer","noMatchTemplate","replaceTextSuffix","positionMenu","spaceSelectsMatch","searchOpts","menuItemLimit","menuShowMinLength","t","val","noMatchEvent","matchItem","wrapper","ul","processValues","items","fragment","collectionIndex","textRange","textNode","textarea","scrollPos","caretPos","front","back","content","newValues","replace","_sfc_main$2","useIsDarkTheme","getAvatarUrl","_hoisted_1$2","_hoisted_2$2","_hoisted_3$1","_hoisted_4$1","_sfc_render$2","_ctx","_cache","$props","$setup","$data","$options","openBlock","createElementBlock","normalizeClass","createElementVNode","normalizeStyle","toDisplayString","NcMentionBubble","_export_sfc","MENTION_START","MENTION_SIMPLE","MENTION_GUEST","MENTION_PREFIXED","MENTION_WITH_SPACE","MENTION_COMPLEX","USERID_REGEX","USERID_REGEX_WITH_SPACE","richEditor","escapeHTML","part","id","stripTags","data","char","props","component","Item","createApp","mount","renderedHtml","_sfc_main$1","NcUserStatusIcon","_hoisted_1$1","_hoisted_2$1","_hoisted_3","_hoisted_4","_hoisted_5","_sfc_render$1","_component_NcUserStatusIcon","resolveComponent","createBlock","createCommentVNode","NcAutoCompleteResult","register","t34","t37","style1","smilesCharacters","textSmiles","isPlaintextOnlySupported","_sfc_main","createElementId","segmenter","error","logger","n","debounce","search","callback","renderMenuItem","tributesCollection","result","query","emojiAddRecent","cb","emojiResults","emojiSearch","searchProvider","getLinkWithPicker","tmpElem","eventData","newElem","selection","clipboardData","htmlOrText","renderedContent","isActive","tributeContainer","target","withFocusVisible","_hoisted_1","_hoisted_2","_sfc_render","mergeProps","$event","withKeys","withModifiers","cssModules","NcRichContenteditable"],"mappings":"k1CAuBA,GAvBK,MAAM,UAAU,OACjB,MAAM,UAAU,KAAO,SAASA,EAAW,CACvC,GAAI,OAAS,KACT,MAAM,IAAI,UAAU,kDAAkD,EAE1E,GAAI,OAAOA,GAAc,WACrB,MAAM,IAAI,UAAU,8BAA8B,EAOtD,QALIC,EAAO,OAAO,IAAI,EAClBC,EAASD,EAAK,SAAW,EACzBE,EAAU,UAAU,CAAC,EACrBC,EAEKC,EAAI,EAAGA,EAAIH,EAAQG,IAExB,GADAD,EAAQH,EAAKI,CAAC,EACVL,EAAU,KAAKG,EAASC,EAAOC,EAAGJ,CAAI,EACtC,OAAOG,CAInB,GAGA,QAAU,OAAO,OAAO,aAAgB,WAAY,CACtD,IAASE,EAAT,SAAuBC,EAAOC,EAAQ,CACpCA,EAASA,GAAU,CACjB,QAAS,GACT,WAAY,GACZ,OAAQ,MACd,EACI,IAAIC,EAAM,SAAS,YAAY,aAAa,EAC5C,OAAAA,EAAI,gBAAgBF,EAAOC,EAAO,QAASA,EAAO,WAAYA,EAAO,MAAM,EACpEC,CACT,EAEG,OAAO,OAAO,MAAU,MAC1BH,EAAc,UAAY,OAAO,MAAM,WAGxC,OAAO,YAAcA,CACvB,CAEA,MAAMI,CAAc,CAClB,YAAYC,EAAS,CACnB,KAAK,QAAUA,EACf,KAAK,QAAQ,OAAS,IACxB,CAEA,OAAO,MAAO,CACZ,MAAO,CACL,CACE,IAAK,EACL,MAAO,KACf,EACM,CACE,IAAK,EACL,MAAO,QACf,EACM,CACE,IAAK,GACL,MAAO,OACf,EACM,CACE,IAAK,GACL,MAAO,QACf,EACM,CACE,IAAK,GACL,MAAO,OACf,EACM,CACE,IAAK,GACL,MAAO,IACf,EACM,CACE,IAAK,GACL,MAAO,MACf,CACA,CACE,CAEA,KAAKC,EAAS,CACZA,EAAQ,aAAe,KAAK,QAAQ,KAAKA,EAAS,IAAI,EACtDA,EAAQ,WAAa,KAAK,MAAM,KAAKA,EAAS,IAAI,EAClDA,EAAQ,WAAa,KAAK,MAAM,KAAKA,EAAS,IAAI,EAElDA,EAAQ,iBAAiB,UAAWA,EAAQ,aAAc,EAAK,EAC/DA,EAAQ,iBAAiB,QAASA,EAAQ,WAAY,EAAK,EAC3DA,EAAQ,iBAAiB,QAASA,EAAQ,WAAY,EAAK,CAC7D,CAEA,OAAOA,EAAS,CACdA,EAAQ,oBAAoB,UAAWA,EAAQ,aAAc,EAAK,EAClEA,EAAQ,oBAAoB,QAASA,EAAQ,WAAY,EAAK,EAC9DA,EAAQ,oBAAoB,QAASA,EAAQ,WAAY,EAAK,EAE9D,OAAOA,EAAQ,aACf,OAAOA,EAAQ,WACf,OAAOA,EAAQ,UACjB,CAEA,QAAQC,EAAUN,EAAO,CACnBM,EAAS,iBAAiBN,CAAK,IACjCM,EAAS,QAAQ,SAAW,GAC5BA,EAAS,QAAQ,SAAQ,GAG3B,IAAID,EAAU,KACdC,EAAS,aAAe,GAExBH,EAAc,KAAI,EAAG,QAAQI,GAAK,CAC5BA,EAAE,MAAQP,EAAM,UAClBM,EAAS,aAAe,GACxBA,EAAS,UAAS,EAAGC,EAAE,MAAM,aAAa,EAAEP,EAAOK,CAAO,EAE9D,CAAC,CACH,CAEA,MAAMC,EAAUN,EAAO,CACrBM,EAAS,WAAa,GACtBA,EAAS,MAAM,KAAK,KAAMA,EAAUN,CAAK,CAC3C,CAEA,MAAMM,EAAUN,EAAO,CACrB,IAAII,EAAUE,EAAS,QACvB,GAAIF,EAAQ,MAAQA,EAAQ,KAAK,SAASJ,EAAM,MAAM,EAAG,CACvD,IAAIQ,EAAKR,EAAM,OAGf,IAFAA,EAAM,eAAc,EACpBA,EAAM,gBAAe,EACdQ,EAAG,SAAS,YAAW,IAAO,MAEnC,GADAA,EAAKA,EAAG,WACJ,CAACA,GAAMA,IAAOJ,EAAQ,KACxB,MAAM,IAAI,MAAM,8CAA8C,EAGlEA,EAAQ,kBAAkBI,EAAG,aAAa,YAAY,EAAGR,CAAK,EAC9DI,EAAQ,SAAQ,CAGlB,MAAWA,EAAQ,QAAQ,SAAW,CAACA,EAAQ,QAAQ,kBACrDA,EAAQ,QAAQ,gBAAkB,GAClC,WAAW,IAAMA,EAAQ,UAAU,EAEvC,CAEA,MAAME,EAAUN,EAAO,CAMrB,GALIM,EAAS,aACXA,EAAS,WAAa,IAExBA,EAAS,gBAAgB,IAAI,EAEzBN,EAAM,UAAY,GAEtB,CAAA,GAAI,CAACM,EAAS,QAAQ,aAAeA,EAAS,QAAQ,iBAAkB,CACtEA,EAAS,QAAQ,iBAAmB,GACpCA,EAAS,aAAe,GACxBA,EAAS,UAAS,EAAG,MAASN,EAAO,IAAI,EACzC,MACF,CAEA,GAAI,CAACM,EAAS,QAAQ,SACpB,GAAIA,EAAS,QAAQ,iBACnBA,EAAS,UAAS,EAAG,YAAYN,EAAO,KAAM,EAAE,MAC3C,CACL,IAAIS,EAAUH,EAAS,WAAWA,EAAU,KAAMN,CAAK,EAEvD,GAAI,MAAMS,CAAO,GAAK,CAACA,EAAS,OAEhC,IAAIC,EAAUJ,EAAS,QAAQ,SAAQ,EAAG,KAAKI,GACtCA,EAAQ,WAAW,CAAC,IAAMD,CAClC,EAEG,OAAOC,EAAY,KACrBJ,EAAS,UAAS,EAAG,YAAYN,EAAO,KAAMU,CAAO,CAEzD,CAIAJ,EAAS,QAAQ,QAAQ,YAAY,OACrCA,EAAS,QAAQ,QAAQ,WAAW,qBAMlCA,EAAS,QAAQ,QAAQ,SACzBA,EAAS,QAAQ,mBACjBA,EAAS,eAAiB,IAC3BA,EAAS,QAAQ,UAAYN,EAAM,UAAY,IAEhDM,EAAS,QAAQ,YAAY,KAAM,EAAI,EAE3C,CAEA,iBAAiBN,EAAO,CACtB,GAAI,CAAC,KAAK,QAAQ,SAAU,MAAO,GAEnC,GAAI,KAAK,QAAQ,QAAQ,YAAY,SAAW,EAAG,CACjD,IAAIW,EAAkB,GACtB,OAAAR,EAAc,KAAI,EAAG,QAAQI,GAAK,CAC5BP,EAAM,UAAYO,EAAE,MAAKI,EAAkB,GACjD,CAAC,EAEM,CAACA,CACV,CAEA,MAAO,EACT,CAEA,WAAWL,EAAUM,EAAIZ,EAAO,CAC9B,IAAII,EAAUE,EAAS,QACnBO,EAAOT,EAAQ,MAAM,eACvB,GACAA,EAAQ,iBACR,GACAA,EAAQ,YACRA,EAAQ,gBACd,EAEI,OAAIS,EACKA,EAAK,mBAAmB,WAAW,CAAC,EAEpC,EAEX,CAEA,gBAAgBD,EAAI,CAClB,KAAK,QAAQ,QAAQ,QAAUA,EAC/B,IAAIC,EAAO,KAAK,QAAQ,MAAM,eAC5B,GACA,KAAK,QAAQ,iBACb,GACA,KAAK,QAAQ,YACb,KAAK,QAAQ,gBACnB,EAEQA,IACF,KAAK,QAAQ,QAAQ,aAAeA,EAAK,oBACzC,KAAK,QAAQ,QAAQ,YAAcA,EAAK,YACxC,KAAK,QAAQ,QAAQ,eAAiBA,EAAK,sBAE/C,CAEA,WAAY,CACV,MAAO,CACL,YAAa,CAACC,EAAGF,EAAIF,IAAY,CAC/B,IAAIN,EAAU,KAAK,QACnBA,EAAQ,QAAQ,QAAUM,EAE1B,IAAIK,EAAiBX,EAAQ,WAAW,KAAKY,GACpCA,EAAK,UAAYN,CACzB,EAEDN,EAAQ,QAAQ,WAAaW,EAG3BX,EAAQ,QAAQ,YAAY,QAC1BA,EAAQ,QAAQ,WAAW,mBAC7BA,EAAQ,YAERA,EAAQ,YAAYQ,EAAI,EAAI,CAEhC,EACA,MAAO,CAACE,EAAGF,IAAO,CAEZ,KAAK,QAAQ,UAAY,KAAK,QAAQ,QAAQ,gBAChDE,EAAE,eAAc,EAChBA,EAAE,gBAAe,EACjB,WAAW,IAAM,CACf,KAAK,QAAQ,kBAAkB,KAAK,QAAQ,aAAcA,CAAC,EAC3D,KAAK,QAAQ,SAAQ,CACvB,EAAG,CAAC,EAER,EACA,OAAQ,CAACA,EAAGF,IAAO,CACb,KAAK,QAAQ,WACfE,EAAE,eAAc,EAChBA,EAAE,gBAAe,EACjB,KAAK,QAAQ,SAAW,GACxB,KAAK,QAAQ,SAAQ,EAEzB,EACA,IAAK,CAACA,EAAGF,IAAO,CAEd,KAAK,UAAS,EAAG,MAAME,EAAGF,CAAE,CAC9B,EACA,MAAO,CAACE,EAAGF,IAAO,CACZ,KAAK,QAAQ,WACX,KAAK,QAAQ,kBACf,KAAK,UAAS,EAAG,MAAME,EAAGF,CAAE,EAClB,KAAK,QAAQ,cACvBE,EAAE,gBAAe,EACjB,WAAW,IAAM,CACf,KAAK,QAAQ,SAAQ,EACrB,KAAK,QAAQ,SAAW,EAC1B,EAAG,CAAC,GAGV,EACA,GAAI,CAACA,EAAGF,IAAO,CAEb,GAAI,KAAK,QAAQ,UAAY,KAAK,QAAQ,QAAQ,cAAe,CAC/DE,EAAE,eAAc,EAChBA,EAAE,gBAAe,EACjB,IAAIG,EAAQ,KAAK,QAAQ,QAAQ,cAAc,OAC7CC,EAAW,KAAK,QAAQ,aAEtBD,EAAQC,GAAYA,EAAW,GACjC,KAAK,QAAQ,eACb,KAAK,YAAW,GACPA,IAAa,IACtB,KAAK,QAAQ,aAAeD,EAAQ,EACpC,KAAK,YAAW,EAChB,KAAK,QAAQ,KAAK,UAAY,KAAK,QAAQ,KAAK,aAEpD,CACF,EACA,KAAM,CAACH,EAAGF,IAAO,CAEf,GAAI,KAAK,QAAQ,UAAY,KAAK,QAAQ,QAAQ,cAAe,CAC/DE,EAAE,eAAc,EAChBA,EAAE,gBAAe,EACjB,IAAIG,EAAQ,KAAK,QAAQ,QAAQ,cAAc,OAAS,EACtDC,EAAW,KAAK,QAAQ,aAEtBD,EAAQC,GACV,KAAK,QAAQ,eACb,KAAK,YAAW,GACPD,IAAUC,IACnB,KAAK,QAAQ,aAAe,EAC5B,KAAK,YAAW,EAChB,KAAK,QAAQ,KAAK,UAAY,EAElC,CACF,EACA,OAAQ,CAACJ,EAAGF,IAAO,CAEf,KAAK,QAAQ,UACb,KAAK,QAAQ,QAAQ,YAAY,OAAS,EAE1C,KAAK,QAAQ,SAAQ,EACZ,KAAK,QAAQ,UACtB,KAAK,QAAQ,YAAYA,CAAE,CAE/B,CACN,CACE,CAEA,YAAYO,EAAO,CACjB,IAAIC,EAAM,KAAK,QAAQ,KAAK,iBAAiB,IAAI,EAC/CzB,EAASyB,EAAI,SAAW,EAEtBD,IAAO,KAAK,QAAQ,aAAe,SAASA,CAAK,GAErD,QAASrB,EAAI,EAAGA,EAAIH,EAAQG,IAAK,CAC/B,IAAIU,EAAKY,EAAItB,CAAC,EACd,GAAIA,IAAM,KAAK,QAAQ,aAAc,CACnCU,EAAG,UAAU,IAAI,KAAK,QAAQ,QAAQ,WAAW,WAAW,EAE5D,IAAIa,EAAeb,EAAG,sBAAqB,EACvCc,EAAiB,KAAK,QAAQ,KAAK,sBAAqB,EAE5D,GAAID,EAAa,OAASC,EAAe,OAAQ,CAC/C,IAAIC,EAAiBF,EAAa,OAASC,EAAe,OAC1D,KAAK,QAAQ,KAAK,WAAaC,CACjC,SAAWF,EAAa,IAAMC,EAAe,IAAK,CAChD,IAAIC,EAAiBD,EAAe,IAAMD,EAAa,IACvD,KAAK,QAAQ,KAAK,WAAaE,CACjC,CACF,MACEf,EAAG,UAAU,OAAO,KAAK,QAAQ,QAAQ,WAAW,WAAW,CAEnE,CACF,CAEA,cAAcgB,EAAMC,EAAe,CACjC,IAAIC,EAASF,EAAK,sBAAqB,EAAG,OAE1C,GAAIC,EAAe,CACjB,IAAIE,EAAQH,EAAK,cAAgB,OAAO,iBAAiBA,CAAI,EAC7D,OACEE,EAAS,WAAWC,EAAM,SAAS,EAAI,WAAWA,EAAM,YAAY,CAExE,CAEA,OAAOD,CACT,CACF,CAEA,MAAME,EAAkB,CACtB,YAAYxB,EAAS,CACnB,KAAK,QAAUA,EACf,KAAK,QAAQ,WAAa,KAC1B,KAAK,KAAO,KAAK,QAAQ,IAC3B,CAEA,KAAKyB,EAAM,CACT,KAAK,eAAiB,KAAK,QAAQ,OAAO,MAAM,KAAK,KAAM,IAAI,EAC/D,KAAK,yBAA2B,KAAK,SACnC,IAAM,CACA,KAAK,QAAQ,UACf,KAAK,QAAQ,YAAY,KAAK,QAAQ,QAAQ,QAAS,EAAK,CAEhE,EACA,IACA,EACN,EACI,KAAK,kBAAoB,KAAK,SAC5B,IAAM,CACA,KAAK,QAAQ,UACf,KAAK,QAAQ,MAAM,oBAAoB,EAAI,CAE/C,EACA,IACA,EACN,EAGI,KAAK,QAAQ,MACV,YAAW,EACX,iBAAiB,gBAAiB,KAAK,eAAgB,EAAK,EAC/D,KAAK,QAAQ,MACV,YAAW,EACX,iBAAiB,YAAa,KAAK,eAAgB,EAAK,EAC3D,OAAO,iBAAiB,SAAU,KAAK,iBAAiB,EAEpD,KAAK,cACP,KAAK,cAAc,iBACjB,SACA,KAAK,yBACL,EACR,EAEM,OAAO,iBAAiB,SAAU,KAAK,wBAAwB,CAEnE,CAEA,OAAOA,EAAM,CACX,KAAK,QAAQ,MACV,YAAW,EACX,oBAAoB,YAAa,KAAK,eAAgB,EAAK,EAC9D,KAAK,QAAQ,MACV,YAAW,EACX,oBAAoB,gBAAiB,KAAK,eAAgB,EAAK,EAClE,OAAO,oBAAoB,SAAU,KAAK,iBAAiB,EAEvD,KAAK,cACP,KAAK,cAAc,oBACjB,SACA,KAAK,yBACL,EACR,EAEM,OAAO,oBAAoB,SAAU,KAAK,wBAAwB,CAEtE,CAEA,SAASC,EAAMC,EAAMC,EAAW,CAC9B,IAAIC,EACJ,MAAO,IAAM,CACX,IAAIC,EAAU,KACZC,EAAO,UACLC,EAAQ,IAAM,CAChBH,EAAU,KACLD,GAAWF,EAAK,MAAMI,EAASC,CAAI,CAC1C,EACIE,EAAUL,GAAa,CAACC,EAC5B,aAAaA,CAAO,EACpBA,EAAU,WAAWG,EAAOL,CAAI,EAC5BM,GAASP,EAAK,MAAMI,EAASC,CAAI,CACvC,CACF,CACF,CAIA,MAAMG,EAAa,CACf,YAAYlC,EAAS,CACjB,KAAK,QAAUA,EACf,KAAK,QAAQ,MAAQ,IACzB,CAEA,aAAc,CACV,IAAImC,EAKJ,OAJI,KAAK,QAAQ,QAAQ,aACrBA,EAAS,KAAK,QAAQ,QAAQ,WAAW,QAGxCA,EAIEA,EAAO,cAAc,SAHjB,QAIf,CAEA,oBAAoBC,EAAU,CAC1B,IAAIN,EAAU,KAAK,QAAQ,QACvBO,EAEA5B,EAAO,KAAK,eAAe,GAAO,KAAK,QAAQ,iBAAkB,GAAM,KAAK,QAAQ,YAAa,KAAK,QAAQ,gBAAgB,EAElI,GAAI,OAAOA,EAAS,IAAa,CAE7B,GAAG,CAAC,KAAK,QAAQ,aAAa,CAC1B,KAAK,QAAQ,KAAK,MAAM,QAAU,kBAClC,MACJ,CAEK,KAAK,kBAAkBqB,EAAQ,OAAO,EAKvCO,EAAc,KAAK,gCAAgC5B,EAAK,eAAe,EAJvE4B,EAAc,KAAK,oCAAoC,KAAK,QAAQ,QAAQ,QACxE5B,EAAK,eAAe,EAM5B,KAAK,QAAQ,KAAK,MAAM,QAAU,QAAQ4B,EAAY,GAAG;AAAA,6CACxBA,EAAY,IAAI;AAAA,8CACfA,EAAY,KAAK;AAAA,+CAChBA,EAAY,MAAM;AAAA;AAAA,sDAIjDA,EAAY,OAAS,SACrB,KAAK,QAAQ,KAAK,MAAM,KAAO,QAG/BA,EAAY,MAAQ,SACpB,KAAK,QAAQ,KAAK,MAAM,IAAM,QAG9BD,GAAU,KAAK,eAAc,EAEjC,OAAO,WAAW,IAAM,CACpB,IAAIE,EAAiB,CAClB,MAAO,KAAK,QAAQ,KAAK,YACzB,OAAQ,KAAK,QAAQ,KAAK,YAC7C,EACoBC,EAAkB,KAAK,gBAAgBF,EAAaC,CAAc,EAElEE,EAA8B,OAAO,WAAaF,EAAe,QAAUC,EAAgB,MAAQA,EAAgB,OACnHE,EAA4B,OAAO,YAAcH,EAAe,SAAWC,EAAgB,KAAOA,EAAgB,SAClHC,GAA+BC,KAC/B,KAAK,QAAQ,KAAK,MAAM,QAAU,gBAClC,KAAK,oBAAoBL,CAAQ,EAEzC,EAAG,CAAC,CAER,MACI,KAAK,QAAQ,KAAK,MAAM,QAAU,eAE1C,CAEA,IAAI,qBAAsB,CACtB,OAAO,KAAK,QAAQ,gBAAkB,SAAS,MAAQ,CAAC,KAAK,QAAQ,aACzE,CAGA,cAAcM,EAAeC,EAAMC,EAAQ,CACvC,IAAIC,EACAzB,EAAOsB,EAEX,GAAIC,EACA,QAASjD,EAAI,EAAGA,EAAIiD,EAAK,OAAQjD,IAAK,CAElC,GADA0B,EAAOA,EAAK,WAAWuB,EAAKjD,CAAC,CAAC,EAC1B0B,IAAS,OACT,OAEJ,KAAOA,EAAK,OAASwB,GACjBA,GAAUxB,EAAK,OACfA,EAAOA,EAAK,YAEZA,EAAK,WAAW,SAAW,GAAK,CAACA,EAAK,SACtCA,EAAOA,EAAK,gBAEpB,CAEJ,IAAI0B,EAAM,KAAK,mBAAkB,EAEjCD,EAAQ,KAAK,YAAW,EAAG,YAAW,EACtCA,EAAM,SAASzB,EAAMwB,CAAM,EAC3BC,EAAM,OAAOzB,EAAMwB,CAAM,EACzBC,EAAM,SAAS,EAAI,EAEnB,GAAI,CACAC,EAAI,gBAAe,CACvB,MAAgB,CAAC,CAEjBA,EAAI,SAASD,CAAK,EAClBH,EAAc,MAAK,CACvB,CAEA,mBAAmBK,EAAMC,EAAqBC,EAAkBC,EAAetC,EAAM,CACjF,IAAIH,EAAO,KAAK,eAAe,GAAMwC,EAAkBD,EAAqB,KAAK,QAAQ,YAAa,KAAK,QAAQ,gBAAgB,EAEnI,GAAIvC,IAAS,OAAW,CACpB,IAAIqB,EAAU,KAAK,QAAQ,QACvBqB,EAAe,IAAI,YAAY,mBAAoB,CACnD,OAAQ,CACJ,KAAMvC,EACN,SAAUkB,EACV,QAASrB,EACT,MAAOyC,CAC3B,CACA,CAAa,EAED,GAAK,KAAK,kBAAkBpB,EAAQ,OAAO,EAepC,CAEH,IAAIsB,EAAa,OAAO,KAAK,QAAQ,mBAAqB,SACpD,KAAK,QAAQ,kBACb,IACNL,GAAQK,EACR,IAAIC,EAAS5C,EAAK,gBAAkBA,EAAK,YAAY,OAChD,KAAK,QAAQ,mBACd4C,GAAU5C,EAAK,mBAAmB,QAEtC,KAAK,UAAUsC,EAAMtC,EAAK,gBAAiB4C,CAAM,CACrD,KA1B8C,CAC1C,IAAIC,EAAU,KAAK,QAAQ,QAAQ,QAC/BF,EAAa,OAAO,KAAK,QAAQ,mBAAqB,SACpD,KAAK,QAAQ,kBACb,IACNL,GAAQK,EACR,IAAIG,EAAW9C,EAAK,gBAChB4C,EAAS5C,EAAK,gBAAkBA,EAAK,YAAY,OAAS2C,EAAW,OACpE,KAAK,QAAQ,mBACdC,GAAU5C,EAAK,mBAAmB,OAAS,GAE/C6C,EAAQ,MAAQA,EAAQ,MAAM,UAAU,EAAGC,CAAQ,EAAIR,EACnDO,EAAQ,MAAM,UAAUD,EAAQC,EAAQ,MAAM,MAAM,EACxDA,EAAQ,eAAiBC,EAAWR,EAAK,OACzCO,EAAQ,aAAeC,EAAWR,EAAK,MAC3C,CAaAjB,EAAQ,QAAQ,cAAc,IAAI,YAAY,QAAS,CAAE,QAAS,EAAI,CAAE,CAAC,EACzEA,EAAQ,QAAQ,cAAcqB,CAAY,CAC9C,CACJ,CAEA,UAAUK,EAAMD,EAAUF,EAAQ,CAC9B,IAAIR,EAAOC,EACXA,EAAM,KAAK,mBAAkB,EAC7BD,EAAQ,KAAK,YAAW,EAAG,YAAW,EACtCA,EAAM,SAASC,EAAI,WAAYS,CAAQ,EACvCV,EAAM,OAAOC,EAAI,WAAYO,CAAM,EACnCR,EAAM,eAAc,EAEpB,IAAIrC,EAAK,KAAK,YAAW,EAAG,cAAc,KAAK,EAC/CA,EAAG,UAAYgD,EACf,IAAIC,EAAO,KAAK,YAAW,EAAG,uBAAsB,EAChDC,EAAMC,EACV,KAAQD,EAAOlD,EAAG,YACdmD,EAAWF,EAAK,YAAYC,CAAI,EAEpCb,EAAM,WAAWY,CAAI,EAGjBE,IACAd,EAAQA,EAAM,WAAU,EACxBA,EAAM,cAAcc,CAAQ,EAC5Bd,EAAM,SAAS,EAAI,EACnBC,EAAI,gBAAe,EACnBA,EAAI,SAASD,CAAK,EAE1B,CAEA,oBAAqB,CACjB,OAAI,KAAK,QAAQ,WAAW,OACjB,KAAK,QAAQ,WAAW,OAAO,cAAc,aAAY,EAG7D,OAAO,aAAY,CAC9B,CAEA,wBAAwB5C,EAAS,CAC7B,GAAIA,EAAQ,aAAe,KACvB,MAAO,GAGX,QAASP,EAAI,EAAGA,EAAIO,EAAQ,WAAW,WAAW,OAAQP,IAGtD,GAFWO,EAAQ,WAAW,WAAWP,CAAC,IAE7BO,EACT,OAAOP,CAGnB,CAEA,+BAA+BkE,EAAK,CAChC,IAAId,EAAM,KAAK,mBAAkB,EAC7BhC,EAAWgC,EAAI,WACfH,EAAO,CAAA,EACPC,EAEJ,GAAI9B,GAAY,KAAM,CAClB,IAAIpB,EACAmE,EAAK/C,EAAS,gBAClB,KAAOA,IAAa,MAAQ+C,IAAO,QAC/BnE,EAAI,KAAK,wBAAwBoB,CAAQ,EACzC6B,EAAK,KAAKjD,CAAC,EACXoB,EAAWA,EAAS,WAChBA,IAAa,OACb+C,EAAK/C,EAAS,iBAGtB,OAAA6B,EAAK,QAAO,EAGZC,EAASE,EAAI,WAAW,CAAC,EAAE,YAEpB,CACH,SAAUhC,EACV,KAAM6B,EACN,OAAQC,CACxB,CACQ,CACJ,CAEA,kCAAmC,CAC/B,IAAId,EAAU,KAAK,QAAQ,QACvBiB,EAAO,GAEX,GAAK,KAAK,kBAAkBjB,EAAQ,OAAO,EASpC,CACH,IAAIgC,EAAe,KAAK,mBAAkB,EAAG,WAE7C,GAAIA,GAAgB,KAAM,CACtB,IAAIC,EAAqBD,EAAa,YAClCE,EAAoB,KAAK,mBAAkB,EAAG,WAAW,CAAC,EAAE,YAE5DD,GAAsBC,GAAqB,IAC3CjB,EAAOgB,EAAmB,UAAU,EAAGC,CAAiB,EAEhE,CACJ,KApB8C,CAC1C,IAAIC,EAAgB,KAAK,QAAQ,QAAQ,QACzC,GAAIA,EAAe,CACf,IAAIV,EAAWU,EAAc,eACzBA,EAAc,OAASV,GAAY,IACnCR,EAAOkB,EAAc,MAAM,UAAU,EAAGV,CAAQ,EAExD,CAEJ,CAaA,OAAOR,CACX,CAEA,kBAAkBA,EAAM,CACpBA,EAAOA,EAAK,QAAQ,UAAW,GAAG,EAClC,IAAImB,EAAanB,EAAK,MAAM,KAAK,EAC7BoB,EAAcD,EAAW,OAAS,EACtC,OAAOA,EAAWC,CAAW,EAAE,KAAI,CACvC,CAEA,eAAeC,EAAmBnB,EAAkBD,EAAqBqB,EAAaC,EAAgB,CAClG,IAAIV,EAAM,KAAK,QAAQ,QACnB9C,EAAU6B,EAAMC,EAEpB,GAAI,CAAC,KAAK,kBAAkBgB,EAAI,OAAO,EACnC9C,EAAW,KAAK,QAAQ,QAAQ,YAC7B,CACH,IAAIyD,EAAgB,KAAK,+BAA+BX,CAAG,EAEvDW,IACAzD,EAAWyD,EAAc,SACzB5B,EAAO4B,EAAc,KACrB3B,EAAS2B,EAAc,OAE/B,CAEA,IAAIC,EAAiB,KAAK,iCAAgC,EACtDC,EAA2B,KAAK,kBAAkBD,CAAc,EAEpE,GAAIF,EACA,MAAO,CACH,gBAAiBE,EAAe,OAASC,EAAyB,OAClE,YAAaA,EACb,uBAAwB3D,EACxB,oBAAqB6B,EACrB,sBAAuBC,CACvC,EAGQ,GAAoC4B,GAAmB,KAAM,CACzD,IAAIE,EAA2B,GAC3BC,EAeJ,GAbA,KAAK,QAAQ,WAAW,QAAQC,GAAU,CACtC,IAAIC,EAAID,EAAO,QACXE,EAAMF,EAAO,oBACb,KAAK,0BAA0BJ,EAAgBK,CAAC,EAChDL,EAAe,YAAYK,CAAC,EAE5BC,EAAMJ,IACNA,EAA2BI,EAC3BH,EAAcE,EACd7B,EAAsB4B,EAAO,oBAErC,CAAC,EAEGF,GAA4B,IAExBA,IAA6B,GAC7B,CAAC1B,GACD,YAAY,KACRwB,EAAe,UACXE,EAA2B,EAC3BA,CAAwB,CACpD,GAEc,CACE,IAAIK,EAAwBP,EAAe,UAAUE,EAA2BC,EAAY,OACxFH,EAAe,MAAM,EAEzBG,EAAcH,EAAe,UAAUE,EAA0BA,EAA2BC,EAAY,MAAM,EAC9G,IAAIK,EAAmBD,EAAsB,UAAU,EAAG,CAAC,EACvDE,EAAeF,EAAsB,OAAS,IAE1CC,IAAqB,KACrBA,IAAqB,KAEzB/B,IACA8B,EAAwBA,EAAsB,KAAI,GAGtD,IAAIG,EAAQb,EAAc,UAAY,YAItC,GAFA,KAAK,QAAQ,iBAAmBa,EAAM,KAAKH,CAAqB,EAE5D,CAACE,IAAiBb,GAAqB,CAAEc,EAAM,KAAKH,CAAqB,GACzE,MAAO,CACH,gBAAiBL,EACjB,YAAaK,EACb,uBAAwBjE,EACxB,oBAAqB6B,EACrB,sBAAuBC,EACvB,mBAAoB+B,CAC5C,CAEY,CACJ,CACJ,CAEA,0BAA2BQ,EAAK7E,EAAS,CACrC,IAAI8E,EAAcD,EAAI,MAAM,EAAE,EAAE,QAAO,EAAG,KAAK,EAAE,EAC7CpE,EAAQ,GAEZ,QAASsE,EAAO,EAAGC,EAAMH,EAAI,OAAQE,EAAOC,EAAKD,IAAQ,CACrD,IAAIE,EAAYF,IAASF,EAAI,OAAS,EAClCF,EAAe,KAAK,KAAKG,EAAYC,EAAO,CAAC,CAAC,EAE9CG,EAAQ,GACZ,QAASC,EAAanF,EAAQ,OAAS,EAAGmF,GAAc,EAAGA,IACzD,GAAInF,EAAQmF,CAAU,IAAML,EAAYC,EAAKI,CAAU,EAAG,CACxDD,EAAQ,GACR,KACF,CAGF,GAAIA,IAAUD,GAAaN,GAAe,CACtClE,EAAQoE,EAAI,OAAS,EAAIE,EACzB,KACJ,CACJ,CAEA,OAAOtE,CACX,CAEA,kBAAkBd,EAAS,CACvB,OAAOA,EAAQ,WAAa,SAAWA,EAAQ,WAAa,UAChE,CAEA,gBAAgBoC,EAAaC,EAAgB,CACzC,IAAIoD,EAAc,OAAO,WACrBC,EAAe,OAAO,YACtBC,EAAM,SAAS,gBACfC,GAAc,OAAO,aAAeD,EAAI,aAAeA,EAAI,YAAc,GACzEE,GAAa,OAAO,aAAeF,EAAI,YAAcA,EAAI,WAAa,GAEtEG,EAAU,OAAO1D,EAAY,KAAQ,SAAWA,EAAY,IAAMyD,EAAYH,EAAetD,EAAY,OAASC,EAAe,OACjI0D,EAAY,OAAO3D,EAAY,OAAU,SAAWA,EAAY,MAAQA,EAAY,KAAOC,EAAe,MAC1G2D,EAAa,OAAO5D,EAAY,QAAW,SAAWA,EAAY,OAASA,EAAY,IAAMC,EAAe,OAC5G4D,EAAW,OAAO7D,EAAY,MAAS,SAAWA,EAAY,KAAOwD,EAAaH,EAAcrD,EAAY,MAAQC,EAAe,MAEvI,MAAO,CACH,IAAKyD,EAAU,KAAK,MAAMD,CAAS,EACnC,MAAOE,EAAY,KAAK,KAAKH,EAAaH,CAAW,EACrD,OAAQO,EAAa,KAAK,KAAKH,EAAYH,CAAY,EACvD,KAAMO,EAAW,KAAK,MAAML,CAAU,CAClD,CACI,CAEA,mBAAoB,CAIhB,IAAIM,EAAa,CACb,MAAO,KACP,OAAQ,IACpB,EAEQ,OAAA,KAAK,QAAQ,KAAK,MAAM,QAAU;AAAA;AAAA;AAAA;AAAA,sDAKnCA,EAAW,MAAQ,KAAK,QAAQ,KAAK,YACrCA,EAAW,OAAS,KAAK,QAAQ,KAAK,aAEtC,KAAK,QAAQ,KAAK,MAAM,QAAU,iBAE3BA,CACV,CAEA,oCAAoClG,EAASmG,EAAUC,EAAS,CAC5D,IAAIC,EAAa,CAAC,YAAa,YAAa,QAAS,SAAU,YAC3D,YAAa,iBAAkB,mBAC/B,oBAAqB,kBAAmB,aACxC,eAAgB,gBAAiB,cACjC,YAAa,cAAe,aAAc,cAC1C,WAAY,iBAAkB,aAAc,aAC5C,YAAa,gBAAiB,aAC9B,iBAAkB,gBAAiB,aAC/C,EAEYC,EAAa,OAAO,kBAAoB,KAExCC,EAAM,KAAK,YAAW,EAAG,cAAc,KAAK,EAChDA,EAAI,GAAK,2CACT,KAAK,YAAW,EAAG,KAAK,YAAYA,CAAG,EAEvC,IAAIjF,EAAQiF,EAAI,MACZC,EAAW,OAAO,iBAAmB,iBAAiBxG,CAAO,EAAIA,EAAQ,aAE7EsB,EAAM,WAAa,WACftB,EAAQ,WAAa,UACrBsB,EAAM,SAAW,cAIrBA,EAAM,SAAW,WACjBA,EAAM,WAAa,SAGnB+E,EAAW,QAAQI,GAAQ,CACvBnF,EAAMmF,CAAI,EAAID,EAASC,CAAI,CAC/B,CAAC,EAEGH,GACAhF,EAAM,MAAQ,GAAI,SAASkF,EAAS,KAAK,EAAI,CAAC,KAC1CxG,EAAQ,aAAe,SAASwG,EAAS,MAAM,IAC/ClF,EAAM,UAAY,WAEtBA,EAAM,SAAW,SAGrBiF,EAAI,YAAcvG,EAAQ,MAAM,UAAU,EAAGmG,CAAQ,EAEjDnG,EAAQ,WAAa,UACrBuG,EAAI,YAAcA,EAAI,YAAY,QAAQ,MAAO,GAAG,GAGxD,IAAIG,EAAO,KAAK,YAAW,EAAG,cAAc,MAAM,EAClDA,EAAK,YAAc1G,EAAQ,MAAM,UAAUmG,CAAQ,GAAK,IACxDI,EAAI,YAAYG,CAAI,EAEpB,IAAIC,EAAO3G,EAAQ,sBAAqB,EACpC2F,EAAM,SAAS,gBACfC,GAAc,OAAO,aAAeD,EAAI,aAAeA,EAAI,YAAc,GACzEE,GAAa,OAAO,aAAeF,EAAI,YAAcA,EAAI,WAAa,GAEtEiB,EAAM,EACNC,EAAO,EACP,KAAK,sBACPD,EAAMD,EAAK,IACXE,EAAOF,EAAK,MAGd,IAAIvE,EAAc,CACd,IAAKwE,EAAMf,EAAYa,EAAK,UAAY,SAASF,EAAS,cAAc,EAAI,SAASA,EAAS,QAAQ,EAAIxG,EAAQ,UAClH,KAAM6G,EAAOjB,EAAac,EAAK,WAAa,SAASF,EAAS,eAAe,CACzF,EAEYf,EAAc,OAAO,WACrBC,EAAe,OAAO,YAEtBrD,EAAiB,KAAK,kBAAiB,EACvCC,EAAkB,KAAK,gBAAgBF,EAAaC,CAAc,EAElEC,EAAgB,QAChBF,EAAY,MAAQqD,EAAcrD,EAAY,KAC9CA,EAAY,KAAO,QAGvB,IAAI0E,EAAe,KAAK,QAAQ,cAC1B,KAAK,QAAQ,cAAc,aAC3B,KAAK,cAAc,KAAK,aAE9B,GAAIxE,EAAgB,OAAQ,CACxB,IAAIyE,EAAa,KAAK,QAAQ,cACxB,KAAK,QAAQ,cAAc,sBAAqB,EAChD,KAAK,YAAW,EAAG,KAAK,sBAAqB,EAC/CC,EAAuBF,GAAgBpB,EAAeqB,EAAW,KAErE3E,EAAY,OAAS4E,GAAwBtB,EAAeiB,EAAK,IAAMD,EAAK,WAC5EtE,EAAY,IAAM,MACtB,CAEA,OAAAE,EAAkB,KAAK,gBAAgBF,EAAaC,CAAc,EAC9DC,EAAgB,OAChBF,EAAY,KAAOqD,EAAcpD,EAAe,MAC1CuD,EAAaH,EAAcpD,EAAe,MAC1CuD,EACN,OAAOxD,EAAY,OAEnBE,EAAgB,MAChBF,EAAY,IAAMsD,EAAerD,EAAe,OAC1CwD,EAAYH,EAAerD,EAAe,OAC1CwD,EACN,OAAOzD,EAAY,QAGvB,KAAK,YAAW,EAAG,KAAK,YAAYmE,CAAG,EAChCnE,CACX,CAEA,gCAAgC6E,EAAsB,CAClD,IAAIrE,EACAC,EAAM,KAAK,mBAAkB,EAEjCD,EAAQ,KAAK,YAAW,EAAG,YAAW,EACtCA,EAAM,SAASC,EAAI,WAAYoE,CAAoB,EACnDrE,EAAM,OAAOC,EAAI,WAAYoE,CAAoB,EAEjDrE,EAAM,SAAS,EAAK,EAEpB,IAAI+D,EAAO/D,EAAM,sBAAqB,EAClC+C,EAAM,SAAS,gBACfC,GAAc,OAAO,aAAeD,EAAI,aAAeA,EAAI,YAAc,GACzEE,GAAa,OAAO,aAAeF,EAAI,YAAcA,EAAI,WAAa,GAEtEkB,EAAOF,EAAK,KACZC,EAAMD,EAAK,IAEXvE,EAAc,CACd,KAAMyE,EAAOjB,EACb,IAAKgB,EAAMD,EAAK,OAASd,CACrC,EACYJ,EAAc,OAAO,WACrBC,EAAe,OAAO,YAEtBrD,EAAiB,KAAK,kBAAiB,EACvCC,EAAkB,KAAK,gBAAgBF,EAAaC,CAAc,EAElEC,EAAgB,QAChBF,EAAY,KAAO,OACnBA,EAAY,MAAQqD,EAAckB,EAAK,KAAOf,GAGlD,IAAIkB,EAAe,KAAK,QAAQ,cAC1B,KAAK,QAAQ,cAAc,aAC3B,KAAK,cAAc,KAAK,aAE9B,GAAIxE,EAAgB,OAAQ,CACxB,IAAIyE,EAAa,KAAK,QAAQ,cACxB,KAAK,QAAQ,cAAc,sBAAqB,EAChD,KAAK,YAAW,EAAG,KAAK,sBAAqB,EAC/CC,EAAuBF,GAAgBpB,EAAeqB,EAAW,KAErE3E,EAAY,IAAM,OAClBA,EAAY,OAAS4E,GAAwBtB,EAAeiB,EAAK,IACrE,CAEA,OAAArE,EAAkB,KAAK,gBAAgBF,EAAaC,CAAc,EAC9DC,EAAgB,OAChBF,EAAY,KAAOqD,EAAcpD,EAAe,MAC1CuD,EAAaH,EAAcpD,EAAe,MAC1CuD,EACN,OAAOxD,EAAY,OAEnBE,EAAgB,MAChBF,EAAY,IAAMsD,EAAerD,EAAe,OAC1CwD,EAAYH,EAAerD,EAAe,OAC1CwD,EACN,OAAOzD,EAAY,QAGlB,KAAK,sBACNA,EAAY,KAAOA,EAAY,KAAOA,EAAY,KAAO,KAAK,QAAQ,cAAc,WAAaA,EAAY,KAC7GA,EAAY,IAAMA,EAAY,IAAMA,EAAY,IAAM,KAAK,QAAQ,cAAc,UAAYA,EAAY,KAGtGA,CACX,CAEA,eAAejB,EAAM,CACjB,IAAI+F,EAAmB,GACnBC,EACAC,EAAwB,IACxB3G,EAAI,KAAK,KAEb,GAAI,OAAOA,EAAM,IAAa,OAE9B,KAAO0G,IAAe,QAAaA,EAAW,SAAW,GAGrD,GAFAA,EAAa1G,EAAE,sBAAqB,EAEhC0G,EAAW,SAAW,IACtB1G,EAAIA,EAAE,WAAW,CAAC,EACdA,IAAM,QAAa,CAACA,EAAE,uBACtB,OAKZ,IAAI4G,EAAUF,EAAW,IACrBG,EAAaD,EAAUF,EAAW,OAEtC,GAAIE,EAAU,EACV,OAAO,SAAS,EAAG,OAAO,YAAcF,EAAW,IAAMD,CAAgB,UAClEI,EAAa,OAAO,YAAa,CACxC,IAAIC,EAAO,OAAO,YAAcJ,EAAW,IAAMD,EAE7CK,EAAO,OAAO,YAAcH,IAC5BG,EAAO,OAAO,YAAcH,GAGhC,IAAII,EAAU,OAAO,aAAe,OAAO,YAAcF,GAErDE,EAAUD,IACVC,EAAUD,GAGd,OAAO,SAAS,EAAGC,CAAO,CAC9B,CACJ,CACJ,CAGA,MAAMC,EAAc,CAChB,YAAY1H,EAAS,CACjB,KAAK,QAAUA,EACf,KAAK,QAAQ,OAAS,IAC1B,CAEA,aAAa2H,EAASC,EAAO,CACzB,OAAOA,EAAM,OAAOC,GACT,KAAK,KAAKF,EAASE,CAAM,CACnC,CACL,CAEA,KAAKF,EAASE,EAAQ,CAClB,OAAO,KAAK,MAAMF,EAASE,CAAM,IAAM,IAC3C,CAEA,MAAMF,EAASE,EAAQC,EAAM,CACzBA,EAAOA,GAAQ,CAAA,EACLD,EAAO,OACzB,IAAYE,EAAMD,EAAK,KAAO,GAClBE,EAAOF,EAAK,MAAQ,GACpBG,EAAgBH,EAAK,eAAiBD,GAAUA,EAAO,YAAW,EAEtE,GAAIC,EAAK,KACL,MAAO,CAAC,SAAUD,EAAQ,MAAO,CAAC,EAGtCF,EAAUG,EAAK,eAAiBH,GAAWA,EAAQ,YAAW,EAE9D,IAAIO,EAAe,KAAK,SAASD,EAAeN,EAAS,EAAG,EAAG,EAAE,EACjE,OAAKO,EAGE,CACH,SAAU,KAAK,OAAOL,EAAQK,EAAa,MAAOH,EAAKC,CAAI,EAC3D,MAAOE,EAAa,KAChC,EALmB,IAMf,CAEA,SAASL,EAAQF,EAASQ,EAAaC,EAAcF,EAAc,CAE/D,GAAIP,EAAQ,SAAWS,EAGnB,MAAO,CACH,MAAO,KAAK,eAAeF,CAAY,EACvC,MAAOA,EAAa,MAAK,CACzC,EAIQ,GAAIL,EAAO,SAAWM,GAAeR,EAAQ,OAASS,EAAeP,EAAO,OAASM,EACjF,OAGJ,IAAItD,EAAI8C,EAAQS,CAAY,EACxBrH,EAAQ8G,EAAO,QAAQhD,EAAGsD,CAAW,EACrCE,EAAMC,EAEV,KAAOvH,EAAQ,IAAI,CAMf,GALAmH,EAAa,KAAKnH,CAAK,EACvBuH,EAAO,KAAK,SAAST,EAAQF,EAAS5G,EAAQ,EAAGqH,EAAe,EAAGF,CAAY,EAC/EA,EAAa,IAAG,EAGZ,CAACI,EACD,OAAOD,GAGP,CAACA,GAAQA,EAAK,MAAQC,EAAK,SAC3BD,EAAOC,GAGXvH,EAAQ8G,EAAO,QAAQhD,EAAG9D,EAAQ,CAAC,CACvC,CAEA,OAAOsH,CACX,CAEA,eAAeH,EAAc,CACzB,IAAIK,EAAQ,EACRD,EAAO,EAEX,OAAAJ,EAAa,QAAQ,CAACnH,EAAOrB,IAAM,CAC3BA,EAAI,IACAwI,EAAaxI,EAAI,CAAC,EAAI,IAAMqB,EAC5BuH,GAAQA,EAAO,EAGfA,EAAO,GAIfC,GAASD,CACb,CAAC,EAEMC,CACX,CAEA,OAAOV,EAAQW,EAAST,EAAKC,EAAM,CAC/B,IAAIS,EAAWZ,EAAO,UAAU,EAAGW,EAAQ,CAAC,CAAC,EAE7C,OAAAA,EAAQ,QAAQ,CAACzH,EAAOrB,IAAM,CAC1B+I,GAAYV,EAAMF,EAAO9G,CAAK,EAAIiH,EAC9BH,EAAO,UAAU9G,EAAQ,EAAIyH,EAAQ9I,EAAI,CAAC,EAAK8I,EAAQ9I,EAAI,CAAC,EAAImI,EAAO,MAAM,CACrF,CAAC,EAEMY,CACX,CAEA,OAAOd,EAASe,EAAKZ,EAAM,CACvB,OAAAA,EAAOA,GAAQ,CAAA,EACRY,EACF,OAAO,CAACC,EAAM1I,EAAS6E,EAAK4D,IAAQ,CACjC,IAAIvD,EAAMlF,EAEN6H,EAAK,UACL3C,EAAM2C,EAAK,QAAQ7H,CAAO,EAErBkF,IACDA,EAAM,KAId,IAAIsD,EAAW,KAAK,MAAMd,EAASxC,EAAK2C,CAAI,EAE5C,OAAIW,GAAY,OACZE,EAAKA,EAAK,MAAM,EAAI,CAChB,OAAQF,EAAS,SACjB,MAAOA,EAAS,MAChB,MAAO3D,EACP,SAAU7E,CAClC,GAGuB0I,CACX,EAAG,CAAA,CAAE,EAER,KAAK,CAACC,EAAGC,IACQA,EAAE,MAAQD,EAAE,OAEnBA,EAAE,MAAQC,EAAE,KACtB,CACL,CACJ,CAEA,MAAMC,CAAQ,CACZ,YAAY,CACV,OAAAC,EAAS,KACT,OAAA5G,EAAS,KACT,YAAA6G,EAAc,YACd,eAAAC,EAAiB,oBACjB,UAAAC,EAAY,GACZ,QAAA5I,EAAU,IACV,iBAAA6I,EAAmB,GACnB,eAAAC,EAAiB,KACjB,iBAAAC,EAAmB,KACnB,OAAAC,EAAS,MACT,SAAAC,EAAW,QACX,WAAAC,EAAa,KACb,cAAAC,EAAgB,KAChB,gBAAAC,EAAkB,KAClB,oBAAA1G,EAAsB,GACtB,YAAAqB,EAAc,GACd,kBAAAsF,EAAoB,KACpB,aAAAC,EAAe,GACf,kBAAAC,EAAoB,GACpB,WAAAC,EAAa,CAAA,EACb,cAAAC,EAAgB,KAChB,kBAAAC,EAAoB,CACxB,EAAK,CAkBD,GAjBA,KAAK,iBAAmBb,EACxB,KAAK,aAAe,EACpB,KAAK,QAAU,CAAA,EACf,KAAK,WAAa,GAClB,KAAK,SAAW,GAChB,KAAK,cAAgBM,EACrB,KAAK,YAAcpF,EACnB,KAAK,kBAAoBsF,EACzB,KAAK,aAAeC,EACpB,KAAK,iBAAmB,GACxB,KAAK,kBAAoBC,EAErB,KAAK,mBACPvJ,EAAU,GACV+D,EAAc,IAGZ0E,EACF,KAAK,WAAa,CAChB,CAEE,QAASzI,EAGT,OAAQ6B,EAGR,YAAa6G,EAGb,eAAgBC,EAGhB,UAAWC,EAGX,gBACEE,GAAkBN,EAAQ,uBAC1B,KAAK,IAAI,EAGX,kBACEO,GAAoBP,EAAQ,yBAC5B,KAAK,IAAI,EAGX,iBAAkBmB,GACZ,OAAOA,GAAM,SACXA,EAAE,SAAW,GAAW,KACrBA,EAEL,OAAOA,GAAM,WACRA,EAAE,KAAK,IAAI,EAIlBP,GACA,UAAW,CACT,MAAO,0BACT,EAAE,KAAK,IAAI,GAEZA,CAAe,EAGlB,OAAQJ,EAGR,SAAUC,EAGV,OAAQR,EAER,oBAAqB/F,EAErB,WAAY8G,EAEZ,cAAeC,EAEf,kBAAmBC,CAC7B,CACA,UACeR,EACL,KAAK,kBACP,QAAQ,KACN,4DACV,EACM,KAAK,WAAaA,EAAW,IAAI5I,IACxB,CACL,QAASA,EAAK,SAAWN,EACzB,OAAQM,EAAK,QAAUuB,EACvB,YAAavB,EAAK,aAAeoI,EACjC,eAAgBpI,EAAK,gBAAkBqI,EACvC,UAAWrI,EAAK,WAAasI,EAC7B,gBACEtI,EAAK,gBAAkBkI,EAAQ,uBAC/B,KAAK,IAAI,EACX,kBACElI,EAAK,kBAAoBkI,EAAQ,yBACjC,KAAK,IAAI,EAEX,iBAAkBmB,GACZ,OAAOA,GAAM,SACXA,EAAE,SAAW,GAAW,KACrBA,EAEL,OAAOA,GAAM,WACRA,EAAE,KAAK,IAAI,EAIlBP,GACA,UAAW,CACT,MAAO,0BACT,EAAE,KAAK,IAAI,GAEZA,CAAe,EAClB,OAAQ9I,EAAK,QAAU0I,EACvB,SAAU1I,EAAK,UAAY2I,EAC3B,OAAQ3I,EAAK,OACb,oBAAqBA,EAAK,oBAC1B,WAAYA,EAAK,YAAckJ,EAC/B,cAAelJ,EAAK,eAAiBmJ,EACrC,kBAAmBnJ,EAAK,mBAAqBoJ,CACvD,EACO,MAED,OAAM,IAAI,MAAM,oCAAoC,EAGtD,IAAI9H,GAAa,IAAI,EACrB,IAAInC,EAAc,IAAI,EACtB,IAAIyB,GAAkB,IAAI,EAC1B,IAAIkG,GAAc,IAAI,CACxB,CAEA,IAAI,UAAW,CACb,OAAO,KAAK,SACd,CAEA,IAAI,SAASwC,EAAK,CAChB,GAAI,KAAK,WAAaA,IACpB,KAAK,UAAYA,EACb,KAAK,QAAQ,SAAS,CACxB,IAAIC,EAAe,IAAI,YAAY,kBAAkBD,CAAG,EAAE,EAC1D,KAAK,QAAQ,QAAQ,cAAcC,CAAY,CACjD,CAEJ,CAEA,OAAO,sBAAsBvJ,EAAM,CACjC,OAAI,OAAOA,EAAS,IACX,GAAG,KAAK,QAAQ,WAAW,OAAO,GAAG,KAAK,QAAQ,WAAW,GAClE,KAAK,MAAM,kBAAkB,KAAK,QAAQ,OAAO,EAEjD,kCACC,KAAK,QAAQ,WAAW,QACvBA,EAAK,SAAS,KAAK,QAAQ,WAAW,QAAQ,GAChD,UAKF,KAAK,QAAQ,WAAW,QACxBA,EAAK,SAAS,KAAK,QAAQ,WAAW,QAAQ,CAElD,CAEA,OAAO,wBAAwBwJ,EAAW,CACxC,OAAOA,EAAU,MACnB,CAEA,OAAO,YAAa,CAClB,MAAO,CAAC,WAAY,OAAO,CAC7B,CAEA,UAAW,CACT,OAAO,KAAK,WAAW,IAAIxF,GAClBA,EAAO,OACf,CACH,CAEA,OAAOpE,EAAI,CACT,GAAI,CAACA,EACH,MAAM,IAAI,MAAM,gDAAgD,EASlE,GALI,OAAO,OAAW,KAAeA,aAAc,SACjDA,EAAKA,EAAG,IAAG,GAKXA,EAAG,cAAgB,UACnBA,EAAG,cAAgB,gBACnBA,EAAG,cAAgB,MACnB,CACA,IAAIjB,EAASiB,EAAG,OAChB,QAASd,EAAI,EAAGA,EAAIH,EAAQ,EAAEG,EAC5B,KAAK,QAAQc,EAAGd,CAAC,CAAC,CAEtB,MACE,KAAK,QAAQc,CAAE,CAEnB,CAEA,QAAQA,EAAI,CACNA,EAAG,aAAa,cAAc,GAChC,QAAQ,KAAK,gCAAkCA,EAAG,QAAQ,EAG5D,KAAK,eAAeA,CAAE,EACtB,KAAK,OAAO,KAAKA,CAAE,EACnBA,EAAG,aAAa,eAAgB,EAAI,CACtC,CAEA,eAAeP,EAAS,CACtB,GAAI6I,EAAQ,aAAa,QAAQ7I,EAAQ,QAAQ,IAAM,GACrD,GAAIA,EAAQ,gBACVA,EAAQ,gBAAkB,OAE1B,OAAM,IAAI,MAAM,4BAA8BA,EAAQ,QAAQ,CAGpE,CAEA,WAAWgJ,EAAgB,CACzB,IAAIoB,EAAU,KAAK,MAAM,YAAW,EAAG,cAAc,KAAK,EACxDC,EAAK,KAAK,MAAM,YAAW,EAAG,cAAc,IAAI,EAIlD,OAHAD,EAAQ,UAAYpB,EACpBoB,EAAQ,YAAYC,CAAE,EAElB,KAAK,cACA,KAAK,cAAc,YAAYD,CAAO,EAGxC,KAAK,MAAM,YAAW,EAAG,KAAK,YAAYA,CAAO,CAC1D,CAEA,YAAYpK,EAASmC,EAAU,CAE7B,GACE,KAAK,UACL,KAAK,QAAQ,UAAYnC,GACzB,KAAK,QAAQ,cAAgB,KAAK,2BAElC,OAEF,KAAK,2BAA6B,KAAK,QAAQ,YAG1C,KAAK,OACR,KAAK,KAAO,KAAK,WAAW,KAAK,QAAQ,WAAW,cAAc,EAClEA,EAAQ,YAAc,KAAK,KAC3B,KAAK,WAAW,KAAK,KAAK,IAAI,GAGhC,KAAK,SAAW,GAChB,KAAK,aAAe,EAEf,KAAK,QAAQ,cAChB,KAAK,QAAQ,YAAc,IAG7B,MAAMsK,EAAgBxB,GAAU,CAE9B,GAAI,CAAC,KAAK,SACR,OAGF,IAAIyB,EAAQ,KAAK,OAAO,OAAO,KAAK,QAAQ,YAAazB,EAAQ,CAC/D,IAAK,KAAK,QAAQ,WAAW,WAAW,KAAO,SAC/C,KAAM,KAAK,QAAQ,WAAW,WAAW,MAAQ,UACjD,KAAM,KAAK,QAAQ,WAAW,WAAW,KACzC,QAASvI,GAAM,CACb,GAAI,OAAO,KAAK,QAAQ,WAAW,QAAW,SAC5C,OAAOA,EAAG,KAAK,QAAQ,WAAW,MAAM,EACnC,GAAI,OAAO,KAAK,QAAQ,WAAW,QAAW,WACnD,OAAO,KAAK,QAAQ,WAAW,OAAOA,EAAI,KAAK,QAAQ,WAAW,EAElE,MAAM,IAAI,MACR,8DACd,CAEQ,CACR,CAAO,EAEG,KAAK,QAAQ,WAAW,gBAC1BgK,EAAQA,EAAM,MAAM,EAAG,KAAK,QAAQ,WAAW,aAAa,GAG9D,KAAK,QAAQ,cAAgBA,EAE7B,IAAIF,EAAK,KAAK,KAAK,cAAc,IAAI,EAIrC,GAFA,KAAK,MAAM,oBAAoBlI,CAAQ,EAEnC,CAACoI,EAAM,OAAQ,CACjB,IAAIL,EAAe,IAAI,YAAY,mBAAoB,CACrD,OAAQ,KAAK,IACvB,CAAS,EACD,KAAK,QAAQ,QAAQ,cAAcA,CAAY,EAE5C,OAAO,KAAK,QAAQ,WAAW,iBAAoB,YAClD,CAAC,KAAK,QAAQ,WAAW,gBAAe,GAC1C,CAAC,KAAK,QAAQ,WAAW,gBAEzB,KAAK,SAAQ,EAEb,OAAO,KAAK,QAAQ,WAAW,iBAAoB,WAC9CG,EAAG,UAAY,KAAK,QAAQ,WAAW,gBAAe,EACtDA,EAAG,UAAY,KAAK,QAAQ,WAAW,gBAG9C,MACF,CAEAA,EAAG,UAAY,GACf,IAAIG,EAAW,KAAK,MAAM,YAAW,EAAG,uBAAsB,EAE9DD,EAAM,QAAQ,CAAC5J,EAAMG,IAAU,CAC7B,IAAIX,EAAK,KAAK,MAAM,YAAW,EAAG,cAAc,IAAI,EACpDA,EAAG,aAAa,aAAcW,CAAK,EACnCX,EAAG,UAAY,KAAK,QAAQ,WAAW,UACvCA,EAAG,iBAAiB,YAAaM,GAAK,CACpC,GAAI,CAACN,EAAIW,CAAK,EAAI,KAAK,cAAcL,EAAE,MAAM,EACzCA,EAAE,YAAc,GAClB,KAAK,OAAO,YAAYK,CAAK,CAEjC,CAAC,EACG,KAAK,eAAiBA,GACxBX,EAAG,UAAU,IAAI,KAAK,QAAQ,WAAW,WAAW,EAEtDA,EAAG,UAAY,KAAK,QAAQ,WAAW,iBAAiBQ,CAAI,EAC5D6J,EAAS,YAAYrK,CAAE,CACzB,CAAC,EACDkK,EAAG,YAAYG,CAAQ,CACzB,EAEI,OAAO,KAAK,QAAQ,WAAW,QAAW,WAC5C,KAAK,QAAQ,WAAW,OAAO,KAAK,QAAQ,YAAaF,CAAa,EAEtEA,EAAc,KAAK,QAAQ,WAAW,MAAM,CAEhD,CAEA,cAAc/J,EAAI,CAChB,GAAI,CAACA,EAAI,MAAO,CAAA,EAChB,MAAMO,EAAQP,EAAG,aAAa,YAAY,EAC1C,OAAQO,EAA4C,CAACP,EAAIO,CAAK,EAA9C,KAAK,cAAcP,EAAG,UAAU,CAClD,CAEA,sBAAsBP,EAASyK,EAAiB,CAC1CzK,IAAY,SAAS,eACvB,KAAK,gBAAgBA,CAAO,EAG9B,KAAK,QAAQ,WAAa,KAAK,WAAWyK,GAAmB,CAAC,EAC9D,KAAK,QAAQ,gBAAkB,GAC/B,KAAK,QAAQ,QAAUzK,EAEnBA,EAAQ,kBACV,KAAK,mBAAmB,KAAK,QAAQ,WAAW,OAAO,EACpD,KAAK,cAAcA,EAAS,KAAK,QAAQ,WAAW,OAAO,EAEhE,KAAK,YAAYA,CAAO,CAC1B,CAGA,gBAAgBO,EAAI,CAElB,GADAA,EAAG,MAAK,EAEN,OAAO,OAAO,aAAgB,KAC9B,OAAO,SAAS,YAAe,IAC/B,CACA,IAAIqC,EAAQ,SAAS,YAAW,EAChCA,EAAM,mBAAmBrC,CAAE,EAC3BqC,EAAM,SAAS,EAAK,EACpB,IAAIC,EAAM,OAAO,aAAY,EAC7BA,EAAI,gBAAe,EACnBA,EAAI,SAASD,CAAK,CACpB,SAAW,OAAO,SAAS,KAAK,gBAAmB,IAAa,CAC9D,IAAI8H,EAAY,SAAS,KAAK,gBAAe,EAC7CA,EAAU,kBAAkBnK,CAAE,EAC9BmK,EAAU,SAAS,EAAK,EACxBA,EAAU,OAAM,CAClB,CACF,CAGA,mBAAmB5H,EAAM,CACvB,IAAID,EAAKD,EACTC,EAAM,OAAO,aAAY,EACzBD,EAAQC,EAAI,WAAW,CAAC,EACxBD,EAAM,eAAc,EACpB,IAAI+H,EAAW,SAAS,eAAe7H,CAAI,EAC3CF,EAAM,WAAW+H,CAAQ,EACzB/H,EAAM,mBAAmB+H,CAAQ,EACjC/H,EAAM,SAAS,EAAK,EACpBC,EAAI,gBAAe,EACnBA,EAAI,SAASD,CAAK,CACpB,CAGA,cAAcgI,EAAU9H,EAAM,CAC5B,IAAI+H,EAAYD,EAAS,UACrBE,EAAWF,EAAS,eAEpBG,EAAQH,EAAS,MAAM,UAAU,EAAGE,CAAQ,EAC5CE,EAAOJ,EAAS,MAAM,UACxBA,EAAS,aACTA,EAAS,MAAM,MACrB,EACIA,EAAS,MAAQG,EAAQjI,EAAOkI,EAChCF,EAAWA,EAAWhI,EAAK,OAC3B8H,EAAS,eAAiBE,EAC1BF,EAAS,aAAeE,EACxBF,EAAS,MAAK,EACdA,EAAS,UAAYC,CACvB,CAEA,UAAW,CACL,KAAK,OACP,KAAK,KAAK,MAAM,QAAU,iBAC1B,KAAK,SAAW,GAChB,KAAK,aAAe,EACpB,KAAK,QAAU,CAAA,EAEnB,CAEA,kBAAkB/J,EAAOmC,EAAe,CAEtC,GADAnC,EAAQ,SAASA,CAAK,EAClB,OAAOA,GAAU,UAAY,MAAMA,CAAK,EAAG,OAC/C,IAAIH,EAAO,KAAK,QAAQ,cAAcG,CAAK,EACvCmK,EAAU,KAAK,QAAQ,WAAW,eAAetK,CAAI,EACrDsK,IAAY,MAAM,KAAK,YAAYA,EAAShI,EAAetC,CAAI,CACrE,CAEA,YAAYsK,EAAShI,EAAetC,EAAM,CACxC,KAAK,MAAM,mBAAmBsK,EAAS,GAAM,GAAMhI,EAAetC,CAAI,CACxE,CAEA,QAAQ4I,EAAY2B,EAAWC,EAAS,CACtC,GAAI,OAAO5B,EAAW,QAAW,WAC/B,MAAM,IAAI,MAAM,kDAAkD,EACxD4B,EAGV5B,EAAW,OAAS2B,EAFpB3B,EAAW,OAASA,EAAW,OAAO,OAAO2B,CAAS,CAI1D,CAEA,OAAOT,EAAiBS,EAAWC,EAAS,CAC1C,IAAIrK,EAAQ,SAAS2J,CAAe,EACpC,GAAI,OAAO3J,GAAU,SACnB,MAAM,IAAI,MAAM,uDAAuD,EAEzE,IAAIyI,EAAa,KAAK,WAAWzI,CAAK,EAEtC,KAAK,QAAQyI,EAAY2B,EAAWC,CAAO,CAC7C,CAEA,cAAcD,EAAWC,EAAS,CAChC,GAAI,KAAK,SACP,KAAK,QAAQ,KAAK,QAAQ,WAAYD,EAAWC,CAAO,MAExD,OAAM,IAAI,MACR,+DACR,CAEE,CAEA,OAAO5K,EAAI,CACT,GAAI,CAACA,EACH,MAAM,IAAI,MAAM,gDAAgD,EASlE,GALI,OAAO,OAAW,KAAeA,aAAc,SACjDA,EAAKA,EAAG,IAAG,GAKXA,EAAG,cAAgB,UACnBA,EAAG,cAAgB,gBACnBA,EAAG,cAAgB,MACnB,CACA,IAAIjB,EAASiB,EAAG,OAChB,QAASd,EAAI,EAAGA,EAAIH,EAAQ,EAAEG,EAC5B,KAAK,QAAQc,EAAGd,CAAC,CAAC,CAEtB,MACE,KAAK,QAAQc,CAAE,CAEnB,CAEA,QAAQA,EAAI,CACV,KAAK,OAAO,OAAOA,CAAE,EACjBA,EAAG,aACL,KAAK,WAAW,OAAOA,EAAG,WAAW,EAGvC,WAAW,IAAM,CACfA,EAAG,gBAAgB,cAAc,EACjC,KAAK,SAAW,GACZA,EAAG,aACLA,EAAG,YAAY,OAAM,CAEzB,CAAC,CACH,CACF,CCjvDA,MAAM6K,GAAc,CAClB,KAAM,kBAEN,MAAO,CAIL,GAAI,CACF,KAAM,OACN,SAAU,EAChB,EAII,MAAO,CACL,KAAM,OACN,SAAU,GACV,QAAS,IACf,EAII,KAAM,CACJ,KAAM,OACN,SAAU,EAChB,EAII,QAAS,CACP,KAAM,CAAC,OAAQ,IAAI,EACnB,QAAS,IACf,EAII,OAAQ,CACN,KAAM,OACN,SAAU,EAChB,EAII,QAAS,CACP,KAAM,QACN,QAAS,EACf,CACA,EACE,OAAQ,CAEN,MAAO,CACL,YAFkBC,EAAc,CAGtC,CACE,EACA,SAAU,CACR,WAAY,CACV,OAAI,KAAK,QACA,KAAK,QAEP,KAAK,IAAM,KAAK,SAAW,QAAUC,EAAa,KAAK,GAAI,CAAE,YAAa,KAAK,WAAW,CAAE,EAAI,IACzG,EACA,aAAc,CACZ,MAAO,CAAC,KAAK,GAAG,SAAS,GAAG,GAAK,CAAC,KAAK,GAAG,SAAS,GAAG,EAAI,IAAI,KAAK,EAAE,GAAK,KAAK,KAAK,EAAE,GACxF,CACJ,CACA,EACMC,GAAe,CAAE,MAAO,yBAAyB,EACjDC,GAAe,CAAE,MAAO,yBAAyB,EACjDC,GAAe,CAAC,OAAO,EACvBC,GAAe,CACnB,KAAM,OACN,MAAO,wBACT,EACA,SAASC,GAAcC,EAAMC,EAAQC,EAAQC,EAAQC,EAAOC,EAAU,CACpE,OAAOC,EAAS,EAAIC,EAAmB,OAAQ,CAC7C,MAAOC,EAAe,CAAC,iBAAkB,CAAE,0BAA2BN,EAAO,OAAO,CAAE,CAAC,EACvF,gBAAiB,OACrB,EAAK,CACDO,EAAmB,OAAQd,GAAc,CACvCc,EAAmB,OAAQb,GAAc,CACvCa,EAAmB,OAAQ,CACzB,MAAOD,EAAe,CAAC,CAACN,EAAO,KAAM,yBAAyBG,EAAS,UAAY,cAAgB,EAAE,EAAE,EAAG,sBAAsB,CAAC,EACjI,MAAOK,EAAeL,EAAS,UAAY,CAAE,gBAAiB,OAAOA,EAAS,SAAS,GAAG,EAAK,IAAI,CAC7G,EAAW,KAAM,CAAC,EACVI,EAAmB,OAAQ,CACzB,KAAM,UACN,MAAO,wBACP,MAAOP,EAAO,KACxB,EAAW,KAAM,EAAGL,EAAY,CAChC,CAAO,EACDY,EAAmB,OAAQX,GAAca,EAAgBN,EAAS,WAAW,EAAG,CAAC,CACvF,CAAK,CACL,EAAK,CAAC,CACN,CACK,MAACO,GAAkCC,EAAYrB,GAAa,CAAC,CAAC,SAAUO,EAAa,EAAG,CAAC,YAAa,iBAAiB,CAAC,CAAC,EACxHe,EAAgB,uBAAuB,OACvCC,GAAiB,qBAAqB,OACtCC,GAAgB,6CAA6C,OAC7DC,GAAmB,yEAAyE,OAC5FC,GAAqB,gCAAgC,OACrDC,GAAkB,IAAIH,EAAa,IAAIC,EAAgB,IAAIC,EAAkB,IAC7EE,GAAe,IAAI,OAAO,GAAGN,CAAa,GAAGC,EAAc,GAAI,IAAI,EACnEM,GAA0B,IAAI,OAAO,GAAGP,CAAa,GAAGK,EAAe,GAAI,IAAI,EAC/EG,GAAa,CACjB,MAAO,CACL,SAAU,CACR,KAAM,OACN,QAAS,KAAO,CAAA,EACtB,CACA,EACE,QAAS,CAOP,cAAc1N,EAAO,CAGnB,OAFuB2N,GAAW3N,CAAK,EACL,MAAMwN,EAAY,EAAE,IAAKI,GAASA,EAAK,MAAMH,EAAuB,CAAC,EAAE,KAAI,EAC3F,IAAKG,GAAS,CAC9B,GAAI,CAACA,EAAK,WAAW,GAAG,EACtB,OAAOA,EAET,MAAMC,EAAKD,EAAK,MAAM,CAAC,EAAE,QAAQ,WAAY,EAAE,EAC/C,OAAO,KAAK,kBAAkBC,CAAE,CAClC,CAAC,EAAE,KAAK,EAAE,EAAE,QAAQ,QAAS,MAAM,EAAE,QAAQ,WAAY,GAAG,CAC9D,EAOA,aAAapC,EAAS,CACpB,IAAInI,EAAOmI,EACX,OAAAnI,EAAOA,EAAK,QAAQ,UAAW;AAAA,CAAI,EACnCA,EAAOA,EAAK,QAAQ,YAAa,GAAG,EACpCA,EAAOA,EAAK,QAAQ,WAAY,GAAG,EACnCA,EAAOA,EAAK,QAAQ,aAAc;AAAA,CAAI,EACtCA,EAAOwK,EAAUxK,EAAM,OAAO,EAC9BA,EAAOwK,EAAUxK,CAAI,EACdA,CACT,EAOA,kBAAkBtD,EAAO,CACvB,GAAI,OAAOA,EAAU,IACnB,MAAO,GAAG,KAAK,oBAAoB,QAAQ,WAAW,OAAO,GAAG,KAAK,oBAAoB,QAAQ,WAAW,GAE9G,MAAM+N,EAAO,KAAK,SAAS/N,CAAK,EAChC,OAAK+N,EAGE,KAAK,oBAAoBA,EAAMf,EAAe,EAAE,QAAQ,YAAa,EAAE,EAAE,QAAQ,SAAU,IAAI,EAF7F,CAAC,IAAK,IAAK,GAAG,EAAE,MAAOgB,GAAS,CAAChO,EAAM,SAASgO,CAAI,CAAC,EAAI,IAAIhO,CAAK,GAAK,KAAKA,CAAK,GAG5F,EAQA,oBAAoBiO,EAAOC,EAAW,CACpC,MAAMC,EAAOC,EAAUF,EAAW,CAChC,GAAGD,CACX,CAAO,EACKI,EAAQ,SAAS,cAAc,KAAK,EAC1CA,EAAM,MAAM,QAAU,OACtB,SAAS,KAAK,YAAYA,CAAK,EAC/BF,EAAK,MAAME,CAAK,EAChB,MAAMC,EAAeD,EAAM,UAC3B,OAAAF,EAAK,QAAO,EACZE,EAAM,OAAM,EACLC,CACT,CACJ,CACA,EACMC,GAAc,CAClB,KAAM,uBACN,WAAY,CACV,iBAAAC,CACJ,EAEE,MAAO,CAIL,MAAO,CACL,KAAM,OACN,SAAU,GACV,QAAS,IACf,EAII,QAAS,CACP,KAAM,OACN,QAAS,IACf,EAII,GAAI,CACF,KAAM,OACN,QAAS,IACf,EAII,KAAM,CACJ,KAAM,OACN,SAAU,EAChB,EAII,QAAS,CACP,KAAM,OACN,QAAS,IACf,EAII,OAAQ,CACN,KAAM,OACN,SAAU,EAChB,EAII,OAAQ,CACN,KAAM,CAAC,OAAQ,KAAK,EACpB,QAAS,KAAO,CAAA,EACtB,CACA,EACE,OAAQ,CAEN,MAAO,CACL,YAFkB3C,EAAc,CAGtC,CACE,EACA,SAAU,CACR,WAAY,CACV,OAAI,KAAK,QACA,KAAK,QAEP,KAAK,IAAM,KAAK,SAAW,QAAUC,EAAa,KAAK,GAAI,CAAE,YAAa,KAAK,WAAW,CAAE,EAAI,IACzG,CACJ,CACA,EACM2C,GAAe,CAAE,MAAO,qBAAqB,EAC7CC,GAAe,CACnB,IAAK,EACL,MAAO,+DACT,EACMC,GAAa,CAAE,MAAO,8BAA8B,EACpDC,GAAa,CAAC,OAAO,EACrBC,GAAa,CACjB,IAAK,EACL,MAAO,8BACT,EACA,SAASC,GAAc1C,EAAMC,EAAQC,EAAQC,EAAQC,EAAOC,EAAU,CACpE,MAAMsC,EAA8BC,EAAiB,kBAAkB,EACvE,OAAOtC,EAAS,EAAIC,EAAmB,MAAO8B,GAAc,CAC1D5B,EAAmB,MAAO,CACxB,MAAOD,EAAe,CAAC,CAACN,EAAO,KAAM,8BAA8BG,EAAS,UAAY,cAAgB,EAAE,EAAE,EAAG,2BAA2B,CAAC,EAC3I,MAAOK,EAAeL,EAAS,UAAY,CAAE,gBAAiB,OAAOA,EAAS,SAAS,GAAG,EAAK,IAAI,CACzG,EAAO,CACDH,EAAO,OAAO,MAAQI,EAAS,EAAIC,EAAmB,OAAQ+B,GAAc3B,EAAgBT,EAAO,QAAUA,EAAO,OAAO,MAAQ,EAAE,EAAG,CAAC,GAAKA,EAAO,OAAO,QAAUA,EAAO,OAAO,SAAW,WAAaI,EAAS,EAAIuC,EAAYF,EAA6B,CAChQ,IAAK,EACL,MAAO,8BACP,OAAQzC,EAAO,OAAO,MAC9B,EAAS,KAAM,EAAG,CAAC,QAAQ,CAAC,GAAK4C,EAAmB,GAAI,EAAI,CAC5D,EAAO,CAAC,EACJrC,EAAmB,OAAQ8B,GAAY,CACrC9B,EAAmB,OAAQ,CACzB,MAAO,6BACP,MAAOP,EAAO,KACtB,EAASS,EAAgBT,EAAO,KAAK,EAAG,EAAGsC,EAAU,EAC/CtC,EAAO,SAAWI,EAAS,EAAIC,EAAmB,OAAQkC,GAAY9B,EAAgBT,EAAO,OAAO,EAAG,CAAC,GAAK4C,EAAmB,GAAI,EAAI,CAC9I,CAAK,CACL,CAAG,CACH,CACK,MAACC,GAAuClC,EAAYsB,GAAa,CAAC,CAAC,SAAUO,EAAa,EAAG,CAAC,YAAa,iBAAiB,CAAC,CAAC,EACnIM,EAASC,GAAKC,CAAG,EACjB,MAAMC,GAAS,CACb,uBAAwB,8BACxB,oBAAqB,2BACrB,0BAA2B,iCAC3B,mCAAoC,0CACpC,iCAAkC,wCAClC,0BAA2B,iCAC3B,yBAA0B,gCAC1B,eAAgB,sBAChB,sBAAuB,6BACvB,qBAAsB,2BACxB,EACMC,GAAmB,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAG,EAC9EC,EAAa,CAAA,EACnBD,GAAiB,QAASxB,GAAS,CACjCyB,EAAW,KAAK,IAAMzB,CAAI,EAC1ByB,EAAW,KAAK,KAAOzB,CAAI,CAC7B,CAAC,EACD,IAAI0B,EAA2B,KAC/B,MAAMC,GAAY,CAChB,KAAM,wBACN,OAAQ,CAACjC,EAAU,EACnB,aAAc,GACd,MAAO,CAIL,GAAI,CACF,KAAM,OACN,QAAS,IAAMkC,EAAe,CACpC,EAII,MAAO,CACL,KAAM,OACN,QAAS,EACf,EAII,WAAY,CACV,KAAM,OACN,SAAU,EAChB,EAII,YAAa,CACX,KAAM,OACN,QAASpF,EAAE,mBAAmB,CACpC,EAII,aAAc,CACZ,KAAM,SACN,QAAS,IAAM,CAAA,CACrB,EAKI,cAAe,CACb,KAAM,CAAC,OAAQ,QAAS,IAAI,EAC5B,QAAS,IACf,EAQI,UAAW,CACT,KAAM,QACN,QAAS,EACf,EAII,gBAAiB,CACf,KAAM,QACN,QAAS,EACf,EAII,SAAU,CACR,KAAM,QACN,QAAS,EACf,EAII,UAAW,CACT,KAAM,OACN,QAAS,IACf,EAII,kBAAmB,CACjB,KAAM,QACN,QAAS,EACf,EAII,iBAAkB,CAChB,KAAM,QACN,QAAS,EACf,EAII,MAAO,CACL,KAAM,CAAC,OAAQ,MAAO,MAAM,EAC5B,QAAS,EACf,CACA,EACE,MAAO,CACL,QACA,oBACA,oBACA,QACJ,EACE,OAAQ,CACN,MAAMqF,EAAY,IAAI,KAAK,UAC3B,GAAIH,IAA6B,KAC/B,GAAI,CACF,SAAS,cAAc,KAAK,EAAE,gBAAkB,iBAChDA,EAA2B,EAC7B,OAASI,EAAO,CACdC,EAAO,MAAM,uDAAwD,CAAE,MAAAD,CAAK,CAAE,EAC9EJ,EAA2B,EAC7B,CAEF,MAAO,CAEL,QAASE,EAAe,EACxB,UAAWA,EAAe,EAC1B,UAAAC,EAMA,QAAS,KACT,6BAA8B,IACpC,CACE,EACA,MAAO,CACL,MAAO,CAIL,WAAY,KAAK,WAEjB,YAAa,GAEb,mBAAoB,GACpB,qBAAsB,OACtB,yBAA0B,EAChC,CACE,EACA,SAAU,CAMR,cAAe,CACb,MAAO,CAAC,KAAK,YAAc,KAAK,WAAW,KAAI,IAAO,EACxD,EAMA,iBAAkB,CAChB,OAAI,KAAK,cAAgB,CAAC,KAAK,UACtB,GAEM,CAAC,GAAG,KAAK,UAAU,QAAQ,KAAK,UAAU,CAAC,EAAE,OAC5C,KAAK,SACvB,EAMA,eAAgB,CACd,OAAK,KAAK,gBAGHG,GAAE,wCAAyC,yCAA0C,KAAK,SAAS,EAFjG,IAGX,EAQA,+BAAgC,CAC9B,OAAI,KAAK,iBAAmB,CAAC,KAAK,SACzBN,EAA2B,iBAAmB,OAEhD,OACT,EAIA,uBAAwB,CACtB,OAAOO,EAAS,MAAOC,EAAQC,IAAa,CAC1C,KAAK,aAAaD,EAAQC,CAAQ,CACpC,EAAG,GAAG,CACR,CACJ,EACE,MAAO,CAKL,YAAa,CACX,MAAMpM,EAAO,KAAK,MAAM,gBAAgB,UACpC,KAAK,WAAW,KAAI,IAAO,KAAK,aAAaA,CAAI,EAAE,QACrD,KAAK,cAAc,KAAK,UAAU,CAEtC,CACJ,EACE,SAAU,CACR,KAAK,kBAAiB,EACtB,KAAK,cAAc,KAAK,UAAU,CACpC,EACA,eAAgB,CACV,KAAK,SACP,KAAK,QAAQ,OAAO,KAAK,MAAM,eAAe,EAE5C,KAAK,8BACP,KAAK,6BAA6B,WAAU,CAEhD,EACA,QAAS,CAMP,OAAQ,CACN,KAAK,MAAM,gBAAgB,MAAK,CAClC,EACA,mBAAoB,CAClB,MAAMqM,EAAkB3E,GAAY,YAAYmE,EAAe,CAAE,YAAY,KAAK,OAAO,cAAc,CAAC,mBAAmBnE,CAAO,SAC5H4E,EAAqB,CAAA,EAC3BA,EAAmB,KAAK,CACtB,SAAU,KAEV,OAASC,GAAW,GAAGA,EAAO,EAAE,IAAIA,EAAO,OAASA,EAAO,KAAK,GAChE,oBAAqB,GAErB,iBAAmBnP,GAASiP,EAAe,KAAK,oBAAoBjP,EAAK,SAAUgO,EAAoB,CAAC,EAExG,gBAAiB,IAAM,+BAEvB,eAAiBhO,GAAS,KAAK,kBAAkBA,GAAM,UAAU,EAAE,EAEnE,OAAQ,KAAK,sBAEb,eAAgB,GAAG,KAAK,OAAO,mBAAmB,CAAC,IAAI,KAAK,OAAO,gCAAgC,CAAC,GAEpG,UAAW,KAAK,OAAO,yBAAyB,CACxD,CAAO,EACG,KAAK,mBACPkP,EAAmB,KAAK,CACtB,QAAS,IAGT,OAAQ,CAACC,EAAQC,IAAUA,EAC3B,oBAAqB,GAErB,iBAAmBpP,GACbsO,EAAW,SAAStO,EAAK,QAAQ,EAC5BA,EAAK,SAEPiP,EAAe,gBAAgB,KAAK,OAAO,qBAAqB,CAAC,KAAKjP,EAAK,SAAS,MAAM,YAAYA,EAAK,SAAS,UAAU,EAAE,EAGzI,gBAAiB,IAAMqJ,EAAE,gBAAgB,EAEzC,eAAiBrJ,GACXsO,EAAW,SAAStO,EAAK,QAAQ,EAC5BA,EAAK,UAEdqP,GAAerP,EAAK,QAAQ,EACrBA,EAAK,SAAS,QAGvB,OAAQ,CAACmC,EAAMmN,IAAO,CACpB,MAAMC,EAAeC,GAAYrN,CAAI,EACjCmM,EAAW,SAAS,IAAMnM,CAAI,GAChCoN,EAAa,QAAQ,IAAMpN,CAAI,EAEjCmN,EAAGC,CAAY,CACjB,EAEA,eAAgB,GAAG,KAAK,OAAO,mBAAmB,CAAC,IAAI,KAAK,OAAO,yBAAyB,CAAC,GAE7F,UAAW,KAAK,OAAO,yBAAyB,CAC1D,CAAS,EAEC,KAAK,kBACPL,EAAmB,KAAK,CACtB,QAAS,IAGT,OAAQ,CAACC,EAAQC,IAAUA,EAC3B,oBAAqB,GAErB,iBAAmBpP,GAASiP,EAAe,eAAe,KAAK,OAAO,oBAAoB,CAAC,UAAUjP,EAAK,SAAS,QAAQ,mBAAmB,KAAK,OAAO,qBAAqB,CAAC,KAAKA,EAAK,SAAS,KAAK,SAAS,EAEjN,gBAAiB,IAAMqJ,EAAE,wBAAwB,EACjD,eAAgB,KAAK,QAErB,OAAQ,CAAClH,EAAMmN,IAAOA,EAAGG,GAAetN,CAAI,CAAC,EAE7C,eAAgB,GAAG,KAAK,OAAO,mBAAmB,CAAC,IAAI,KAAK,OAAO,wBAAwB,CAAC,GAE5F,UAAW,KAAK,OAAO,yBAAyB,CAC1D,CAAS,EAEH,MAAM0G,EAAgB,OAAO,KAAK,eAAkB,SAAW,SAAS,cAAc,KAAK,aAAa,EAAI,KAAK,cACjH,KAAK,QAAU,IAAIX,EAAQ,CACzB,WAAYgH,EAGZ,YAAa,GAEb,cAAArG,CACR,CAAO,EACD,KAAK,QAAQ,OAAO,KAAK,MAAM,eAAe,EAC9C,KAAK,MAAM,gBAAgB,gBAAkB,KAAK,6BACpD,EACA,QAAQ7I,EAAM,CACZ,OAAA0P,GAAkB1P,EAAK,SAAS,EAAE,EAAE,KAAMmP,GAAW,CACnD,MAAMQ,EAAU,SAAS,eAAe,8BAA8B,EAChEC,EAAY,CAChB,OAAAT,EACA,WAAY,EACtB,EAEQ,GADA,KAAK,MAAM,oBAAqBS,CAAS,EACrCA,EAAU,WAAY,CACxB,MAAMC,EAAU,SAAS,eAAeV,CAAM,EAC9CQ,EAAQ,YAAYE,CAAO,EAC3B,KAAK,eAAeA,CAAO,EAC3B,KAAK,YAAY,KAAK,MAAM,gBAAgB,SAAS,CACvD,MACEF,EAAQ,OAAM,CAElB,CAAC,EAAE,MAAOhB,GAAU,CAClBC,EAAO,MAAM,yDAA0D,CAAE,MAAAD,CAAK,CAAE,EAChF,MAAMgB,EAAU,SAAS,eAAe,8BAA8B,EACtE,KAAK,eAAeA,CAAO,EAC3BA,EAAQ,OAAM,CAChB,CAAC,EACM,iDACT,EACA,eAAetQ,EAAS,CACtB,MAAM4C,EAAQ,SAAS,YAAW,EAClCA,EAAM,YAAY5C,CAAO,EACzB4C,EAAM,SAAQ,EACd,MAAM6N,EAAY,OAAO,aAAY,EACrCA,EAAU,gBAAe,EACzBA,EAAU,SAAS7N,CAAK,CAC1B,EACA,iBAAkB,CAIhB,GAHI,CAAC,SAAS,aAGV,OAAO,aAAY,EAAG,WAAa,GAAK,KAAK,MAAM,gBAAgB,SAAS,OAAO,aAAY,EAAG,WAAW,CAAC,EAAE,uBAAuB,EACzI,OAEF,MAAMA,EAAQ,SAAS,YAAW,EAClCA,EAAM,mBAAmB,KAAK,MAAM,eAAe,EACnDA,EAAM,SAAS,EAAK,EACpB,MAAM6N,EAAY,OAAO,aAAY,EACrCA,EAAU,gBAAe,EACzBA,EAAU,SAAS7N,CAAK,CAC1B,EAMA,QAAQjD,EAAO,CACb,KAAK,YAAYA,EAAM,OAAO,SAAS,CACzC,EAQA,QAAQA,EAAO,CACb,GAAI,EAAA,CAAC,KAAK,iBAAmB,KAAK,UAGlC,IAAIuP,EACF,KAAK,MAAM,QAASvP,CAAK,MACpB,CACLA,EAAM,eAAc,EACpB,MAAM+Q,EAAgB/Q,EAAM,cAE5B,GADA,KAAK,MAAM,QAASA,CAAK,EACrB+Q,EAAc,MAAM,SAAW,GAAK,CAAC,OAAO,OAAOA,EAAc,KAAK,EAAE,KAAM/P,GAASA,GAAM,KAAK,WAAW,MAAM,CAAC,EACtH,OAEF,MAAMmC,EAAO4N,EAAc,QAAQ,MAAM,EAEnC9N,EADY,OAAO,aAAY,EACb,WAAW,CAAC,EACpCA,EAAM,eAAc,EACpBA,EAAM,WAAW,SAAS,eAAeE,CAAI,CAAC,EAC9CF,EAAM,SAAS,EAAK,CACtB,CACA,KAAK,YAAY,KAAK,MAAM,gBAAgB,SAAS,CAAA,CACvD,EAMA,YAAY+N,EAAY,CACtB,MAAM7N,EAAO,KAAK,aAAa6N,CAAU,EAAE,QAAQ,OAAQ,EAAE,EAC7D,KAAK,WAAa7N,EAClB,KAAK,MAAM,oBAAqBA,CAAI,CACtC,EAMA,cAActD,EAAO,CACnB,MAAMoR,EAAkB,KAAK,cAAcpR,CAAK,EAChD,KAAK,MAAM,gBAAgB,UAAYoR,EACvC,KAAK,WAAapR,CACpB,EAMA,QAAQG,EAAO,CACT,KAAK,WAAa,KAAK,iBAAmB,KAAK,QAAQ,UAAY,KAAK,cAG5EA,EAAM,eAAc,EACpBA,EAAM,gBAAe,EACrB,KAAK,MAAM,SAAUA,CAAK,EAC5B,EAMA,YAAYA,EAAO,CACb,KAAK,iBAGT,KAAK,MAAM,SAAUA,CAAK,CAC5B,EACA,QAAQA,EAAO,CACbA,EAAM,yBAAwB,CAChC,EACA,SAASA,EAAO,CACV,KAAK,SAAW,KAAK,qBACvBA,EAAM,yBAAwB,EAC9B,KAAK,QAAQ,SAAQ,EAEzB,EAMA,qBAAsB,CACpB,OAAO,KAAK,QAAQ,IACtB,EAMA,wBAAyB,CACvB,OAAO,KAAK,sBAAsB,cAAc,0DAA0D,CAC5G,EAMA,gBAAgBkR,EAAU,CACxB,KAAK,mBAAqBA,EACtBA,GACF,KAAK,oBAAmB,EAAG,aAAa,QAAS,KAAK,QAAQ,QAAQ,WAAW,gBAAkB,KAAK,OAAO,mBAAmB,CAAC,EACnI,KAAK,wBAAuB,EAC5B,SAAS,oBAAoB,QAAS,KAAK,YAAa,EAAI,IAE5D,KAAK,sBAAsB,MAAK,EAChC,KAAK,qBAAuB,OAC5B,KAAK,uBAAuB,EAAK,EAErC,EACA,uBAAwB,CACjB,KAAK,qBAGV,KAAK,uBAAuB,EAAI,EAChC,KAAK,gCAA+B,EACtC,EACA,iCAAkC,CAChC,sBAAsB,IAAM,CAC1B,KAAK,qBAAuB,KAAK,uBAAsB,GAAI,EAC7D,CAAC,CACH,EACA,yBAA0B,CACxB,GAAI,KAAK,yBACP,OAEF,KAAK,yBAA2B,GAChC,MAAMC,EAAmB,KAAK,oBAAmB,EACjDA,EAAiB,GAAK,KAAK,UAC3BA,EAAiB,aAAa,OAAQ,SAAS,EACpCA,EAAiB,SAAS,CAAC,EACnC,aAAa,OAAQ,cAAc,EACtC,KAAK,6BAA+B,IAAI,iBAAiB,CAAC,CAAC,CAAE,OAAAC,CAAM,CAAE,IAAM,CACrEA,EAAO,MAAM,UAAY,QAC3B,KAAK,gCAA+B,CAExC,CAAC,EAAE,QAAQD,EAAkB,CAC3B,WAAY,GACZ,gBAAiB,CAAC,OAAO,CACjC,CAAO,EACDA,EAAiB,iBAAiB,YAAa,IAAM,CACnD,KAAK,uBAAuB,EAAK,EACjC,KAAK,gCAA+B,CACtC,EAAG,CAAE,QAAS,GAAM,CACtB,EASA,uBAAuBE,EAAkB,CACnCA,EACF,KAAK,oBAAmB,EAAG,UAAU,IAAI,KAAK,OAAO,kCAAkC,CAAC,EAExF,KAAK,oBAAmB,EAAG,UAAU,OAAO,KAAK,OAAO,kCAAkC,CAAC,CAE/F,EAQA,YAAY3Q,EAAS,CACnB,KAAK,MAAK,EACV,MAAMS,EAAQ,KAAK,QAAQ,WAAW,UAAWyI,GAAeA,EAAW,UAAYlJ,CAAO,EAC9F,KAAK,QAAQ,sBAAsB,KAAK,MAAM,gBAAiBS,CAAK,EACpE,KAAK,YAAY,KAAK,MAAM,gBAAgB,SAAS,EACrD,SAAS,iBAAiB,QAAS,KAAK,YAAa,EAAI,CAC3D,EAKA,aAAc,CACZ,KAAK,QAAQ,SAAQ,EACrB,SAAS,oBAAoB,QAAS,KAAK,YAAa,EAAI,CAC9D,CACJ,CACA,EACMmQ,GAAa,CAAC,KAAM,kBAAmB,kBAAmB,mBAAoB,gBAAiB,gBAAiB,wBAAyB,OAAO,EAChJC,GAAa,CAAC,IAAI,EACxB,SAASC,GAAYvF,EAAMC,EAAQC,EAAQC,EAAQC,EAAOC,EAAU,CAClE,OAAOC,EAAS,EAAIC,EAAmB,MAAO,CAC5C,MAAOC,EAAe,CAAC,uBAAwBR,EAAK,OAAO,KAAK,CAAC,CACrE,EAAK,CACDS,EAAmB,MAAO+E,EAAW,CACnC,GAAItF,EAAO,GACX,IAAK,kBACL,MAAO,CAAC,CACN,qCAAsCG,EAAS,aAC/C,yCAA0CH,EAAO,UACjD,yCAA0CA,EAAO,MACjD,wCAAyCG,EAAS,gBAClD,wCAAyCH,EAAO,QACxD,EAAS,6BAA6B,EAChC,gBAAiBG,EAAS,8BAC1B,kBAAmBH,EAAO,MAAQC,EAAO,QAAU,OACnD,mBAAoBD,EAAO,YAC3B,iBAAkB,OAClB,KAAM,UACN,gBAAiB,UACjB,oBAAqB,SACrB,gBAAiBC,EAAO,UACxB,gBAAiBC,EAAM,mBAAqB,OAAS,QACrD,wBAAyBA,EAAM,qBAC/B,MAAOC,EAAS,aACtB,EAAOL,EAAK,OAAQ,CACd,QAASC,EAAO,CAAC,IAAMA,EAAO,CAAC,EAAI,IAAI/J,IAASmK,EAAS,iBAAmBA,EAAS,gBAAgB,GAAGnK,CAAI,GAC5G,QAAS+J,EAAO,CAAC,IAAMA,EAAO,CAAC,EAAI,IAAI/J,IAASmK,EAAS,SAAWA,EAAS,QAAQ,GAAGnK,CAAI,GAC5F,mBAAoB+J,EAAO,CAAC,IAAMA,EAAO,CAAC,EAAKwF,GAAWrF,EAAM,YAAc,IAC9E,iBAAkBH,EAAO,CAAC,IAAMA,EAAO,CAAC,EAAKwF,GAAWrF,EAAM,YAAc,IAC5E,iBAAkBH,EAAO,CAAC,IAAMA,EAAO,CAAC,EAAIyF,EAAS,IAAIxP,IAASmK,EAAS,UAAYA,EAAS,SAAS,GAAGnK,CAAI,EAAG,CAAC,KAAK,CAAC,GAC1H,UAAW,CACT+J,EAAO,CAAC,IAAMA,EAAO,CAAC,EAAIyF,EAASC,EAAc,IAAIzP,IAASmK,EAAS,SAAWA,EAAS,QAAQ,GAAGnK,CAAI,EAAG,CAAC,OAAO,CAAC,EAAG,CAAC,OAAO,CAAC,GAClI+J,EAAO,CAAC,IAAMA,EAAO,CAAC,EAAIyF,EAASC,EAAc,IAAIzP,IAASmK,EAAS,aAAeA,EAAS,YAAY,GAAGnK,CAAI,EAAG,CAAC,OAAQ,QAAS,OAAQ,SAAS,CAAC,EAAG,CAAC,OAAO,CAAC,GACrK+J,EAAO,CAAC,IAAMA,EAAO,CAAC,EAAIyF,EAASC,EAAc,IAAIzP,IAASmK,EAAS,uBAAyBA,EAAS,sBAAsB,GAAGnK,CAAI,EAAG,CAAC,QAAS,MAAM,CAAC,EAAG,CAAC,IAAI,CAAC,GACnK+J,EAAO,EAAE,IAAMA,EAAO,EAAE,EAAIyF,EAASC,EAAc,IAAIzP,IAASmK,EAAS,uBAAyBA,EAAS,sBAAsB,GAAGnK,CAAI,EAAG,CAAC,QAAS,MAAM,CAAC,EAAG,CAAC,MAAM,CAAC,EAC/K,EACM,QAAS+J,EAAO,CAAC,IAAMA,EAAO,CAAC,EAAI,IAAI/J,IAASmK,EAAS,SAAWA,EAAS,QAAQ,GAAGnK,CAAI,GAC5F,eAAgB+J,EAAO,CAAC,IAAMA,EAAO,CAAC,EAAI0F,EAAc,IAAIzP,IAASmK,EAAS,SAAWA,EAAS,QAAQ,GAAGnK,CAAI,EAAG,CAAC,OAAQ,SAAS,CAAC,GACvI,oBAAqB+J,EAAO,EAAE,IAAMA,EAAO,EAAE,EAAKwF,GAAWpF,EAAS,gBAAgB,EAAI,GAC1F,qBAAsBJ,EAAO,EAAE,IAAMA,EAAO,EAAE,EAAKwF,GAAWpF,EAAS,gBAAgB,EAAK,EAClG,CAAK,EAAG,KAAM,GAAIgF,EAAU,EACxBnF,EAAO,OAASI,IAAaC,EAAmB,MAAO,CACrD,IAAK,EACL,GAAIJ,EAAO,QACX,MAAO,6BACb,EAAOQ,EAAgBT,EAAO,KAAK,EAAG,EAAGoF,EAAU,GAAKxC,EAAmB,GAAI,EAAI,CACnF,EAAK,CAAC,CACN,CACA,MAAM8C,GAAa,CACjB,OAAUzC,EACZ,EACM0C,GAAwChF,EAAY0C,GAAW,CAAC,CAAC,SAAUgC,EAAW,EAAG,CAAC,eAAgBK,EAAU,EAAG,CAAC,YAAa,iBAAiB,CAAC,CAAC","x_google_ignoreList":[0,1]}