{"version":3,"file":"generator.mjs","sources":["../../src/regex.js","../../src/parse-citation.js","../../src/utils.js","../../src/html-transform-browser.js","../../src/generator.js","../../src/gen-citation.js","../../src/gen-biblio.js","../../src/gen-footnote.js"],"sourcesContent":["// Regex adapted from https://github.com/Zettlr/Zettlr/blob/develop/source/common/util/extract-citations.ts\n\n/**\n * Citation detection: The first alternative matches \"full\" citations surrounded\n * by square brackets, whereas the second one matches in-text citations,\n * optionally with suffixes.\n *\n * * Group 1 matches regular \"full\" citations\n * * Group 2 matches in-text citations (not surrounded by brackets)\n * * Group 3 matches optional square-brackets suffixes to group 2 matches\n *\n * For more information, see https://pandoc.org/MANUAL.html#extension-citations\n *\n * @var {RegExp}\n */\nexport const citationRE =\n /(?:\\[([^[\\]]*@[^[\\]]+)\\])|(?<=\\s|^|(-))(?:@([\\p{L}\\d_][^\\s]*[\\p{L}\\d_]|\\{.+\\})(?:\\s+\\[(.*?)\\])?)/u\n\n/**\n * I hate everything at this. This can match every single possible variation on\n * whatever the f*** you can possibly do within square brackets according to the\n * documentation. I opted for named groups for these because otherwise I have no\n * idea what I have been doing here.\n *\n * * Group prefix: Contains the prefix, ends with a dash if we should suppress the author\n * * Group citekey: Contains the actual citekey, can be surrounded in curly brackets\n * * Group explicitLocator: Contains an explicit locator statement. If given, we MUST ignore any form of locator in the suffix\n * * Group explicitLocatorInSuffix: Same as above, but not concatenated to the citekey\n * * Group suffix: Contains the suffix, but may start with a locator (if explicitLocator and explicitLocatorInSuffix are not given)\n *\n * @var {RegExp}\n */\nexport const fullCitationRE =\n /(?.+)?(?:@(?[\\p{L}\\d_][^\\s{]*[\\p{L}\\d_]|\\{.+\\}))(?:\\{(?.*)\\})?(?:,\\s+(?:\\{(?.*)\\})?(?.*))?/u\n\n/**\n * This regular expression matches locator ranges, like the following:\n *\n * * 23-45, and further (here it matches up to, not including the comma)\n * * 45\n * * 15423\n * * 14235-12532\n * * 12-34, 23, 56\n * * 12, 23-14, 23\n * * 12, 54, 12-23\n * * 1, 1-4\n * * 3\n * * NEW NEW NEW: Now also matches Roman numerals as sometimes used in forewords!\n *\n * @var {RegExp}\n */\nexport const locatorRE = /^(?:[\\d, -]*\\d|[ivxlcdm, -]*[ivxlcdm])/i\n","/**\n * @typedef {import('./types').CiteItem} CiteItem\n * @typedef {import('./types').CiteItemSuffix} CiteItemSuffix\n */\n\nimport { fullCitationRE, locatorRE } from './regex.js'\n\n/**\n * The locatorLabels have been sourced from the Citr library. Basically it's just\n * a map with valid CSL locator labels and an array of possible natural labels\n * which a user might want to write (instead of the standardized labels).\n *\n * @var {{ [key: string]: string[] }}}\n */\nconst locatorLabels = {\n book: ['Buch', 'Bücher', 'B.', 'book', 'books', 'bk.', 'bks.', 'livre', 'livres', 'liv.'],\n chapter: ['Kapitel', 'Kap.', 'chapter', 'chapters', 'chap.', 'chaps', 'chapitre', 'chapitres'],\n column: ['Spalte', 'Spalten', 'Sp.', 'column', 'columns', 'col.', 'cols', 'colonne', 'colonnes'],\n figure: ['Abbildung', 'Abbildungen', 'Abb.', 'figure', 'figures', 'fig.', 'figs'],\n folio: ['Blatt', 'Blätter', 'Fol.', 'folio', 'folios', 'fol.', 'fols', 'fᵒ', 'fᵒˢ'],\n issue: [\n 'Nummer',\n 'Nummern',\n 'Nr.',\n 'number',\n 'numbers',\n 'no.',\n 'nos.',\n 'numéro',\n 'numéros',\n 'nᵒ',\n 'nᵒˢ',\n ],\n line: ['Zeile', 'Zeilen', 'Z', 'line', 'lines', 'l.', 'll.', 'ligne', 'lignes'],\n note: ['Note', 'Noten', 'N.', 'note', 'notes', 'n.', 'nn.'],\n opus: ['Opus', 'Opera', 'op.', 'opus', 'opera', 'opp.'],\n page: ['Seite', 'Seiten', 'S.', 'page', 'pages', 'p.', 'pp.'],\n paragraph: [\n 'Absatz',\n 'Absätze',\n 'Abs.',\n '¶',\n '¶¶',\n 'paragraph',\n 'paragraphs',\n 'para.',\n 'paras',\n 'paragraphe',\n 'paragraphes',\n 'paragr.',\n ],\n part: ['Teil', 'Teile', 'part', 'parts', 'pt.', 'pts', 'partie', 'parties', 'part.'],\n section: [\n 'Abschnitt',\n 'Abschnitte',\n 'Abschn.',\n '§',\n '§§',\n 'section',\n 'sections',\n 'sec.',\n 'secs',\n 'sect.',\n ],\n 'sub verbo': ['sub verbo', 'sub verbis', 's. v.', 's. vv.', 's.v.', 's.vv.'],\n verse: ['Vers', 'Verse', 'V.', 'verse', 'verses', 'v.', 'vv.', 'verset', 'versets'],\n volume: ['Band', 'Bände', 'Bd.', 'Bde.', 'volume', 'volumes', 'vol.', 'vols.'],\n}\n\n/**\n * Parses a given citation string and return entries and isComposite flag required for cite-proc.\n * Adapted from https://github.com/Zettlr/Zettlr/blob/develop/source/common/util/extract-citations.ts\n *\n * @param {RegExpMatchArray} regexMatch Cite string in the form of '[@item]' or '@item'\n * @return {[CiteItem[], boolean]} [entries, isComposite]\n */\nexport const parseCitation = (regexMatch) => {\n /** @type {CiteItem[]} */\n let entries = []\n let isComposite = false\n const fullCitation = regexMatch[1]\n const inTextSuppressAuthor = regexMatch[2]\n const inTextCitation = regexMatch[3]\n const optionalSuffix = regexMatch[4]\n\n if (fullCitation !== undefined) {\n // Handle citations in the form of [@item1; @item2]\n for (const citationPart of fullCitation.split(';')) {\n const match = fullCitationRE.exec(citationPart.trim())\n if (match === null) {\n continue // Faulty citation\n }\n // Prefix is the portion before @ e.g. [see @item1] or an empty string\n // We explicitly cast groups since we have groups in our RegExp and as\n // such the groups object will be set.\n /** @type {CiteItem} */\n const thisCitation = {\n id: match.groups.citekey.replace(/{(.+)}/, '$1'),\n prefix: undefined,\n locator: undefined,\n label: 'page',\n 'suppress-author': false,\n suffix: undefined,\n }\n\n // First, deal with the prefix. The speciality here is that it can\n // indicate if we should suppress the author.\n const rawPrefix = match.groups.prefix\n if (rawPrefix !== undefined) {\n thisCitation['suppress-author'] = rawPrefix.trim().endsWith('-')\n if (thisCitation['suppress-author']) {\n thisCitation.prefix = rawPrefix.substring(0, rawPrefix.trim().length - 1).trim()\n } else {\n thisCitation.prefix = rawPrefix.trim()\n }\n }\n\n // Second, deal with the suffix. This one can be much more tricky than\n // the prefix. We have three alternatives where the locator may be\n // present: If we have an explicitLocator or an explicitLocatorInSuffix,\n // we should extract the locator from there and leave the actual suffix\n // untouched. Only if those two alternatives are not present, then we\n // have a look at the rawSuffix and extract a (potential) locator.\n const explicitLocator = match.groups.explicitLocator\n const explicitLocatorInSuffix = match.groups.explicitLocatorInSuffix\n const rawSuffix = match.groups.suffix\n\n let suffixToParse\n let containsLocator = true\n if (explicitLocator === undefined && explicitLocatorInSuffix === undefined) {\n // Potential locator in rawSuffix. Only in this case should we overwrite\n // the suffix (hence the same if-condition below)\n suffixToParse = rawSuffix\n containsLocator = false\n } else if (explicitLocatorInSuffix !== undefined || explicitLocator !== undefined) {\n suffixToParse = explicitLocator !== undefined ? explicitLocator : explicitLocatorInSuffix\n thisCitation.suffix = rawSuffix?.trim()\n }\n\n const { label, locator, suffix } = parseSuffix(suffixToParse, containsLocator)\n thisCitation.locator = locator\n\n if (label !== undefined) {\n thisCitation.label = label\n }\n\n if (explicitLocator === undefined && explicitLocatorInSuffix === undefined) {\n thisCitation.suffix = suffix\n } else if (suffix !== undefined && thisCitation.locator !== undefined) {\n // If we're here, we should not change the suffix, but parseSuffix may\n // have put something into the suffix return. If we're here, that will\n // definitely be a part of the locator.\n thisCitation.locator += suffix\n }\n\n entries.push(thisCitation)\n }\n } else {\n // We have an in-text citation, so we can take a shortcut\n isComposite = true\n entries.push({\n prefix: undefined,\n id: inTextCitation.replace(/{(.+)}/, '$1'),\n 'suppress-author': inTextSuppressAuthor !== undefined,\n ...parseSuffix(optionalSuffix, false), // Populate more depending on the suffix\n })\n }\n return [entries, isComposite]\n}\n\n/**\n * This takes a suffix and extracts optional label and locator from this. Pass\n * true for the containsLocator property to indicate to this function that what\n * it got was not a regular suffix with an optional locator, but an explicit\n * locator so it knows it just needs to look for an optional label.\n *\n * @param {string} suffix The suffix to parse\n * @param {boolean} containsLocator If true, forces parseSuffix to return a locator\n *\n * @return {CiteItemSuffix} An object containing three optional properties locator, label, or suffix.\n */\nfunction parseSuffix(suffix, containsLocator) {\n /** @type {CiteItemSuffix} */\n const retValue = {\n locator: undefined,\n label: 'page',\n suffix: undefined,\n }\n\n if (suffix === undefined) {\n return retValue\n }\n\n // Make sure the suffix does not start or end with spaces\n suffix = suffix.trim()\n\n // If there is a label, the suffix must start with it\n for (const label in locatorLabels) {\n for (const natural of locatorLabels[label]) {\n if (suffix.toLowerCase().startsWith(natural.toLowerCase())) {\n retValue.label = label\n if (containsLocator) {\n // The suffix actually is the full locator, we just had to extract\n // the label from it. There is no remaining suffix.\n retValue.locator = suffix.substr(natural.length).trim()\n } else {\n // The caller indicated that this is a regular suffix, so we must also\n // extract the locator from what is left after label extraction.\n retValue.suffix = suffix.substr(natural.length).trim()\n const match = locatorRE.exec(retValue.suffix)\n if (match !== null) {\n retValue.locator = match[0] // Extract the full match\n retValue.suffix = retValue.suffix.substr(match[0].length).trim()\n }\n }\n\n return retValue // Early exit\n }\n }\n }\n\n // If we're here, there was no explicit label given, but the caller has indicated\n // that this suffix MUST contain a locator. This means that the whole suffix is\n // the locator.\n if (containsLocator) {\n retValue.locator = suffix\n } else {\n // The caller has not indicated that the whole suffix is the locator, so it\n // can be at the beginning. We only accept simple page/number ranges here.\n // For everything, the user should please be more specific.\n const match = locatorRE.exec(suffix)\n if (match !== null) {\n retValue.locator = match[0] // Full match is the locator\n retValue.suffix = suffix.substr(match[0].length).trim() // The rest is the suffix.\n }\n }\n\n return retValue\n}\n","import fetch from 'cross-fetch'\n\nexport const isNode = typeof window === 'undefined'\n\nexport const readFile = async (path) => {\n if (isValidHttpUrl(path)) {\n return fetch(path)\n .then((response) => response.text())\n .then((data) => data)\n } else {\n if (isNode) {\n return import('fs').then((fs) => fs.readFileSync(path, 'utf8'))\n } else {\n throw new Error(`Cannot read non valid URL in node env.`)\n }\n }\n}\n\n/**\n * Check if valid URL\n * https://stackoverflow.com/questions/5717093/check-if-a-javascript-string-is-a-url\n *\n * @param {string} str\n * @return {boolean}\n */\nexport const isValidHttpUrl = (str) => {\n let url\n\n try {\n url = new URL(str)\n } catch (_) {\n return false\n }\n\n return url.protocol === 'http:' || url.protocol === 'https:'\n}\n\n/**\n * Get bibliography by merging options and vfile data\n *\n * @param {import('./generator.js').Options} options\n * @param {import('vfile').VFile} file\n */\nexport const getBibliography = async (options, file) => {\n /** @type {string[]} */\n let bibliography = []\n if (options.bibliography) {\n bibliography =\n typeof options.bibliography === 'string' ? [options.bibliography] : options.bibliography\n // @ts-ignore\n } else if (file?.data?.frontmatter?.bibliography) {\n // @ts-ignore\n bibliography =\n typeof file.data.frontmatter.bibliography === 'string'\n ? [file.data.frontmatter.bibliography]\n : file.data.frontmatter.bibliography\n // If local path, get absolute path\n for (let i = 0; i < bibliography.length; i++) {\n if (!isValidHttpUrl(bibliography[i])) {\n if (isNode) {\n bibliography[i] = await import('path').then((path) =>\n path.join(options.path || file.cwd, bibliography[i])\n )\n } else {\n throw new Error(`Cannot read non valid bibliography URL in node env.`)\n }\n }\n }\n }\n\n return bibliography\n}\n\n/**\n * Load CSL - supports predefined name from config.templates.data or http, file path (nodejs)\n *\n * @param {*} Cite cite object from citation-js\n * @param {string} format CSL name e.g. apa or file path to CSL file\n * @param {string} root optional root path\n */\nexport const loadCSL = async (Cite, format, root = '') => {\n const config = Cite.plugins.config.get('@csl')\n if (!Object.keys(config.templates.data).includes(format)) {\n const cslName = `customCSL-${Math.random().toString(36).slice(2, 7)}`\n let cslPath = ''\n if (isValidHttpUrl(format)) cslPath = format\n else {\n if (isNode) cslPath = await import('path').then((path) => path.join(root, format))\n }\n try {\n config.templates.add(cslName, await readFile(cslPath))\n } catch (err) {\n throw new Error(`Input CSL option, ${format}, is invalid or is an unknown file.`)\n }\n return cslName\n } else {\n return format\n }\n}\n\n/**\n * Load locale - supports predefined name from config.locales.data or http, file path (nodejs)\n *\n * @param {*} Cite cite object from citation-js\n * @param {string} format locale name\n * @param {string} root optional root path\n */\nexport const loadLocale = async (Cite, format, root = '') => {\n const config = Cite.plugins.config.get('@csl')\n if (!Object.keys(config.locales.data).includes(format)) {\n let localePath = ''\n if (isValidHttpUrl(format)) localePath = format\n else {\n if (isNode) localePath = await import('path').then((path) => path.join(root, format))\n }\n try {\n const file = await readFile(localePath)\n const xmlLangRe = /xml:lang=\"(.+)\"/\n const localeName = file.match(xmlLangRe)[1]\n config.locales.add(localeName, file)\n return localeName\n } catch (err) {\n throw new Error(`Input locale option, ${format}, is invalid or is an unknown file.`)\n }\n } else {\n return format\n }\n}\n\n/**\n * Get citation format\n *\n * @param {*} citeproc citeproc\n * @returns string\n */\nexport const getCitationFormat = (citeproc) => {\n const info = citeproc.cslXml.dataObj.children[0]\n const node = info.children.find((x) => x['attrs'] && x['attrs']['citation-format'])\n // citation-format takes 5 possible values\n // https://docs.citationstyles.org/en/stable/specification.html#toc-entry-14\n /** @type {'author-date' | 'author' | 'numeric' | 'note' | 'label'} */\n const citationFormat = node['attrs']['citation-format']\n return citationFormat\n}\n\n/**\n * Get registry objects that matches a list of relevantIds\n * If sorted is false, retrieve registry item in the order of the given relevantIds\n *\n * @param {*} citeproc citeproc\n * @param {string[]} relevantIds\n * @param {boolean} sorted\n * @return {*} registry objects that matches Ids, in the correct order\n */\nexport const getSortedRelevantRegistryItems = (citeproc, relevantIds, sorted) => {\n const res = []\n if (sorted) {\n // If sorted follow registry order\n for (const item of citeproc.registry.reflist) {\n if (relevantIds.includes(item.id)) res.push(item)\n }\n } else {\n // Otherwise follow the relevantIds\n for (const id of relevantIds) {\n res.push(citeproc.registry.reflist.find((x) => x.id === id))\n }\n }\n return res\n}\n\n/**\n * Split a string into two parts based on a given index position\n *\n * @param {string} str\n * @param {number} index\n * @return {string[]}\n */\nexport const split = (str, index) => {\n return [str.slice(0, index), str.slice(index)]\n}\n\n/**\n * Check if two registry objects belong to the same author\n * Currently only checks on family name\n *\n * @param {*} item registry object\n * @param {*} item2 registry object\n * @return {boolean}\n */\nexport const isSameAuthor = (item, item2) => {\n const authorList = item.ref.author\n const authorList2 = item2.ref.author\n if (authorList.length !== authorList2.length) return false\n for (let i = 0; i < authorList.length; i++) {\n if (authorList[i].family !== authorList2[i].family) return false\n }\n return true\n}\n","import { fromDom } from 'hast-util-from-dom'\n\n/**\n * Convert HTML to HAST node\n *\n * @param {string} html\n */\nexport const htmlToHast = (html) => {\n const frag = document.createRange().createContextualFragment(html)\n return fromDom(frag).children[0]\n}\n","/**\n * @typedef {import('hast').Node} Node\n * @typedef {import('hast').Parent} Parent\n * @typedef {import('hast').Root} Root\n * @typedef {import('hast').Element} Element\n * @typedef {import('unist-util-visit').Visitor} Visitor\n * @typedef {import('./types').CiteItem} CiteItem\n * @typedef {import('./types').Mode} Mode\n * @typedef {import('./types').Options} Options\n */\n\nimport { visit } from 'unist-util-visit'\nimport fetch from 'cross-fetch'\nimport { parseCitation } from './parse-citation.js'\nimport { genCitation } from './gen-citation.js'\nimport { genBiblioNode } from './gen-biblio.js'\nimport { genFootnoteSection } from './gen-footnote.js'\nimport { citationRE } from './regex.js'\nimport {\n isNode,\n isValidHttpUrl,\n readFile,\n getBibliography,\n loadCSL,\n loadLocale,\n getCitationFormat,\n} from './utils.js'\n\nconst defaultCiteFormat = 'apa'\nconst permittedTags = ['div', 'p', 'span', 'li', 'td', 'th']\nconst idRoot = 'CITATION'\n\n/**\n * Rehype plugin that formats citations in markdown documents and insert bibliography in html format\n *\n * [-@wadler1990] --> (1990)\n * [@hughes1989, sec 3.4] --> (Hughes 1989, sec 3.4)\n * [see @wadler1990; and @hughes1989, pp. 4] --> (see Wadler 1990 and Hughes 1989, pp. 4)\n *\n * @param {*} Cite cite object from citation-js configured with the required CSLs\n * @return {import('unified').Plugin<[Options?], Root>}\n */\nconst rehypeCitationGenerator = (Cite) => {\n return (options = {}) => {\n return async (tree, file) => {\n /** @type {string[]} */\n let bibtexFile = []\n /** @type {string} */ // @ts-ignore\n const inputCiteformat = options.csl || file?.data?.frontmatter?.csl || defaultCiteFormat\n const inputLang = options.lang || 'en-US'\n const config = Cite.plugins.config.get('@csl')\n const citeFormat = await loadCSL(Cite, inputCiteformat, options.path)\n const lang = await loadLocale(Cite, inputLang, options.path)\n\n let bibliography = await getBibliography(options, file)\n if (bibliography.length === 0) {\n return\n }\n\n for (let i = 0; i < bibliography.length; i++) {\n if (isValidHttpUrl(bibliography[i])) {\n const response = await fetch(bibliography[i])\n bibtexFile.push(await response.text())\n } else {\n if (isNode) {\n bibtexFile.push(await readFile(bibliography[i]))\n } else {\n throw new Error(`Cannot read non valid bibliography URL in node env.`)\n }\n }\n }\n const citations = new Cite(bibtexFile)\n const citationIds = citations.data.map((x) => x.id)\n const citationPre = []\n const citationDict = {}\n let citationId = 1\n const citeproc = config.engine(citations.data, citeFormat, lang, 'html')\n /** @type {Mode} */\n const mode = citeproc.opt.xclass\n const citationFormat = getCitationFormat(citeproc)\n\n visit(tree, 'text', (node, idx, parent) => {\n const match = node.value.match(citationRE)\n if (!match || ('tagName' in parent && !permittedTags.includes(parent.tagName))) return\n let citeStartIdx = match.index\n let citeEndIdx = match.index + match[0].length\n // If we have an in-text citation and we should suppress the author, the\n // match.index does NOT include the positive lookbehind, so we have to manually\n // shift \"from\" to one before.\n if (match[2] !== undefined) {\n citeStartIdx--\n }\n const newChildren = []\n // if preceding string\n if (citeStartIdx !== 0) {\n // create a new child node\n newChildren.push({\n type: 'text',\n value: node.value.slice(0, citeStartIdx),\n })\n }\n\n const [entries, isComposite] = parseCitation(match)\n\n // If id is not in citation file (e.g. route alias or js package), abort process\n for (const citeItem of entries) {\n if (!citationIds.includes(citeItem.id)) return\n }\n const [citedText, citedTextNode] = genCitation(\n citeproc,\n mode,\n entries,\n idRoot,\n citationId,\n citationPre,\n options,\n isComposite,\n citationFormat\n )\n citationDict[citationId] = citedText\n\n // Prepare citationPre and citationId for the next cite instance\n citationPre.push([`${idRoot}-${citationId}`, 0])\n citationId = citationId + 1\n\n newChildren.push(citedTextNode)\n\n // if trailing string\n if (citeEndIdx < node.value.length) {\n newChildren.push({\n type: 'text',\n value: node.value.slice(citeEndIdx),\n })\n }\n\n // insert into the parent\n // @ts-ignore\n parent.children = [\n ...parent.children.slice(0, idx),\n ...newChildren,\n ...parent.children.slice(idx + 1),\n ]\n })\n\n if (options.noCite) {\n citeproc.updateItems(options.noCite.map((x) => x.replace('@', '')))\n }\n\n if (\n citeproc.registry.mylist.length >= 1 &&\n (!options.suppressBibliography || options.inlineBibClass?.length > 0)\n ) {\n const biblioNode = genBiblioNode(citeproc)\n let bilioInserted = false\n\n const biblioMap = {}\n biblioNode.children\n .filter((node) => node.properties?.className?.includes('csl-entry'))\n .forEach((node) => {\n const citekey = node.properties.id.split('-').slice(1).join('-')\n biblioMap[citekey] = { ...node }\n biblioMap[citekey].properties = { id: 'inlinebib-' + citekey }\n })\n\n // Insert it at ^ref, if not found insert it as the last element of the tree\n visit(tree, 'element', (node, idx, parent) => {\n // Add inline bibliography\n if (\n options.inlineBibClass?.length > 0 &&\n node.properties?.id?.toString().startsWith('citation-')\n ) {\n // id is citation--nash1951--nash1950--1\n const [, ...citekeys] = node.properties.id.toString().split('--')\n const citationID = citekeys.pop()\n\n /** @type {Element} */\n const inlineBibNode = {\n type: 'element',\n tagName: 'div',\n properties: {\n className: options.inlineBibClass,\n id: `inlineBib--${citekeys.join('--')}--${citationID}`,\n },\n children: citekeys.map((citekey) => {\n const aBibNode = biblioMap[citekey]\n aBibNode.properties = {\n class: 'inline-entry',\n id: `inline--${citekey}--${citationID}`,\n }\n return aBibNode\n }),\n }\n parent.children.push(inlineBibNode)\n }\n\n // Add bibliography\n if (\n !options.suppressBibliography &&\n (node.tagName === 'p' || node.tagName === 'div') &&\n node.children.length >= 1 &&\n node.children[0].type === 'text' &&\n node.children[0].value === '[^ref]'\n ) {\n parent.children[idx] = biblioNode\n bilioInserted = true\n }\n })\n\n if (!options.suppressBibliography && !bilioInserted) {\n tree.children.push(biblioNode)\n }\n }\n\n let footnoteSection\n visit(tree, 'element', (node, index, parent) => {\n if (node.tagName === 'section' && node.properties.dataFootnotes) {\n footnoteSection = node\n parent.children.splice(index, 1)\n }\n })\n\n // Need to adjust footnote numbering based on existing ones already assigned\n // And insert them into the footnote section (if exists)\n // Footnote comes after bibliography\n if (mode === 'note' && Object.keys(citationDict).length > 0) {\n /** @type {{type: 'citation' | 'existing', oldId: string}[]} */\n let fnArray = []\n let index = 1\n visit(tree, 'element', (node) => {\n if (node.tagName === 'sup' && node.children[0].type === 'element') {\n let nextNode = node.children[0]\n if (nextNode.tagName === 'a') {\n /** @type {{href: string, id: string}} */ // @ts-ignore\n const { href, id } = nextNode.properties\n if (href.includes('fn') && id.includes('fnref')) {\n const oldId = href.split('-').pop()\n fnArray.push({\n type: href.includes('cite') ? 'citation' : 'existing',\n oldId,\n })\n // Update ref number\n nextNode.properties.href = `#user-content-fn-${index}`\n nextNode.properties.id = `user-content-fnref-${index}`\n // @ts-ignore\n nextNode.children[0].value = index.toString()\n index += 1\n }\n }\n }\n })\n // @ts-ignore\n const newFootnoteSection = genFootnoteSection(citationDict, fnArray, footnoteSection)\n tree.children.push(newFootnoteSection)\n } else {\n if (footnoteSection) tree.children.push(footnoteSection)\n }\n }\n }\n}\n\nexport default rehypeCitationGenerator\n","/**\n * @typedef {import('./types').CiteItem} CiteItem\n * @typedef {import('./types').Mode} Mode\n * @typedef {import('./types').Options} Options\n */\n\nimport { getSortedRelevantRegistryItems, split, isSameAuthor } from './utils.js'\nimport { htmlToHast } from './html-transform-node.js'\n\n/**\n * Generate citation using citeproc\n * This accounts for prev citations and additional properties\n *\n * @param {*} citeproc\n * @param {Mode} mode\n * @param {CiteItem[]} entries\n * @param {string} citationIdRoot\n * @param {number} citationId\n * @param {any[]} citationPre\n * @param {Options} options\n * @param {boolean} isComposite\n * @param {import('./types').CitationFormat} citationFormat\n * @return {[string, string]}\n */\nexport const genCitation = (\n citeproc,\n mode,\n entries,\n citationIdRoot,\n citationId,\n citationPre,\n options,\n isComposite,\n citationFormat\n) => {\n const { inlineClass, linkCitations } = options\n const key = `${citationIdRoot}-${citationId}`\n const c = citeproc.processCitationCluster(\n {\n citationID: key,\n citationItems: entries,\n properties:\n mode === 'in-text'\n ? { noteIndex: 0, mode: isComposite ? 'composite' : '' }\n : { noteIndex: citationId, mode: isComposite ? 'composite' : '' },\n },\n citationPre.length > 0 ? citationPre : [],\n []\n )\n // c = [ { bibchange: true, citation_errors: [] }, [ [ 0, '(1)', 'CITATION-1' ] ]]\n\n const citationText = c[1].find((x) => x[2] === key)[1]\n const ids = `citation--${entries.map((x) => x.id.toLowerCase()).join('--')}--${citationId}`\n if (mode === 'note') {\n // Use cite-fn-{id} to denote footnote from citation, will clean it up later to follow gfm \"user-content\" format\n return [\n citationText,\n htmlToHast(\n `${citationId}`\n ),\n ]\n } else if (linkCitations && citationFormat === 'numeric') {\n // e.g. [1, 2]\n let i = 0\n const refIds = entries.map((e) => e.id)\n const output = citationText.replace(/\\d+/g, function (d) {\n const url = `${d}`\n i++\n return url\n })\n\n return [\n citationText,\n htmlToHast(`${output}`),\n ]\n } else if (linkCitations && citationFormat === 'author-date') {\n // E.g. (see Nash, 1950, pp. 12–13, 1951); (Nash, 1950; Xie, 2016)\n if (entries.length === 1) {\n // Do not link bracket\n const output = isComposite\n ? `${citationText}`\n : `${citationText.slice(\n 0,\n 1\n )}${citationText.slice(\n 1,\n -1\n )}${citationText.slice(-1)}`\n return [\n citationText,\n htmlToHast(`${output}`),\n ]\n } else {\n // Retrieve the items in the correct order and attach link each of them\n const refIds = entries.map((e) => e.id)\n const results = getSortedRelevantRegistryItems(citeproc, refIds, citeproc.opt.sort_citations)\n const output = []\n let str = citationText\n\n for (const [i, item] of results.entries()) {\n // Need to compare author. If same just match on date.\n const id = item.id\n let citeMatch = item.ambig\n // If author is the same as the previous, some styles like apa collapse the author\n if (i > 0 && isSameAuthor(results[i - 1], item) && str.indexOf(citeMatch) === -1) {\n // Just match on year\n citeMatch = item.ref.issued.year.toString()\n }\n const startPos = str.indexOf(citeMatch)\n const [start, rest] = split(str, startPos)\n output.push(start) // Irrelevant parts\n const url = `${rest.substring(0, citeMatch.length)}`\n output.push(url)\n str = rest.substr(citeMatch.length)\n }\n output.push(str)\n return [\n citationText,\n htmlToHast(\n `${output.join('')}`\n ),\n ]\n }\n } else {\n return [\n citationText,\n htmlToHast(`${citationText}`),\n ]\n }\n}\n","import { htmlToHast } from './html-transform-node.js'\n\n/**\n * Generate bibliography in html and convert it to hast\n *\n * @param {*} citeproc\n */\nexport const genBiblioNode = (citeproc) => {\n const [params, bibBody] = citeproc.makeBibliography()\n const bibliography =\n '
\\n' + bibBody.join('') + '
'\n const biblioNode = htmlToHast(bibliography)\n\n // Add citekey id to each bibliography entry.\n biblioNode.children\n .filter((node) => node.properties?.className?.includes('csl-entry'))\n .forEach((node, i) => {\n const citekey = params.entry_ids[i][0].toLowerCase()\n node.properties = node.properties || {}\n node.properties.id = 'bib-' + citekey\n })\n return biblioNode\n}\n","/**\n * @typedef {import('hast').Element} Element\n * @typedef {import('hast').ElementContent} ElementContent\n */\n\nimport { htmlToHast } from './html-transform-node.js'\n\n/**\n * Create new footnote section node based on footnoteArray mappings\n *\n * @param {{int: string}} citationDict\n * @param {{type: 'citation' | 'existing', oldId: string}[]} footnoteArray\n * @param {Element | undefined} footnoteSection\n * @return {Element}\n */\nexport const genFootnoteSection = (citationDict, footnoteArray, footnoteSection) => {\n /** @type {Element} */\n const list = {\n type: 'element',\n tagName: 'ol',\n properties: {},\n children: [{ type: 'text', value: '\\n' }],\n }\n let oldFootnoteList\n if (footnoteSection) {\n /** @type {Element} */ // @ts-ignore - for some reason, the type does not narrow even after filtering\n oldFootnoteList = footnoteSection.children.filter(n => (n.type == \"element\")).find((n) => (n.tagName === 'ol'))\n }\n for (const [idx, item] of footnoteArray.entries()) {\n const { type, oldId } = item\n if (type === 'citation') {\n list.children.push({\n type: 'element',\n tagName: 'li',\n properties: { id: `user-content-fn-${idx + 1}` },\n children: [\n {\n type: 'element',\n tagName: 'p',\n properties: {},\n children: [\n htmlToHast(`${citationDict[oldId]}`),\n {\n type: 'element',\n tagName: 'a',\n properties: {\n href: `#user-content-fnref-${idx + 1}`,\n dataFootnoteBackref: true,\n className: ['data-footnote-backref'],\n ariaLabel: 'Back to content',\n },\n children: [{ type: 'text', value: '↩' }],\n },\n ],\n },\n { type: 'text', value: '\\n' },\n ],\n })\n } else if (type === 'existing') {\n // @ts-ignore\n const liNode = oldFootnoteList.children.find(\n (n) => n.tagName === 'li' && n.properties.id === `user-content-fn-${oldId}`\n )\n liNode.properties.id = `user-content-fn-${idx + 1}`\n const aNode = liNode.children[1].children.find((n) => n.tagName === 'a')\n aNode.properties.href = `#user-content-fnref-${idx + 1}`\n list.children.push(liNode)\n }\n }\n\n /** @type {Element} */\n const newfootnoteSection = {\n type: 'element',\n tagName: 'section',\n properties: { dataFootnotes: true, className: ['footnotes'] },\n children: [\n {\n type: 'element',\n tagName: 'h2',\n properties: { className: ['sr-only'], id: 'footnote-label' },\n children: [{ type: 'text', value: 'Footnotes' }],\n },\n { type: 'text', value: '\\n' },\n list,\n ],\n }\n return newfootnoteSection\n}\n"],"names":["citationRE","fullCitationRE","_wrapRegExp","prefix","citekey","explicitLocator","explicitLocatorInSuffix","suffix","locatorRE","locatorLabels","book","chapter","column","figure","folio","issue","line","note","opus","page","paragraph","part","section","verse","volume","parseSuffix","containsLocator","retValue","locator","undefined","label","trim","natural","toLowerCase","startsWith","substr","length","match","exec","readFile","async","isValidHttpUrl","path","fetch","then","response","text","data","Error","str","url","URL","_","protocol","split","index","slice","isSameAuthor","item","item2","authorList","ref","author","authorList2","i","family","htmlToHast","html","frag","document","createRange","createContextualFragment","fromDom","children","permittedTags","idRoot","rehypeCitationGenerator","Cite","options","tree","file","_file$data","_options$inlineBibCla","bibtexFile","inputCiteformat","csl","frontmatter","inputLang","lang","config","plugins","get","citeFormat","format","root","Object","keys","templates","includes","cslName","Math","random","toString","cslPath","add","err","loadCSL","locales","localePath","localeName","loadLocale","bibliography","getBibliography","push","citations","citationIds","map","x","id","citationPre","citationDict","citationId","citeproc","engine","mode","opt","xclass","citationFormat","cslXml","dataObj","find","getCitationFormat","visit","node","idx","parent","value","tagName","citeStartIdx","citeEndIdx","newChildren","type","entries","isComposite","regexMatch","fullCitation","inTextSuppressAuthor","inTextCitation","optionalSuffix","citationPart","thisCitation","groups","replace","rawPrefix","endsWith","substring","rawSuffix","suffixToParse","_extends","parseCitation","citeItem","citedText","citedTextNode","genCitation","citationIdRoot","inlineClass","linkCitations","key","citationText","processCitationCluster","citationID","citationItems","properties","noteIndex","ids","join","refIds","e","output","d","results","getSortedRelevantRegistryItems","relevantIds","sorted","res","registry","reflist","sort_citations","citeMatch","ambig","indexOf","issued","year","startPos","start","rest","noCite","updateItems","mylist","suppressBibliography","inlineBibClass","biblioNode","params","bibBody","makeBibliography","filter","_node$properties","className","forEach","entry_ids","genBiblioNode","bilioInserted","biblioMap","_options$inlineBibCla2","_node$properties2","citekeys","pop","inlineBibNode","aBibNode","class","footnoteSection","dataFootnotes","splice","fnArray","nextNode","href","oldId","newFootnoteSection","genFootnoteSection","footnoteArray","list","oldFootnoteList","n","dataFootnoteBackref","ariaLabel","liNode","newfootnoteSection"],"mappings":"qtDAea,MAAAA,EACX,ouhBAgBWC,eAAcC,EACzB,u2hBAAgK,CAAAC,OAAA,EAAAC,QAAA,EAAAC,gBAAA,EAAAC,wBAAA,EAAAC,OAAA,IAkBrJC,EAAY,0CCrCnBC,EAAgB,CACpBC,KAAM,CAAC,OAAQ,SAAU,KAAM,OAAQ,QAAS,MAAO,OAAQ,QAAS,SAAU,QAClFC,QAAS,CAAC,UAAW,OAAQ,UAAW,WAAY,QAAS,QAAS,WAAY,aAClFC,OAAQ,CAAC,SAAU,UAAW,MAAO,SAAU,UAAW,OAAQ,OAAQ,UAAW,YACrFC,OAAQ,CAAC,YAAa,cAAe,OAAQ,SAAU,UAAW,OAAQ,QAC1EC,MAAO,CAAC,QAAS,UAAW,OAAQ,QAAS,SAAU,OAAQ,OAAQ,KAAM,OAC7EC,MAAO,CACL,SACA,UACA,MACA,SACA,UACA,MACA,OACA,SACA,UACA,KACA,OAEFC,KAAM,CAAC,QAAS,SAAU,IAAK,OAAQ,QAAS,KAAM,MAAO,QAAS,UACtEC,KAAM,CAAC,OAAQ,QAAS,KAAM,OAAQ,QAAS,KAAM,OACrDC,KAAM,CAAC,OAAQ,QAAS,MAAO,OAAQ,QAAS,QAChDC,KAAM,CAAC,QAAS,SAAU,KAAM,OAAQ,QAAS,KAAM,OACvDC,UAAW,CACT,SACA,UACA,OACA,IACA,KACA,YACA,aACA,QACA,QACA,aACA,cACA,WAEFC,KAAM,CAAC,OAAQ,QAAS,OAAQ,QAAS,MAAO,MAAO,SAAU,UAAW,SAC5EC,QAAS,CACP,YACA,aACA,UACA,IACA,KACA,UACA,WACA,OACA,OACA,SAEF,YAAa,CAAC,YAAa,aAAc,aAAc,cAAe,OAAQ,SAC9EC,MAAO,CAAC,OAAQ,QAAS,KAAM,QAAS,SAAU,KAAM,MAAO,SAAU,WACzEC,OAAQ,CAAC,OAAQ,QAAS,MAAO,OAAQ,SAAU,UAAW,OAAQ,UAmHxE,SAASC,EAAYlB,EAAQmB,GAE3B,MAAMC,EAAW,CACfC,aAASC,EACTC,MAAO,OACPvB,YAAQsB,GAGV,QAAeA,IAAXtB,EACF,OAAOoB,EAITpB,EAASA,EAAOwB,OAGhB,IAAK,MAAMD,KAASrB,EAClB,IAAK,MAAMuB,KAAWvB,EAAcqB,GAClC,GAAIvB,EAAO0B,cAAcC,WAAWF,EAAQC,eAAgB,CAE1D,GADAN,EAASG,MAAQA,EACbJ,EAGFC,EAASC,QAAUrB,EAAO4B,OAAOH,EAAQI,QAAQL,WAC5C,CAGLJ,EAASpB,OAASA,EAAO4B,OAAOH,EAAQI,QAAQL,OAChD,MAAMM,EAAQ7B,EAAU8B,KAAKX,EAASpB,QACxB,OAAV8B,IACFV,EAASC,QAAUS,EAAM,GACzBV,EAASpB,OAASoB,EAASpB,OAAO4B,OAAOE,EAAM,GAAGD,QAAQL,OAE9D,CAEA,OAAOJ,CACT,CAOJ,GAAID,EACFC,EAASC,QAAUrB,MACd,CAIL,MAAM8B,EAAQ7B,EAAU8B,KAAK/B,GACf,OAAV8B,IACFV,EAASC,QAAUS,EAAM,GACzBV,EAASpB,OAASA,EAAO4B,OAAOE,EAAM,GAAGD,QAAQL,OAErD,CAEA,OAAOJ,CACT,CC1Oa,MAAAY,EAAWC,UACtB,GAAIC,EAAeC,GACjB,OAAOC,EAAMD,GACVE,KAAMC,GAAaA,EAASC,QAC5BF,KAAMG,GAASA,GAKhB,MAAU,IAAAC,MAAO,yCAErB,EAUWP,EAAkBQ,IAC7B,IAAIC,EAEJ,IACEA,EAAM,IAAIC,IAAIF,EAChB,CAAE,MAAOG,GACP,OACF,CAAA,CAEA,MAAwB,UAAjBF,EAAIG,UAAyC,WAAjBH,EAAIG,QAAa,EA+IzCC,EAAQA,CAACL,EAAKM,IAClB,CAACN,EAAIO,MAAM,EAAGD,GAAQN,EAAIO,MAAMD,IAW5BE,EAAeA,CAACC,EAAMC,KACjC,MAAMC,EAAaF,EAAKG,IAAIC,OACtBC,EAAcJ,EAAME,IAAIC,OAC9B,GAAIF,EAAWxB,SAAW2B,EAAY3B,OAAQ,OAAY,EAC1D,IAAK,IAAI4B,EAAI,EAAGA,EAAIJ,EAAWxB,OAAQ4B,IACrC,GAAIJ,EAAWI,GAAGC,SAAWF,EAAYC,GAAGC,OAAQ,OACtD,EACA,OAAO,GC7LIC,EAAcC,IACzB,MAAMC,EAAOC,SAASC,cAAcC,yBAAyBJ,GAC7D,OAAOK,EAAQJ,GAAMK,SAAS,EAAC,ECoB3BC,EAAgB,CAAC,MAAO,IAAK,OAAQ,KAAM,KAAM,MACjDC,EAAS,WAYTC,EAA2BC,GACxB,CAACC,EAAU,KACTtC,MAAOuC,EAAMC,KAASC,IAAAA,EAAAC,EAE3B,IAAIC,EAAa,GAEjB,MAAMC,EAAkBN,EAAQO,MAAW,MAAJL,UAAIC,EAAJD,EAAMjC,cAAIkC,EAAVA,EAAYK,oBAAZL,EAAyBI,MApB5C,MAqBdE,EAAYT,EAAQU,MAAQ,QAC5BC,EAASZ,EAAKa,QAAQD,OAAOE,IAAI,QACjCC,OF6BWpD,OAAOqC,EAAMgB,EAAQC,EAAO,MACjD,MAAML,EAASZ,EAAKa,QAAQD,OAAOE,IAAI,QACvC,GAAKI,OAAOC,KAAKP,EAAOQ,UAAUlD,MAAMmD,SAASL,GAc/C,OAAOA,EAdiD,CACxD,MAAMM,EAAW,aAAYC,KAAKC,SAASC,SAAS,IAAI9C,MAAM,EAAG,KACjE,IAAI+C,EAAU,GACV9D,EAAeoD,KAASU,EAAUV,GAItC,IACEJ,EAAOQ,UAAUO,IAAIL,QAAe5D,EAASgE,GAC/C,CAAE,MAAOE,GACP,MAAU,IAAAzD,MAAO,qBAAoB6C,uCACvC,CACA,OAAOM,CACT,CAEA,EE9C6BO,CAAQ7B,EAAMO,EAAiBN,EAAQpC,MAC1D8C,OFuDchD,OAAOqC,EAAMgB,EAAQC,EAAO,MACpD,MAAML,EAASZ,EAAKa,QAAQD,OAAOE,IAAI,QACvC,GAAKI,OAAOC,KAAKP,EAAOkB,QAAQ5D,MAAMmD,SAASL,GAgB7C,OAAOA,EAhB+C,CACtD,IAAIe,EAAa,GACbnE,EAAeoD,KAASe,EAAaf,GAIzC,IACE,MAAMb,QAAazC,EAASqE,GAEtBC,EAAa7B,EAAK3C,MADN,mBACuB,GAEzC,OADAoD,EAAOkB,QAAQH,IAAIK,EAAY7B,GACxB6B,CACT,CAAE,MAAOJ,GACP,MAAM,IAAIzD,MAAO,wBAAuB6C,uCAC1C,CACF,CAEA,EE1EuBiB,CAAWjC,EAAMU,EAAWT,EAAQpC,MAEvD,IAAIqE,OFXqBvE,OAAOsC,EAASE,KAASC,IAAAA,EAEtD,IAAI8B,EAAe,GACnB,GAAIjC,EAAQiC,aACVA,EACkC,iBAAzBjC,EAAQiC,aAA4B,CAACjC,EAAQiC,cAAgBjC,EAAQiC,kBAErE/B,GAAIC,MAAJD,GAAUC,OAANA,EAAJD,EAAMjC,OAAiB,OAAbkC,EAAVA,EAAYK,cAAZL,EAAyB8B,aAAc,CAEhDA,EACgD,iBAAvC/B,EAAKjC,KAAKuC,YAAYyB,aACzB,CAAC/B,EAAKjC,KAAKuC,YAAYyB,cACvB/B,EAAKjC,KAAKuC,YAAYyB,aAE5B,IAAK,IAAI/C,EAAI,EAAGA,EAAI+C,EAAa3E,OAAQ4B,IACvC,IAAKvB,EAAesE,EAAa/C,IAM7B,MAAU,IAAAhB,MAAO,sDAIzB,CAEA,OAAO+D,GEhBsBC,CAAgBlC,EAASE,GAClD,GAA4B,IAAxB+B,EAAa3E,OACf,OAGF,IAAK,IAAI4B,EAAI,EAAGA,EAAI+C,EAAa3E,OAAQ4B,IAAK,CAC5C,IAAIvB,EAAesE,EAAa/C,IAO5B,MAAM,IAAIhB,MAAO,uDAPgB,CACnC,MAAMH,QAAiBF,EAAMoE,EAAa/C,IAC1CmB,EAAW8B,WAAWpE,EAASC,OACjC,CAOF,CACA,MAAMoE,EAAY,IAAIrC,EAAKM,GACrBgC,EAAcD,EAAUnE,KAAKqE,IAAKC,GAAMA,EAAEC,IAC1CC,EAAc,GACdC,EAAe,CAAE,EACvB,IAAIC,EAAa,EACjB,MAAMC,EAAWjC,EAAOkC,OAAOT,EAAUnE,KAAM6C,EAAYJ,EAAM,QAE3DoC,EAAOF,EAASG,IAAIC,OACpBC,EFwDsBL,IACnBA,EAASM,OAAOC,QAAQxD,SAAS,GAC5BA,SAASyD,KAAMb,GAAMA,EAAS,OAAKA,EAAS,MAAE,oBAI7B,MAAE,mBE9DVc,CAAkBT,GAqEzC,GAnEAU,EAAMrD,EAAM,OAAQ,CAACsD,EAAMC,EAAKC,KAC9B,MAAMlG,EAAQgG,EAAKG,MAAMnG,MAAMrC,GAC/B,IAAKqC,GAAU,YAAakG,IAAW7D,EAAcwB,SAASqC,EAAOE,SAAW,OAChF,IAAIC,EAAerG,EAAMkB,MACrBoF,EAAatG,EAAMkB,MAAQlB,EAAM,GAAGD,YAIvBP,IAAbQ,EAAM,IACRqG,IAEF,MAAME,EAAc,GAEC,IAAjBF,GAEFE,EAAY3B,KAAK,CACf4B,KAAM,OACNL,MAAOH,EAAKG,MAAMhF,MAAM,EAAGkF,KAI/B,MAAOI,EAASC,GH1BMC,KAE5B,IAAIF,EAAU,GACVC,GAAc,EAClB,MAAME,EAAeD,EAAW,GAC1BE,EAAuBF,EAAW,GAClCG,EAAiBH,EAAW,GAC5BI,EAAiBJ,EAAW,GAElC,QAAqBnH,IAAjBoH,EAEF,IAAK,MAAMI,KAAgBJ,EAAa3F,MAAM,KAAM,CAClD,MAAMjB,EAAQpC,EAAeqC,KAAK+G,EAAatH,QAC/C,GAAc,OAAVM,EACF,SAMF,MAAMiH,EAAe,CACnBhC,GAAIjF,EAAMkH,OAAOnJ,QAAQoJ,QAAQ,SAAU,MAC3CrJ,YAAQ0B,EACRD,aAASC,EACTC,MAAO,OACP,mBAAmB,EACnBvB,YAAQsB,GAKJ4H,EAAYpH,EAAMkH,OAAOpJ,YACb0B,IAAd4H,IACFH,EAAa,mBAAqBG,EAAU1H,OAAO2H,SAAS,KAE1DJ,EAAanJ,OADXmJ,EAAa,mBACOG,EAAUE,UAAU,EAAGF,EAAU1H,OAAOK,OAAS,GAAGL,OAEpD0H,EAAU1H,QAUpC,MAAM1B,EAAkBgC,EAAMkH,OAAOlJ,gBAC/BC,EAA0B+B,EAAMkH,OAAOjJ,wBACvCsJ,EAAYvH,EAAMkH,OAAOhJ,OAE/B,IAAIsJ,EACAnI,GAAkB,OACEG,IAApBxB,QAA6DwB,IAA5BvB,GAGnCuJ,EAAgBD,EAChBlI,GAAkB,QACmBG,IAA5BvB,QAA6DuB,IAApBxB,IAClDwJ,OAAoChI,IAApBxB,EAAgCA,EAAkBC,EAClEgJ,EAAa/I,OAASqJ,MAAAA,OAAAA,EAAAA,EAAW7H,QAGnC,MAAMD,MAAEA,EAAKF,QAAEA,EAAOrB,OAAEA,GAAWkB,EAAYoI,EAAenI,GAC9D4H,EAAa1H,QAAUA,OAETC,IAAVC,IACFwH,EAAaxH,MAAQA,QAGCD,IAApBxB,QAA6DwB,IAA5BvB,EACnCgJ,EAAa/I,OAASA,OACFsB,IAAXtB,QAAiDsB,IAAzByH,EAAa1H,UAI9C0H,EAAa1H,SAAWrB,GAG1BuI,EAAQ7B,KAAKqC,EACf,MAGAP,GAAc,EACdD,EAAQ7B,KAAI6C,EACV3J,CAAAA,YAAQ0B,EACRyF,GAAI6B,EAAeK,QAAQ,SAAU,MACrC,uBAA4C3H,IAAzBqH,GAChBzH,EAAY2H,GAAgB,KAGnC,MAAO,CAACN,EAASC,EAAW,EGjESgB,CAAc1H,GAG7C,IAAK,MAAM2H,KAAYlB,EACrB,IAAK3B,EAAYjB,SAAS8D,EAAS1C,IAAK,OAE1C,MAAO2C,EAAWC,GCpFCC,EACzBzC,EACAE,EACAkB,EACAsB,EACA3C,EACAF,EACAzC,EACAiE,EACAhB,KAEA,MAAMsC,YAAEA,EAAWC,cAAEA,GAAkBxF,EACjCyF,EAAO,GAAEH,KAAkB3C,IAe3B+C,EAdI9C,EAAS+C,uBACjB,CACEC,WAAYH,EACZI,cAAe7B,EACf8B,WACW,YAAThD,EACI,CAAEiD,UAAW,EAAGjD,KAAMmB,EAAc,YAAc,IAClD,CAAE8B,UAAWpD,EAAYG,KAAMmB,EAAc,YAAc,KAEnExB,EAAYnF,OAAS,EAAImF,EAAc,GACvC,IAIqB,GAAGW,KAAMb,GAAMA,EAAE,KAAOkD,GAAK,GAC9CO,EAAO,aAAYhC,EAAQ1B,IAAKC,GAAMA,EAAEC,GAAGrF,eAAe8I,KAAK,UAAUtD,IAC/E,GAAa,SAATG,EAEF,MAAO,CACL4C,EACAtG,EACG,uBAAgBmG,EAAAA,EAAe,IAAIU,KAClC,YACOD,4BAA8BrD,qBAA8BA,0DAAmEA,uBAGnI6C,GAAAA,GAAoC,YAAnBvC,EAA8B,CAExD,IAAI/D,EAAI,EACR,MAAMgH,EAASlC,EAAQ1B,IAAK6D,GAAMA,EAAE3D,IAC9B4D,EAASV,EAAahB,QAAQ,OAAQ,SAAU2B,GACpD,MAAMjI,EAAO,iBAAgB8H,EAAOhH,GAAG/B,kBAAkBkJ,QAEzD,OADAnH,IACOd,CACT,GAEA,MAAO,CACLsH,EACAtG,EAAY,uBAAgBmG,EAAAA,EAAe,IAAIU,KAAK,YAAYD,KAAOI,YAE3E,IAAWZ,GAAoC,gBAAnBvC,EAAkC,CAE5D,GAAuB,IAAnBe,EAAQ1G,OAAc,CAExB,MAAM8I,EAASnC,EACV,iBAAgBD,EAAQ,GAAGxB,GAAGrF,kBAAkBuI,QAChD,GAAEA,EAAahH,MACd,EACA,mBACgBsF,EAAQ,GAAGxB,GAAGrF,kBAAkBuI,EAAahH,MAC7D,GACC,SACKgH,EAAahH,OAAO,KAChC,MAAO,CACLgH,EACAtG,EAAY,iBAAgBmG,MAAAA,EAAAA,EAAe,IAAIU,KAAK,YAAYD,KAAOI,YAE3E,CAAO,CAEL,MACME,EHyDkCC,EAAC3D,EAAU4D,EAAaC,KACpE,MAAMC,EAAM,GACZ,GAAID,EAEF,IAAK,MAAM7H,KAAQgE,EAAS+D,SAASC,QAC/BJ,EAAYpF,SAASxC,EAAK4D,KAAKkE,EAAIvE,KAAKvD,QAI9C,IAAK,MAAM4D,KAAMgE,EACfE,EAAIvE,KAAKS,EAAS+D,SAASC,QAAQxD,KAAMb,GAAMA,EAAEC,KAAOA,IAG5D,OAAOkE,GGtEaH,CAA+B3D,EADhCoB,EAAQ1B,IAAK6D,GAAMA,EAAE3D,IAC6BI,EAASG,IAAI8D,gBACxET,EAAS,GACf,IAAIjI,EAAMuH,EAEV,IAAK,MAAOxG,EAAGN,KAAS0H,EAAQtC,UAAW,CAEzC,MAAMxB,EAAK5D,EAAK4D,GAChB,IAAIsE,EAAYlI,EAAKmI,MAEjB7H,EAAI,GAAKP,EAAa2H,EAAQpH,EAAI,GAAIN,KAAqC,IAA5BT,EAAI6I,QAAQF,KAE7DA,EAAYlI,EAAKG,IAAIkI,OAAOC,KAAK1F,YAEnC,MAAM2F,EAAWhJ,EAAI6I,QAAQF,IACtBM,EAAOC,GAAQ7I,EAAML,EAAKgJ,GACjCf,EAAOjE,KAAKiF,GACZ,MAAMhJ,EAAO,iBAAgBoE,EAAGrF,kBAAkBkK,EAAKxC,UAAU,EAAGiC,EAAUxJ,cAC9E8I,EAAOjE,KAAK/D,GACZD,EAAMkJ,EAAKhK,OAAOyJ,EAAUxJ,OAC9B,CAEA,OADA8I,EAAOjE,KAAKhE,GACL,CACLuH,EACAtG,EACG,iBAA2B,MAAXmG,EAAAA,EAAe,IAAIU,KAAK,YAAYD,KAAOI,EAAOH,KAAK,cAG9E,CACF,CACE,MAAO,CACLP,EACAtG,EAAY,iBAAgBmG,MAAAA,EAAAA,EAAe,IAAIU,KAAK,YAAYD,KAAON,YAE3E,EDtByCL,CACjCzC,EACAE,EACAkB,EACAnE,EACA8C,EACAF,EACAzC,EACAiE,EACAhB,GAEFP,EAAaC,GAAcwC,EAG3B1C,EAAYN,KAAK,CAAE,GAAEtC,KAAU8C,IAAc,IAC7CA,GAA0B,EAE1BmB,EAAY3B,KAAKiD,GAGbvB,EAAaN,EAAKG,MAAMpG,QAC1BwG,EAAY3B,KAAK,CACf4B,KAAM,OACNL,MAAOH,EAAKG,MAAMhF,MAAMmF,KAM5BJ,EAAO9D,SAAW,IACb8D,EAAO9D,SAASjB,MAAM,EAAG8E,MACzBM,KACAL,EAAO9D,SAASjB,MAAM8E,EAAM,MAI/BxD,EAAQsH,QACV1E,EAAS2E,YAAYvH,EAAQsH,OAAOhF,IAAKC,GAAMA,EAAEmC,QAAQ,IAAK,MAI9D9B,EAAS+D,SAASa,OAAOlK,QAAU,KACjC0C,EAAQyH,8BAAwBrH,EAAAJ,EAAQ0H,uBAARtH,EAAwB9C,QAAS,GACnE,CACA,MAAMqK,EEjJgB/E,KAC5B,MAAOgF,EAAQC,GAAWjF,EAASkF,mBAC7B7F,EACJ,oDAAsD4F,EAAQ5B,KAAK,IAAM,SACrE0B,EAAavI,EAAW6C,GAU9B,OAPA0F,EAAWhI,SACRoI,OAAQxE,IAAIyE,IAAAA,EAAAA,OAAoB,OAApBA,EAAKzE,EAAKuC,aAAqB,OAAXkC,EAAfA,EAAiBC,gBAAS,EAA1BD,EAA4B5G,SAAS,YAAW,GACjE8G,QAAQ,CAAC3E,EAAMrE,KACd,MAAM5D,EAAUsM,EAAOO,UAAUjJ,GAAG,GAAG/B,cACvCoG,EAAKuC,WAAavC,EAAKuC,YAAc,CAAA,EACrCvC,EAAKuC,WAAWtD,GAAK,OAASlH,CAAAA,GAE3BqM,GFmIkBS,CAAcxF,GACjC,IAAIyF,GAAgB,EAEpB,MAAMC,EAAY,CAAE,EACpBX,EAAWhI,SACRoI,OAAQxE,IAAIyE,IAAAA,gBAAAA,EAAKzE,EAAKuC,aAALkC,OAAeA,EAAfA,EAAiBC,gBAAjBD,EAAAA,EAA4B5G,SAAS,YAAW,GACjE8G,QAAS3E,IACR,MAAMjI,EAAUiI,EAAKuC,WAAWtD,GAAGhE,MAAM,KAAKE,MAAM,GAAGuH,KAAK,KAC5DqC,EAAUhN,GAAQ0J,KAAQzB,GAC1B+E,EAAUhN,GAASwK,WAAa,CAAEtD,GAAI,aAAelH,KAIzDgI,EAAMrD,EAAM,UAAW,CAACsD,EAAMC,EAAKC,KAAW8E,IAAAA,EAAAC,EAE5C,WACED,EAAAvI,EAAQ0H,uBAARa,EAAwBjL,QAAS,GAClBkL,OADmBA,EAClCjF,EAAKuC,aAAc,OAAJ0C,EAAfA,EAAiBhG,KAAjBgG,EAAqBhH,WAAWpE,WAAW,aAC3C,CAEA,UAAYqL,GAAYlF,EAAKuC,WAAWtD,GAAGhB,WAAWhD,MAAM,MACtDoH,EAAa6C,EAASC,MAGtBC,EAAgB,CACpB5E,KAAM,UACNJ,QAAS,MACTmC,WAAY,CACVmC,UAAWjI,EAAQ0H,eACnBlF,GAAK,cAAaiG,EAASxC,KAAK,UAAUL,KAE5CjG,SAAU8I,EAASnG,IAAKhH,IACtB,MAAMsN,EAAWN,EAAUhN,GAK3B,OAJAsN,EAAS9C,WAAa,CACpB+C,MAAO,eACPrG,GAAK,WAAUlH,MAAYsK,KAEtBgD,KAGXnF,EAAO9D,SAASwC,KAAKwG,EACvB,EAIG3I,EAAQyH,uBACS,MAAjBlE,EAAKI,SAAoC,QAAjBJ,EAAKI,UAC9BJ,EAAK5D,SAASrC,QAAU,GACE,SAA1BiG,EAAK5D,SAAS,GAAGoE,MACU,WAA3BR,EAAK5D,SAAS,GAAG+D,QAEjBD,EAAO9D,SAAS6D,GAAOmE,EACvBU,GAAgB,EAClB,GAGGrI,EAAQyH,sBAAyBY,GACpCpI,EAAKN,SAASwC,KAAKwF,EAEvB,CAEA,IAAImB,EAWJ,GAVAxF,EAAMrD,EAAM,UAAW,CAACsD,EAAM9E,EAAOgF,KACd,YAAjBF,EAAKI,SAAyBJ,EAAKuC,WAAWiD,gBAChDD,EAAkBvF,EAClBE,EAAO9D,SAASqJ,OAAOvK,EAAO,GAChC,GAMW,SAATqE,GAAmB7B,OAAOC,KAAKwB,GAAcpF,OAAS,EAAG,CAE3D,IAAI2L,EAAU,GACVxK,EAAQ,EACZ6E,EAAMrD,EAAM,UAAYsD,IACtB,GAAqB,QAAjBA,EAAKI,SAA+C,YAA1BJ,EAAK5D,SAAS,GAAGoE,KAAoB,CACjE,IAAImF,EAAW3F,EAAK5D,SAAS,GAC7B,GAAyB,MAArBuJ,EAASvF,QAAiB,CAE5B,MAAMwF,KAAEA,EAAI3G,GAAEA,GAAO0G,EAASpD,WAC9B,GAAIqD,EAAK/H,SAAS,OAASoB,EAAGpB,SAAS,SAAU,CAC/C,MAAMgI,EAAQD,EAAK3K,MAAM,KAAKkK,MAC9BO,EAAQ9G,KAAK,CACX4B,KAAMoF,EAAK/H,SAAS,QAAU,WAAa,WAC3CgI,UAGFF,EAASpD,WAAWqD,KAAQ,oBAAmB1K,IAC/CyK,EAASpD,WAAWtD,GAAM,sBAAqB/D,IAE/CyK,EAASvJ,SAAS,GAAG+D,MAAQjF,EAAM+C,WACnC/C,GAAS,CACX,CACF,CACF,IAGF,MAAM4K,EG5OoBC,EAAC5G,EAAc6G,EAAeT,KAE9D,MAAMU,EAAO,CACXzF,KAAM,UACNJ,QAAS,KACTmC,WAAY,GACZnG,SAAU,CAAC,CAAEoE,KAAM,OAAQL,MAAO,QAEpC,IAAI+F,EACAX,IAEFW,EAAkBX,EAAgBnJ,SAASoI,OAAO2B,GAAgB,WAAVA,EAAE3F,MAAoBX,KAAMsG,GAAqB,OAAdA,EAAE/F,UAE/F,IAAK,MAAOH,EAAK5E,KAAS2K,EAAcvF,UAAW,CACjD,MAAMD,KAAEA,EAAIqF,MAAEA,GAAUxK,EACxB,GAAa,aAATmF,EACFyF,EAAK7J,SAASwC,KAAK,CACjB4B,KAAM,UACNJ,QAAS,KACTmC,WAAY,CAAEtD,GAAK,mBAAkBgB,EAAM,KAC3C7D,SAAU,CACR,CACEoE,KAAM,UACNJ,QAAS,IACTmC,WAAY,CAAA,EACZnG,SAAU,CACRP,EAAY,SAAQsD,EAAa0G,aACjC,CACErF,KAAM,UACNJ,QAAS,IACTmC,WAAY,CACVqD,KAAO,uBAAsB3F,EAAM,IACnCmG,qBAAqB,EACrB1B,UAAW,CAAC,yBACZ2B,UAAW,mBAEbjK,SAAU,CAAC,CAAEoE,KAAM,OAAQL,MAAO,SAIxC,CAAEK,KAAM,OAAQL,MAAO,cAGtB,GAAa,aAATK,EAAqB,CAE9B,MAAM8F,EAASJ,EAAgB9J,SAASyD,KACrCsG,GAAoB,OAAdA,EAAE/F,SAAoB+F,EAAE5D,WAAWtD,KAAQ,mBAAkB4G,KAEtES,EAAO/D,WAAWtD,GAAM,mBAAkBgB,EAAM,IAClCqG,EAAOlK,SAAS,GAAGA,SAASyD,KAAMsG,GAAoB,MAAdA,EAAE/F,SAClDmC,WAAWqD,KAAQ,uBAAsB3F,EAAM,IACrDgG,EAAK7J,SAASwC,KAAK0H,EACrB,CACF,CAkBA,MAf2B,CACzB9F,KAAM,UACNJ,QAAS,UACTmC,WAAY,CAAEiD,eAAe,EAAMd,UAAW,CAAC,cAC/CtI,SAAU,CACR,CACEoE,KAAM,UACNJ,QAAS,KACTmC,WAAY,CAAEmC,UAAW,CAAC,WAAYzF,GAAI,kBAC1C7C,SAAU,CAAC,CAAEoE,KAAM,OAAQL,MAAO,eAEpC,CAAEK,KAAM,OAAQL,MAAO,MACvB8F,GAGGM,EHqK0BR,CAAmB5G,EAAcuG,EAASH,GACrE7I,EAAKN,SAASwC,KAAKkH,EACrB,MACMP,GAAiB7I,EAAKN,SAASwC,KAAK2G,EAC1C"}