index.cjs.map 209 KB

1
  1. {"version":3,"file":"index.cjs","sources":["../node_modules/marked/lib/marked.esm.js","../node_modules/@floating-ui/utils/dist/floating-ui.utils.mjs","../node_modules/@floating-ui/core/dist/floating-ui.core.mjs","../node_modules/@floating-ui/utils/dist/floating-ui.utils.dom.mjs","../node_modules/@floating-ui/dom/dist/floating-ui.dom.mjs","../src/index.ts","../src/widgetHtmlString.ts"],"sourcesContent":["/**\n * marked v12.0.0 - a markdown parser\n * Copyright (c) 2011-2024, Christopher Jeffrey. (MIT Licensed)\n * https://github.com/markedjs/marked\n */\n\n/**\n * DO NOT EDIT THIS FILE\n * The code in this file is generated from files in ./src/\n */\n\n/**\n * Gets the original marked default options.\n */\nfunction _getDefaults() {\n return {\n async: false,\n breaks: false,\n extensions: null,\n gfm: true,\n hooks: null,\n pedantic: false,\n renderer: null,\n silent: false,\n tokenizer: null,\n walkTokens: null\n };\n}\nlet _defaults = _getDefaults();\nfunction changeDefaults(newDefaults) {\n _defaults = newDefaults;\n}\n\n/**\n * Helpers\n */\nconst escapeTest = /[&<>\"']/;\nconst escapeReplace = new RegExp(escapeTest.source, 'g');\nconst escapeTestNoEncode = /[<>\"']|&(?!(#\\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\\w+);)/;\nconst escapeReplaceNoEncode = new RegExp(escapeTestNoEncode.source, 'g');\nconst escapeReplacements = {\n '&': '&amp;',\n '<': '&lt;',\n '>': '&gt;',\n '\"': '&quot;',\n \"'\": '&#39;'\n};\nconst getEscapeReplacement = (ch) => escapeReplacements[ch];\nfunction escape$1(html, encode) {\n if (encode) {\n if (escapeTest.test(html)) {\n return html.replace(escapeReplace, getEscapeReplacement);\n }\n }\n else {\n if (escapeTestNoEncode.test(html)) {\n return html.replace(escapeReplaceNoEncode, getEscapeReplacement);\n }\n }\n return html;\n}\nconst unescapeTest = /&(#(?:\\d+)|(?:#x[0-9A-Fa-f]+)|(?:\\w+));?/ig;\nfunction unescape(html) {\n // explicitly match decimal, hex, and named HTML entities\n return html.replace(unescapeTest, (_, n) => {\n n = n.toLowerCase();\n if (n === 'colon')\n return ':';\n if (n.charAt(0) === '#') {\n return n.charAt(1) === 'x'\n ? String.fromCharCode(parseInt(n.substring(2), 16))\n : String.fromCharCode(+n.substring(1));\n }\n return '';\n });\n}\nconst caret = /(^|[^\\[])\\^/g;\nfunction edit(regex, opt) {\n let source = typeof regex === 'string' ? regex : regex.source;\n opt = opt || '';\n const obj = {\n replace: (name, val) => {\n let valSource = typeof val === 'string' ? val : val.source;\n valSource = valSource.replace(caret, '$1');\n source = source.replace(name, valSource);\n return obj;\n },\n getRegex: () => {\n return new RegExp(source, opt);\n }\n };\n return obj;\n}\nfunction cleanUrl(href) {\n try {\n href = encodeURI(href).replace(/%25/g, '%');\n }\n catch (e) {\n return null;\n }\n return href;\n}\nconst noopTest = { exec: () => null };\nfunction splitCells(tableRow, count) {\n // ensure that every cell-delimiting pipe has a space\n // before it to distinguish it from an escaped pipe\n const row = tableRow.replace(/\\|/g, (match, offset, str) => {\n let escaped = false;\n let curr = offset;\n while (--curr >= 0 && str[curr] === '\\\\')\n escaped = !escaped;\n if (escaped) {\n // odd number of slashes means | is escaped\n // so we leave it alone\n return '|';\n }\n else {\n // add space before unescaped |\n return ' |';\n }\n }), cells = row.split(/ \\|/);\n let i = 0;\n // First/last cell in a row cannot be empty if it has no leading/trailing pipe\n if (!cells[0].trim()) {\n cells.shift();\n }\n if (cells.length > 0 && !cells[cells.length - 1].trim()) {\n cells.pop();\n }\n if (count) {\n if (cells.length > count) {\n cells.splice(count);\n }\n else {\n while (cells.length < count)\n cells.push('');\n }\n }\n for (; i < cells.length; i++) {\n // leading or trailing whitespace is ignored per the gfm spec\n cells[i] = cells[i].trim().replace(/\\\\\\|/g, '|');\n }\n return cells;\n}\n/**\n * Remove trailing 'c's. Equivalent to str.replace(/c*$/, '').\n * /c*$/ is vulnerable to REDOS.\n *\n * @param str\n * @param c\n * @param invert Remove suffix of non-c chars instead. Default falsey.\n */\nfunction rtrim(str, c, invert) {\n const l = str.length;\n if (l === 0) {\n return '';\n }\n // Length of suffix matching the invert condition.\n let suffLen = 0;\n // Step left until we fail to match the invert condition.\n while (suffLen < l) {\n const currChar = str.charAt(l - suffLen - 1);\n if (currChar === c && !invert) {\n suffLen++;\n }\n else if (currChar !== c && invert) {\n suffLen++;\n }\n else {\n break;\n }\n }\n return str.slice(0, l - suffLen);\n}\nfunction findClosingBracket(str, b) {\n if (str.indexOf(b[1]) === -1) {\n return -1;\n }\n let level = 0;\n for (let i = 0; i < str.length; i++) {\n if (str[i] === '\\\\') {\n i++;\n }\n else if (str[i] === b[0]) {\n level++;\n }\n else if (str[i] === b[1]) {\n level--;\n if (level < 0) {\n return i;\n }\n }\n }\n return -1;\n}\n\nfunction outputLink(cap, link, raw, lexer) {\n const href = link.href;\n const title = link.title ? escape$1(link.title) : null;\n const text = cap[1].replace(/\\\\([\\[\\]])/g, '$1');\n if (cap[0].charAt(0) !== '!') {\n lexer.state.inLink = true;\n const token = {\n type: 'link',\n raw,\n href,\n title,\n text,\n tokens: lexer.inlineTokens(text)\n };\n lexer.state.inLink = false;\n return token;\n }\n return {\n type: 'image',\n raw,\n href,\n title,\n text: escape$1(text)\n };\n}\nfunction indentCodeCompensation(raw, text) {\n const matchIndentToCode = raw.match(/^(\\s+)(?:```)/);\n if (matchIndentToCode === null) {\n return text;\n }\n const indentToCode = matchIndentToCode[1];\n return text\n .split('\\n')\n .map(node => {\n const matchIndentInNode = node.match(/^\\s+/);\n if (matchIndentInNode === null) {\n return node;\n }\n const [indentInNode] = matchIndentInNode;\n if (indentInNode.length >= indentToCode.length) {\n return node.slice(indentToCode.length);\n }\n return node;\n })\n .join('\\n');\n}\n/**\n * Tokenizer\n */\nclass _Tokenizer {\n options;\n rules; // set by the lexer\n lexer; // set by the lexer\n constructor(options) {\n this.options = options || _defaults;\n }\n space(src) {\n const cap = this.rules.block.newline.exec(src);\n if (cap && cap[0].length > 0) {\n return {\n type: 'space',\n raw: cap[0]\n };\n }\n }\n code(src) {\n const cap = this.rules.block.code.exec(src);\n if (cap) {\n const text = cap[0].replace(/^ {1,4}/gm, '');\n return {\n type: 'code',\n raw: cap[0],\n codeBlockStyle: 'indented',\n text: !this.options.pedantic\n ? rtrim(text, '\\n')\n : text\n };\n }\n }\n fences(src) {\n const cap = this.rules.block.fences.exec(src);\n if (cap) {\n const raw = cap[0];\n const text = indentCodeCompensation(raw, cap[3] || '');\n return {\n type: 'code',\n raw,\n lang: cap[2] ? cap[2].trim().replace(this.rules.inline.anyPunctuation, '$1') : cap[2],\n text\n };\n }\n }\n heading(src) {\n const cap = this.rules.block.heading.exec(src);\n if (cap) {\n let text = cap[2].trim();\n // remove trailing #s\n if (/#$/.test(text)) {\n const trimmed = rtrim(text, '#');\n if (this.options.pedantic) {\n text = trimmed.trim();\n }\n else if (!trimmed || / $/.test(trimmed)) {\n // CommonMark requires space before trailing #s\n text = trimmed.trim();\n }\n }\n return {\n type: 'heading',\n raw: cap[0],\n depth: cap[1].length,\n text,\n tokens: this.lexer.inline(text)\n };\n }\n }\n hr(src) {\n const cap = this.rules.block.hr.exec(src);\n if (cap) {\n return {\n type: 'hr',\n raw: cap[0]\n };\n }\n }\n blockquote(src) {\n const cap = this.rules.block.blockquote.exec(src);\n if (cap) {\n const text = rtrim(cap[0].replace(/^ *>[ \\t]?/gm, ''), '\\n');\n const top = this.lexer.state.top;\n this.lexer.state.top = true;\n const tokens = this.lexer.blockTokens(text);\n this.lexer.state.top = top;\n return {\n type: 'blockquote',\n raw: cap[0],\n tokens,\n text\n };\n }\n }\n list(src) {\n let cap = this.rules.block.list.exec(src);\n if (cap) {\n let bull = cap[1].trim();\n const isordered = bull.length > 1;\n const list = {\n type: 'list',\n raw: '',\n ordered: isordered,\n start: isordered ? +bull.slice(0, -1) : '',\n loose: false,\n items: []\n };\n bull = isordered ? `\\\\d{1,9}\\\\${bull.slice(-1)}` : `\\\\${bull}`;\n if (this.options.pedantic) {\n bull = isordered ? bull : '[*+-]';\n }\n // Get next list item\n const itemRegex = new RegExp(`^( {0,3}${bull})((?:[\\t ][^\\\\n]*)?(?:\\\\n|$))`);\n let raw = '';\n let itemContents = '';\n let endsWithBlankLine = false;\n // Check if current bullet point can start a new List Item\n while (src) {\n let endEarly = false;\n if (!(cap = itemRegex.exec(src))) {\n break;\n }\n if (this.rules.block.hr.test(src)) { // End list if bullet was actually HR (possibly move into itemRegex?)\n break;\n }\n raw = cap[0];\n src = src.substring(raw.length);\n let line = cap[2].split('\\n', 1)[0].replace(/^\\t+/, (t) => ' '.repeat(3 * t.length));\n let nextLine = src.split('\\n', 1)[0];\n let indent = 0;\n if (this.options.pedantic) {\n indent = 2;\n itemContents = line.trimStart();\n }\n else {\n indent = cap[2].search(/[^ ]/); // Find first non-space char\n indent = indent > 4 ? 1 : indent; // Treat indented code blocks (> 4 spaces) as having only 1 indent\n itemContents = line.slice(indent);\n indent += cap[1].length;\n }\n let blankLine = false;\n if (!line && /^ *$/.test(nextLine)) { // Items begin with at most one blank line\n raw += nextLine + '\\n';\n src = src.substring(nextLine.length + 1);\n endEarly = true;\n }\n if (!endEarly) {\n const nextBulletRegex = new RegExp(`^ {0,${Math.min(3, indent - 1)}}(?:[*+-]|\\\\d{1,9}[.)])((?:[ \\t][^\\\\n]*)?(?:\\\\n|$))`);\n const hrRegex = new RegExp(`^ {0,${Math.min(3, indent - 1)}}((?:- *){3,}|(?:_ *){3,}|(?:\\\\* *){3,})(?:\\\\n+|$)`);\n const fencesBeginRegex = new RegExp(`^ {0,${Math.min(3, indent - 1)}}(?:\\`\\`\\`|~~~)`);\n const headingBeginRegex = new RegExp(`^ {0,${Math.min(3, indent - 1)}}#`);\n // Check if following lines should be included in List Item\n while (src) {\n const rawLine = src.split('\\n', 1)[0];\n nextLine = rawLine;\n // Re-align to follow commonmark nesting rules\n if (this.options.pedantic) {\n nextLine = nextLine.replace(/^ {1,4}(?=( {4})*[^ ])/g, ' ');\n }\n // End list item if found code fences\n if (fencesBeginRegex.test(nextLine)) {\n break;\n }\n // End list item if found start of new heading\n if (headingBeginRegex.test(nextLine)) {\n break;\n }\n // End list item if found start of new bullet\n if (nextBulletRegex.test(nextLine)) {\n break;\n }\n // Horizontal rule found\n if (hrRegex.test(src)) {\n break;\n }\n if (nextLine.search(/[^ ]/) >= indent || !nextLine.trim()) { // Dedent if possible\n itemContents += '\\n' + nextLine.slice(indent);\n }\n else {\n // not enough indentation\n if (blankLine) {\n break;\n }\n // paragraph continuation unless last line was a different block level element\n if (line.search(/[^ ]/) >= 4) { // indented code block\n break;\n }\n if (fencesBeginRegex.test(line)) {\n break;\n }\n if (headingBeginRegex.test(line)) {\n break;\n }\n if (hrRegex.test(line)) {\n break;\n }\n itemContents += '\\n' + nextLine;\n }\n if (!blankLine && !nextLine.trim()) { // Check if current line is blank\n blankLine = true;\n }\n raw += rawLine + '\\n';\n src = src.substring(rawLine.length + 1);\n line = nextLine.slice(indent);\n }\n }\n if (!list.loose) {\n // If the previous item ended with a blank line, the list is loose\n if (endsWithBlankLine) {\n list.loose = true;\n }\n else if (/\\n *\\n *$/.test(raw)) {\n endsWithBlankLine = true;\n }\n }\n let istask = null;\n let ischecked;\n // Check for task list items\n if (this.options.gfm) {\n istask = /^\\[[ xX]\\] /.exec(itemContents);\n if (istask) {\n ischecked = istask[0] !== '[ ] ';\n itemContents = itemContents.replace(/^\\[[ xX]\\] +/, '');\n }\n }\n list.items.push({\n type: 'list_item',\n raw,\n task: !!istask,\n checked: ischecked,\n loose: false,\n text: itemContents,\n tokens: []\n });\n list.raw += raw;\n }\n // Do not consume newlines at end of final item. Alternatively, make itemRegex *start* with any newlines to simplify/speed up endsWithBlankLine logic\n list.items[list.items.length - 1].raw = raw.trimEnd();\n (list.items[list.items.length - 1]).text = itemContents.trimEnd();\n list.raw = list.raw.trimEnd();\n // Item child tokens handled here at end because we needed to have the final item to trim it first\n for (let i = 0; i < list.items.length; i++) {\n this.lexer.state.top = false;\n list.items[i].tokens = this.lexer.blockTokens(list.items[i].text, []);\n if (!list.loose) {\n // Check if list should be loose\n const spacers = list.items[i].tokens.filter(t => t.type === 'space');\n const hasMultipleLineBreaks = spacers.length > 0 && spacers.some(t => /\\n.*\\n/.test(t.raw));\n list.loose = hasMultipleLineBreaks;\n }\n }\n // Set all items to loose if list is loose\n if (list.loose) {\n for (let i = 0; i < list.items.length; i++) {\n list.items[i].loose = true;\n }\n }\n return list;\n }\n }\n html(src) {\n const cap = this.rules.block.html.exec(src);\n if (cap) {\n const token = {\n type: 'html',\n block: true,\n raw: cap[0],\n pre: cap[1] === 'pre' || cap[1] === 'script' || cap[1] === 'style',\n text: cap[0]\n };\n return token;\n }\n }\n def(src) {\n const cap = this.rules.block.def.exec(src);\n if (cap) {\n const tag = cap[1].toLowerCase().replace(/\\s+/g, ' ');\n const href = cap[2] ? cap[2].replace(/^<(.*)>$/, '$1').replace(this.rules.inline.anyPunctuation, '$1') : '';\n const title = cap[3] ? cap[3].substring(1, cap[3].length - 1).replace(this.rules.inline.anyPunctuation, '$1') : cap[3];\n return {\n type: 'def',\n tag,\n raw: cap[0],\n href,\n title\n };\n }\n }\n table(src) {\n const cap = this.rules.block.table.exec(src);\n if (!cap) {\n return;\n }\n if (!/[:|]/.test(cap[2])) {\n // delimiter row must have a pipe (|) or colon (:) otherwise it is a setext heading\n return;\n }\n const headers = splitCells(cap[1]);\n const aligns = cap[2].replace(/^\\||\\| *$/g, '').split('|');\n const rows = cap[3] && cap[3].trim() ? cap[3].replace(/\\n[ \\t]*$/, '').split('\\n') : [];\n const item = {\n type: 'table',\n raw: cap[0],\n header: [],\n align: [],\n rows: []\n };\n if (headers.length !== aligns.length) {\n // header and align columns must be equal, rows can be different.\n return;\n }\n for (const align of aligns) {\n if (/^ *-+: *$/.test(align)) {\n item.align.push('right');\n }\n else if (/^ *:-+: *$/.test(align)) {\n item.align.push('center');\n }\n else if (/^ *:-+ *$/.test(align)) {\n item.align.push('left');\n }\n else {\n item.align.push(null);\n }\n }\n for (const header of headers) {\n item.header.push({\n text: header,\n tokens: this.lexer.inline(header)\n });\n }\n for (const row of rows) {\n item.rows.push(splitCells(row, item.header.length).map(cell => {\n return {\n text: cell,\n tokens: this.lexer.inline(cell)\n };\n }));\n }\n return item;\n }\n lheading(src) {\n const cap = this.rules.block.lheading.exec(src);\n if (cap) {\n return {\n type: 'heading',\n raw: cap[0],\n depth: cap[2].charAt(0) === '=' ? 1 : 2,\n text: cap[1],\n tokens: this.lexer.inline(cap[1])\n };\n }\n }\n paragraph(src) {\n const cap = this.rules.block.paragraph.exec(src);\n if (cap) {\n const text = cap[1].charAt(cap[1].length - 1) === '\\n'\n ? cap[1].slice(0, -1)\n : cap[1];\n return {\n type: 'paragraph',\n raw: cap[0],\n text,\n tokens: this.lexer.inline(text)\n };\n }\n }\n text(src) {\n const cap = this.rules.block.text.exec(src);\n if (cap) {\n return {\n type: 'text',\n raw: cap[0],\n text: cap[0],\n tokens: this.lexer.inline(cap[0])\n };\n }\n }\n escape(src) {\n const cap = this.rules.inline.escape.exec(src);\n if (cap) {\n return {\n type: 'escape',\n raw: cap[0],\n text: escape$1(cap[1])\n };\n }\n }\n tag(src) {\n const cap = this.rules.inline.tag.exec(src);\n if (cap) {\n if (!this.lexer.state.inLink && /^<a /i.test(cap[0])) {\n this.lexer.state.inLink = true;\n }\n else if (this.lexer.state.inLink && /^<\\/a>/i.test(cap[0])) {\n this.lexer.state.inLink = false;\n }\n if (!this.lexer.state.inRawBlock && /^<(pre|code|kbd|script)(\\s|>)/i.test(cap[0])) {\n this.lexer.state.inRawBlock = true;\n }\n else if (this.lexer.state.inRawBlock && /^<\\/(pre|code|kbd|script)(\\s|>)/i.test(cap[0])) {\n this.lexer.state.inRawBlock = false;\n }\n return {\n type: 'html',\n raw: cap[0],\n inLink: this.lexer.state.inLink,\n inRawBlock: this.lexer.state.inRawBlock,\n block: false,\n text: cap[0]\n };\n }\n }\n link(src) {\n const cap = this.rules.inline.link.exec(src);\n if (cap) {\n const trimmedUrl = cap[2].trim();\n if (!this.options.pedantic && /^</.test(trimmedUrl)) {\n // commonmark requires matching angle brackets\n if (!(/>$/.test(trimmedUrl))) {\n return;\n }\n // ending angle bracket cannot be escaped\n const rtrimSlash = rtrim(trimmedUrl.slice(0, -1), '\\\\');\n if ((trimmedUrl.length - rtrimSlash.length) % 2 === 0) {\n return;\n }\n }\n else {\n // find closing parenthesis\n const lastParenIndex = findClosingBracket(cap[2], '()');\n if (lastParenIndex > -1) {\n const start = cap[0].indexOf('!') === 0 ? 5 : 4;\n const linkLen = start + cap[1].length + lastParenIndex;\n cap[2] = cap[2].substring(0, lastParenIndex);\n cap[0] = cap[0].substring(0, linkLen).trim();\n cap[3] = '';\n }\n }\n let href = cap[2];\n let title = '';\n if (this.options.pedantic) {\n // split pedantic href and title\n const link = /^([^'\"]*[^\\s])\\s+(['\"])(.*)\\2/.exec(href);\n if (link) {\n href = link[1];\n title = link[3];\n }\n }\n else {\n title = cap[3] ? cap[3].slice(1, -1) : '';\n }\n href = href.trim();\n if (/^</.test(href)) {\n if (this.options.pedantic && !(/>$/.test(trimmedUrl))) {\n // pedantic allows starting angle bracket without ending angle bracket\n href = href.slice(1);\n }\n else {\n href = href.slice(1, -1);\n }\n }\n return outputLink(cap, {\n href: href ? href.replace(this.rules.inline.anyPunctuation, '$1') : href,\n title: title ? title.replace(this.rules.inline.anyPunctuation, '$1') : title\n }, cap[0], this.lexer);\n }\n }\n reflink(src, links) {\n let cap;\n if ((cap = this.rules.inline.reflink.exec(src))\n || (cap = this.rules.inline.nolink.exec(src))) {\n const linkString = (cap[2] || cap[1]).replace(/\\s+/g, ' ');\n const link = links[linkString.toLowerCase()];\n if (!link) {\n const text = cap[0].charAt(0);\n return {\n type: 'text',\n raw: text,\n text\n };\n }\n return outputLink(cap, link, cap[0], this.lexer);\n }\n }\n emStrong(src, maskedSrc, prevChar = '') {\n let match = this.rules.inline.emStrongLDelim.exec(src);\n if (!match)\n return;\n // _ can't be between two alphanumerics. \\p{L}\\p{N} includes non-english alphabet/numbers as well\n if (match[3] && prevChar.match(/[\\p{L}\\p{N}]/u))\n return;\n const nextChar = match[1] || match[2] || '';\n if (!nextChar || !prevChar || this.rules.inline.punctuation.exec(prevChar)) {\n // unicode Regex counts emoji as 1 char; spread into array for proper count (used multiple times below)\n const lLength = [...match[0]].length - 1;\n let rDelim, rLength, delimTotal = lLength, midDelimTotal = 0;\n const endReg = match[0][0] === '*' ? this.rules.inline.emStrongRDelimAst : this.rules.inline.emStrongRDelimUnd;\n endReg.lastIndex = 0;\n // Clip maskedSrc to same section of string as src (move to lexer?)\n maskedSrc = maskedSrc.slice(-1 * src.length + lLength);\n while ((match = endReg.exec(maskedSrc)) != null) {\n rDelim = match[1] || match[2] || match[3] || match[4] || match[5] || match[6];\n if (!rDelim)\n continue; // skip single * in __abc*abc__\n rLength = [...rDelim].length;\n if (match[3] || match[4]) { // found another Left Delim\n delimTotal += rLength;\n continue;\n }\n else if (match[5] || match[6]) { // either Left or Right Delim\n if (lLength % 3 && !((lLength + rLength) % 3)) {\n midDelimTotal += rLength;\n continue; // CommonMark Emphasis Rules 9-10\n }\n }\n delimTotal -= rLength;\n if (delimTotal > 0)\n continue; // Haven't found enough closing delimiters\n // Remove extra characters. *a*** -> *a*\n rLength = Math.min(rLength, rLength + delimTotal + midDelimTotal);\n // char length can be >1 for unicode characters;\n const lastCharLength = [...match[0]][0].length;\n const raw = src.slice(0, lLength + match.index + lastCharLength + rLength);\n // Create `em` if smallest delimiter has odd char count. *a***\n if (Math.min(lLength, rLength) % 2) {\n const text = raw.slice(1, -1);\n return {\n type: 'em',\n raw,\n text,\n tokens: this.lexer.inlineTokens(text)\n };\n }\n // Create 'strong' if smallest delimiter has even char count. **a***\n const text = raw.slice(2, -2);\n return {\n type: 'strong',\n raw,\n text,\n tokens: this.lexer.inlineTokens(text)\n };\n }\n }\n }\n codespan(src) {\n const cap = this.rules.inline.code.exec(src);\n if (cap) {\n let text = cap[2].replace(/\\n/g, ' ');\n const hasNonSpaceChars = /[^ ]/.test(text);\n const hasSpaceCharsOnBothEnds = /^ /.test(text) && / $/.test(text);\n if (hasNonSpaceChars && hasSpaceCharsOnBothEnds) {\n text = text.substring(1, text.length - 1);\n }\n text = escape$1(text, true);\n return {\n type: 'codespan',\n raw: cap[0],\n text\n };\n }\n }\n br(src) {\n const cap = this.rules.inline.br.exec(src);\n if (cap) {\n return {\n type: 'br',\n raw: cap[0]\n };\n }\n }\n del(src) {\n const cap = this.rules.inline.del.exec(src);\n if (cap) {\n return {\n type: 'del',\n raw: cap[0],\n text: cap[2],\n tokens: this.lexer.inlineTokens(cap[2])\n };\n }\n }\n autolink(src) {\n const cap = this.rules.inline.autolink.exec(src);\n if (cap) {\n let text, href;\n if (cap[2] === '@') {\n text = escape$1(cap[1]);\n href = 'mailto:' + text;\n }\n else {\n text = escape$1(cap[1]);\n href = text;\n }\n return {\n type: 'link',\n raw: cap[0],\n text,\n href,\n tokens: [\n {\n type: 'text',\n raw: text,\n text\n }\n ]\n };\n }\n }\n url(src) {\n let cap;\n if (cap = this.rules.inline.url.exec(src)) {\n let text, href;\n if (cap[2] === '@') {\n text = escape$1(cap[0]);\n href = 'mailto:' + text;\n }\n else {\n // do extended autolink path validation\n let prevCapZero;\n do {\n prevCapZero = cap[0];\n cap[0] = this.rules.inline._backpedal.exec(cap[0])?.[0] ?? '';\n } while (prevCapZero !== cap[0]);\n text = escape$1(cap[0]);\n if (cap[1] === 'www.') {\n href = 'http://' + cap[0];\n }\n else {\n href = cap[0];\n }\n }\n return {\n type: 'link',\n raw: cap[0],\n text,\n href,\n tokens: [\n {\n type: 'text',\n raw: text,\n text\n }\n ]\n };\n }\n }\n inlineText(src) {\n const cap = this.rules.inline.text.exec(src);\n if (cap) {\n let text;\n if (this.lexer.state.inRawBlock) {\n text = cap[0];\n }\n else {\n text = escape$1(cap[0]);\n }\n return {\n type: 'text',\n raw: cap[0],\n text\n };\n }\n }\n}\n\n/**\n * Block-Level Grammar\n */\nconst newline = /^(?: *(?:\\n|$))+/;\nconst blockCode = /^( {4}[^\\n]+(?:\\n(?: *(?:\\n|$))*)?)+/;\nconst fences = /^ {0,3}(`{3,}(?=[^`\\n]*(?:\\n|$))|~{3,})([^\\n]*)(?:\\n|$)(?:|([\\s\\S]*?)(?:\\n|$))(?: {0,3}\\1[~`]* *(?=\\n|$)|$)/;\nconst hr = /^ {0,3}((?:-[\\t ]*){3,}|(?:_[ \\t]*){3,}|(?:\\*[ \\t]*){3,})(?:\\n+|$)/;\nconst heading = /^ {0,3}(#{1,6})(?=\\s|$)(.*)(?:\\n+|$)/;\nconst bullet = /(?:[*+-]|\\d{1,9}[.)])/;\nconst lheading = edit(/^(?!bull )((?:.|\\n(?!\\s*?\\n|bull ))+?)\\n {0,3}(=+|-+) *(?:\\n+|$)/)\n .replace(/bull/g, bullet) // lists can interrupt\n .getRegex();\nconst _paragraph = /^([^\\n]+(?:\\n(?!hr|heading|lheading|blockquote|fences|list|html|table| +\\n)[^\\n]+)*)/;\nconst blockText = /^[^\\n]+/;\nconst _blockLabel = /(?!\\s*\\])(?:\\\\.|[^\\[\\]\\\\])+/;\nconst def = edit(/^ {0,3}\\[(label)\\]: *(?:\\n *)?([^<\\s][^\\s]*|<.*?>)(?:(?: +(?:\\n *)?| *\\n *)(title))? *(?:\\n+|$)/)\n .replace('label', _blockLabel)\n .replace('title', /(?:\"(?:\\\\\"?|[^\"\\\\])*\"|'[^'\\n]*(?:\\n[^'\\n]+)*\\n?'|\\([^()]*\\))/)\n .getRegex();\nconst list = edit(/^( {0,3}bull)([ \\t][^\\n]+?)?(?:\\n|$)/)\n .replace(/bull/g, bullet)\n .getRegex();\nconst _tag = 'address|article|aside|base|basefont|blockquote|body|caption'\n + '|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption'\n + '|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe'\n + '|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option'\n + '|p|param|search|section|summary|table|tbody|td|tfoot|th|thead|title'\n + '|tr|track|ul';\nconst _comment = /<!--(?:-?>|[\\s\\S]*?(?:-->|$))/;\nconst html = edit('^ {0,3}(?:' // optional indentation\n + '<(script|pre|style|textarea)[\\\\s>][\\\\s\\\\S]*?(?:</\\\\1>[^\\\\n]*\\\\n+|$)' // (1)\n + '|comment[^\\\\n]*(\\\\n+|$)' // (2)\n + '|<\\\\?[\\\\s\\\\S]*?(?:\\\\?>\\\\n*|$)' // (3)\n + '|<![A-Z][\\\\s\\\\S]*?(?:>\\\\n*|$)' // (4)\n + '|<!\\\\[CDATA\\\\[[\\\\s\\\\S]*?(?:\\\\]\\\\]>\\\\n*|$)' // (5)\n + '|</?(tag)(?: +|\\\\n|/?>)[\\\\s\\\\S]*?(?:(?:\\\\n *)+\\\\n|$)' // (6)\n + '|<(?!script|pre|style|textarea)([a-z][\\\\w-]*)(?:attribute)*? */?>(?=[ \\\\t]*(?:\\\\n|$))[\\\\s\\\\S]*?(?:(?:\\\\n *)+\\\\n|$)' // (7) open tag\n + '|</(?!script|pre|style|textarea)[a-z][\\\\w-]*\\\\s*>(?=[ \\\\t]*(?:\\\\n|$))[\\\\s\\\\S]*?(?:(?:\\\\n *)+\\\\n|$)' // (7) closing tag\n + ')', 'i')\n .replace('comment', _comment)\n .replace('tag', _tag)\n .replace('attribute', / +[a-zA-Z:_][\\w.:-]*(?: *= *\"[^\"\\n]*\"| *= *'[^'\\n]*'| *= *[^\\s\"'=<>`]+)?/)\n .getRegex();\nconst paragraph = edit(_paragraph)\n .replace('hr', hr)\n .replace('heading', ' {0,3}#{1,6}(?:\\\\s|$)')\n .replace('|lheading', '') // setex headings don't interrupt commonmark paragraphs\n .replace('|table', '')\n .replace('blockquote', ' {0,3}>')\n .replace('fences', ' {0,3}(?:`{3,}(?=[^`\\\\n]*\\\\n)|~{3,})[^\\\\n]*\\\\n')\n .replace('list', ' {0,3}(?:[*+-]|1[.)]) ') // only lists starting from 1 can interrupt\n .replace('html', '</?(?:tag)(?: +|\\\\n|/?>)|<(?:script|pre|style|textarea|!--)')\n .replace('tag', _tag) // pars can be interrupted by type (6) html blocks\n .getRegex();\nconst blockquote = edit(/^( {0,3}> ?(paragraph|[^\\n]*)(?:\\n|$))+/)\n .replace('paragraph', paragraph)\n .getRegex();\n/**\n * Normal Block Grammar\n */\nconst blockNormal = {\n blockquote,\n code: blockCode,\n def,\n fences,\n heading,\n hr,\n html,\n lheading,\n list,\n newline,\n paragraph,\n table: noopTest,\n text: blockText\n};\n/**\n * GFM Block Grammar\n */\nconst gfmTable = edit('^ *([^\\\\n ].*)\\\\n' // Header\n + ' {0,3}((?:\\\\| *)?:?-+:? *(?:\\\\| *:?-+:? *)*(?:\\\\| *)?)' // Align\n + '(?:\\\\n((?:(?! *\\\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\\\n|$))*)\\\\n*|$)') // Cells\n .replace('hr', hr)\n .replace('heading', ' {0,3}#{1,6}(?:\\\\s|$)')\n .replace('blockquote', ' {0,3}>')\n .replace('code', ' {4}[^\\\\n]')\n .replace('fences', ' {0,3}(?:`{3,}(?=[^`\\\\n]*\\\\n)|~{3,})[^\\\\n]*\\\\n')\n .replace('list', ' {0,3}(?:[*+-]|1[.)]) ') // only lists starting from 1 can interrupt\n .replace('html', '</?(?:tag)(?: +|\\\\n|/?>)|<(?:script|pre|style|textarea|!--)')\n .replace('tag', _tag) // tables can be interrupted by type (6) html blocks\n .getRegex();\nconst blockGfm = {\n ...blockNormal,\n table: gfmTable,\n paragraph: edit(_paragraph)\n .replace('hr', hr)\n .replace('heading', ' {0,3}#{1,6}(?:\\\\s|$)')\n .replace('|lheading', '') // setex headings don't interrupt commonmark paragraphs\n .replace('table', gfmTable) // interrupt paragraphs with table\n .replace('blockquote', ' {0,3}>')\n .replace('fences', ' {0,3}(?:`{3,}(?=[^`\\\\n]*\\\\n)|~{3,})[^\\\\n]*\\\\n')\n .replace('list', ' {0,3}(?:[*+-]|1[.)]) ') // only lists starting from 1 can interrupt\n .replace('html', '</?(?:tag)(?: +|\\\\n|/?>)|<(?:script|pre|style|textarea|!--)')\n .replace('tag', _tag) // pars can be interrupted by type (6) html blocks\n .getRegex()\n};\n/**\n * Pedantic grammar (original John Gruber's loose markdown specification)\n */\nconst blockPedantic = {\n ...blockNormal,\n html: edit('^ *(?:comment *(?:\\\\n|\\\\s*$)'\n + '|<(tag)[\\\\s\\\\S]+?</\\\\1> *(?:\\\\n{2,}|\\\\s*$)' // closed tag\n + '|<tag(?:\"[^\"]*\"|\\'[^\\']*\\'|\\\\s[^\\'\"/>\\\\s]*)*?/?> *(?:\\\\n{2,}|\\\\s*$))')\n .replace('comment', _comment)\n .replace(/tag/g, '(?!(?:'\n + 'a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub'\n + '|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)'\n + '\\\\b)\\\\w+(?!:|[^\\\\w\\\\s@]*@)\\\\b')\n .getRegex(),\n def: /^ *\\[([^\\]]+)\\]: *<?([^\\s>]+)>?(?: +([\"(][^\\n]+[\")]))? *(?:\\n+|$)/,\n heading: /^(#{1,6})(.*)(?:\\n+|$)/,\n fences: noopTest, // fences not supported\n lheading: /^(.+?)\\n {0,3}(=+|-+) *(?:\\n+|$)/,\n paragraph: edit(_paragraph)\n .replace('hr', hr)\n .replace('heading', ' *#{1,6} *[^\\n]')\n .replace('lheading', lheading)\n .replace('|table', '')\n .replace('blockquote', ' {0,3}>')\n .replace('|fences', '')\n .replace('|list', '')\n .replace('|html', '')\n .replace('|tag', '')\n .getRegex()\n};\n/**\n * Inline-Level Grammar\n */\nconst escape = /^\\\\([!\"#$%&'()*+,\\-./:;<=>?@\\[\\]\\\\^_`{|}~])/;\nconst inlineCode = /^(`+)([^`]|[^`][\\s\\S]*?[^`])\\1(?!`)/;\nconst br = /^( {2,}|\\\\)\\n(?!\\s*$)/;\nconst inlineText = /^(`+|[^`])(?:(?= {2,}\\n)|[\\s\\S]*?(?:(?=[\\\\<!\\[`*_]|\\b_|$)|[^ ](?= {2,}\\n)))/;\n// list of unicode punctuation marks, plus any missing characters from CommonMark spec\nconst _punctuation = '\\\\p{P}\\\\p{S}';\nconst punctuation = edit(/^((?![*_])[\\spunctuation])/, 'u')\n .replace(/punctuation/g, _punctuation).getRegex();\n// sequences em should skip over [title](link), `code`, <html>\nconst blockSkip = /\\[[^[\\]]*?\\]\\([^\\(\\)]*?\\)|`[^`]*?`|<[^<>]*?>/g;\nconst emStrongLDelim = edit(/^(?:\\*+(?:((?!\\*)[punct])|[^\\s*]))|^_+(?:((?!_)[punct])|([^\\s_]))/, 'u')\n .replace(/punct/g, _punctuation)\n .getRegex();\nconst emStrongRDelimAst = edit('^[^_*]*?__[^_*]*?\\\\*[^_*]*?(?=__)' // Skip orphan inside strong\n + '|[^*]+(?=[^*])' // Consume to delim\n + '|(?!\\\\*)[punct](\\\\*+)(?=[\\\\s]|$)' // (1) #*** can only be a Right Delimiter\n + '|[^punct\\\\s](\\\\*+)(?!\\\\*)(?=[punct\\\\s]|$)' // (2) a***#, a*** can only be a Right Delimiter\n + '|(?!\\\\*)[punct\\\\s](\\\\*+)(?=[^punct\\\\s])' // (3) #***a, ***a can only be Left Delimiter\n + '|[\\\\s](\\\\*+)(?!\\\\*)(?=[punct])' // (4) ***# can only be Left Delimiter\n + '|(?!\\\\*)[punct](\\\\*+)(?!\\\\*)(?=[punct])' // (5) #***# can be either Left or Right Delimiter\n + '|[^punct\\\\s](\\\\*+)(?=[^punct\\\\s])', 'gu') // (6) a***a can be either Left or Right Delimiter\n .replace(/punct/g, _punctuation)\n .getRegex();\n// (6) Not allowed for _\nconst emStrongRDelimUnd = edit('^[^_*]*?\\\\*\\\\*[^_*]*?_[^_*]*?(?=\\\\*\\\\*)' // Skip orphan inside strong\n + '|[^_]+(?=[^_])' // Consume to delim\n + '|(?!_)[punct](_+)(?=[\\\\s]|$)' // (1) #___ can only be a Right Delimiter\n + '|[^punct\\\\s](_+)(?!_)(?=[punct\\\\s]|$)' // (2) a___#, a___ can only be a Right Delimiter\n + '|(?!_)[punct\\\\s](_+)(?=[^punct\\\\s])' // (3) #___a, ___a can only be Left Delimiter\n + '|[\\\\s](_+)(?!_)(?=[punct])' // (4) ___# can only be Left Delimiter\n + '|(?!_)[punct](_+)(?!_)(?=[punct])', 'gu') // (5) #___# can be either Left or Right Delimiter\n .replace(/punct/g, _punctuation)\n .getRegex();\nconst anyPunctuation = edit(/\\\\([punct])/, 'gu')\n .replace(/punct/g, _punctuation)\n .getRegex();\nconst autolink = edit(/^<(scheme:[^\\s\\x00-\\x1f<>]*|email)>/)\n .replace('scheme', /[a-zA-Z][a-zA-Z0-9+.-]{1,31}/)\n .replace('email', /[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/)\n .getRegex();\nconst _inlineComment = edit(_comment).replace('(?:-->|$)', '-->').getRegex();\nconst tag = edit('^comment'\n + '|^</[a-zA-Z][\\\\w:-]*\\\\s*>' // self-closing tag\n + '|^<[a-zA-Z][\\\\w-]*(?:attribute)*?\\\\s*/?>' // open tag\n + '|^<\\\\?[\\\\s\\\\S]*?\\\\?>' // processing instruction, e.g. <?php ?>\n + '|^<![a-zA-Z]+\\\\s[\\\\s\\\\S]*?>' // declaration, e.g. <!DOCTYPE html>\n + '|^<!\\\\[CDATA\\\\[[\\\\s\\\\S]*?\\\\]\\\\]>') // CDATA section\n .replace('comment', _inlineComment)\n .replace('attribute', /\\s+[a-zA-Z:_][\\w.:-]*(?:\\s*=\\s*\"[^\"]*\"|\\s*=\\s*'[^']*'|\\s*=\\s*[^\\s\"'=<>`]+)?/)\n .getRegex();\nconst _inlineLabel = /(?:\\[(?:\\\\.|[^\\[\\]\\\\])*\\]|\\\\.|`[^`]*`|[^\\[\\]\\\\`])*?/;\nconst link = edit(/^!?\\[(label)\\]\\(\\s*(href)(?:\\s+(title))?\\s*\\)/)\n .replace('label', _inlineLabel)\n .replace('href', /<(?:\\\\.|[^\\n<>\\\\])+>|[^\\s\\x00-\\x1f]*/)\n .replace('title', /\"(?:\\\\\"?|[^\"\\\\])*\"|'(?:\\\\'?|[^'\\\\])*'|\\((?:\\\\\\)?|[^)\\\\])*\\)/)\n .getRegex();\nconst reflink = edit(/^!?\\[(label)\\]\\[(ref)\\]/)\n .replace('label', _inlineLabel)\n .replace('ref', _blockLabel)\n .getRegex();\nconst nolink = edit(/^!?\\[(ref)\\](?:\\[\\])?/)\n .replace('ref', _blockLabel)\n .getRegex();\nconst reflinkSearch = edit('reflink|nolink(?!\\\\()', 'g')\n .replace('reflink', reflink)\n .replace('nolink', nolink)\n .getRegex();\n/**\n * Normal Inline Grammar\n */\nconst inlineNormal = {\n _backpedal: noopTest, // only used for GFM url\n anyPunctuation,\n autolink,\n blockSkip,\n br,\n code: inlineCode,\n del: noopTest,\n emStrongLDelim,\n emStrongRDelimAst,\n emStrongRDelimUnd,\n escape,\n link,\n nolink,\n punctuation,\n reflink,\n reflinkSearch,\n tag,\n text: inlineText,\n url: noopTest\n};\n/**\n * Pedantic Inline Grammar\n */\nconst inlinePedantic = {\n ...inlineNormal,\n link: edit(/^!?\\[(label)\\]\\((.*?)\\)/)\n .replace('label', _inlineLabel)\n .getRegex(),\n reflink: edit(/^!?\\[(label)\\]\\s*\\[([^\\]]*)\\]/)\n .replace('label', _inlineLabel)\n .getRegex()\n};\n/**\n * GFM Inline Grammar\n */\nconst inlineGfm = {\n ...inlineNormal,\n escape: edit(escape).replace('])', '~|])').getRegex(),\n url: edit(/^((?:ftp|https?):\\/\\/|www\\.)(?:[a-zA-Z0-9\\-]+\\.?)+[^\\s<]*|^email/, 'i')\n .replace('email', /[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/)\n .getRegex(),\n _backpedal: /(?:[^?!.,:;*_'\"~()&]+|\\([^)]*\\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_'\"~)]+(?!$))+/,\n del: /^(~~?)(?=[^\\s~])([\\s\\S]*?[^\\s~])\\1(?=[^~]|$)/,\n text: /^([`~]+|[^`~])(?:(?= {2,}\\n)|(?=[a-zA-Z0-9.!#$%&'*+\\/=?_`{\\|}~-]+@)|[\\s\\S]*?(?:(?=[\\\\<!\\[`*~_]|\\b_|https?:\\/\\/|ftp:\\/\\/|www\\.|$)|[^ ](?= {2,}\\n)|[^a-zA-Z0-9.!#$%&'*+\\/=?_`{\\|}~-](?=[a-zA-Z0-9.!#$%&'*+\\/=?_`{\\|}~-]+@)))/\n};\n/**\n * GFM + Line Breaks Inline Grammar\n */\nconst inlineBreaks = {\n ...inlineGfm,\n br: edit(br).replace('{2,}', '*').getRegex(),\n text: edit(inlineGfm.text)\n .replace('\\\\b_', '\\\\b_| {2,}\\\\n')\n .replace(/\\{2,\\}/g, '*')\n .getRegex()\n};\n/**\n * exports\n */\nconst block = {\n normal: blockNormal,\n gfm: blockGfm,\n pedantic: blockPedantic\n};\nconst inline = {\n normal: inlineNormal,\n gfm: inlineGfm,\n breaks: inlineBreaks,\n pedantic: inlinePedantic\n};\n\n/**\n * Block Lexer\n */\nclass _Lexer {\n tokens;\n options;\n state;\n tokenizer;\n inlineQueue;\n constructor(options) {\n // TokenList cannot be created in one go\n this.tokens = [];\n this.tokens.links = Object.create(null);\n this.options = options || _defaults;\n this.options.tokenizer = this.options.tokenizer || new _Tokenizer();\n this.tokenizer = this.options.tokenizer;\n this.tokenizer.options = this.options;\n this.tokenizer.lexer = this;\n this.inlineQueue = [];\n this.state = {\n inLink: false,\n inRawBlock: false,\n top: true\n };\n const rules = {\n block: block.normal,\n inline: inline.normal\n };\n if (this.options.pedantic) {\n rules.block = block.pedantic;\n rules.inline = inline.pedantic;\n }\n else if (this.options.gfm) {\n rules.block = block.gfm;\n if (this.options.breaks) {\n rules.inline = inline.breaks;\n }\n else {\n rules.inline = inline.gfm;\n }\n }\n this.tokenizer.rules = rules;\n }\n /**\n * Expose Rules\n */\n static get rules() {\n return {\n block,\n inline\n };\n }\n /**\n * Static Lex Method\n */\n static lex(src, options) {\n const lexer = new _Lexer(options);\n return lexer.lex(src);\n }\n /**\n * Static Lex Inline Method\n */\n static lexInline(src, options) {\n const lexer = new _Lexer(options);\n return lexer.inlineTokens(src);\n }\n /**\n * Preprocessing\n */\n lex(src) {\n src = src\n .replace(/\\r\\n|\\r/g, '\\n');\n this.blockTokens(src, this.tokens);\n for (let i = 0; i < this.inlineQueue.length; i++) {\n const next = this.inlineQueue[i];\n this.inlineTokens(next.src, next.tokens);\n }\n this.inlineQueue = [];\n return this.tokens;\n }\n blockTokens(src, tokens = []) {\n if (this.options.pedantic) {\n src = src.replace(/\\t/g, ' ').replace(/^ +$/gm, '');\n }\n else {\n src = src.replace(/^( *)(\\t+)/gm, (_, leading, tabs) => {\n return leading + ' '.repeat(tabs.length);\n });\n }\n let token;\n let lastToken;\n let cutSrc;\n let lastParagraphClipped;\n while (src) {\n if (this.options.extensions\n && this.options.extensions.block\n && this.options.extensions.block.some((extTokenizer) => {\n if (token = extTokenizer.call({ lexer: this }, src, tokens)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n return true;\n }\n return false;\n })) {\n continue;\n }\n // newline\n if (token = this.tokenizer.space(src)) {\n src = src.substring(token.raw.length);\n if (token.raw.length === 1 && tokens.length > 0) {\n // if there's a single \\n as a spacer, it's terminating the last line,\n // so move it there so that we don't get unnecessary paragraph tags\n tokens[tokens.length - 1].raw += '\\n';\n }\n else {\n tokens.push(token);\n }\n continue;\n }\n // code\n if (token = this.tokenizer.code(src)) {\n src = src.substring(token.raw.length);\n lastToken = tokens[tokens.length - 1];\n // An indented code block cannot interrupt a paragraph.\n if (lastToken && (lastToken.type === 'paragraph' || lastToken.type === 'text')) {\n lastToken.raw += '\\n' + token.raw;\n lastToken.text += '\\n' + token.text;\n this.inlineQueue[this.inlineQueue.length - 1].src = lastToken.text;\n }\n else {\n tokens.push(token);\n }\n continue;\n }\n // fences\n if (token = this.tokenizer.fences(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n // heading\n if (token = this.tokenizer.heading(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n // hr\n if (token = this.tokenizer.hr(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n // blockquote\n if (token = this.tokenizer.blockquote(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n // list\n if (token = this.tokenizer.list(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n // html\n if (token = this.tokenizer.html(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n // def\n if (token = this.tokenizer.def(src)) {\n src = src.substring(token.raw.length);\n lastToken = tokens[tokens.length - 1];\n if (lastToken && (lastToken.type === 'paragraph' || lastToken.type === 'text')) {\n lastToken.raw += '\\n' + token.raw;\n lastToken.text += '\\n' + token.raw;\n this.inlineQueue[this.inlineQueue.length - 1].src = lastToken.text;\n }\n else if (!this.tokens.links[token.tag]) {\n this.tokens.links[token.tag] = {\n href: token.href,\n title: token.title\n };\n }\n continue;\n }\n // table (gfm)\n if (token = this.tokenizer.table(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n // lheading\n if (token = this.tokenizer.lheading(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n // top-level paragraph\n // prevent paragraph consuming extensions by clipping 'src' to extension start\n cutSrc = src;\n if (this.options.extensions && this.options.extensions.startBlock) {\n let startIndex = Infinity;\n const tempSrc = src.slice(1);\n let tempStart;\n this.options.extensions.startBlock.forEach((getStartIndex) => {\n tempStart = getStartIndex.call({ lexer: this }, tempSrc);\n if (typeof tempStart === 'number' && tempStart >= 0) {\n startIndex = Math.min(startIndex, tempStart);\n }\n });\n if (startIndex < Infinity && startIndex >= 0) {\n cutSrc = src.substring(0, startIndex + 1);\n }\n }\n if (this.state.top && (token = this.tokenizer.paragraph(cutSrc))) {\n lastToken = tokens[tokens.length - 1];\n if (lastParagraphClipped && lastToken.type === 'paragraph') {\n lastToken.raw += '\\n' + token.raw;\n lastToken.text += '\\n' + token.text;\n this.inlineQueue.pop();\n this.inlineQueue[this.inlineQueue.length - 1].src = lastToken.text;\n }\n else {\n tokens.push(token);\n }\n lastParagraphClipped = (cutSrc.length !== src.length);\n src = src.substring(token.raw.length);\n continue;\n }\n // text\n if (token = this.tokenizer.text(src)) {\n src = src.substring(token.raw.length);\n lastToken = tokens[tokens.length - 1];\n if (lastToken && lastToken.type === 'text') {\n lastToken.raw += '\\n' + token.raw;\n lastToken.text += '\\n' + token.text;\n this.inlineQueue.pop();\n this.inlineQueue[this.inlineQueue.length - 1].src = lastToken.text;\n }\n else {\n tokens.push(token);\n }\n continue;\n }\n if (src) {\n const errMsg = 'Infinite loop on byte: ' + src.charCodeAt(0);\n if (this.options.silent) {\n console.error(errMsg);\n break;\n }\n else {\n throw new Error(errMsg);\n }\n }\n }\n this.state.top = true;\n return tokens;\n }\n inline(src, tokens = []) {\n this.inlineQueue.push({ src, tokens });\n return tokens;\n }\n /**\n * Lexing/Compiling\n */\n inlineTokens(src, tokens = []) {\n let token, lastToken, cutSrc;\n // String with links masked to avoid interference with em and strong\n let maskedSrc = src;\n let match;\n let keepPrevChar, prevChar;\n // Mask out reflinks\n if (this.tokens.links) {\n const links = Object.keys(this.tokens.links);\n if (links.length > 0) {\n while ((match = this.tokenizer.rules.inline.reflinkSearch.exec(maskedSrc)) != null) {\n if (links.includes(match[0].slice(match[0].lastIndexOf('[') + 1, -1))) {\n maskedSrc = maskedSrc.slice(0, match.index) + '[' + 'a'.repeat(match[0].length - 2) + ']' + maskedSrc.slice(this.tokenizer.rules.inline.reflinkSearch.lastIndex);\n }\n }\n }\n }\n // Mask out other blocks\n while ((match = this.tokenizer.rules.inline.blockSkip.exec(maskedSrc)) != null) {\n maskedSrc = maskedSrc.slice(0, match.index) + '[' + 'a'.repeat(match[0].length - 2) + ']' + maskedSrc.slice(this.tokenizer.rules.inline.blockSkip.lastIndex);\n }\n // Mask out escaped characters\n while ((match = this.tokenizer.rules.inline.anyPunctuation.exec(maskedSrc)) != null) {\n maskedSrc = maskedSrc.slice(0, match.index) + '++' + maskedSrc.slice(this.tokenizer.rules.inline.anyPunctuation.lastIndex);\n }\n while (src) {\n if (!keepPrevChar) {\n prevChar = '';\n }\n keepPrevChar = false;\n // extensions\n if (this.options.extensions\n && this.options.extensions.inline\n && this.options.extensions.inline.some((extTokenizer) => {\n if (token = extTokenizer.call({ lexer: this }, src, tokens)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n return true;\n }\n return false;\n })) {\n continue;\n }\n // escape\n if (token = this.tokenizer.escape(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n // tag\n if (token = this.tokenizer.tag(src)) {\n src = src.substring(token.raw.length);\n lastToken = tokens[tokens.length - 1];\n if (lastToken && token.type === 'text' && lastToken.type === 'text') {\n lastToken.raw += token.raw;\n lastToken.text += token.text;\n }\n else {\n tokens.push(token);\n }\n continue;\n }\n // link\n if (token = this.tokenizer.link(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n // reflink, nolink\n if (token = this.tokenizer.reflink(src, this.tokens.links)) {\n src = src.substring(token.raw.length);\n lastToken = tokens[tokens.length - 1];\n if (lastToken && token.type === 'text' && lastToken.type === 'text') {\n lastToken.raw += token.raw;\n lastToken.text += token.text;\n }\n else {\n tokens.push(token);\n }\n continue;\n }\n // em & strong\n if (token = this.tokenizer.emStrong(src, maskedSrc, prevChar)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n // code\n if (token = this.tokenizer.codespan(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n // br\n if (token = this.tokenizer.br(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n // del (gfm)\n if (token = this.tokenizer.del(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n // autolink\n if (token = this.tokenizer.autolink(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n // url (gfm)\n if (!this.state.inLink && (token = this.tokenizer.url(src))) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n // text\n // prevent inlineText consuming extensions by clipping 'src' to extension start\n cutSrc = src;\n if (this.options.extensions && this.options.extensions.startInline) {\n let startIndex = Infinity;\n const tempSrc = src.slice(1);\n let tempStart;\n this.options.extensions.startInline.forEach((getStartIndex) => {\n tempStart = getStartIndex.call({ lexer: this }, tempSrc);\n if (typeof tempStart === 'number' && tempStart >= 0) {\n startIndex = Math.min(startIndex, tempStart);\n }\n });\n if (startIndex < Infinity && startIndex >= 0) {\n cutSrc = src.substring(0, startIndex + 1);\n }\n }\n if (token = this.tokenizer.inlineText(cutSrc)) {\n src = src.substring(token.raw.length);\n if (token.raw.slice(-1) !== '_') { // Track prevChar before string of ____ started\n prevChar = token.raw.slice(-1);\n }\n keepPrevChar = true;\n lastToken = tokens[tokens.length - 1];\n if (lastToken && lastToken.type === 'text') {\n lastToken.raw += token.raw;\n lastToken.text += token.text;\n }\n else {\n tokens.push(token);\n }\n continue;\n }\n if (src) {\n const errMsg = 'Infinite loop on byte: ' + src.charCodeAt(0);\n if (this.options.silent) {\n console.error(errMsg);\n break;\n }\n else {\n throw new Error(errMsg);\n }\n }\n }\n return tokens;\n }\n}\n\n/**\n * Renderer\n */\nclass _Renderer {\n options;\n constructor(options) {\n this.options = options || _defaults;\n }\n code(code, infostring, escaped) {\n const lang = (infostring || '').match(/^\\S*/)?.[0];\n code = code.replace(/\\n$/, '') + '\\n';\n if (!lang) {\n return '<pre><code>'\n + (escaped ? code : escape$1(code, true))\n + '</code></pre>\\n';\n }\n return '<pre><code class=\"language-'\n + escape$1(lang)\n + '\">'\n + (escaped ? code : escape$1(code, true))\n + '</code></pre>\\n';\n }\n blockquote(quote) {\n return `<blockquote>\\n${quote}</blockquote>\\n`;\n }\n html(html, block) {\n return html;\n }\n heading(text, level, raw) {\n // ignore IDs\n return `<h${level}>${text}</h${level}>\\n`;\n }\n hr() {\n return '<hr>\\n';\n }\n list(body, ordered, start) {\n const type = ordered ? 'ol' : 'ul';\n const startatt = (ordered && start !== 1) ? (' start=\"' + start + '\"') : '';\n return '<' + type + startatt + '>\\n' + body + '</' + type + '>\\n';\n }\n listitem(text, task, checked) {\n return `<li>${text}</li>\\n`;\n }\n checkbox(checked) {\n return '<input '\n + (checked ? 'checked=\"\" ' : '')\n + 'disabled=\"\" type=\"checkbox\">';\n }\n paragraph(text) {\n return `<p>${text}</p>\\n`;\n }\n table(header, body) {\n if (body)\n body = `<tbody>${body}</tbody>`;\n return '<table>\\n'\n + '<thead>\\n'\n + header\n + '</thead>\\n'\n + body\n + '</table>\\n';\n }\n tablerow(content) {\n return `<tr>\\n${content}</tr>\\n`;\n }\n tablecell(content, flags) {\n const type = flags.header ? 'th' : 'td';\n const tag = flags.align\n ? `<${type} align=\"${flags.align}\">`\n : `<${type}>`;\n return tag + content + `</${type}>\\n`;\n }\n /**\n * span level renderer\n */\n strong(text) {\n return `<strong>${text}</strong>`;\n }\n em(text) {\n return `<em>${text}</em>`;\n }\n codespan(text) {\n return `<code>${text}</code>`;\n }\n br() {\n return '<br>';\n }\n del(text) {\n return `<del>${text}</del>`;\n }\n link(href, title, text) {\n const cleanHref = cleanUrl(href);\n if (cleanHref === null) {\n return text;\n }\n href = cleanHref;\n let out = '<a href=\"' + href + '\"';\n if (title) {\n out += ' title=\"' + title + '\"';\n }\n out += '>' + text + '</a>';\n return out;\n }\n image(href, title, text) {\n const cleanHref = cleanUrl(href);\n if (cleanHref === null) {\n return text;\n }\n href = cleanHref;\n let out = `<img src=\"${href}\" alt=\"${text}\"`;\n if (title) {\n out += ` title=\"${title}\"`;\n }\n out += '>';\n return out;\n }\n text(text) {\n return text;\n }\n}\n\n/**\n * TextRenderer\n * returns only the textual part of the token\n */\nclass _TextRenderer {\n // no need for block level renderers\n strong(text) {\n return text;\n }\n em(text) {\n return text;\n }\n codespan(text) {\n return text;\n }\n del(text) {\n return text;\n }\n html(text) {\n return text;\n }\n text(text) {\n return text;\n }\n link(href, title, text) {\n return '' + text;\n }\n image(href, title, text) {\n return '' + text;\n }\n br() {\n return '';\n }\n}\n\n/**\n * Parsing & Compiling\n */\nclass _Parser {\n options;\n renderer;\n textRenderer;\n constructor(options) {\n this.options = options || _defaults;\n this.options.renderer = this.options.renderer || new _Renderer();\n this.renderer = this.options.renderer;\n this.renderer.options = this.options;\n this.textRenderer = new _TextRenderer();\n }\n /**\n * Static Parse Method\n */\n static parse(tokens, options) {\n const parser = new _Parser(options);\n return parser.parse(tokens);\n }\n /**\n * Static Parse Inline Method\n */\n static parseInline(tokens, options) {\n const parser = new _Parser(options);\n return parser.parseInline(tokens);\n }\n /**\n * Parse Loop\n */\n parse(tokens, top = true) {\n let out = '';\n for (let i = 0; i < tokens.length; i++) {\n const token = tokens[i];\n // Run any renderer extensions\n if (this.options.extensions && this.options.extensions.renderers && this.options.extensions.renderers[token.type]) {\n const genericToken = token;\n const ret = this.options.extensions.renderers[genericToken.type].call({ parser: this }, genericToken);\n if (ret !== false || !['space', 'hr', 'heading', 'code', 'table', 'blockquote', 'list', 'html', 'paragraph', 'text'].includes(genericToken.type)) {\n out += ret || '';\n continue;\n }\n }\n switch (token.type) {\n case 'space': {\n continue;\n }\n case 'hr': {\n out += this.renderer.hr();\n continue;\n }\n case 'heading': {\n const headingToken = token;\n out += this.renderer.heading(this.parseInline(headingToken.tokens), headingToken.depth, unescape(this.parseInline(headingToken.tokens, this.textRenderer)));\n continue;\n }\n case 'code': {\n const codeToken = token;\n out += this.renderer.code(codeToken.text, codeToken.lang, !!codeToken.escaped);\n continue;\n }\n case 'table': {\n const tableToken = token;\n let header = '';\n // header\n let cell = '';\n for (let j = 0; j < tableToken.header.length; j++) {\n cell += this.renderer.tablecell(this.parseInline(tableToken.header[j].tokens), { header: true, align: tableToken.align[j] });\n }\n header += this.renderer.tablerow(cell);\n let body = '';\n for (let j = 0; j < tableToken.rows.length; j++) {\n const row = tableToken.rows[j];\n cell = '';\n for (let k = 0; k < row.length; k++) {\n cell += this.renderer.tablecell(this.parseInline(row[k].tokens), { header: false, align: tableToken.align[k] });\n }\n body += this.renderer.tablerow(cell);\n }\n out += this.renderer.table(header, body);\n continue;\n }\n case 'blockquote': {\n const blockquoteToken = token;\n const body = this.parse(blockquoteToken.tokens);\n out += this.renderer.blockquote(body);\n continue;\n }\n case 'list': {\n const listToken = token;\n const ordered = listToken.ordered;\n const start = listToken.start;\n const loose = listToken.loose;\n let body = '';\n for (let j = 0; j < listToken.items.length; j++) {\n const item = listToken.items[j];\n const checked = item.checked;\n const task = item.task;\n let itemBody = '';\n if (item.task) {\n const checkbox = this.renderer.checkbox(!!checked);\n if (loose) {\n if (item.tokens.length > 0 && item.tokens[0].type === 'paragraph') {\n item.tokens[0].text = checkbox + ' ' + item.tokens[0].text;\n if (item.tokens[0].tokens && item.tokens[0].tokens.length > 0 && item.tokens[0].tokens[0].type === 'text') {\n item.tokens[0].tokens[0].text = checkbox + ' ' + item.tokens[0].tokens[0].text;\n }\n }\n else {\n item.tokens.unshift({\n type: 'text',\n text: checkbox + ' '\n });\n }\n }\n else {\n itemBody += checkbox + ' ';\n }\n }\n itemBody += this.parse(item.tokens, loose);\n body += this.renderer.listitem(itemBody, task, !!checked);\n }\n out += this.renderer.list(body, ordered, start);\n continue;\n }\n case 'html': {\n const htmlToken = token;\n out += this.renderer.html(htmlToken.text, htmlToken.block);\n continue;\n }\n case 'paragraph': {\n const paragraphToken = token;\n out += this.renderer.paragraph(this.parseInline(paragraphToken.tokens));\n continue;\n }\n case 'text': {\n let textToken = token;\n let body = textToken.tokens ? this.parseInline(textToken.tokens) : textToken.text;\n while (i + 1 < tokens.length && tokens[i + 1].type === 'text') {\n textToken = tokens[++i];\n body += '\\n' + (textToken.tokens ? this.parseInline(textToken.tokens) : textToken.text);\n }\n out += top ? this.renderer.paragraph(body) : body;\n continue;\n }\n default: {\n const errMsg = 'Token with \"' + token.type + '\" type was not found.';\n if (this.options.silent) {\n console.error(errMsg);\n return '';\n }\n else {\n throw new Error(errMsg);\n }\n }\n }\n }\n return out;\n }\n /**\n * Parse Inline Tokens\n */\n parseInline(tokens, renderer) {\n renderer = renderer || this.renderer;\n let out = '';\n for (let i = 0; i < tokens.length; i++) {\n const token = tokens[i];\n // Run any renderer extensions\n if (this.options.extensions && this.options.extensions.renderers && this.options.extensions.renderers[token.type]) {\n const ret = this.options.extensions.renderers[token.type].call({ parser: this }, token);\n if (ret !== false || !['escape', 'html', 'link', 'image', 'strong', 'em', 'codespan', 'br', 'del', 'text'].includes(token.type)) {\n out += ret || '';\n continue;\n }\n }\n switch (token.type) {\n case 'escape': {\n const escapeToken = token;\n out += renderer.text(escapeToken.text);\n break;\n }\n case 'html': {\n const tagToken = token;\n out += renderer.html(tagToken.text);\n break;\n }\n case 'link': {\n const linkToken = token;\n out += renderer.link(linkToken.href, linkToken.title, this.parseInline(linkToken.tokens, renderer));\n break;\n }\n case 'image': {\n const imageToken = token;\n out += renderer.image(imageToken.href, imageToken.title, imageToken.text);\n break;\n }\n case 'strong': {\n const strongToken = token;\n out += renderer.strong(this.parseInline(strongToken.tokens, renderer));\n break;\n }\n case 'em': {\n const emToken = token;\n out += renderer.em(this.parseInline(emToken.tokens, renderer));\n break;\n }\n case 'codespan': {\n const codespanToken = token;\n out += renderer.codespan(codespanToken.text);\n break;\n }\n case 'br': {\n out += renderer.br();\n break;\n }\n case 'del': {\n const delToken = token;\n out += renderer.del(this.parseInline(delToken.tokens, renderer));\n break;\n }\n case 'text': {\n const textToken = token;\n out += renderer.text(textToken.text);\n break;\n }\n default: {\n const errMsg = 'Token with \"' + token.type + '\" type was not found.';\n if (this.options.silent) {\n console.error(errMsg);\n return '';\n }\n else {\n throw new Error(errMsg);\n }\n }\n }\n }\n return out;\n }\n}\n\nclass _Hooks {\n options;\n constructor(options) {\n this.options = options || _defaults;\n }\n static passThroughHooks = new Set([\n 'preprocess',\n 'postprocess',\n 'processAllTokens'\n ]);\n /**\n * Process markdown before marked\n */\n preprocess(markdown) {\n return markdown;\n }\n /**\n * Process HTML after marked is finished\n */\n postprocess(html) {\n return html;\n }\n /**\n * Process all tokens before walk tokens\n */\n processAllTokens(tokens) {\n return tokens;\n }\n}\n\nclass Marked {\n defaults = _getDefaults();\n options = this.setOptions;\n parse = this.#parseMarkdown(_Lexer.lex, _Parser.parse);\n parseInline = this.#parseMarkdown(_Lexer.lexInline, _Parser.parseInline);\n Parser = _Parser;\n Renderer = _Renderer;\n TextRenderer = _TextRenderer;\n Lexer = _Lexer;\n Tokenizer = _Tokenizer;\n Hooks = _Hooks;\n constructor(...args) {\n this.use(...args);\n }\n /**\n * Run callback for every token\n */\n walkTokens(tokens, callback) {\n let values = [];\n for (const token of tokens) {\n values = values.concat(callback.call(this, token));\n switch (token.type) {\n case 'table': {\n const tableToken = token;\n for (const cell of tableToken.header) {\n values = values.concat(this.walkTokens(cell.tokens, callback));\n }\n for (const row of tableToken.rows) {\n for (const cell of row) {\n values = values.concat(this.walkTokens(cell.tokens, callback));\n }\n }\n break;\n }\n case 'list': {\n const listToken = token;\n values = values.concat(this.walkTokens(listToken.items, callback));\n break;\n }\n default: {\n const genericToken = token;\n if (this.defaults.extensions?.childTokens?.[genericToken.type]) {\n this.defaults.extensions.childTokens[genericToken.type].forEach((childTokens) => {\n const tokens = genericToken[childTokens].flat(Infinity);\n values = values.concat(this.walkTokens(tokens, callback));\n });\n }\n else if (genericToken.tokens) {\n values = values.concat(this.walkTokens(genericToken.tokens, callback));\n }\n }\n }\n }\n return values;\n }\n use(...args) {\n const extensions = this.defaults.extensions || { renderers: {}, childTokens: {} };\n args.forEach((pack) => {\n // copy options to new object\n const opts = { ...pack };\n // set async to true if it was set to true before\n opts.async = this.defaults.async || opts.async || false;\n // ==-- Parse \"addon\" extensions --== //\n if (pack.extensions) {\n pack.extensions.forEach((ext) => {\n if (!ext.name) {\n throw new Error('extension name required');\n }\n if ('renderer' in ext) { // Renderer extensions\n const prevRenderer = extensions.renderers[ext.name];\n if (prevRenderer) {\n // Replace extension with func to run new extension but fall back if false\n extensions.renderers[ext.name] = function (...args) {\n let ret = ext.renderer.apply(this, args);\n if (ret === false) {\n ret = prevRenderer.apply(this, args);\n }\n return ret;\n };\n }\n else {\n extensions.renderers[ext.name] = ext.renderer;\n }\n }\n if ('tokenizer' in ext) { // Tokenizer Extensions\n if (!ext.level || (ext.level !== 'block' && ext.level !== 'inline')) {\n throw new Error(\"extension level must be 'block' or 'inline'\");\n }\n const extLevel = extensions[ext.level];\n if (extLevel) {\n extLevel.unshift(ext.tokenizer);\n }\n else {\n extensions[ext.level] = [ext.tokenizer];\n }\n if (ext.start) { // Function to check for start of token\n if (ext.level === 'block') {\n if (extensions.startBlock) {\n extensions.startBlock.push(ext.start);\n }\n else {\n extensions.startBlock = [ext.start];\n }\n }\n else if (ext.level === 'inline') {\n if (extensions.startInline) {\n extensions.startInline.push(ext.start);\n }\n else {\n extensions.startInline = [ext.start];\n }\n }\n }\n }\n if ('childTokens' in ext && ext.childTokens) { // Child tokens to be visited by walkTokens\n extensions.childTokens[ext.name] = ext.childTokens;\n }\n });\n opts.extensions = extensions;\n }\n // ==-- Parse \"overwrite\" extensions --== //\n if (pack.renderer) {\n const renderer = this.defaults.renderer || new _Renderer(this.defaults);\n for (const prop in pack.renderer) {\n if (!(prop in renderer)) {\n throw new Error(`renderer '${prop}' does not exist`);\n }\n if (prop === 'options') {\n // ignore options property\n continue;\n }\n const rendererProp = prop;\n const rendererFunc = pack.renderer[rendererProp];\n const prevRenderer = renderer[rendererProp];\n // Replace renderer with func to run extension, but fall back if false\n renderer[rendererProp] = (...args) => {\n let ret = rendererFunc.apply(renderer, args);\n if (ret === false) {\n ret = prevRenderer.apply(renderer, args);\n }\n return ret || '';\n };\n }\n opts.renderer = renderer;\n }\n if (pack.tokenizer) {\n const tokenizer = this.defaults.tokenizer || new _Tokenizer(this.defaults);\n for (const prop in pack.tokenizer) {\n if (!(prop in tokenizer)) {\n throw new Error(`tokenizer '${prop}' does not exist`);\n }\n if (['options', 'rules', 'lexer'].includes(prop)) {\n // ignore options, rules, and lexer properties\n continue;\n }\n const tokenizerProp = prop;\n const tokenizerFunc = pack.tokenizer[tokenizerProp];\n const prevTokenizer = tokenizer[tokenizerProp];\n // Replace tokenizer with func to run extension, but fall back if false\n // @ts-expect-error cannot type tokenizer function dynamically\n tokenizer[tokenizerProp] = (...args) => {\n let ret = tokenizerFunc.apply(tokenizer, args);\n if (ret === false) {\n ret = prevTokenizer.apply(tokenizer, args);\n }\n return ret;\n };\n }\n opts.tokenizer = tokenizer;\n }\n // ==-- Parse Hooks extensions --== //\n if (pack.hooks) {\n const hooks = this.defaults.hooks || new _Hooks();\n for (const prop in pack.hooks) {\n if (!(prop in hooks)) {\n throw new Error(`hook '${prop}' does not exist`);\n }\n if (prop === 'options') {\n // ignore options property\n continue;\n }\n const hooksProp = prop;\n const hooksFunc = pack.hooks[hooksProp];\n const prevHook = hooks[hooksProp];\n if (_Hooks.passThroughHooks.has(prop)) {\n // @ts-expect-error cannot type hook function dynamically\n hooks[hooksProp] = (arg) => {\n if (this.defaults.async) {\n return Promise.resolve(hooksFunc.call(hooks, arg)).then(ret => {\n return prevHook.call(hooks, ret);\n });\n }\n const ret = hooksFunc.call(hooks, arg);\n return prevHook.call(hooks, ret);\n };\n }\n else {\n // @ts-expect-error cannot type hook function dynamically\n hooks[hooksProp] = (...args) => {\n let ret = hooksFunc.apply(hooks, args);\n if (ret === false) {\n ret = prevHook.apply(hooks, args);\n }\n return ret;\n };\n }\n }\n opts.hooks = hooks;\n }\n // ==-- Parse WalkTokens extensions --== //\n if (pack.walkTokens) {\n const walkTokens = this.defaults.walkTokens;\n const packWalktokens = pack.walkTokens;\n opts.walkTokens = function (token) {\n let values = [];\n values.push(packWalktokens.call(this, token));\n if (walkTokens) {\n values = values.concat(walkTokens.call(this, token));\n }\n return values;\n };\n }\n this.defaults = { ...this.defaults, ...opts };\n });\n return this;\n }\n setOptions(opt) {\n this.defaults = { ...this.defaults, ...opt };\n return this;\n }\n lexer(src, options) {\n return _Lexer.lex(src, options ?? this.defaults);\n }\n parser(tokens, options) {\n return _Parser.parse(tokens, options ?? this.defaults);\n }\n #parseMarkdown(lexer, parser) {\n return (src, options) => {\n const origOpt = { ...options };\n const opt = { ...this.defaults, ...origOpt };\n // Show warning if an extension set async to true but the parse was called with async: false\n if (this.defaults.async === true && origOpt.async === false) {\n if (!opt.silent) {\n console.warn('marked(): The async option was set to true by an extension. The async: false option sent to parse will be ignored.');\n }\n opt.async = true;\n }\n const throwError = this.#onError(!!opt.silent, !!opt.async);\n // throw error in case of non string input\n if (typeof src === 'undefined' || src === null) {\n return throwError(new Error('marked(): input parameter is undefined or null'));\n }\n if (typeof src !== 'string') {\n return throwError(new Error('marked(): input parameter is of type '\n + Object.prototype.toString.call(src) + ', string expected'));\n }\n if (opt.hooks) {\n opt.hooks.options = opt;\n }\n if (opt.async) {\n return Promise.resolve(opt.hooks ? opt.hooks.preprocess(src) : src)\n .then(src => lexer(src, opt))\n .then(tokens => opt.hooks ? opt.hooks.processAllTokens(tokens) : tokens)\n .then(tokens => opt.walkTokens ? Promise.all(this.walkTokens(tokens, opt.walkTokens)).then(() => tokens) : tokens)\n .then(tokens => parser(tokens, opt))\n .then(html => opt.hooks ? opt.hooks.postprocess(html) : html)\n .catch(throwError);\n }\n try {\n if (opt.hooks) {\n src = opt.hooks.preprocess(src);\n }\n let tokens = lexer(src, opt);\n if (opt.hooks) {\n tokens = opt.hooks.processAllTokens(tokens);\n }\n if (opt.walkTokens) {\n this.walkTokens(tokens, opt.walkTokens);\n }\n let html = parser(tokens, opt);\n if (opt.hooks) {\n html = opt.hooks.postprocess(html);\n }\n return html;\n }\n catch (e) {\n return throwError(e);\n }\n };\n }\n #onError(silent, async) {\n return (e) => {\n e.message += '\\nPlease report this to https://github.com/markedjs/marked.';\n if (silent) {\n const msg = '<p>An error occurred:</p><pre>'\n + escape$1(e.message + '', true)\n + '</pre>';\n if (async) {\n return Promise.resolve(msg);\n }\n return msg;\n }\n if (async) {\n return Promise.reject(e);\n }\n throw e;\n };\n }\n}\n\nconst markedInstance = new Marked();\nfunction marked(src, opt) {\n return markedInstance.parse(src, opt);\n}\n/**\n * Sets the default options.\n *\n * @param options Hash of options\n */\nmarked.options =\n marked.setOptions = function (options) {\n markedInstance.setOptions(options);\n marked.defaults = markedInstance.defaults;\n changeDefaults(marked.defaults);\n return marked;\n };\n/**\n * Gets the original marked default options.\n */\nmarked.getDefaults = _getDefaults;\nmarked.defaults = _defaults;\n/**\n * Use Extension\n */\nmarked.use = function (...args) {\n markedInstance.use(...args);\n marked.defaults = markedInstance.defaults;\n changeDefaults(marked.defaults);\n return marked;\n};\n/**\n * Run callback for every token\n */\nmarked.walkTokens = function (tokens, callback) {\n return markedInstance.walkTokens(tokens, callback);\n};\n/**\n * Compiles markdown to HTML without enclosing `p` tag.\n *\n * @param src String of markdown source to be compiled\n * @param options Hash of options\n * @return String of compiled HTML\n */\nmarked.parseInline = markedInstance.parseInline;\n/**\n * Expose\n */\nmarked.Parser = _Parser;\nmarked.parser = _Parser.parse;\nmarked.Renderer = _Renderer;\nmarked.TextRenderer = _TextRenderer;\nmarked.Lexer = _Lexer;\nmarked.lexer = _Lexer.lex;\nmarked.Tokenizer = _Tokenizer;\nmarked.Hooks = _Hooks;\nmarked.parse = marked;\nconst options = marked.options;\nconst setOptions = marked.setOptions;\nconst use = marked.use;\nconst walkTokens = marked.walkTokens;\nconst parseInline = marked.parseInline;\nconst parse = marked;\nconst parser = _Parser.parse;\nconst lexer = _Lexer.lex;\n\nexport { _Hooks as Hooks, _Lexer as Lexer, Marked, _Parser as Parser, _Renderer as Renderer, _TextRenderer as TextRenderer, _Tokenizer as Tokenizer, _defaults as defaults, _getDefaults as getDefaults, lexer, marked, options, parse, parseInline, parser, setOptions, use, walkTokens };\n//# sourceMappingURL=marked.esm.js.map\n","/**\n * Custom positioning reference element.\n * @see https://floating-ui.com/docs/virtual-elements\n */\n\nconst sides = ['top', 'right', 'bottom', 'left'];\nconst alignments = ['start', 'end'];\nconst placements = /*#__PURE__*/sides.reduce((acc, side) => acc.concat(side, side + \"-\" + alignments[0], side + \"-\" + alignments[1]), []);\nconst min = Math.min;\nconst max = Math.max;\nconst round = Math.round;\nconst floor = Math.floor;\nconst createCoords = v => ({\n x: v,\n y: v\n});\nconst oppositeSideMap = {\n left: 'right',\n right: 'left',\n bottom: 'top',\n top: 'bottom'\n};\nconst oppositeAlignmentMap = {\n start: 'end',\n end: 'start'\n};\nfunction clamp(start, value, end) {\n return max(start, min(value, end));\n}\nfunction evaluate(value, param) {\n return typeof value === 'function' ? value(param) : value;\n}\nfunction getSide(placement) {\n return placement.split('-')[0];\n}\nfunction getAlignment(placement) {\n return placement.split('-')[1];\n}\nfunction getOppositeAxis(axis) {\n return axis === 'x' ? 'y' : 'x';\n}\nfunction getAxisLength(axis) {\n return axis === 'y' ? 'height' : 'width';\n}\nfunction getSideAxis(placement) {\n return ['top', 'bottom'].includes(getSide(placement)) ? 'y' : 'x';\n}\nfunction getAlignmentAxis(placement) {\n return getOppositeAxis(getSideAxis(placement));\n}\nfunction getAlignmentSides(placement, rects, rtl) {\n if (rtl === void 0) {\n rtl = false;\n }\n const alignment = getAlignment(placement);\n const alignmentAxis = getAlignmentAxis(placement);\n const length = getAxisLength(alignmentAxis);\n let mainAlignmentSide = alignmentAxis === 'x' ? alignment === (rtl ? 'end' : 'start') ? 'right' : 'left' : alignment === 'start' ? 'bottom' : 'top';\n if (rects.reference[length] > rects.floating[length]) {\n mainAlignmentSide = getOppositePlacement(mainAlignmentSide);\n }\n return [mainAlignmentSide, getOppositePlacement(mainAlignmentSide)];\n}\nfunction getExpandedPlacements(placement) {\n const oppositePlacement = getOppositePlacement(placement);\n return [getOppositeAlignmentPlacement(placement), oppositePlacement, getOppositeAlignmentPlacement(oppositePlacement)];\n}\nfunction getOppositeAlignmentPlacement(placement) {\n return placement.replace(/start|end/g, alignment => oppositeAlignmentMap[alignment]);\n}\nfunction getSideList(side, isStart, rtl) {\n const lr = ['left', 'right'];\n const rl = ['right', 'left'];\n const tb = ['top', 'bottom'];\n const bt = ['bottom', 'top'];\n switch (side) {\n case 'top':\n case 'bottom':\n if (rtl) return isStart ? rl : lr;\n return isStart ? lr : rl;\n case 'left':\n case 'right':\n return isStart ? tb : bt;\n default:\n return [];\n }\n}\nfunction getOppositeAxisPlacements(placement, flipAlignment, direction, rtl) {\n const alignment = getAlignment(placement);\n let list = getSideList(getSide(placement), direction === 'start', rtl);\n if (alignment) {\n list = list.map(side => side + \"-\" + alignment);\n if (flipAlignment) {\n list = list.concat(list.map(getOppositeAlignmentPlacement));\n }\n }\n return list;\n}\nfunction getOppositePlacement(placement) {\n return placement.replace(/left|right|bottom|top/g, side => oppositeSideMap[side]);\n}\nfunction expandPaddingObject(padding) {\n return {\n top: 0,\n right: 0,\n bottom: 0,\n left: 0,\n ...padding\n };\n}\nfunction getPaddingObject(padding) {\n return typeof padding !== 'number' ? expandPaddingObject(padding) : {\n top: padding,\n right: padding,\n bottom: padding,\n left: padding\n };\n}\nfunction rectToClientRect(rect) {\n return {\n ...rect,\n top: rect.y,\n left: rect.x,\n right: rect.x + rect.width,\n bottom: rect.y + rect.height\n };\n}\n\nexport { alignments, clamp, createCoords, evaluate, expandPaddingObject, floor, getAlignment, getAlignmentAxis, getAlignmentSides, getAxisLength, getExpandedPlacements, getOppositeAlignmentPlacement, getOppositeAxis, getOppositeAxisPlacements, getOppositePlacement, getPaddingObject, getSide, getSideAxis, max, min, placements, rectToClientRect, round, sides };\n","import { getSideAxis, getAlignmentAxis, getAxisLength, getSide, getAlignment, evaluate, getPaddingObject, rectToClientRect, min, clamp, placements, getAlignmentSides, getOppositeAlignmentPlacement, getOppositePlacement, getExpandedPlacements, getOppositeAxisPlacements, sides, max, getOppositeAxis } from '@floating-ui/utils';\nexport { rectToClientRect } from '@floating-ui/utils';\n\nfunction computeCoordsFromPlacement(_ref, placement, rtl) {\n let {\n reference,\n floating\n } = _ref;\n const sideAxis = getSideAxis(placement);\n const alignmentAxis = getAlignmentAxis(placement);\n const alignLength = getAxisLength(alignmentAxis);\n const side = getSide(placement);\n const isVertical = sideAxis === 'y';\n const commonX = reference.x + reference.width / 2 - floating.width / 2;\n const commonY = reference.y + reference.height / 2 - floating.height / 2;\n const commonAlign = reference[alignLength] / 2 - floating[alignLength] / 2;\n let coords;\n switch (side) {\n case 'top':\n coords = {\n x: commonX,\n y: reference.y - floating.height\n };\n break;\n case 'bottom':\n coords = {\n x: commonX,\n y: reference.y + reference.height\n };\n break;\n case 'right':\n coords = {\n x: reference.x + reference.width,\n y: commonY\n };\n break;\n case 'left':\n coords = {\n x: reference.x - floating.width,\n y: commonY\n };\n break;\n default:\n coords = {\n x: reference.x,\n y: reference.y\n };\n }\n switch (getAlignment(placement)) {\n case 'start':\n coords[alignmentAxis] -= commonAlign * (rtl && isVertical ? -1 : 1);\n break;\n case 'end':\n coords[alignmentAxis] += commonAlign * (rtl && isVertical ? -1 : 1);\n break;\n }\n return coords;\n}\n\n/**\n * Computes the `x` and `y` coordinates that will place the floating element\n * next to a given reference element.\n *\n * This export does not have any `platform` interface logic. You will need to\n * write one for the platform you are using Floating UI with.\n */\nconst computePosition = async (reference, floating, config) => {\n const {\n placement = 'bottom',\n strategy = 'absolute',\n middleware = [],\n platform\n } = config;\n const validMiddleware = middleware.filter(Boolean);\n const rtl = await (platform.isRTL == null ? void 0 : platform.isRTL(floating));\n let rects = await platform.getElementRects({\n reference,\n floating,\n strategy\n });\n let {\n x,\n y\n } = computeCoordsFromPlacement(rects, placement, rtl);\n let statefulPlacement = placement;\n let middlewareData = {};\n let resetCount = 0;\n for (let i = 0; i < validMiddleware.length; i++) {\n const {\n name,\n fn\n } = validMiddleware[i];\n const {\n x: nextX,\n y: nextY,\n data,\n reset\n } = await fn({\n x,\n y,\n initialPlacement: placement,\n placement: statefulPlacement,\n strategy,\n middlewareData,\n rects,\n platform,\n elements: {\n reference,\n floating\n }\n });\n x = nextX != null ? nextX : x;\n y = nextY != null ? nextY : y;\n middlewareData = {\n ...middlewareData,\n [name]: {\n ...middlewareData[name],\n ...data\n }\n };\n if (reset && resetCount <= 50) {\n resetCount++;\n if (typeof reset === 'object') {\n if (reset.placement) {\n statefulPlacement = reset.placement;\n }\n if (reset.rects) {\n rects = reset.rects === true ? await platform.getElementRects({\n reference,\n floating,\n strategy\n }) : reset.rects;\n }\n ({\n x,\n y\n } = computeCoordsFromPlacement(rects, statefulPlacement, rtl));\n }\n i = -1;\n }\n }\n return {\n x,\n y,\n placement: statefulPlacement,\n strategy,\n middlewareData\n };\n};\n\n/**\n * Resolves with an object of overflow side offsets that determine how much the\n * element is overflowing a given clipping boundary on each side.\n * - positive = overflowing the boundary by that number of pixels\n * - negative = how many pixels left before it will overflow\n * - 0 = lies flush with the boundary\n * @see https://floating-ui.com/docs/detectOverflow\n */\nasync function detectOverflow(state, options) {\n var _await$platform$isEle;\n if (options === void 0) {\n options = {};\n }\n const {\n x,\n y,\n platform,\n rects,\n elements,\n strategy\n } = state;\n const {\n boundary = 'clippingAncestors',\n rootBoundary = 'viewport',\n elementContext = 'floating',\n altBoundary = false,\n padding = 0\n } = evaluate(options, state);\n const paddingObject = getPaddingObject(padding);\n const altContext = elementContext === 'floating' ? 'reference' : 'floating';\n const element = elements[altBoundary ? altContext : elementContext];\n const clippingClientRect = rectToClientRect(await platform.getClippingRect({\n element: ((_await$platform$isEle = await (platform.isElement == null ? void 0 : platform.isElement(element))) != null ? _await$platform$isEle : true) ? element : element.contextElement || (await (platform.getDocumentElement == null ? void 0 : platform.getDocumentElement(elements.floating))),\n boundary,\n rootBoundary,\n strategy\n }));\n const rect = elementContext === 'floating' ? {\n ...rects.floating,\n x,\n y\n } : rects.reference;\n const offsetParent = await (platform.getOffsetParent == null ? void 0 : platform.getOffsetParent(elements.floating));\n const offsetScale = (await (platform.isElement == null ? void 0 : platform.isElement(offsetParent))) ? (await (platform.getScale == null ? void 0 : platform.getScale(offsetParent))) || {\n x: 1,\n y: 1\n } : {\n x: 1,\n y: 1\n };\n const elementClientRect = rectToClientRect(platform.convertOffsetParentRelativeRectToViewportRelativeRect ? await platform.convertOffsetParentRelativeRectToViewportRelativeRect({\n elements,\n rect,\n offsetParent,\n strategy\n }) : rect);\n return {\n top: (clippingClientRect.top - elementClientRect.top + paddingObject.top) / offsetScale.y,\n bottom: (elementClientRect.bottom - clippingClientRect.bottom + paddingObject.bottom) / offsetScale.y,\n left: (clippingClientRect.left - elementClientRect.left + paddingObject.left) / offsetScale.x,\n right: (elementClientRect.right - clippingClientRect.right + paddingObject.right) / offsetScale.x\n };\n}\n\n/**\n * Provides data to position an inner element of the floating element so that it\n * appears centered to the reference element.\n * @see https://floating-ui.com/docs/arrow\n */\nconst arrow = options => ({\n name: 'arrow',\n options,\n async fn(state) {\n const {\n x,\n y,\n placement,\n rects,\n platform,\n elements,\n middlewareData\n } = state;\n // Since `element` is required, we don't Partial<> the type.\n const {\n element,\n padding = 0\n } = evaluate(options, state) || {};\n if (element == null) {\n return {};\n }\n const paddingObject = getPaddingObject(padding);\n const coords = {\n x,\n y\n };\n const axis = getAlignmentAxis(placement);\n const length = getAxisLength(axis);\n const arrowDimensions = await platform.getDimensions(element);\n const isYAxis = axis === 'y';\n const minProp = isYAxis ? 'top' : 'left';\n const maxProp = isYAxis ? 'bottom' : 'right';\n const clientProp = isYAxis ? 'clientHeight' : 'clientWidth';\n const endDiff = rects.reference[length] + rects.reference[axis] - coords[axis] - rects.floating[length];\n const startDiff = coords[axis] - rects.reference[axis];\n const arrowOffsetParent = await (platform.getOffsetParent == null ? void 0 : platform.getOffsetParent(element));\n let clientSize = arrowOffsetParent ? arrowOffsetParent[clientProp] : 0;\n\n // DOM platform can return `window` as the `offsetParent`.\n if (!clientSize || !(await (platform.isElement == null ? void 0 : platform.isElement(arrowOffsetParent)))) {\n clientSize = elements.floating[clientProp] || rects.floating[length];\n }\n const centerToReference = endDiff / 2 - startDiff / 2;\n\n // If the padding is large enough that it causes the arrow to no longer be\n // centered, modify the padding so that it is centered.\n const largestPossiblePadding = clientSize / 2 - arrowDimensions[length] / 2 - 1;\n const minPadding = min(paddingObject[minProp], largestPossiblePadding);\n const maxPadding = min(paddingObject[maxProp], largestPossiblePadding);\n\n // Make sure the arrow doesn't overflow the floating element if the center\n // point is outside the floating element's bounds.\n const min$1 = minPadding;\n const max = clientSize - arrowDimensions[length] - maxPadding;\n const center = clientSize / 2 - arrowDimensions[length] / 2 + centerToReference;\n const offset = clamp(min$1, center, max);\n\n // If the reference is small enough that the arrow's padding causes it to\n // to point to nothing for an aligned placement, adjust the offset of the\n // floating element itself. To ensure `shift()` continues to take action,\n // a single reset is performed when this is true.\n const shouldAddOffset = !middlewareData.arrow && getAlignment(placement) != null && center !== offset && rects.reference[length] / 2 - (center < min$1 ? minPadding : maxPadding) - arrowDimensions[length] / 2 < 0;\n const alignmentOffset = shouldAddOffset ? center < min$1 ? center - min$1 : center - max : 0;\n return {\n [axis]: coords[axis] + alignmentOffset,\n data: {\n [axis]: offset,\n centerOffset: center - offset - alignmentOffset,\n ...(shouldAddOffset && {\n alignmentOffset\n })\n },\n reset: shouldAddOffset\n };\n }\n});\n\nfunction getPlacementList(alignment, autoAlignment, allowedPlacements) {\n const allowedPlacementsSortedByAlignment = alignment ? [...allowedPlacements.filter(placement => getAlignment(placement) === alignment), ...allowedPlacements.filter(placement => getAlignment(placement) !== alignment)] : allowedPlacements.filter(placement => getSide(placement) === placement);\n return allowedPlacementsSortedByAlignment.filter(placement => {\n if (alignment) {\n return getAlignment(placement) === alignment || (autoAlignment ? getOppositeAlignmentPlacement(placement) !== placement : false);\n }\n return true;\n });\n}\n/**\n * Optimizes the visibility of the floating element by choosing the placement\n * that has the most space available automatically, without needing to specify a\n * preferred placement. Alternative to `flip`.\n * @see https://floating-ui.com/docs/autoPlacement\n */\nconst autoPlacement = function (options) {\n if (options === void 0) {\n options = {};\n }\n return {\n name: 'autoPlacement',\n options,\n async fn(state) {\n var _middlewareData$autoP, _middlewareData$autoP2, _placementsThatFitOnE;\n const {\n rects,\n middlewareData,\n placement,\n platform,\n elements\n } = state;\n const {\n crossAxis = false,\n alignment,\n allowedPlacements = placements,\n autoAlignment = true,\n ...detectOverflowOptions\n } = evaluate(options, state);\n const placements$1 = alignment !== undefined || allowedPlacements === placements ? getPlacementList(alignment || null, autoAlignment, allowedPlacements) : allowedPlacements;\n const overflow = await detectOverflow(state, detectOverflowOptions);\n const currentIndex = ((_middlewareData$autoP = middlewareData.autoPlacement) == null ? void 0 : _middlewareData$autoP.index) || 0;\n const currentPlacement = placements$1[currentIndex];\n if (currentPlacement == null) {\n return {};\n }\n const alignmentSides = getAlignmentSides(currentPlacement, rects, await (platform.isRTL == null ? void 0 : platform.isRTL(elements.floating)));\n\n // Make `computeCoords` start from the right place.\n if (placement !== currentPlacement) {\n return {\n reset: {\n placement: placements$1[0]\n }\n };\n }\n const currentOverflows = [overflow[getSide(currentPlacement)], overflow[alignmentSides[0]], overflow[alignmentSides[1]]];\n const allOverflows = [...(((_middlewareData$autoP2 = middlewareData.autoPlacement) == null ? void 0 : _middlewareData$autoP2.overflows) || []), {\n placement: currentPlacement,\n overflows: currentOverflows\n }];\n const nextPlacement = placements$1[currentIndex + 1];\n\n // There are more placements to check.\n if (nextPlacement) {\n return {\n data: {\n index: currentIndex + 1,\n overflows: allOverflows\n },\n reset: {\n placement: nextPlacement\n }\n };\n }\n const placementsSortedByMostSpace = allOverflows.map(d => {\n const alignment = getAlignment(d.placement);\n return [d.placement, alignment && crossAxis ?\n // Check along the mainAxis and main crossAxis side.\n d.overflows.slice(0, 2).reduce((acc, v) => acc + v, 0) :\n // Check only the mainAxis.\n d.overflows[0], d.overflows];\n }).sort((a, b) => a[1] - b[1]);\n const placementsThatFitOnEachSide = placementsSortedByMostSpace.filter(d => d[2].slice(0,\n // Aligned placements should not check their opposite crossAxis\n // side.\n getAlignment(d[0]) ? 2 : 3).every(v => v <= 0));\n const resetPlacement = ((_placementsThatFitOnE = placementsThatFitOnEachSide[0]) == null ? void 0 : _placementsThatFitOnE[0]) || placementsSortedByMostSpace[0][0];\n if (resetPlacement !== placement) {\n return {\n data: {\n index: currentIndex + 1,\n overflows: allOverflows\n },\n reset: {\n placement: resetPlacement\n }\n };\n }\n return {};\n }\n };\n};\n\n/**\n * Optimizes the visibility of the floating element by flipping the `placement`\n * in order to keep it in view when the preferred placement(s) will overflow the\n * clipping boundary. Alternative to `autoPlacement`.\n * @see https://floating-ui.com/docs/flip\n */\nconst flip = function (options) {\n if (options === void 0) {\n options = {};\n }\n return {\n name: 'flip',\n options,\n async fn(state) {\n var _middlewareData$arrow, _middlewareData$flip;\n const {\n placement,\n middlewareData,\n rects,\n initialPlacement,\n platform,\n elements\n } = state;\n const {\n mainAxis: checkMainAxis = true,\n crossAxis: checkCrossAxis = true,\n fallbackPlacements: specifiedFallbackPlacements,\n fallbackStrategy = 'bestFit',\n fallbackAxisSideDirection = 'none',\n flipAlignment = true,\n ...detectOverflowOptions\n } = evaluate(options, state);\n\n // If a reset by the arrow was caused due to an alignment offset being\n // added, we should skip any logic now since `flip()` has already done its\n // work.\n // https://github.com/floating-ui/floating-ui/issues/2549#issuecomment-1719601643\n if ((_middlewareData$arrow = middlewareData.arrow) != null && _middlewareData$arrow.alignmentOffset) {\n return {};\n }\n const side = getSide(placement);\n const isBasePlacement = getSide(initialPlacement) === initialPlacement;\n const rtl = await (platform.isRTL == null ? void 0 : platform.isRTL(elements.floating));\n const fallbackPlacements = specifiedFallbackPlacements || (isBasePlacement || !flipAlignment ? [getOppositePlacement(initialPlacement)] : getExpandedPlacements(initialPlacement));\n if (!specifiedFallbackPlacements && fallbackAxisSideDirection !== 'none') {\n fallbackPlacements.push(...getOppositeAxisPlacements(initialPlacement, flipAlignment, fallbackAxisSideDirection, rtl));\n }\n const placements = [initialPlacement, ...fallbackPlacements];\n const overflow = await detectOverflow(state, detectOverflowOptions);\n const overflows = [];\n let overflowsData = ((_middlewareData$flip = middlewareData.flip) == null ? void 0 : _middlewareData$flip.overflows) || [];\n if (checkMainAxis) {\n overflows.push(overflow[side]);\n }\n if (checkCrossAxis) {\n const sides = getAlignmentSides(placement, rects, rtl);\n overflows.push(overflow[sides[0]], overflow[sides[1]]);\n }\n overflowsData = [...overflowsData, {\n placement,\n overflows\n }];\n\n // One or more sides is overflowing.\n if (!overflows.every(side => side <= 0)) {\n var _middlewareData$flip2, _overflowsData$filter;\n const nextIndex = (((_middlewareData$flip2 = middlewareData.flip) == null ? void 0 : _middlewareData$flip2.index) || 0) + 1;\n const nextPlacement = placements[nextIndex];\n if (nextPlacement) {\n // Try next placement and re-run the lifecycle.\n return {\n data: {\n index: nextIndex,\n overflows: overflowsData\n },\n reset: {\n placement: nextPlacement\n }\n };\n }\n\n // First, find the candidates that fit on the mainAxis side of overflow,\n // then find the placement that fits the best on the main crossAxis side.\n let resetPlacement = (_overflowsData$filter = overflowsData.filter(d => d.overflows[0] <= 0).sort((a, b) => a.overflows[1] - b.overflows[1])[0]) == null ? void 0 : _overflowsData$filter.placement;\n\n // Otherwise fallback.\n if (!resetPlacement) {\n switch (fallbackStrategy) {\n case 'bestFit':\n {\n var _overflowsData$map$so;\n const placement = (_overflowsData$map$so = overflowsData.map(d => [d.placement, d.overflows.filter(overflow => overflow > 0).reduce((acc, overflow) => acc + overflow, 0)]).sort((a, b) => a[1] - b[1])[0]) == null ? void 0 : _overflowsData$map$so[0];\n if (placement) {\n resetPlacement = placement;\n }\n break;\n }\n case 'initialPlacement':\n resetPlacement = initialPlacement;\n break;\n }\n }\n if (placement !== resetPlacement) {\n return {\n reset: {\n placement: resetPlacement\n }\n };\n }\n }\n return {};\n }\n };\n};\n\nfunction getSideOffsets(overflow, rect) {\n return {\n top: overflow.top - rect.height,\n right: overflow.right - rect.width,\n bottom: overflow.bottom - rect.height,\n left: overflow.left - rect.width\n };\n}\nfunction isAnySideFullyClipped(overflow) {\n return sides.some(side => overflow[side] >= 0);\n}\n/**\n * Provides data to hide the floating element in applicable situations, such as\n * when it is not in the same clipping context as the reference element.\n * @see https://floating-ui.com/docs/hide\n */\nconst hide = function (options) {\n if (options === void 0) {\n options = {};\n }\n return {\n name: 'hide',\n options,\n async fn(state) {\n const {\n rects\n } = state;\n const {\n strategy = 'referenceHidden',\n ...detectOverflowOptions\n } = evaluate(options, state);\n switch (strategy) {\n case 'referenceHidden':\n {\n const overflow = await detectOverflow(state, {\n ...detectOverflowOptions,\n elementContext: 'reference'\n });\n const offsets = getSideOffsets(overflow, rects.reference);\n return {\n data: {\n referenceHiddenOffsets: offsets,\n referenceHidden: isAnySideFullyClipped(offsets)\n }\n };\n }\n case 'escaped':\n {\n const overflow = await detectOverflow(state, {\n ...detectOverflowOptions,\n altBoundary: true\n });\n const offsets = getSideOffsets(overflow, rects.floating);\n return {\n data: {\n escapedOffsets: offsets,\n escaped: isAnySideFullyClipped(offsets)\n }\n };\n }\n default:\n {\n return {};\n }\n }\n }\n };\n};\n\nfunction getBoundingRect(rects) {\n const minX = min(...rects.map(rect => rect.left));\n const minY = min(...rects.map(rect => rect.top));\n const maxX = max(...rects.map(rect => rect.right));\n const maxY = max(...rects.map(rect => rect.bottom));\n return {\n x: minX,\n y: minY,\n width: maxX - minX,\n height: maxY - minY\n };\n}\nfunction getRectsByLine(rects) {\n const sortedRects = rects.slice().sort((a, b) => a.y - b.y);\n const groups = [];\n let prevRect = null;\n for (let i = 0; i < sortedRects.length; i++) {\n const rect = sortedRects[i];\n if (!prevRect || rect.y - prevRect.y > prevRect.height / 2) {\n groups.push([rect]);\n } else {\n groups[groups.length - 1].push(rect);\n }\n prevRect = rect;\n }\n return groups.map(rect => rectToClientRect(getBoundingRect(rect)));\n}\n/**\n * Provides improved positioning for inline reference elements that can span\n * over multiple lines, such as hyperlinks or range selections.\n * @see https://floating-ui.com/docs/inline\n */\nconst inline = function (options) {\n if (options === void 0) {\n options = {};\n }\n return {\n name: 'inline',\n options,\n async fn(state) {\n const {\n placement,\n elements,\n rects,\n platform,\n strategy\n } = state;\n // A MouseEvent's client{X,Y} coords can be up to 2 pixels off a\n // ClientRect's bounds, despite the event listener being triggered. A\n // padding of 2 seems to handle this issue.\n const {\n padding = 2,\n x,\n y\n } = evaluate(options, state);\n const nativeClientRects = Array.from((await (platform.getClientRects == null ? void 0 : platform.getClientRects(elements.reference))) || []);\n const clientRects = getRectsByLine(nativeClientRects);\n const fallback = rectToClientRect(getBoundingRect(nativeClientRects));\n const paddingObject = getPaddingObject(padding);\n function getBoundingClientRect() {\n // There are two rects and they are disjoined.\n if (clientRects.length === 2 && clientRects[0].left > clientRects[1].right && x != null && y != null) {\n // Find the first rect in which the point is fully inside.\n return clientRects.find(rect => x > rect.left - paddingObject.left && x < rect.right + paddingObject.right && y > rect.top - paddingObject.top && y < rect.bottom + paddingObject.bottom) || fallback;\n }\n\n // There are 2 or more connected rects.\n if (clientRects.length >= 2) {\n if (getSideAxis(placement) === 'y') {\n const firstRect = clientRects[0];\n const lastRect = clientRects[clientRects.length - 1];\n const isTop = getSide(placement) === 'top';\n const top = firstRect.top;\n const bottom = lastRect.bottom;\n const left = isTop ? firstRect.left : lastRect.left;\n const right = isTop ? firstRect.right : lastRect.right;\n const width = right - left;\n const height = bottom - top;\n return {\n top,\n bottom,\n left,\n right,\n width,\n height,\n x: left,\n y: top\n };\n }\n const isLeftSide = getSide(placement) === 'left';\n const maxRight = max(...clientRects.map(rect => rect.right));\n const minLeft = min(...clientRects.map(rect => rect.left));\n const measureRects = clientRects.filter(rect => isLeftSide ? rect.left === minLeft : rect.right === maxRight);\n const top = measureRects[0].top;\n const bottom = measureRects[measureRects.length - 1].bottom;\n const left = minLeft;\n const right = maxRight;\n const width = right - left;\n const height = bottom - top;\n return {\n top,\n bottom,\n left,\n right,\n width,\n height,\n x: left,\n y: top\n };\n }\n return fallback;\n }\n const resetRects = await platform.getElementRects({\n reference: {\n getBoundingClientRect\n },\n floating: elements.floating,\n strategy\n });\n if (rects.reference.x !== resetRects.reference.x || rects.reference.y !== resetRects.reference.y || rects.reference.width !== resetRects.reference.width || rects.reference.height !== resetRects.reference.height) {\n return {\n reset: {\n rects: resetRects\n }\n };\n }\n return {};\n }\n };\n};\n\n// For type backwards-compatibility, the `OffsetOptions` type was also\n// Derivable.\n\nasync function convertValueToCoords(state, options) {\n const {\n placement,\n platform,\n elements\n } = state;\n const rtl = await (platform.isRTL == null ? void 0 : platform.isRTL(elements.floating));\n const side = getSide(placement);\n const alignment = getAlignment(placement);\n const isVertical = getSideAxis(placement) === 'y';\n const mainAxisMulti = ['left', 'top'].includes(side) ? -1 : 1;\n const crossAxisMulti = rtl && isVertical ? -1 : 1;\n const rawValue = evaluate(options, state);\n let {\n mainAxis,\n crossAxis,\n alignmentAxis\n } = typeof rawValue === 'number' ? {\n mainAxis: rawValue,\n crossAxis: 0,\n alignmentAxis: null\n } : {\n mainAxis: 0,\n crossAxis: 0,\n alignmentAxis: null,\n ...rawValue\n };\n if (alignment && typeof alignmentAxis === 'number') {\n crossAxis = alignment === 'end' ? alignmentAxis * -1 : alignmentAxis;\n }\n return isVertical ? {\n x: crossAxis * crossAxisMulti,\n y: mainAxis * mainAxisMulti\n } : {\n x: mainAxis * mainAxisMulti,\n y: crossAxis * crossAxisMulti\n };\n}\n\n/**\n * Modifies the placement by translating the floating element along the\n * specified axes.\n * A number (shorthand for `mainAxis` or distance), or an axes configuration\n * object may be passed.\n * @see https://floating-ui.com/docs/offset\n */\nconst offset = function (options) {\n if (options === void 0) {\n options = 0;\n }\n return {\n name: 'offset',\n options,\n async fn(state) {\n var _middlewareData$offse, _middlewareData$arrow;\n const {\n x,\n y,\n placement,\n middlewareData\n } = state;\n const diffCoords = await convertValueToCoords(state, options);\n\n // If the placement is the same and the arrow caused an alignment offset\n // then we don't need to change the positioning coordinates.\n if (placement === ((_middlewareData$offse = middlewareData.offset) == null ? void 0 : _middlewareData$offse.placement) && (_middlewareData$arrow = middlewareData.arrow) != null && _middlewareData$arrow.alignmentOffset) {\n return {};\n }\n return {\n x: x + diffCoords.x,\n y: y + diffCoords.y,\n data: {\n ...diffCoords,\n placement\n }\n };\n }\n };\n};\n\n/**\n * Optimizes the visibility of the floating element by shifting it in order to\n * keep it in view when it will overflow the clipping boundary.\n * @see https://floating-ui.com/docs/shift\n */\nconst shift = function (options) {\n if (options === void 0) {\n options = {};\n }\n return {\n name: 'shift',\n options,\n async fn(state) {\n const {\n x,\n y,\n placement\n } = state;\n const {\n mainAxis: checkMainAxis = true,\n crossAxis: checkCrossAxis = false,\n limiter = {\n fn: _ref => {\n let {\n x,\n y\n } = _ref;\n return {\n x,\n y\n };\n }\n },\n ...detectOverflowOptions\n } = evaluate(options, state);\n const coords = {\n x,\n y\n };\n const overflow = await detectOverflow(state, detectOverflowOptions);\n const crossAxis = getSideAxis(getSide(placement));\n const mainAxis = getOppositeAxis(crossAxis);\n let mainAxisCoord = coords[mainAxis];\n let crossAxisCoord = coords[crossAxis];\n if (checkMainAxis) {\n const minSide = mainAxis === 'y' ? 'top' : 'left';\n const maxSide = mainAxis === 'y' ? 'bottom' : 'right';\n const min = mainAxisCoord + overflow[minSide];\n const max = mainAxisCoord - overflow[maxSide];\n mainAxisCoord = clamp(min, mainAxisCoord, max);\n }\n if (checkCrossAxis) {\n const minSide = crossAxis === 'y' ? 'top' : 'left';\n const maxSide = crossAxis === 'y' ? 'bottom' : 'right';\n const min = crossAxisCoord + overflow[minSide];\n const max = crossAxisCoord - overflow[maxSide];\n crossAxisCoord = clamp(min, crossAxisCoord, max);\n }\n const limitedCoords = limiter.fn({\n ...state,\n [mainAxis]: mainAxisCoord,\n [crossAxis]: crossAxisCoord\n });\n return {\n ...limitedCoords,\n data: {\n x: limitedCoords.x - x,\n y: limitedCoords.y - y\n }\n };\n }\n };\n};\n/**\n * Built-in `limiter` that will stop `shift()` at a certain point.\n */\nconst limitShift = function (options) {\n if (options === void 0) {\n options = {};\n }\n return {\n options,\n fn(state) {\n const {\n x,\n y,\n placement,\n rects,\n middlewareData\n } = state;\n const {\n offset = 0,\n mainAxis: checkMainAxis = true,\n crossAxis: checkCrossAxis = true\n } = evaluate(options, state);\n const coords = {\n x,\n y\n };\n const crossAxis = getSideAxis(placement);\n const mainAxis = getOppositeAxis(crossAxis);\n let mainAxisCoord = coords[mainAxis];\n let crossAxisCoord = coords[crossAxis];\n const rawOffset = evaluate(offset, state);\n const computedOffset = typeof rawOffset === 'number' ? {\n mainAxis: rawOffset,\n crossAxis: 0\n } : {\n mainAxis: 0,\n crossAxis: 0,\n ...rawOffset\n };\n if (checkMainAxis) {\n const len = mainAxis === 'y' ? 'height' : 'width';\n const limitMin = rects.reference[mainAxis] - rects.floating[len] + computedOffset.mainAxis;\n const limitMax = rects.reference[mainAxis] + rects.reference[len] - computedOffset.mainAxis;\n if (mainAxisCoord < limitMin) {\n mainAxisCoord = limitMin;\n } else if (mainAxisCoord > limitMax) {\n mainAxisCoord = limitMax;\n }\n }\n if (checkCrossAxis) {\n var _middlewareData$offse, _middlewareData$offse2;\n const len = mainAxis === 'y' ? 'width' : 'height';\n const isOriginSide = ['top', 'left'].includes(getSide(placement));\n const limitMin = rects.reference[crossAxis] - rects.floating[len] + (isOriginSide ? ((_middlewareData$offse = middlewareData.offset) == null ? void 0 : _middlewareData$offse[crossAxis]) || 0 : 0) + (isOriginSide ? 0 : computedOffset.crossAxis);\n const limitMax = rects.reference[crossAxis] + rects.reference[len] + (isOriginSide ? 0 : ((_middlewareData$offse2 = middlewareData.offset) == null ? void 0 : _middlewareData$offse2[crossAxis]) || 0) - (isOriginSide ? computedOffset.crossAxis : 0);\n if (crossAxisCoord < limitMin) {\n crossAxisCoord = limitMin;\n } else if (crossAxisCoord > limitMax) {\n crossAxisCoord = limitMax;\n }\n }\n return {\n [mainAxis]: mainAxisCoord,\n [crossAxis]: crossAxisCoord\n };\n }\n };\n};\n\n/**\n * Provides data that allows you to change the size of the floating element —\n * for instance, prevent it from overflowing the clipping boundary or match the\n * width of the reference element.\n * @see https://floating-ui.com/docs/size\n */\nconst size = function (options) {\n if (options === void 0) {\n options = {};\n }\n return {\n name: 'size',\n options,\n async fn(state) {\n const {\n placement,\n rects,\n platform,\n elements\n } = state;\n const {\n apply = () => {},\n ...detectOverflowOptions\n } = evaluate(options, state);\n const overflow = await detectOverflow(state, detectOverflowOptions);\n const side = getSide(placement);\n const alignment = getAlignment(placement);\n const isYAxis = getSideAxis(placement) === 'y';\n const {\n width,\n height\n } = rects.floating;\n let heightSide;\n let widthSide;\n if (side === 'top' || side === 'bottom') {\n heightSide = side;\n widthSide = alignment === ((await (platform.isRTL == null ? void 0 : platform.isRTL(elements.floating))) ? 'start' : 'end') ? 'left' : 'right';\n } else {\n widthSide = side;\n heightSide = alignment === 'end' ? 'top' : 'bottom';\n }\n const overflowAvailableHeight = height - overflow[heightSide];\n const overflowAvailableWidth = width - overflow[widthSide];\n const noShift = !state.middlewareData.shift;\n let availableHeight = overflowAvailableHeight;\n let availableWidth = overflowAvailableWidth;\n if (isYAxis) {\n const maximumClippingWidth = width - overflow.left - overflow.right;\n availableWidth = alignment || noShift ? min(overflowAvailableWidth, maximumClippingWidth) : maximumClippingWidth;\n } else {\n const maximumClippingHeight = height - overflow.top - overflow.bottom;\n availableHeight = alignment || noShift ? min(overflowAvailableHeight, maximumClippingHeight) : maximumClippingHeight;\n }\n if (noShift && !alignment) {\n const xMin = max(overflow.left, 0);\n const xMax = max(overflow.right, 0);\n const yMin = max(overflow.top, 0);\n const yMax = max(overflow.bottom, 0);\n if (isYAxis) {\n availableWidth = width - 2 * (xMin !== 0 || xMax !== 0 ? xMin + xMax : max(overflow.left, overflow.right));\n } else {\n availableHeight = height - 2 * (yMin !== 0 || yMax !== 0 ? yMin + yMax : max(overflow.top, overflow.bottom));\n }\n }\n await apply({\n ...state,\n availableWidth,\n availableHeight\n });\n const nextDimensions = await platform.getDimensions(elements.floating);\n if (width !== nextDimensions.width || height !== nextDimensions.height) {\n return {\n reset: {\n rects: true\n }\n };\n }\n return {};\n }\n };\n};\n\nexport { arrow, autoPlacement, computePosition, detectOverflow, flip, hide, inline, limitShift, offset, shift, size };\n","function getNodeName(node) {\n if (isNode(node)) {\n return (node.nodeName || '').toLowerCase();\n }\n // Mocked nodes in testing environments may not be instances of Node. By\n // returning `#document` an infinite loop won't occur.\n // https://github.com/floating-ui/floating-ui/issues/2317\n return '#document';\n}\nfunction getWindow(node) {\n var _node$ownerDocument;\n return (node == null || (_node$ownerDocument = node.ownerDocument) == null ? void 0 : _node$ownerDocument.defaultView) || window;\n}\nfunction getDocumentElement(node) {\n var _ref;\n return (_ref = (isNode(node) ? node.ownerDocument : node.document) || window.document) == null ? void 0 : _ref.documentElement;\n}\nfunction isNode(value) {\n return value instanceof Node || value instanceof getWindow(value).Node;\n}\nfunction isElement(value) {\n return value instanceof Element || value instanceof getWindow(value).Element;\n}\nfunction isHTMLElement(value) {\n return value instanceof HTMLElement || value instanceof getWindow(value).HTMLElement;\n}\nfunction isShadowRoot(value) {\n // Browsers without `ShadowRoot` support.\n if (typeof ShadowRoot === 'undefined') {\n return false;\n }\n return value instanceof ShadowRoot || value instanceof getWindow(value).ShadowRoot;\n}\nfunction isOverflowElement(element) {\n const {\n overflow,\n overflowX,\n overflowY,\n display\n } = getComputedStyle(element);\n return /auto|scroll|overlay|hidden|clip/.test(overflow + overflowY + overflowX) && !['inline', 'contents'].includes(display);\n}\nfunction isTableElement(element) {\n return ['table', 'td', 'th'].includes(getNodeName(element));\n}\nfunction isContainingBlock(element) {\n const webkit = isWebKit();\n const css = getComputedStyle(element);\n\n // https://developer.mozilla.org/en-US/docs/Web/CSS/Containing_block#identifying_the_containing_block\n return css.transform !== 'none' || css.perspective !== 'none' || (css.containerType ? css.containerType !== 'normal' : false) || !webkit && (css.backdropFilter ? css.backdropFilter !== 'none' : false) || !webkit && (css.filter ? css.filter !== 'none' : false) || ['transform', 'perspective', 'filter'].some(value => (css.willChange || '').includes(value)) || ['paint', 'layout', 'strict', 'content'].some(value => (css.contain || '').includes(value));\n}\nfunction getContainingBlock(element) {\n let currentNode = getParentNode(element);\n while (isHTMLElement(currentNode) && !isLastTraversableNode(currentNode)) {\n if (isContainingBlock(currentNode)) {\n return currentNode;\n } else {\n currentNode = getParentNode(currentNode);\n }\n }\n return null;\n}\nfunction isWebKit() {\n if (typeof CSS === 'undefined' || !CSS.supports) return false;\n return CSS.supports('-webkit-backdrop-filter', 'none');\n}\nfunction isLastTraversableNode(node) {\n return ['html', 'body', '#document'].includes(getNodeName(node));\n}\nfunction getComputedStyle(element) {\n return getWindow(element).getComputedStyle(element);\n}\nfunction getNodeScroll(element) {\n if (isElement(element)) {\n return {\n scrollLeft: element.scrollLeft,\n scrollTop: element.scrollTop\n };\n }\n return {\n scrollLeft: element.pageXOffset,\n scrollTop: element.pageYOffset\n };\n}\nfunction getParentNode(node) {\n if (getNodeName(node) === 'html') {\n return node;\n }\n const result =\n // Step into the shadow DOM of the parent of a slotted node.\n node.assignedSlot ||\n // DOM Element detected.\n node.parentNode ||\n // ShadowRoot detected.\n isShadowRoot(node) && node.host ||\n // Fallback.\n getDocumentElement(node);\n return isShadowRoot(result) ? result.host : result;\n}\nfunction getNearestOverflowAncestor(node) {\n const parentNode = getParentNode(node);\n if (isLastTraversableNode(parentNode)) {\n return node.ownerDocument ? node.ownerDocument.body : node.body;\n }\n if (isHTMLElement(parentNode) && isOverflowElement(parentNode)) {\n return parentNode;\n }\n return getNearestOverflowAncestor(parentNode);\n}\nfunction getOverflowAncestors(node, list, traverseIframes) {\n var _node$ownerDocument2;\n if (list === void 0) {\n list = [];\n }\n if (traverseIframes === void 0) {\n traverseIframes = true;\n }\n const scrollableAncestor = getNearestOverflowAncestor(node);\n const isBody = scrollableAncestor === ((_node$ownerDocument2 = node.ownerDocument) == null ? void 0 : _node$ownerDocument2.body);\n const win = getWindow(scrollableAncestor);\n if (isBody) {\n return list.concat(win, win.visualViewport || [], isOverflowElement(scrollableAncestor) ? scrollableAncestor : [], win.frameElement && traverseIframes ? getOverflowAncestors(win.frameElement) : []);\n }\n return list.concat(scrollableAncestor, getOverflowAncestors(scrollableAncestor, [], traverseIframes));\n}\n\nexport { getComputedStyle, getContainingBlock, getDocumentElement, getNearestOverflowAncestor, getNodeName, getNodeScroll, getOverflowAncestors, getParentNode, getWindow, isContainingBlock, isElement, isHTMLElement, isLastTraversableNode, isNode, isOverflowElement, isShadowRoot, isTableElement, isWebKit };\n","import { rectToClientRect, autoPlacement as autoPlacement$1, shift as shift$1, flip as flip$1, size as size$1, hide as hide$1, arrow as arrow$1, inline as inline$1, limitShift as limitShift$1, computePosition as computePosition$1 } from '@floating-ui/core';\nexport { detectOverflow, offset } from '@floating-ui/core';\nimport { round, createCoords, max, min, floor } from '@floating-ui/utils';\nimport { getComputedStyle, isHTMLElement, isElement, getWindow, isWebKit, getDocumentElement, getNodeName, isOverflowElement, getNodeScroll, getOverflowAncestors, getParentNode, isLastTraversableNode, isContainingBlock, isTableElement, getContainingBlock } from '@floating-ui/utils/dom';\nexport { getOverflowAncestors } from '@floating-ui/utils/dom';\n\nfunction getCssDimensions(element) {\n const css = getComputedStyle(element);\n // In testing environments, the `width` and `height` properties are empty\n // strings for SVG elements, returning NaN. Fallback to `0` in this case.\n let width = parseFloat(css.width) || 0;\n let height = parseFloat(css.height) || 0;\n const hasOffset = isHTMLElement(element);\n const offsetWidth = hasOffset ? element.offsetWidth : width;\n const offsetHeight = hasOffset ? element.offsetHeight : height;\n const shouldFallback = round(width) !== offsetWidth || round(height) !== offsetHeight;\n if (shouldFallback) {\n width = offsetWidth;\n height = offsetHeight;\n }\n return {\n width,\n height,\n $: shouldFallback\n };\n}\n\nfunction unwrapElement(element) {\n return !isElement(element) ? element.contextElement : element;\n}\n\nfunction getScale(element) {\n const domElement = unwrapElement(element);\n if (!isHTMLElement(domElement)) {\n return createCoords(1);\n }\n const rect = domElement.getBoundingClientRect();\n const {\n width,\n height,\n $\n } = getCssDimensions(domElement);\n let x = ($ ? round(rect.width) : rect.width) / width;\n let y = ($ ? round(rect.height) : rect.height) / height;\n\n // 0, NaN, or Infinity should always fallback to 1.\n\n if (!x || !Number.isFinite(x)) {\n x = 1;\n }\n if (!y || !Number.isFinite(y)) {\n y = 1;\n }\n return {\n x,\n y\n };\n}\n\nconst noOffsets = /*#__PURE__*/createCoords(0);\nfunction getVisualOffsets(element) {\n const win = getWindow(element);\n if (!isWebKit() || !win.visualViewport) {\n return noOffsets;\n }\n return {\n x: win.visualViewport.offsetLeft,\n y: win.visualViewport.offsetTop\n };\n}\nfunction shouldAddVisualOffsets(element, isFixed, floatingOffsetParent) {\n if (isFixed === void 0) {\n isFixed = false;\n }\n if (!floatingOffsetParent || isFixed && floatingOffsetParent !== getWindow(element)) {\n return false;\n }\n return isFixed;\n}\n\nfunction getBoundingClientRect(element, includeScale, isFixedStrategy, offsetParent) {\n if (includeScale === void 0) {\n includeScale = false;\n }\n if (isFixedStrategy === void 0) {\n isFixedStrategy = false;\n }\n const clientRect = element.getBoundingClientRect();\n const domElement = unwrapElement(element);\n let scale = createCoords(1);\n if (includeScale) {\n if (offsetParent) {\n if (isElement(offsetParent)) {\n scale = getScale(offsetParent);\n }\n } else {\n scale = getScale(element);\n }\n }\n const visualOffsets = shouldAddVisualOffsets(domElement, isFixedStrategy, offsetParent) ? getVisualOffsets(domElement) : createCoords(0);\n let x = (clientRect.left + visualOffsets.x) / scale.x;\n let y = (clientRect.top + visualOffsets.y) / scale.y;\n let width = clientRect.width / scale.x;\n let height = clientRect.height / scale.y;\n if (domElement) {\n const win = getWindow(domElement);\n const offsetWin = offsetParent && isElement(offsetParent) ? getWindow(offsetParent) : offsetParent;\n let currentWin = win;\n let currentIFrame = currentWin.frameElement;\n while (currentIFrame && offsetParent && offsetWin !== currentWin) {\n const iframeScale = getScale(currentIFrame);\n const iframeRect = currentIFrame.getBoundingClientRect();\n const css = getComputedStyle(currentIFrame);\n const left = iframeRect.left + (currentIFrame.clientLeft + parseFloat(css.paddingLeft)) * iframeScale.x;\n const top = iframeRect.top + (currentIFrame.clientTop + parseFloat(css.paddingTop)) * iframeScale.y;\n x *= iframeScale.x;\n y *= iframeScale.y;\n width *= iframeScale.x;\n height *= iframeScale.y;\n x += left;\n y += top;\n currentWin = getWindow(currentIFrame);\n currentIFrame = currentWin.frameElement;\n }\n }\n return rectToClientRect({\n width,\n height,\n x,\n y\n });\n}\n\nconst topLayerSelectors = [':popover-open', ':modal'];\nfunction isTopLayer(floating) {\n return topLayerSelectors.some(selector => {\n try {\n return floating.matches(selector);\n } catch (e) {\n return false;\n }\n });\n}\n\nfunction convertOffsetParentRelativeRectToViewportRelativeRect(_ref) {\n let {\n elements,\n rect,\n offsetParent,\n strategy\n } = _ref;\n const isFixed = strategy === 'fixed';\n const documentElement = getDocumentElement(offsetParent);\n const topLayer = elements ? isTopLayer(elements.floating) : false;\n if (offsetParent === documentElement || topLayer && isFixed) {\n return rect;\n }\n let scroll = {\n scrollLeft: 0,\n scrollTop: 0\n };\n let scale = createCoords(1);\n const offsets = createCoords(0);\n const isOffsetParentAnElement = isHTMLElement(offsetParent);\n if (isOffsetParentAnElement || !isOffsetParentAnElement && !isFixed) {\n if (getNodeName(offsetParent) !== 'body' || isOverflowElement(documentElement)) {\n scroll = getNodeScroll(offsetParent);\n }\n if (isHTMLElement(offsetParent)) {\n const offsetRect = getBoundingClientRect(offsetParent);\n scale = getScale(offsetParent);\n offsets.x = offsetRect.x + offsetParent.clientLeft;\n offsets.y = offsetRect.y + offsetParent.clientTop;\n }\n }\n return {\n width: rect.width * scale.x,\n height: rect.height * scale.y,\n x: rect.x * scale.x - scroll.scrollLeft * scale.x + offsets.x,\n y: rect.y * scale.y - scroll.scrollTop * scale.y + offsets.y\n };\n}\n\nfunction getClientRects(element) {\n return Array.from(element.getClientRects());\n}\n\nfunction getWindowScrollBarX(element) {\n // If <html> has a CSS width greater than the viewport, then this will be\n // incorrect for RTL.\n return getBoundingClientRect(getDocumentElement(element)).left + getNodeScroll(element).scrollLeft;\n}\n\n// Gets the entire size of the scrollable document area, even extending outside\n// of the `<html>` and `<body>` rect bounds if horizontally scrollable.\nfunction getDocumentRect(element) {\n const html = getDocumentElement(element);\n const scroll = getNodeScroll(element);\n const body = element.ownerDocument.body;\n const width = max(html.scrollWidth, html.clientWidth, body.scrollWidth, body.clientWidth);\n const height = max(html.scrollHeight, html.clientHeight, body.scrollHeight, body.clientHeight);\n let x = -scroll.scrollLeft + getWindowScrollBarX(element);\n const y = -scroll.scrollTop;\n if (getComputedStyle(body).direction === 'rtl') {\n x += max(html.clientWidth, body.clientWidth) - width;\n }\n return {\n width,\n height,\n x,\n y\n };\n}\n\nfunction getViewportRect(element, strategy) {\n const win = getWindow(element);\n const html = getDocumentElement(element);\n const visualViewport = win.visualViewport;\n let width = html.clientWidth;\n let height = html.clientHeight;\n let x = 0;\n let y = 0;\n if (visualViewport) {\n width = visualViewport.width;\n height = visualViewport.height;\n const visualViewportBased = isWebKit();\n if (!visualViewportBased || visualViewportBased && strategy === 'fixed') {\n x = visualViewport.offsetLeft;\n y = visualViewport.offsetTop;\n }\n }\n return {\n width,\n height,\n x,\n y\n };\n}\n\n// Returns the inner client rect, subtracting scrollbars if present.\nfunction getInnerBoundingClientRect(element, strategy) {\n const clientRect = getBoundingClientRect(element, true, strategy === 'fixed');\n const top = clientRect.top + element.clientTop;\n const left = clientRect.left + element.clientLeft;\n const scale = isHTMLElement(element) ? getScale(element) : createCoords(1);\n const width = element.clientWidth * scale.x;\n const height = element.clientHeight * scale.y;\n const x = left * scale.x;\n const y = top * scale.y;\n return {\n width,\n height,\n x,\n y\n };\n}\nfunction getClientRectFromClippingAncestor(element, clippingAncestor, strategy) {\n let rect;\n if (clippingAncestor === 'viewport') {\n rect = getViewportRect(element, strategy);\n } else if (clippingAncestor === 'document') {\n rect = getDocumentRect(getDocumentElement(element));\n } else if (isElement(clippingAncestor)) {\n rect = getInnerBoundingClientRect(clippingAncestor, strategy);\n } else {\n const visualOffsets = getVisualOffsets(element);\n rect = {\n ...clippingAncestor,\n x: clippingAncestor.x - visualOffsets.x,\n y: clippingAncestor.y - visualOffsets.y\n };\n }\n return rectToClientRect(rect);\n}\nfunction hasFixedPositionAncestor(element, stopNode) {\n const parentNode = getParentNode(element);\n if (parentNode === stopNode || !isElement(parentNode) || isLastTraversableNode(parentNode)) {\n return false;\n }\n return getComputedStyle(parentNode).position === 'fixed' || hasFixedPositionAncestor(parentNode, stopNode);\n}\n\n// A \"clipping ancestor\" is an `overflow` element with the characteristic of\n// clipping (or hiding) child elements. This returns all clipping ancestors\n// of the given element up the tree.\nfunction getClippingElementAncestors(element, cache) {\n const cachedResult = cache.get(element);\n if (cachedResult) {\n return cachedResult;\n }\n let result = getOverflowAncestors(element, [], false).filter(el => isElement(el) && getNodeName(el) !== 'body');\n let currentContainingBlockComputedStyle = null;\n const elementIsFixed = getComputedStyle(element).position === 'fixed';\n let currentNode = elementIsFixed ? getParentNode(element) : element;\n\n // https://developer.mozilla.org/en-US/docs/Web/CSS/Containing_block#identifying_the_containing_block\n while (isElement(currentNode) && !isLastTraversableNode(currentNode)) {\n const computedStyle = getComputedStyle(currentNode);\n const currentNodeIsContaining = isContainingBlock(currentNode);\n if (!currentNodeIsContaining && computedStyle.position === 'fixed') {\n currentContainingBlockComputedStyle = null;\n }\n const shouldDropCurrentNode = elementIsFixed ? !currentNodeIsContaining && !currentContainingBlockComputedStyle : !currentNodeIsContaining && computedStyle.position === 'static' && !!currentContainingBlockComputedStyle && ['absolute', 'fixed'].includes(currentContainingBlockComputedStyle.position) || isOverflowElement(currentNode) && !currentNodeIsContaining && hasFixedPositionAncestor(element, currentNode);\n if (shouldDropCurrentNode) {\n // Drop non-containing blocks.\n result = result.filter(ancestor => ancestor !== currentNode);\n } else {\n // Record last containing block for next iteration.\n currentContainingBlockComputedStyle = computedStyle;\n }\n currentNode = getParentNode(currentNode);\n }\n cache.set(element, result);\n return result;\n}\n\n// Gets the maximum area that the element is visible in due to any number of\n// clipping ancestors.\nfunction getClippingRect(_ref) {\n let {\n element,\n boundary,\n rootBoundary,\n strategy\n } = _ref;\n const elementClippingAncestors = boundary === 'clippingAncestors' ? getClippingElementAncestors(element, this._c) : [].concat(boundary);\n const clippingAncestors = [...elementClippingAncestors, rootBoundary];\n const firstClippingAncestor = clippingAncestors[0];\n const clippingRect = clippingAncestors.reduce((accRect, clippingAncestor) => {\n const rect = getClientRectFromClippingAncestor(element, clippingAncestor, strategy);\n accRect.top = max(rect.top, accRect.top);\n accRect.right = min(rect.right, accRect.right);\n accRect.bottom = min(rect.bottom, accRect.bottom);\n accRect.left = max(rect.left, accRect.left);\n return accRect;\n }, getClientRectFromClippingAncestor(element, firstClippingAncestor, strategy));\n return {\n width: clippingRect.right - clippingRect.left,\n height: clippingRect.bottom - clippingRect.top,\n x: clippingRect.left,\n y: clippingRect.top\n };\n}\n\nfunction getDimensions(element) {\n const {\n width,\n height\n } = getCssDimensions(element);\n return {\n width,\n height\n };\n}\n\nfunction getRectRelativeToOffsetParent(element, offsetParent, strategy) {\n const isOffsetParentAnElement = isHTMLElement(offsetParent);\n const documentElement = getDocumentElement(offsetParent);\n const isFixed = strategy === 'fixed';\n const rect = getBoundingClientRect(element, true, isFixed, offsetParent);\n let scroll = {\n scrollLeft: 0,\n scrollTop: 0\n };\n const offsets = createCoords(0);\n if (isOffsetParentAnElement || !isOffsetParentAnElement && !isFixed) {\n if (getNodeName(offsetParent) !== 'body' || isOverflowElement(documentElement)) {\n scroll = getNodeScroll(offsetParent);\n }\n if (isOffsetParentAnElement) {\n const offsetRect = getBoundingClientRect(offsetParent, true, isFixed, offsetParent);\n offsets.x = offsetRect.x + offsetParent.clientLeft;\n offsets.y = offsetRect.y + offsetParent.clientTop;\n } else if (documentElement) {\n offsets.x = getWindowScrollBarX(documentElement);\n }\n }\n const x = rect.left + scroll.scrollLeft - offsets.x;\n const y = rect.top + scroll.scrollTop - offsets.y;\n return {\n x,\n y,\n width: rect.width,\n height: rect.height\n };\n}\n\nfunction getTrueOffsetParent(element, polyfill) {\n if (!isHTMLElement(element) || getComputedStyle(element).position === 'fixed') {\n return null;\n }\n if (polyfill) {\n return polyfill(element);\n }\n return element.offsetParent;\n}\n\n// Gets the closest ancestor positioned element. Handles some edge cases,\n// such as table ancestors and cross browser bugs.\nfunction getOffsetParent(element, polyfill) {\n const window = getWindow(element);\n if (!isHTMLElement(element) || isTopLayer(element)) {\n return window;\n }\n let offsetParent = getTrueOffsetParent(element, polyfill);\n while (offsetParent && isTableElement(offsetParent) && getComputedStyle(offsetParent).position === 'static') {\n offsetParent = getTrueOffsetParent(offsetParent, polyfill);\n }\n if (offsetParent && (getNodeName(offsetParent) === 'html' || getNodeName(offsetParent) === 'body' && getComputedStyle(offsetParent).position === 'static' && !isContainingBlock(offsetParent))) {\n return window;\n }\n return offsetParent || getContainingBlock(element) || window;\n}\n\nconst getElementRects = async function (data) {\n const getOffsetParentFn = this.getOffsetParent || getOffsetParent;\n const getDimensionsFn = this.getDimensions;\n return {\n reference: getRectRelativeToOffsetParent(data.reference, await getOffsetParentFn(data.floating), data.strategy),\n floating: {\n x: 0,\n y: 0,\n ...(await getDimensionsFn(data.floating))\n }\n };\n};\n\nfunction isRTL(element) {\n return getComputedStyle(element).direction === 'rtl';\n}\n\nconst platform = {\n convertOffsetParentRelativeRectToViewportRelativeRect,\n getDocumentElement,\n getClippingRect,\n getOffsetParent,\n getElementRects,\n getClientRects,\n getDimensions,\n getScale,\n isElement,\n isRTL\n};\n\n// https://samthor.au/2021/observing-dom/\nfunction observeMove(element, onMove) {\n let io = null;\n let timeoutId;\n const root = getDocumentElement(element);\n function cleanup() {\n var _io;\n clearTimeout(timeoutId);\n (_io = io) == null || _io.disconnect();\n io = null;\n }\n function refresh(skip, threshold) {\n if (skip === void 0) {\n skip = false;\n }\n if (threshold === void 0) {\n threshold = 1;\n }\n cleanup();\n const {\n left,\n top,\n width,\n height\n } = element.getBoundingClientRect();\n if (!skip) {\n onMove();\n }\n if (!width || !height) {\n return;\n }\n const insetTop = floor(top);\n const insetRight = floor(root.clientWidth - (left + width));\n const insetBottom = floor(root.clientHeight - (top + height));\n const insetLeft = floor(left);\n const rootMargin = -insetTop + \"px \" + -insetRight + \"px \" + -insetBottom + \"px \" + -insetLeft + \"px\";\n const options = {\n rootMargin,\n threshold: max(0, min(1, threshold)) || 1\n };\n let isFirstUpdate = true;\n function handleObserve(entries) {\n const ratio = entries[0].intersectionRatio;\n if (ratio !== threshold) {\n if (!isFirstUpdate) {\n return refresh();\n }\n if (!ratio) {\n timeoutId = setTimeout(() => {\n refresh(false, 1e-7);\n }, 100);\n } else {\n refresh(false, ratio);\n }\n }\n isFirstUpdate = false;\n }\n\n // Older browsers don't support a `document` as the root and will throw an\n // error.\n try {\n io = new IntersectionObserver(handleObserve, {\n ...options,\n // Handle <iframe>s\n root: root.ownerDocument\n });\n } catch (e) {\n io = new IntersectionObserver(handleObserve, options);\n }\n io.observe(element);\n }\n refresh(true);\n return cleanup;\n}\n\n/**\n * Automatically updates the position of the floating element when necessary.\n * Should only be called when the floating element is mounted on the DOM or\n * visible on the screen.\n * @returns cleanup function that should be invoked when the floating element is\n * removed from the DOM or hidden from the screen.\n * @see https://floating-ui.com/docs/autoUpdate\n */\nfunction autoUpdate(reference, floating, update, options) {\n if (options === void 0) {\n options = {};\n }\n const {\n ancestorScroll = true,\n ancestorResize = true,\n elementResize = typeof ResizeObserver === 'function',\n layoutShift = typeof IntersectionObserver === 'function',\n animationFrame = false\n } = options;\n const referenceEl = unwrapElement(reference);\n const ancestors = ancestorScroll || ancestorResize ? [...(referenceEl ? getOverflowAncestors(referenceEl) : []), ...getOverflowAncestors(floating)] : [];\n ancestors.forEach(ancestor => {\n ancestorScroll && ancestor.addEventListener('scroll', update, {\n passive: true\n });\n ancestorResize && ancestor.addEventListener('resize', update);\n });\n const cleanupIo = referenceEl && layoutShift ? observeMove(referenceEl, update) : null;\n let reobserveFrame = -1;\n let resizeObserver = null;\n if (elementResize) {\n resizeObserver = new ResizeObserver(_ref => {\n let [firstEntry] = _ref;\n if (firstEntry && firstEntry.target === referenceEl && resizeObserver) {\n // Prevent update loops when using the `size` middleware.\n // https://github.com/floating-ui/floating-ui/issues/1740\n resizeObserver.unobserve(floating);\n cancelAnimationFrame(reobserveFrame);\n reobserveFrame = requestAnimationFrame(() => {\n var _resizeObserver;\n (_resizeObserver = resizeObserver) == null || _resizeObserver.observe(floating);\n });\n }\n update();\n });\n if (referenceEl && !animationFrame) {\n resizeObserver.observe(referenceEl);\n }\n resizeObserver.observe(floating);\n }\n let frameId;\n let prevRefRect = animationFrame ? getBoundingClientRect(reference) : null;\n if (animationFrame) {\n frameLoop();\n }\n function frameLoop() {\n const nextRefRect = getBoundingClientRect(reference);\n if (prevRefRect && (nextRefRect.x !== prevRefRect.x || nextRefRect.y !== prevRefRect.y || nextRefRect.width !== prevRefRect.width || nextRefRect.height !== prevRefRect.height)) {\n update();\n }\n prevRefRect = nextRefRect;\n frameId = requestAnimationFrame(frameLoop);\n }\n update();\n return () => {\n var _resizeObserver2;\n ancestors.forEach(ancestor => {\n ancestorScroll && ancestor.removeEventListener('scroll', update);\n ancestorResize && ancestor.removeEventListener('resize', update);\n });\n cleanupIo == null || cleanupIo();\n (_resizeObserver2 = resizeObserver) == null || _resizeObserver2.disconnect();\n resizeObserver = null;\n if (animationFrame) {\n cancelAnimationFrame(frameId);\n }\n };\n}\n\n/**\n * Optimizes the visibility of the floating element by choosing the placement\n * that has the most space available automatically, without needing to specify a\n * preferred placement. Alternative to `flip`.\n * @see https://floating-ui.com/docs/autoPlacement\n */\nconst autoPlacement = autoPlacement$1;\n\n/**\n * Optimizes the visibility of the floating element by shifting it in order to\n * keep it in view when it will overflow the clipping boundary.\n * @see https://floating-ui.com/docs/shift\n */\nconst shift = shift$1;\n\n/**\n * Optimizes the visibility of the floating element by flipping the `placement`\n * in order to keep it in view when the preferred placement(s) will overflow the\n * clipping boundary. Alternative to `autoPlacement`.\n * @see https://floating-ui.com/docs/flip\n */\nconst flip = flip$1;\n\n/**\n * Provides data that allows you to change the size of the floating element —\n * for instance, prevent it from overflowing the clipping boundary or match the\n * width of the reference element.\n * @see https://floating-ui.com/docs/size\n */\nconst size = size$1;\n\n/**\n * Provides data to hide the floating element in applicable situations, such as\n * when it is not in the same clipping context as the reference element.\n * @see https://floating-ui.com/docs/hide\n */\nconst hide = hide$1;\n\n/**\n * Provides data to position an inner element of the floating element so that it\n * appears centered to the reference element.\n * @see https://floating-ui.com/docs/arrow\n */\nconst arrow = arrow$1;\n\n/**\n * Provides improved positioning for inline reference elements that can span\n * over multiple lines, such as hyperlinks or range selections.\n * @see https://floating-ui.com/docs/inline\n */\nconst inline = inline$1;\n\n/**\n * Built-in `limiter` that will stop `shift()` at a certain point.\n */\nconst limitShift = limitShift$1;\n\n/**\n * Computes the `x` and `y` coordinates that will place the floating element\n * next to a given reference element.\n */\nconst computePosition = (reference, floating, options) => {\n // This caches the expensive `getClippingElementAncestors` function so that\n // multiple lifecycle resets re-use the same result. It only lives for a\n // single call. If other functions become expensive, we can add them as well.\n const cache = new Map();\n const mergedOptions = {\n platform,\n ...options\n };\n const platformWithCache = {\n ...mergedOptions.platform,\n _c: cache\n };\n return computePosition$1(reference, floating, {\n ...mergedOptions,\n platform: platformWithCache\n });\n};\n\nexport { arrow, autoPlacement, autoUpdate, computePosition, flip, hide, inline, limitShift, platform, shift, size };\n","import {marked} from \"marked\";\nimport css from \"./widget.css\";\nimport {widgetHTML} from \"./widgetHtmlString\";\nimport {autoUpdate, computePosition, flip, shift} from \"@floating-ui/dom\";\n\nconst APP = 'LangChat'\nconst LANGCHAT_ID = \"langchat-web-sdk\";\nconst LANGCHAT_BTN_OPEN = \"langchat-button-open\";\nconst LANGCHAT_BTN_CLOSE = \"langchat-button-close\";\nconst WIDGET_BACKDROP_ID = \"langchat-chat-widget__backdrop\";\nconst WIDGET_CONTAINER_ID = \"langchat-chat-widget__container\";\nconst WIDGET_MESSAGES_HISTORY_CONTAINER_ID = \"langchat-chat-widget__messages_history\";\nconst WIDGET_THINKING_BUBBLE_ID = \"langchat-chat-widget__thinking_bubble\";\n\nexport type WidgetConfig = {\n element: Element,\n url: string;\n apiKey: string;\n threadId: string | null;\n user: Record<any, any>;\n greetingMessage: string | null;\n disableErrorAlert: boolean;\n};\n\nconst renderer = new marked.Renderer();\nconst linkRenderer = renderer.link;\n// To open links in a new tab\nrenderer.link = (href, title, text) => {\n const parsed = linkRenderer.call(renderer, href, title, text);\n return parsed.replace(/^<a /, '<a target=\"_blank\" rel=\"nofollow\" ');\n};\n\nconst config: WidgetConfig = {\n element: null,\n url: \"\",\n apiKey: \"\",\n threadId: null,\n user: {},\n greetingMessage: null,\n disableErrorAlert: false,\n ...(window as any).langchatChatWidget?.config,\n};\n\nlet cleanup = () => {\n};\n\nasync function init() {\n let langchatElement: Element | null = null;\n if (config.element == null) {\n langchatElement = document.getElementById(LANGCHAT_ID)\n if (langchatElement == null) {\n langchatElement = document.createElement(\"div\");\n langchatElement.id = LANGCHAT_ID;\n document.body.appendChild(langchatElement)\n }\n } else {\n langchatElement = config.element;\n }\n langchatElement!.innerHTML = widgetHTML;\n\n const styleElement = document.createElement(\"style\");\n styleElement.innerHTML = css;\n\n document.head.insertBefore(styleElement, document.head.firstChild);\n\n // Slight delay to allow DOMContent to be fully loaded\n // (particularly for the button to be available in the `if (config.openOnLoad)` block below).\n await new Promise((resolve) => setTimeout(resolve, 500));\n\n document.getElementById(LANGCHAT_BTN_OPEN)?.addEventListener(\"click\", open);\n document.getElementById(LANGCHAT_BTN_CLOSE)?.addEventListener(\"click\", close);\n\n // if (config.openOnLoad) {\n // const target = document.querySelector(\n // \"[data-langchat-chat-widget-button]\"\n // );\n // open({target} as Event);\n // }\n}\n\n// window.addEventListener(\"load\", init);\n\nconst messagesHistory = document.createElement(\"div\");\nmessagesHistory.id = WIDGET_MESSAGES_HISTORY_CONTAINER_ID;\n\nconst optionalBackdrop = document.createElement(\"div\");\noptionalBackdrop.id = WIDGET_BACKDROP_ID;\n\nconst thinkingBubble = document.createElement(\"div\");\nthinkingBubble.id = WIDGET_THINKING_BUBBLE_ID;\nthinkingBubble.innerHTML = `\n <span class=\"circle\"></span>\n <span class=\"circle\"></span>\n <span class=\"circle\"></span>\n `;\n\nfunction open(e: Event) {\n document.getElementById(LANGCHAT_BTN_OPEN)!.style.display = 'none'\n document.getElementById(LANGCHAT_BTN_CLOSE)!.style.display = 'block'\n const containerElement = document.getElementById(WIDGET_CONTAINER_ID)!\n containerElement!.style.display = 'block'\n\n // const chatbotHeaderTitleText = document.createElement(\"span\");\n // chatbotHeaderTitleText.id = \"langchat-chat-widget__title_text\";\n // chatbotHeaderTitleText.textContent = APP;\n const chatbotHeaderTitle = document.getElementById(\n \"langchat-chat-widget__title_text\"\n )!;\n chatbotHeaderTitle.innerText = 'LangChat聊天助手';\n\n document.getElementById('langchat-chat-widget__copyright')!.innerText = APP\n\n const chatbotBody = document.getElementById(\"langchat-chat-widget__body\")!;\n chatbotBody.prepend(messagesHistory);\n if (config.greetingMessage && messagesHistory.children.length === 0) {\n createNewMessageEntry(config.greetingMessage, Date.now(), \"system\");\n }\n\n const target = document.getElementById('langchat-chat-widget__btn')!;\n cleanup = autoUpdate(target, containerElement, () => {\n computePosition(target, containerElement, {\n placement: \"top-start\",\n middleware: [flip(), shift({crossAxis: true, padding: 8})],\n strategy: \"fixed\",\n }).then(({x, y}) => {\n console.log(x,y)\n Object.assign(containerElement.style, {\n left: `${x - 350}px`,\n top: `${y - 10}px`,\n });\n });\n });\n\n document\n .getElementById(\"langchat-chat-widget__form\")!\n .addEventListener(\"submit\", submit);\n}\n\nfunction close() {\n document.getElementById(LANGCHAT_BTN_OPEN)!.style.display = 'block'\n document.getElementById(LANGCHAT_BTN_CLOSE)!.style.display = 'none'\n optionalBackdrop.remove();\n\n const containerElement = document.getElementById(WIDGET_CONTAINER_ID)\n containerElement!.style.display = 'none'\n\n cleanup();\n cleanup = () => {\n };\n}\n\nasync function createNewMessageEntry(\n message: string,\n timestamp: number,\n from: \"system\" | \"user\"\n) {\n const messageElement = document.createElement(\"div\");\n messageElement.classList.add(\"langchat-chat-widget__message\");\n messageElement.classList.add(`langchat-chat-widget__message--${from}`);\n messageElement.id = `langchat-chat-widget__message--${from}--${timestamp}`;\n\n const messageText = document.createElement(\"p\");\n messageText.innerHTML = await marked(message, {renderer});\n messageElement.appendChild(messageText);\n\n const messageTimestamp = document.createElement(\"p\");\n messageTimestamp.classList.add(\"langchat-chat-widget__message-timestamp\");\n messageTimestamp.textContent =\n (\"0\" + new Date(timestamp).getHours()).slice(-2) + // Hours (padded with 0 if needed)\n \":\" +\n (\"0\" + new Date(timestamp).getMinutes()).slice(-2); // Minutes (padded with 0 if needed)\n messageElement.appendChild(messageTimestamp);\n\n messagesHistory.prepend(messageElement);\n}\n\nconst handleStandardResponse = async (res: Response) => {\n if (res.ok) {\n const {\n message: responseMessage,\n threadId: responseThreadId,\n }: {\n message: string | undefined;\n threadId: string | undefined;\n } = await res.json();\n\n if (typeof responseThreadId !== \"string\") {\n console.error(\"LangChat Chat Widget: Server error\", res);\n if (!config.disableErrorAlert)\n alert(\n `Received an OK response but \"threadId\" was of incompatible type (expected 'string', received '${typeof responseThreadId}'). Please make sure the API response is configured correctly.\n\nYou can learn more here: https://github.com/rowyio/langchat-chat-widget?tab=readme-ov-file#connecting-the-widget-to-your-langchat-workflow`\n );\n return;\n }\n\n if (typeof responseMessage !== \"string\") {\n console.error(\"LangChat Chat Widget: Server error\", res);\n if (!config.disableErrorAlert)\n alert(\n `Received an OK response but \"message\" was of incompatible type (expected 'string', received '${typeof responseMessage}'). Please make sure the API response is configured correctly.\n\nYou can learn more here: https://github.com/rowyio/langchat-chat-widget?tab=readme-ov-file#connecting-the-widget-to-your-langchat-workflow`\n );\n return;\n }\n\n if (!responseMessage && responseMessage !== \"\") {\n console.error(\"LangChat Chat Widget: Server error\", res);\n if (!config.disableErrorAlert)\n alert(\n `Received an OK response but no message was found. Please make sure the API response is configured correctly. You can learn more here:\\n\\nhttps://github.com/rowyio/langchat-chat-widget?tab=readme-ov-file#connecting-the-widget-to-your-langchat-workflow`\n );\n return;\n }\n\n await createNewMessageEntry(responseMessage, Date.now(), \"system\");\n config.threadId = config.threadId ?? responseThreadId ?? null;\n } else {\n console.error(\"LangChat Chat Widget: Server error\", res);\n if (!config.disableErrorAlert)\n alert(`Could not send message: ${res.statusText}`);\n }\n};\n\nasync function streamResponseToMessageEntry(\n message: string,\n timestamp: number,\n from: \"system\" | \"user\"\n) {\n const existingMessageElement = messagesHistory.querySelector(\n `#langchat-chat-widget__message--${from}--${timestamp}`\n );\n if (existingMessageElement) {\n // If the message element already exists, update the text\n const messageText = existingMessageElement.querySelector(\"p\")!;\n messageText.innerHTML = await marked(message, {renderer});\n return;\n } else {\n // If the message element doesn't exist yet, create a new one\n await createNewMessageEntry(message, timestamp, from);\n }\n}\n\nconst handleStreamedResponse = async (res: Response) => {\n if (!res.body) {\n console.error(\"LangChat Chat Widget: Streamed response has no body\", res);\n if (!config.disableErrorAlert)\n alert(\n `Received a streamed response but no body was found. Please make sure the API response is configured correctly.`\n );\n return;\n }\n\n const threadIdFromHeader = res.headers.get(\"x-thread-id\");\n\n let responseMessage = \"\";\n let responseThreadId = \"\";\n let responseMessageComplete = false;\n let ts = Date.now();\n const reader = res.body.getReader();\n\n while (true) {\n const {value, done} = await reader.read();\n if (done || value === undefined) {\n break;\n }\n const decoded = new TextDecoder().decode(value, {stream: true});\n\n const messages = decoded.split('\\n');\n\n for (const item of messages) {\n const message = item\n if (message.startsWith('data:{') || message.startsWith('{')) {\n let data = '';\n if (message.startsWith('data:{')) {\n data = message.slice(5).trim();\n }\n if (message.startsWith('{')) {\n data = message.trim();\n }\n\n try {\n const jsonData = JSON.parse(data);\n const choice = jsonData.choices[0];\n\n if (choice.finishReason === 'STOP') {\n responseMessageComplete = true;\n return;\n }\n const content = choice.delta.content;\n responseMessage += content;\n } catch (error) {\n responseMessageComplete = true;\n console.error('Failed to parse JSON:', error);\n }\n }\n }\n\n await streamResponseToMessageEntry(responseMessage, ts, \"system\");\n }\n\n config.threadId =\n config.threadId ??\n threadIdFromHeader ?? // If the threadId isn't set, use the one from the header\n (responseThreadId !== \"\" ? responseThreadId : null); // If the threadId isn't set and one isn't included in the header, use the one from the response\n};\n\nasync function submit(e: Event) {\n e.preventDefault();\n const target = e.target as HTMLFormElement;\n\n if (!config.url) {\n console.error(\"LangChat Chat Widget: No URL provided\");\n if (!config.disableErrorAlert)\n alert(\"Could not send chat message: No URL provided\");\n return;\n }\n\n const submitElement = document.getElementById(\n \"langchat-chat-widget__submit\"\n )!;\n submitElement.setAttribute(\"disabled\", \"\");\n\n const requestHeaders = new Headers();\n requestHeaders.append(\"Content-Type\", \"application/json\");\n requestHeaders.append(\"Accept\", \"text/event-stream\");\n requestHeaders.append(\"Authorization\", `Bearer ${config.apiKey}`);\n\n const message = (target.elements as any).message.value\n const data = {\n ...config.user,\n messages: [{\n role: 'user',\n content: message,\n }],\n threadId: config.threadId,\n timestamp: Date.now(),\n };\n\n await createNewMessageEntry(message, data.timestamp, \"user\");\n target.reset();\n messagesHistory.prepend(thinkingBubble);\n\n try {\n let response = await fetch(config.url, {\n method: \"POST\",\n headers: requestHeaders,\n body: JSON.stringify(data),\n });\n thinkingBubble.remove();\n\n // if (config.responseIsAStream) {\n // await handleStreamedResponse(response);\n // } else {\n // await handleStandardResponse(response);\n // }\n await handleStreamedResponse(response);\n } catch (e: any) {\n thinkingBubble.remove();\n console.error(\"LangChat Chat Widget:\", e);\n if (!config.disableErrorAlert) {\n alert(`Could not send message: ${e.message}`);\n }\n }\n\n submitElement.removeAttribute(\"disabled\");\n return false;\n}\n\nconst langchatChatWidget = {open, close, config, init};\n(window as any).langchatChatWidget = langchatChatWidget;\ndeclare global {\n interface Window {\n langchatChatWidget: typeof langchatChatWidget;\n }\n}\n\nexport default langchatChatWidget;\n","export const widgetHTML = `<div id=\"langchat-chat-widget__container\"><div id=\"langchat-chat-widget__header\"><div id=\"langchat-chat-widget__title\"><svg height=\"3em\" id=\"langchat-chat-widget__title_icon\" viewBox=\"0 0 24 24\" width=\"3em\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M17.753 14a2.25 2.25 0 0 1 2.25 2.25v.904A3.75 3.75 0 0 1 18.696 20c-1.565 1.344-3.806 2-6.696 2s-5.128-.656-6.69-2a3.75 3.75 0 0 1-1.306-2.843v-.908A2.25 2.25 0 0 1 6.254 14zm0 1.5h-11.5a.75.75 0 0 0-.75.75v.907c0 .655.287 1.278.784 1.706C7.545 19.945 9.441 20.5 12 20.5s4.458-.557 5.72-1.64a2.25 2.25 0 0 0 .783-1.707v-.905a.75.75 0 0 0-.75-.75M11.9 2.006L12 2a.75.75 0 0 1 .743.648l.007.102l-.001.749h3.5a2.25 2.25 0 0 1 2.25 2.25v4.505a2.25 2.25 0 0 1-2.25 2.25h-8.5a2.25 2.25 0 0 1-2.25-2.25V5.75A2.25 2.25 0 0 1 7.75 3.5l3.5-.001V2.75a.75.75 0 0 1 .649-.743L12 2zM16.25 5h-8.5a.75.75 0 0 0-.75.75v4.504c0 .414.336.75.75.75h8.5a.75.75 0 0 0 .75-.75V5.75a.75.75 0 0 0-.75-.75m-6.5 1.5a1.25 1.25 0 1 1 0 2.498a1.25 1.25 0 0 1 0-2.498m4.492 0a1.25 1.25 0 1 1 0 2.498a1.25 1.25 0 0 1 0-2.498\"/></svg><span id=\"langchat-chat-widget__title_text\"></span></div></div><div id=\"langchat-chat-widget__body\"><form id=\"langchat-chat-widget__form\"><input aria-label=\"Message\" autocomplete=\"off\" id=\"langchat-chat-widget__input\" name=\"message\" placeholder=\"Ask me a question…\" required type=\"text\"><button id=\"langchat-chat-widget__submit\" type=\"submit\"><svg height=\"26\" viewBox=\"0 0 26 26\" width=\"26\" xmlns=\"http://www.w3.org/2000/svg\"><g fill=\"none\"><path d=\"M24 0v24H0V0zM12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.019-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z\"></path><path d=\"m21.433 4.861l-6 15.5a1 1 0 0 1-1.624.362l-3.382-3.235l-2.074 2.073a.5.5 0 0 1-.853-.354v-4.519L2.309 9.723a1 1 0 0 1 .442-1.691l17.5-4.5a1 1 0 0 1 1.181 1.329ZM19 6.001L8.032 13.152l1.735 1.66L19 6Z\" fill=\"currentColor\"></path></g></svg></button></form><div id=\"langchat-chat-widget__bottom\"><a href=\"https://github.com/tycoding/langchat\" id=\"langchat-chat-widget__branding\" target=\"_blank\">Powered by&nbsp;<span id=\"langchat-chat-widget__copyright\">LangChat</span></a></div></div></div><div data-langchat-chat-widget-button id=\"langchat-chat-widget__btn\"><svg class=\"icon\" height=\"48\" id=\"langchat-button-open\" p-id=\"16714\" t=\"1723177956363\" version=\"1.1\" viewBox=\"0 0 1024 1024\" width=\"48\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M512 512m-512 0a512 512 0 1 0 1024 0 512 512 0 1 0-1024 0Z\" fill=\"#1972F5\" p-id=\"16715\"></path><path d=\"M508.76416 286.72c-134.36928 0-242.52416 94.6176-242.52416 211.29216a207.36 207.36 0 0 0 103.936 174.08v65.06496a13.53728 13.53728 0 0 0 13.53728 14.336 16.384 16.384 0 0 0 6.7584-1.67936l65.88416-43.95008a261.55008 261.55008 0 0 0 51.52768 4.21888c134.41024 0 242.56512-94.6176 242.56512-211.29216 0.83968-117.4528-108.1344-212.0704-241.68448-212.0704z m-109.03552 245.92384a28.672 28.672 0 1 1 28.672-28.672 28.50816 28.50816 0 0 1-28.672 28.672z m110.6944 0a28.672 28.672 0 1 1 28.672-28.672 29.63456 29.63456 0 0 1-28.65152 28.672z m106.496 0a28.672 28.672 0 1 1 28.672-28.672 29.04064 29.04064 0 0 1-28.672 28.672z m0 0\" fill=\"#FFFFFF\" p-id=\"16716\"></path></svg><svg class=\"icon\" height=\"48\" id=\"langchat-button-close\" p-id=\"6658\" style=\"display: none\" t=\"1723178083363\" version=\"1.1\" viewBox=\"0 0 1024 1024\" width=\"48\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M512 0c282.784 0 512 229.216 512 512s-229.216 512-512 512S0 794.784 0 512 229.216 0 512 0z m-133.952 335.648l-41.792 41.792L470.816 512l-134.56 134.56 41.792 41.792 134.56-134.56 133.952 133.952 41.792-41.792L554.4 512l133.952-133.952-41.792-41.792-133.952 133.952-134.56-134.56z\" fill=\"#1972F5\" p-id=\"6659\"></path></svg></div>`;\n"],"names":["_defaults","async","breaks","extensions","gfm","hooks","pedantic","renderer","silent","tokenizer","walkTokens","changeDefaults","newDefaults","min","Math","max","round","floor","createCoords","v","x","y","oppositeSideMap","left","right","bottom","top","oppositeAlignmentMap","start","end","clamp","value","evaluate","param","getSide","placement","split","getAlignment","getOppositeAxis","axis","getAxisLength","getSideAxis","includes","getAlignmentAxis","getOppositeAlignmentPlacement","replace","alignment","getOppositePlacement","side","rectToClientRect","rect","width","height","computeCoordsFromPlacement","_ref","rtl","reference","floating","sideAxis","alignmentAxis","alignLength","isVertical","commonX","commonY","commonAlign","coords","detectOverflow","state","options","_await$platform$isEle","platform","rects","elements","strategy","boundary","rootBoundary","elementContext","altBoundary","padding","paddingObject","expandPaddingObject","getPaddingObject","element","clippingClientRect","getClippingRect","isElement","contextElement","getDocumentElement","offsetParent","getOffsetParent","offsetScale","getScale","elementClientRect","convertOffsetParentRelativeRectToViewportRelativeRect","getNodeName","node","isNode","nodeName","toLowerCase","getWindow","_node$ownerDocument","ownerDocument","defaultView","window","document","documentElement","Node","Element","isHTMLElement","HTMLElement","isShadowRoot","ShadowRoot","isOverflowElement","overflow","overflowX","overflowY","display","getComputedStyle","test","isTableElement","isContainingBlock","webkit","isWebKit","css","transform","perspective","containerType","backdropFilter","filter","some","willChange","contain","CSS","supports","isLastTraversableNode","getNodeScroll","scrollLeft","scrollTop","pageXOffset","pageYOffset","getParentNode","result","assignedSlot","parentNode","host","getNearestOverflowAncestor","body","getOverflowAncestors","list","traverseIframes","_node$ownerDocument2","scrollableAncestor","isBody","win","concat","visualViewport","frameElement","getCssDimensions","parseFloat","hasOffset","offsetWidth","offsetHeight","shouldFallback","$","unwrapElement","domElement","getBoundingClientRect","Number","isFinite","noOffsets","getVisualOffsets","offsetLeft","offsetTop","includeScale","isFixedStrategy","clientRect","scale","visualOffsets","isFixed","floatingOffsetParent","shouldAddVisualOffsets","offsetWin","currentWin","currentIFrame","iframeScale","iframeRect","clientLeft","paddingLeft","clientTop","paddingTop","topLayerSelectors","isTopLayer","selector","matches","e","getWindowScrollBarX","getClientRectFromClippingAncestor","clippingAncestor","html","clientWidth","clientHeight","visualViewportBased","getViewportRect","scroll","scrollWidth","scrollHeight","direction","getDocumentRect","getInnerBoundingClientRect","hasFixedPositionAncestor","stopNode","position","getRectRelativeToOffsetParent","isOffsetParentAnElement","offsets","offsetRect","getTrueOffsetParent","polyfill","currentNode","getContainingBlock","topLayer","clippingAncestors","cache","cachedResult","get","el","currentContainingBlockComputedStyle","elementIsFixed","computedStyle","currentNodeIsContaining","ancestor","set","getClippingElementAncestors","this","_c","clippingRect","reduce","accRect","getElementRects","data","getOffsetParentFn","getDimensionsFn","getDimensions","getClientRects","Array","from","isRTL","flip","name","fn","_middlewareData$arrow","_middlewareData$flip","middlewareData","initialPlacement","mainAxis","checkMainAxis","crossAxis","checkCrossAxis","fallbackPlacements","specifiedFallbackPlacements","fallbackStrategy","fallbackAxisSideDirection","flipAlignment","detectOverflowOptions","arrow","alignmentOffset","isBasePlacement","oppositePlacement","getExpandedPlacements","push","isStart","lr","rl","tb","bt","getSideList","map","getOppositeAxisPlacements","placements","overflows","overflowsData","sides","length","mainAlignmentSide","getAlignmentSides","every","_middlewareData$flip2","_overflowsData$filter","nextIndex","index","nextPlacement","reset","resetPlacement","d","sort","a","b","_overflowsData$map$so","acc","_window$langchatChatW","_settle","pact","s","_Pact","o","bind","then","observer","submit","preventDefault","target","config","url","console","error","disableErrorAlert","alert","Promise","resolve","submitElement","getElementById","setAttribute","requestHeaders","Headers","append","apiKey","message","_extends","user","messages","role","content","threadId","timestamp","Date","now","createNewMessageEntry","_temp4","removeAttribute","messagesHistory","prepend","thinkingBubble","_temp3","fetch","method","headers","JSON","stringify","response","remove","handleStreamedResponse","_catch","reject","prototype","onFulfilled","onRejected","callback","_this","_isSettledPact","thenable","messageElement","createElement","classList","add","id","messageText","marked","_marked","innerHTML","appendChild","messageTimestamp","textContent","getHours","slice","getMinutes","LANGCHAT_ID","LANGCHAT_BTN_OPEN","LANGCHAT_BTN_CLOSE","WIDGET_CONTAINER_ID","Renderer","linkRenderer","link","href","title","text","call","greetingMessage","langchatChatWidget","cleanup","optionalBackdrop","open","style","containerElement","innerText","children","update","ancestorScroll","ancestorResize","elementResize","ResizeObserver","layoutShift","IntersectionObserver","animationFrame","referenceEl","ancestors","forEach","addEventListener","passive","cleanupIo","onMove","timeoutId","io","root","_io","clearTimeout","disconnect","refresh","skip","threshold","rootMargin","isFirstUpdate","handleObserve","entries","ratio","intersectionRatio","setTimeout","observe","observeMove","frameId","reobserveFrame","resizeObserver","firstEntry","unobserve","cancelAnimationFrame","requestAnimationFrame","_resizeObserver","prevRefRect","frameLoop","nextRefRect","_resizeObserver2","removeEventListener","autoUpdate","computePosition","Map","mergedOptions","platformWithCache","middleware","validMiddleware","Boolean","statefulPlacement","resetCount","i","nextX","nextY","computePosition$1","limiter","mainAxisCoord","crossAxisCoord","limitedCoords","log","Object","assign","close","res","_exit","_interrupt","_temp2","_result2","_ref4","_config$threadId2","threadIdFromHeader","responseThreadId","responseMessage","ts","reader","getReader","_temp","stage","shouldContinue","updateValue","_for","read","_ref5","done","undefined","_step","_iterator","_createForOfIteratorHelperLoose","TextDecoder","decode","stream","startsWith","trim","choice","parse","choices","finishReason","delta","existingMessageElement","querySelector","_marked2","streamResponseToMessageEntry","init","langchatElement","styleElement","head","insertBefore","firstChild","_document$getElementB","_document$getElementB2"],"mappings":"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"}