decklight 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +257 -0
- package/SPEC.md +372 -0
- package/cli/bundle.mjs +388 -0
- package/cli/decklight.mjs +95 -0
- package/cli/edit.mjs +142 -0
- package/cli/init.mjs +215 -0
- package/cli/rec.mjs +538 -0
- package/dist/decklight.css +1068 -0
- package/dist/decklight.js +239 -0
- package/dist/decklight.js.map +7 -0
- package/docs/architecture.svg +94 -0
- package/docs/demo.svg +124 -0
- package/package.json +54 -0
- package/themes/README.md +61 -0
- package/themes/aliens.css +84 -0
- package/themes/apple2.css +126 -0
- package/themes/aurora.css +84 -0
- package/themes/berry.css +80 -0
- package/themes/blade-runner.css +83 -0
- package/themes/c64.css +85 -0
- package/themes/carbon.css +82 -0
- package/themes/citrus.css +80 -0
- package/themes/coastal.css +80 -0
- package/themes/cosmos.css +86 -0
- package/themes/dune.css +80 -0
- package/themes/eclipse.css +82 -0
- package/themes/ember.css +80 -0
- package/themes/fjord.css +80 -0
- package/themes/friends.css +82 -0
- package/themes/gallery.html +203 -0
- package/themes/gameboy.css +118 -0
- package/themes/genesis.css +84 -0
- package/themes/glacier.css +82 -0
- package/themes/godfather.css +82 -0
- package/themes/graphite.css +80 -0
- package/themes/harvest.css +80 -0
- package/themes/ibm-modern.css +83 -0
- package/themes/ibm-oldschool.css +84 -0
- package/themes/ink.css +82 -0
- package/themes/latte.css +80 -0
- package/themes/linen.css +80 -0
- package/themes/meadow.css +80 -0
- package/themes/metropolis.css +85 -0
- package/themes/miami-vice.css +84 -0
- package/themes/midnight.css +80 -0
- package/themes/mint.css +82 -0
- package/themes/moss.css +82 -0
- package/themes/obsidian.css +82 -0
- package/themes/orchid.css +82 -0
- package/themes/packs.json +89 -0
- package/themes/paper.css +83 -0
- package/themes/peony.css +84 -0
- package/themes/porcelain.css +82 -0
- package/themes/pulp-fiction.css +84 -0
- package/themes/reveal-beige.css +87 -0
- package/themes/reveal-black.css +83 -0
- package/themes/reveal-blood.css +84 -0
- package/themes/reveal-dracula.css +83 -0
- package/themes/reveal-league.css +88 -0
- package/themes/reveal-moon.css +83 -0
- package/themes/reveal-night.css +86 -0
- package/themes/reveal-serif.css +82 -0
- package/themes/reveal-simple.css +84 -0
- package/themes/reveal-sky.css +85 -0
- package/themes/reveal-solarized.css +83 -0
- package/themes/reveal-white.css +82 -0
- package/themes/sepia.css +81 -0
- package/themes/seriph.css +82 -0
- package/themes/severance.css +82 -0
- package/themes/slate.css +80 -0
- package/themes/snes.css +82 -0
- package/themes/star-wars.css +85 -0
- package/themes/storm.css +80 -0
- package/themes/stranger-things.css +84 -0
- package/themes/synthwave.css +90 -0
- package/themes/terminator.css +84 -0
- package/themes/velvet.css +80 -0
- package/tools/gemini-tts.mjs +140 -0
- package/tools/publish-site-voices.mjs +71 -0
- package/tools/voiceover-server.mjs +0 -0
- package/tools/voiceover.mjs +155 -0
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["<define:__DECKLIGHT_PACKS__>", "<define:__DECKLIGHT_THEMES__>", "../node_modules/highlight.js/lib/core.js", "../src/index.js", "../src/core/engine.js", "../src/core/builds.js", "../src/core/svg.js", "../src/core/autoanimate.js", "../src/md/markdown.js", "../node_modules/marked/src/defaults.ts", "../node_modules/marked/src/rules.ts", "../node_modules/marked/src/helpers.ts", "../node_modules/marked/src/Tokenizer.ts", "../node_modules/marked/src/Lexer.ts", "../node_modules/marked/src/Renderer.ts", "../node_modules/marked/src/TextRenderer.ts", "../node_modules/marked/src/Parser.ts", "../node_modules/marked/src/Hooks.ts", "../node_modules/marked/src/Instance.ts", "../node_modules/marked/src/marked.ts", "../src/code/code.js", "../node_modules/highlight.js/es/core.js", "../node_modules/highlight.js/es/languages/sql.js", "../node_modules/highlight.js/es/languages/javascript.js", "../node_modules/highlight.js/es/languages/typescript.js", "../node_modules/highlight.js/es/languages/python.js", "../node_modules/highlight.js/es/languages/bash.js", "../node_modules/highlight.js/es/languages/yaml.js", "../node_modules/highlight.js/es/languages/json.js", "../node_modules/highlight.js/es/languages/java.js", "../node_modules/highlight.js/es/languages/go.js", "../node_modules/highlight.js/es/languages/rust.js", "../node_modules/highlight.js/es/languages/xml.js", "../node_modules/highlight.js/es/languages/css.js", "../node_modules/highlight.js/es/languages/plaintext.js", "../src/core/speaker.js", "../src/core/themegen.js", "../src/terminal/player.mjs", "../src/terminal/ansi.mjs"],
|
|
4
|
+
"sourcesContent": ["", "", "/* eslint-disable no-multi-assign */\n\nfunction deepFreeze(obj) {\n if (obj instanceof Map) {\n obj.clear =\n obj.delete =\n obj.set =\n function () {\n throw new Error('map is read-only');\n };\n } else if (obj instanceof Set) {\n obj.add =\n obj.clear =\n obj.delete =\n function () {\n throw new Error('set is read-only');\n };\n }\n\n // Freeze self\n Object.freeze(obj);\n\n Object.getOwnPropertyNames(obj).forEach((name) => {\n const prop = obj[name];\n const type = typeof prop;\n\n // Freeze prop if it is an object or function and also not already frozen\n if ((type === 'object' || type === 'function') && !Object.isFrozen(prop)) {\n deepFreeze(prop);\n }\n });\n\n return obj;\n}\n\n/** @typedef {import('highlight.js').CallbackResponse} CallbackResponse */\n/** @typedef {import('highlight.js').CompiledMode} CompiledMode */\n/** @implements CallbackResponse */\n\nclass Response {\n /**\n * @param {CompiledMode} mode\n */\n constructor(mode) {\n // eslint-disable-next-line no-undefined\n if (mode.data === undefined) mode.data = {};\n\n this.data = mode.data;\n this.isMatchIgnored = false;\n }\n\n ignoreMatch() {\n this.isMatchIgnored = true;\n }\n}\n\n/**\n * @param {string} value\n * @returns {string}\n */\nfunction escapeHTML(value) {\n return value\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''');\n}\n\n/**\n * performs a shallow merge of multiple objects into one\n *\n * @template T\n * @param {T} original\n * @param {Record<string,any>[]} objects\n * @returns {T} a single new object\n */\nfunction inherit$1(original, ...objects) {\n /** @type Record<string,any> */\n const result = Object.create(null);\n\n for (const key in original) {\n result[key] = original[key];\n }\n objects.forEach(function(obj) {\n for (const key in obj) {\n result[key] = obj[key];\n }\n });\n return /** @type {T} */ (result);\n}\n\n/**\n * @typedef {object} Renderer\n * @property {(text: string) => void} addText\n * @property {(node: Node) => void} openNode\n * @property {(node: Node) => void} closeNode\n * @property {() => string} value\n */\n\n/** @typedef {{scope?: string, language?: string, sublanguage?: boolean}} Node */\n/** @typedef {{walk: (r: Renderer) => void}} Tree */\n/** */\n\nconst SPAN_CLOSE = '</span>';\n\n/**\n * Determines if a node needs to be wrapped in <span>\n *\n * @param {Node} node */\nconst emitsWrappingTags = (node) => {\n // rarely we can have a sublanguage where language is undefined\n // TODO: track down why\n return !!node.scope;\n};\n\n/**\n *\n * @param {string} name\n * @param {{prefix:string}} options\n */\nconst scopeToCSSClass = (name, { prefix }) => {\n // sub-language\n if (name.startsWith(\"language:\")) {\n return name.replace(\"language:\", \"language-\");\n }\n // tiered scope: comment.line\n if (name.includes(\".\")) {\n const pieces = name.split(\".\");\n return [\n `${prefix}${pieces.shift()}`,\n ...(pieces.map((x, i) => `${x}${\"_\".repeat(i + 1)}`))\n ].join(\" \");\n }\n // simple scope\n return `${prefix}${name}`;\n};\n\n/** @type {Renderer} */\nclass HTMLRenderer {\n /**\n * Creates a new HTMLRenderer\n *\n * @param {Tree} parseTree - the parse tree (must support `walk` API)\n * @param {{classPrefix: string}} options\n */\n constructor(parseTree, options) {\n this.buffer = \"\";\n this.classPrefix = options.classPrefix;\n parseTree.walk(this);\n }\n\n /**\n * Adds texts to the output stream\n *\n * @param {string} text */\n addText(text) {\n this.buffer += escapeHTML(text);\n }\n\n /**\n * Adds a node open to the output stream (if needed)\n *\n * @param {Node} node */\n openNode(node) {\n if (!emitsWrappingTags(node)) return;\n\n const className = scopeToCSSClass(node.scope,\n { prefix: this.classPrefix });\n this.span(className);\n }\n\n /**\n * Adds a node close to the output stream (if needed)\n *\n * @param {Node} node */\n closeNode(node) {\n if (!emitsWrappingTags(node)) return;\n\n this.buffer += SPAN_CLOSE;\n }\n\n /**\n * returns the accumulated buffer\n */\n value() {\n return this.buffer;\n }\n\n // helpers\n\n /**\n * Builds a span element\n *\n * @param {string} className */\n span(className) {\n this.buffer += `<span class=\"${className}\">`;\n }\n}\n\n/** @typedef {{scope?: string, language?: string, children: Node[]} | string} Node */\n/** @typedef {{scope?: string, language?: string, children: Node[]} } DataNode */\n/** @typedef {import('highlight.js').Emitter} Emitter */\n/** */\n\n/** @returns {DataNode} */\nconst newNode = (opts = {}) => {\n /** @type DataNode */\n const result = { children: [] };\n Object.assign(result, opts);\n return result;\n};\n\nclass TokenTree {\n constructor() {\n /** @type DataNode */\n this.rootNode = newNode();\n this.stack = [this.rootNode];\n }\n\n get top() {\n return this.stack[this.stack.length - 1];\n }\n\n get root() { return this.rootNode; }\n\n /** @param {Node} node */\n add(node) {\n this.top.children.push(node);\n }\n\n /** @param {string} scope */\n openNode(scope) {\n /** @type Node */\n const node = newNode({ scope });\n this.add(node);\n this.stack.push(node);\n }\n\n closeNode() {\n if (this.stack.length > 1) {\n return this.stack.pop();\n }\n // eslint-disable-next-line no-undefined\n return undefined;\n }\n\n closeAllNodes() {\n while (this.closeNode());\n }\n\n toJSON() {\n return JSON.stringify(this.rootNode, null, 4);\n }\n\n /**\n * @typedef { import(\"./html_renderer\").Renderer } Renderer\n * @param {Renderer} builder\n */\n walk(builder) {\n // this does not\n return this.constructor._walk(builder, this.rootNode);\n // this works\n // return TokenTree._walk(builder, this.rootNode);\n }\n\n /**\n * @param {Renderer} builder\n * @param {Node} node\n */\n static _walk(builder, node) {\n if (typeof node === \"string\") {\n builder.addText(node);\n } else if (node.children) {\n builder.openNode(node);\n node.children.forEach((child) => this._walk(builder, child));\n builder.closeNode(node);\n }\n return builder;\n }\n\n /**\n * @param {Node} node\n */\n static _collapse(node) {\n if (typeof node === \"string\") return;\n if (!node.children) return;\n\n if (node.children.every(el => typeof el === \"string\")) {\n // node.text = node.children.join(\"\");\n // delete node.children;\n node.children = [node.children.join(\"\")];\n } else {\n node.children.forEach((child) => {\n TokenTree._collapse(child);\n });\n }\n }\n}\n\n/**\n Currently this is all private API, but this is the minimal API necessary\n that an Emitter must implement to fully support the parser.\n\n Minimal interface:\n\n - addText(text)\n - __addSublanguage(emitter, subLanguageName)\n - startScope(scope)\n - endScope()\n - finalize()\n - toHTML()\n\n*/\n\n/**\n * @implements {Emitter}\n */\nclass TokenTreeEmitter extends TokenTree {\n /**\n * @param {*} options\n */\n constructor(options) {\n super();\n this.options = options;\n }\n\n /**\n * @param {string} text\n */\n addText(text) {\n if (text === \"\") { return; }\n\n this.add(text);\n }\n\n /** @param {string} scope */\n startScope(scope) {\n this.openNode(scope);\n }\n\n endScope() {\n this.closeNode();\n }\n\n /**\n * @param {Emitter & {root: DataNode}} emitter\n * @param {string} name\n */\n __addSublanguage(emitter, name) {\n /** @type DataNode */\n const node = emitter.root;\n if (name) node.scope = `language:${name}`;\n\n this.add(node);\n }\n\n toHTML() {\n const renderer = new HTMLRenderer(this, this.options);\n return renderer.value();\n }\n\n finalize() {\n this.closeAllNodes();\n return true;\n }\n}\n\n/**\n * @param {string} value\n * @returns {RegExp}\n * */\n\n/**\n * @param {RegExp | string } re\n * @returns {string}\n */\nfunction source(re) {\n if (!re) return null;\n if (typeof re === \"string\") return re;\n\n return re.source;\n}\n\n/**\n * @param {RegExp | string } re\n * @returns {string}\n */\nfunction lookahead(re) {\n return concat('(?=', re, ')');\n}\n\n/**\n * @param {RegExp | string } re\n * @returns {string}\n */\nfunction anyNumberOfTimes(re) {\n return concat('(?:', re, ')*');\n}\n\n/**\n * @param {RegExp | string } re\n * @returns {string}\n */\nfunction optional(re) {\n return concat('(?:', re, ')?');\n}\n\n/**\n * @param {...(RegExp | string) } args\n * @returns {string}\n */\nfunction concat(...args) {\n const joined = args.map((x) => source(x)).join(\"\");\n return joined;\n}\n\n/**\n * @param { Array<string | RegExp | Object> } args\n * @returns {object}\n */\nfunction stripOptionsFromArgs(args) {\n const opts = args[args.length - 1];\n\n if (typeof opts === 'object' && opts.constructor === Object) {\n args.splice(args.length - 1, 1);\n return opts;\n } else {\n return {};\n }\n}\n\n/** @typedef { {capture?: boolean} } RegexEitherOptions */\n\n/**\n * Any of the passed expresssions may match\n *\n * Creates a huge this | this | that | that match\n * @param {(RegExp | string)[] | [...(RegExp | string)[], RegexEitherOptions]} args\n * @returns {string}\n */\nfunction either(...args) {\n /** @type { object & {capture?: boolean} } */\n const opts = stripOptionsFromArgs(args);\n const joined = '('\n + (opts.capture ? \"\" : \"?:\")\n + args.map((x) => source(x)).join(\"|\") + \")\";\n return joined;\n}\n\n/**\n * @param {RegExp | string} re\n * @returns {number}\n */\nfunction countMatchGroups(re) {\n return (new RegExp(re.toString() + '|')).exec('').length - 1;\n}\n\n/**\n * Does lexeme start with a regular expression match at the beginning\n * @param {RegExp} re\n * @param {string} lexeme\n */\nfunction startsWith(re, lexeme) {\n const match = re && re.exec(lexeme);\n return match && match.index === 0;\n}\n\n// BACKREF_RE matches an open parenthesis or backreference. To avoid\n// an incorrect parse, it additionally matches the following:\n// - [...] elements, where the meaning of parentheses and escapes change\n// - other escape sequences, so we do not misparse escape sequences as\n// interesting elements\n// - non-matching or lookahead parentheses, which do not capture. These\n// follow the '(' with a '?'.\nconst BACKREF_RE = /\\[(?:[^\\\\\\]]|\\\\.)*\\]|\\(\\??|\\\\([1-9][0-9]*)|\\\\./;\n\n// **INTERNAL** Not intended for outside usage\n// join logically computes regexps.join(separator), but fixes the\n// backreferences so they continue to match.\n// it also places each individual regular expression into it's own\n// match group, keeping track of the sequencing of those match groups\n// is currently an exercise for the caller. :-)\n/**\n * @param {(string | RegExp)[]} regexps\n * @param {{joinWith: string}} opts\n * @returns {string}\n */\nfunction _rewriteBackreferences(regexps, { joinWith }) {\n let numCaptures = 0;\n\n return regexps.map((regex) => {\n numCaptures += 1;\n const offset = numCaptures;\n let re = source(regex);\n let out = '';\n\n while (re.length > 0) {\n const match = BACKREF_RE.exec(re);\n if (!match) {\n out += re;\n break;\n }\n out += re.substring(0, match.index);\n re = re.substring(match.index + match[0].length);\n if (match[0][0] === '\\\\' && match[1]) {\n // Adjust the backreference.\n out += '\\\\' + String(Number(match[1]) + offset);\n } else {\n out += match[0];\n if (match[0] === '(') {\n numCaptures++;\n }\n }\n }\n return out;\n }).map(re => `(${re})`).join(joinWith);\n}\n\n/** @typedef {import('highlight.js').Mode} Mode */\n/** @typedef {import('highlight.js').ModeCallback} ModeCallback */\n\n// Common regexps\nconst MATCH_NOTHING_RE = /\\b\\B/;\nconst IDENT_RE = '[a-zA-Z]\\\\w*';\nconst UNDERSCORE_IDENT_RE = '[a-zA-Z_]\\\\w*';\nconst NUMBER_RE = '\\\\b\\\\d+(\\\\.\\\\d+)?';\nconst C_NUMBER_RE = '(-?)(\\\\b0[xX][a-fA-F0-9]+|(\\\\b\\\\d+(\\\\.\\\\d*)?|\\\\.\\\\d+)([eE][-+]?\\\\d+)?)'; // 0x..., 0..., decimal, float\nconst BINARY_NUMBER_RE = '\\\\b(0b[01]+)'; // 0b...\nconst RE_STARTERS_RE = '!|!=|!==|%|%=|&|&&|&=|\\\\*|\\\\*=|\\\\+|\\\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\\\?|\\\\[|\\\\{|\\\\(|\\\\^|\\\\^=|\\\\||\\\\|=|\\\\|\\\\||~';\n\n/**\n* @param { Partial<Mode> & {binary?: string | RegExp} } opts\n*/\nconst SHEBANG = (opts = {}) => {\n const beginShebang = /^#![ ]*\\//;\n if (opts.binary) {\n opts.begin = concat(\n beginShebang,\n /.*\\b/,\n opts.binary,\n /\\b.*/);\n }\n return inherit$1({\n scope: 'meta',\n begin: beginShebang,\n end: /$/,\n relevance: 0,\n /** @type {ModeCallback} */\n \"on:begin\": (m, resp) => {\n if (m.index !== 0) resp.ignoreMatch();\n }\n }, opts);\n};\n\n// Common modes\nconst BACKSLASH_ESCAPE = {\n begin: '\\\\\\\\[\\\\s\\\\S]', relevance: 0\n};\nconst APOS_STRING_MODE = {\n scope: 'string',\n begin: '\\'',\n end: '\\'',\n illegal: '\\\\n',\n contains: [BACKSLASH_ESCAPE]\n};\nconst QUOTE_STRING_MODE = {\n scope: 'string',\n begin: '\"',\n end: '\"',\n illegal: '\\\\n',\n contains: [BACKSLASH_ESCAPE]\n};\nconst PHRASAL_WORDS_MODE = {\n begin: /\\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|they|like|more)\\b/\n};\n/**\n * Creates a comment mode\n *\n * @param {string | RegExp} begin\n * @param {string | RegExp} end\n * @param {Mode | {}} [modeOptions]\n * @returns {Partial<Mode>}\n */\nconst COMMENT = function(begin, end, modeOptions = {}) {\n const mode = inherit$1(\n {\n scope: 'comment',\n begin,\n end,\n contains: []\n },\n modeOptions\n );\n mode.contains.push({\n scope: 'doctag',\n // hack to avoid the space from being included. the space is necessary to\n // match here to prevent the plain text rule below from gobbling up doctags\n begin: '[ ]*(?=(TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):)',\n end: /(TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):/,\n excludeBegin: true,\n relevance: 0\n });\n const ENGLISH_WORD = either(\n // list of common 1 and 2 letter words in English\n \"I\",\n \"a\",\n \"is\",\n \"so\",\n \"us\",\n \"to\",\n \"at\",\n \"if\",\n \"in\",\n \"it\",\n \"on\",\n // note: this is not an exhaustive list of contractions, just popular ones\n /[A-Za-z]+['](d|ve|re|ll|t|s|n)/, // contractions - can't we'd they're let's, etc\n /[A-Za-z]+[-][a-z]+/, // `no-way`, etc.\n /[A-Za-z][a-z]{2,}/ // allow capitalized words at beginning of sentences\n );\n // looking like plain text, more likely to be a comment\n mode.contains.push(\n {\n // TODO: how to include \", (, ) without breaking grammars that use these for\n // comment delimiters?\n // begin: /[ ]+([()\"]?([A-Za-z'-]{3,}|is|a|I|so|us|[tT][oO]|at|if|in|it|on)[.]?[()\":]?([.][ ]|[ ]|\\))){3}/\n // ---\n\n // this tries to find sequences of 3 english words in a row (without any\n // \"programming\" type syntax) this gives us a strong signal that we've\n // TRULY found a comment - vs perhaps scanning with the wrong language.\n // It's possible to find something that LOOKS like the start of the\n // comment - but then if there is no readable text - good chance it is a\n // false match and not a comment.\n //\n // for a visual example please see:\n // https://github.com/highlightjs/highlight.js/issues/2827\n\n begin: concat(\n /[ ]+/, // necessary to prevent us gobbling up doctags like /* @author Bob Mcgill */\n '(',\n ENGLISH_WORD,\n /[.]?[:]?([.][ ]|[ ])/,\n '){3}') // look for 3 words in a row\n }\n );\n return mode;\n};\nconst C_LINE_COMMENT_MODE = COMMENT('//', '$');\nconst C_BLOCK_COMMENT_MODE = COMMENT('/\\\\*', '\\\\*/');\nconst HASH_COMMENT_MODE = COMMENT('#', '$');\nconst NUMBER_MODE = {\n scope: 'number',\n begin: NUMBER_RE,\n relevance: 0\n};\nconst C_NUMBER_MODE = {\n scope: 'number',\n begin: C_NUMBER_RE,\n relevance: 0\n};\nconst BINARY_NUMBER_MODE = {\n scope: 'number',\n begin: BINARY_NUMBER_RE,\n relevance: 0\n};\nconst REGEXP_MODE = {\n scope: \"regexp\",\n begin: /\\/(?=[^/\\n]*\\/)/,\n end: /\\/[gimuy]*/,\n contains: [\n BACKSLASH_ESCAPE,\n {\n begin: /\\[/,\n end: /\\]/,\n relevance: 0,\n contains: [BACKSLASH_ESCAPE]\n }\n ]\n};\nconst TITLE_MODE = {\n scope: 'title',\n begin: IDENT_RE,\n relevance: 0\n};\nconst UNDERSCORE_TITLE_MODE = {\n scope: 'title',\n begin: UNDERSCORE_IDENT_RE,\n relevance: 0\n};\nconst METHOD_GUARD = {\n // excludes method names from keyword processing\n begin: '\\\\.\\\\s*' + UNDERSCORE_IDENT_RE,\n relevance: 0\n};\n\n/**\n * Adds end same as begin mechanics to a mode\n *\n * Your mode must include at least a single () match group as that first match\n * group is what is used for comparison\n * @param {Partial<Mode>} mode\n */\nconst END_SAME_AS_BEGIN = function(mode) {\n return Object.assign(mode,\n {\n /** @type {ModeCallback} */\n 'on:begin': (m, resp) => { resp.data._beginMatch = m[1]; },\n /** @type {ModeCallback} */\n 'on:end': (m, resp) => { if (resp.data._beginMatch !== m[1]) resp.ignoreMatch(); }\n });\n};\n\nvar MODES = /*#__PURE__*/Object.freeze({\n __proto__: null,\n APOS_STRING_MODE: APOS_STRING_MODE,\n BACKSLASH_ESCAPE: BACKSLASH_ESCAPE,\n BINARY_NUMBER_MODE: BINARY_NUMBER_MODE,\n BINARY_NUMBER_RE: BINARY_NUMBER_RE,\n COMMENT: COMMENT,\n C_BLOCK_COMMENT_MODE: C_BLOCK_COMMENT_MODE,\n C_LINE_COMMENT_MODE: C_LINE_COMMENT_MODE,\n C_NUMBER_MODE: C_NUMBER_MODE,\n C_NUMBER_RE: C_NUMBER_RE,\n END_SAME_AS_BEGIN: END_SAME_AS_BEGIN,\n HASH_COMMENT_MODE: HASH_COMMENT_MODE,\n IDENT_RE: IDENT_RE,\n MATCH_NOTHING_RE: MATCH_NOTHING_RE,\n METHOD_GUARD: METHOD_GUARD,\n NUMBER_MODE: NUMBER_MODE,\n NUMBER_RE: NUMBER_RE,\n PHRASAL_WORDS_MODE: PHRASAL_WORDS_MODE,\n QUOTE_STRING_MODE: QUOTE_STRING_MODE,\n REGEXP_MODE: REGEXP_MODE,\n RE_STARTERS_RE: RE_STARTERS_RE,\n SHEBANG: SHEBANG,\n TITLE_MODE: TITLE_MODE,\n UNDERSCORE_IDENT_RE: UNDERSCORE_IDENT_RE,\n UNDERSCORE_TITLE_MODE: UNDERSCORE_TITLE_MODE\n});\n\n/**\n@typedef {import('highlight.js').CallbackResponse} CallbackResponse\n@typedef {import('highlight.js').CompilerExt} CompilerExt\n*/\n\n// Grammar extensions / plugins\n// See: https://github.com/highlightjs/highlight.js/issues/2833\n\n// Grammar extensions allow \"syntactic sugar\" to be added to the grammar modes\n// without requiring any underlying changes to the compiler internals.\n\n// `compileMatch` being the perfect small example of now allowing a grammar\n// author to write `match` when they desire to match a single expression rather\n// than being forced to use `begin`. The extension then just moves `match` into\n// `begin` when it runs. Ie, no features have been added, but we've just made\n// the experience of writing (and reading grammars) a little bit nicer.\n\n// ------\n\n// TODO: We need negative look-behind support to do this properly\n/**\n * Skip a match if it has a preceding dot\n *\n * This is used for `beginKeywords` to prevent matching expressions such as\n * `bob.keyword.do()`. The mode compiler automatically wires this up as a\n * special _internal_ 'on:begin' callback for modes with `beginKeywords`\n * @param {RegExpMatchArray} match\n * @param {CallbackResponse} response\n */\nfunction skipIfHasPrecedingDot(match, response) {\n const before = match.input[match.index - 1];\n if (before === \".\") {\n response.ignoreMatch();\n }\n}\n\n/**\n *\n * @type {CompilerExt}\n */\nfunction scopeClassName(mode, _parent) {\n // eslint-disable-next-line no-undefined\n if (mode.className !== undefined) {\n mode.scope = mode.className;\n delete mode.className;\n }\n}\n\n/**\n * `beginKeywords` syntactic sugar\n * @type {CompilerExt}\n */\nfunction beginKeywords(mode, parent) {\n if (!parent) return;\n if (!mode.beginKeywords) return;\n\n // for languages with keywords that include non-word characters checking for\n // a word boundary is not sufficient, so instead we check for a word boundary\n // or whitespace - this does no harm in any case since our keyword engine\n // doesn't allow spaces in keywords anyways and we still check for the boundary\n // first\n mode.begin = '\\\\b(' + mode.beginKeywords.split(' ').join('|') + ')(?!\\\\.)(?=\\\\b|\\\\s)';\n mode.__beforeBegin = skipIfHasPrecedingDot;\n mode.keywords = mode.keywords || mode.beginKeywords;\n delete mode.beginKeywords;\n\n // prevents double relevance, the keywords themselves provide\n // relevance, the mode doesn't need to double it\n // eslint-disable-next-line no-undefined\n if (mode.relevance === undefined) mode.relevance = 0;\n}\n\n/**\n * Allow `illegal` to contain an array of illegal values\n * @type {CompilerExt}\n */\nfunction compileIllegal(mode, _parent) {\n if (!Array.isArray(mode.illegal)) return;\n\n mode.illegal = either(...mode.illegal);\n}\n\n/**\n * `match` to match a single expression for readability\n * @type {CompilerExt}\n */\nfunction compileMatch(mode, _parent) {\n if (!mode.match) return;\n if (mode.begin || mode.end) throw new Error(\"begin & end are not supported with match\");\n\n mode.begin = mode.match;\n delete mode.match;\n}\n\n/**\n * provides the default 1 relevance to all modes\n * @type {CompilerExt}\n */\nfunction compileRelevance(mode, _parent) {\n // eslint-disable-next-line no-undefined\n if (mode.relevance === undefined) mode.relevance = 1;\n}\n\n// allow beforeMatch to act as a \"qualifier\" for the match\n// the full match begin must be [beforeMatch][begin]\nconst beforeMatchExt = (mode, parent) => {\n if (!mode.beforeMatch) return;\n // starts conflicts with endsParent which we need to make sure the child\n // rule is not matched multiple times\n if (mode.starts) throw new Error(\"beforeMatch cannot be used with starts\");\n\n const originalMode = Object.assign({}, mode);\n Object.keys(mode).forEach((key) => { delete mode[key]; });\n\n mode.keywords = originalMode.keywords;\n mode.begin = concat(originalMode.beforeMatch, lookahead(originalMode.begin));\n mode.starts = {\n relevance: 0,\n contains: [\n Object.assign(originalMode, { endsParent: true })\n ]\n };\n mode.relevance = 0;\n\n delete originalMode.beforeMatch;\n};\n\n// keywords that should have no default relevance value\nconst COMMON_KEYWORDS = [\n 'of',\n 'and',\n 'for',\n 'in',\n 'not',\n 'or',\n 'if',\n 'then',\n 'parent', // common variable name\n 'list', // common variable name\n 'value' // common variable name\n];\n\nconst DEFAULT_KEYWORD_SCOPE = \"keyword\";\n\n/**\n * Given raw keywords from a language definition, compile them.\n *\n * @param {string | Record<string,string|string[]> | Array<string>} rawKeywords\n * @param {boolean} caseInsensitive\n */\nfunction compileKeywords(rawKeywords, caseInsensitive, scopeName = DEFAULT_KEYWORD_SCOPE) {\n /** @type {import(\"highlight.js/private\").KeywordDict} */\n const compiledKeywords = Object.create(null);\n\n // input can be a string of keywords, an array of keywords, or a object with\n // named keys representing scopeName (which can then point to a string or array)\n if (typeof rawKeywords === 'string') {\n compileList(scopeName, rawKeywords.split(\" \"));\n } else if (Array.isArray(rawKeywords)) {\n compileList(scopeName, rawKeywords);\n } else {\n Object.keys(rawKeywords).forEach(function(scopeName) {\n // collapse all our objects back into the parent object\n Object.assign(\n compiledKeywords,\n compileKeywords(rawKeywords[scopeName], caseInsensitive, scopeName)\n );\n });\n }\n return compiledKeywords;\n\n // ---\n\n /**\n * Compiles an individual list of keywords\n *\n * Ex: \"for if when while|5\"\n *\n * @param {string} scopeName\n * @param {Array<string>} keywordList\n */\n function compileList(scopeName, keywordList) {\n if (caseInsensitive) {\n keywordList = keywordList.map(x => x.toLowerCase());\n }\n keywordList.forEach(function(keyword) {\n const pair = keyword.split('|');\n compiledKeywords[pair[0]] = [scopeName, scoreForKeyword(pair[0], pair[1])];\n });\n }\n}\n\n/**\n * Returns the proper score for a given keyword\n *\n * Also takes into account comment keywords, which will be scored 0 UNLESS\n * another score has been manually assigned.\n * @param {string} keyword\n * @param {string} [providedScore]\n */\nfunction scoreForKeyword(keyword, providedScore) {\n // manual scores always win over common keywords\n // so you can force a score of 1 if you really insist\n if (providedScore) {\n return Number(providedScore);\n }\n\n return commonKeyword(keyword) ? 0 : 1;\n}\n\n/**\n * Determines if a given keyword is common or not\n *\n * @param {string} keyword */\nfunction commonKeyword(keyword) {\n return COMMON_KEYWORDS.includes(keyword.toLowerCase());\n}\n\n/*\n\nFor the reasoning behind this please see:\nhttps://github.com/highlightjs/highlight.js/issues/2880#issuecomment-747275419\n\n*/\n\n/**\n * @type {Record<string, boolean>}\n */\nconst seenDeprecations = {};\n\n/**\n * @param {string} message\n */\nconst error = (message) => {\n console.error(message);\n};\n\n/**\n * @param {string} message\n * @param {any} args\n */\nconst warn = (message, ...args) => {\n console.log(`WARN: ${message}`, ...args);\n};\n\n/**\n * @param {string} version\n * @param {string} message\n */\nconst deprecated = (version, message) => {\n if (seenDeprecations[`${version}/${message}`]) return;\n\n console.log(`Deprecated as of ${version}. ${message}`);\n seenDeprecations[`${version}/${message}`] = true;\n};\n\n/* eslint-disable no-throw-literal */\n\n/**\n@typedef {import('highlight.js').CompiledMode} CompiledMode\n*/\n\nconst MultiClassError = new Error();\n\n/**\n * Renumbers labeled scope names to account for additional inner match\n * groups that otherwise would break everything.\n *\n * Lets say we 3 match scopes:\n *\n * { 1 => ..., 2 => ..., 3 => ... }\n *\n * So what we need is a clean match like this:\n *\n * (a)(b)(c) => [ \"a\", \"b\", \"c\" ]\n *\n * But this falls apart with inner match groups:\n *\n * (a)(((b)))(c) => [\"a\", \"b\", \"b\", \"b\", \"c\" ]\n *\n * Our scopes are now \"out of alignment\" and we're repeating `b` 3 times.\n * What needs to happen is the numbers are remapped:\n *\n * { 1 => ..., 2 => ..., 5 => ... }\n *\n * We also need to know that the ONLY groups that should be output\n * are 1, 2, and 5. This function handles this behavior.\n *\n * @param {CompiledMode} mode\n * @param {Array<RegExp | string>} regexes\n * @param {{key: \"beginScope\"|\"endScope\"}} opts\n */\nfunction remapScopeNames(mode, regexes, { key }) {\n let offset = 0;\n const scopeNames = mode[key];\n /** @type Record<number,boolean> */\n const emit = {};\n /** @type Record<number,string> */\n const positions = {};\n\n for (let i = 1; i <= regexes.length; i++) {\n positions[i + offset] = scopeNames[i];\n emit[i + offset] = true;\n offset += countMatchGroups(regexes[i - 1]);\n }\n // we use _emit to keep track of which match groups are \"top-level\" to avoid double\n // output from inside match groups\n mode[key] = positions;\n mode[key]._emit = emit;\n mode[key]._multi = true;\n}\n\n/**\n * @param {CompiledMode} mode\n */\nfunction beginMultiClass(mode) {\n if (!Array.isArray(mode.begin)) return;\n\n if (mode.skip || mode.excludeBegin || mode.returnBegin) {\n error(\"skip, excludeBegin, returnBegin not compatible with beginScope: {}\");\n throw MultiClassError;\n }\n\n if (typeof mode.beginScope !== \"object\" || mode.beginScope === null) {\n error(\"beginScope must be object\");\n throw MultiClassError;\n }\n\n remapScopeNames(mode, mode.begin, { key: \"beginScope\" });\n mode.begin = _rewriteBackreferences(mode.begin, { joinWith: \"\" });\n}\n\n/**\n * @param {CompiledMode} mode\n */\nfunction endMultiClass(mode) {\n if (!Array.isArray(mode.end)) return;\n\n if (mode.skip || mode.excludeEnd || mode.returnEnd) {\n error(\"skip, excludeEnd, returnEnd not compatible with endScope: {}\");\n throw MultiClassError;\n }\n\n if (typeof mode.endScope !== \"object\" || mode.endScope === null) {\n error(\"endScope must be object\");\n throw MultiClassError;\n }\n\n remapScopeNames(mode, mode.end, { key: \"endScope\" });\n mode.end = _rewriteBackreferences(mode.end, { joinWith: \"\" });\n}\n\n/**\n * this exists only to allow `scope: {}` to be used beside `match:`\n * Otherwise `beginScope` would necessary and that would look weird\n\n {\n match: [ /def/, /\\w+/ ]\n scope: { 1: \"keyword\" , 2: \"title\" }\n }\n\n * @param {CompiledMode} mode\n */\nfunction scopeSugar(mode) {\n if (mode.scope && typeof mode.scope === \"object\" && mode.scope !== null) {\n mode.beginScope = mode.scope;\n delete mode.scope;\n }\n}\n\n/**\n * @param {CompiledMode} mode\n */\nfunction MultiClass(mode) {\n scopeSugar(mode);\n\n if (typeof mode.beginScope === \"string\") {\n mode.beginScope = { _wrap: mode.beginScope };\n }\n if (typeof mode.endScope === \"string\") {\n mode.endScope = { _wrap: mode.endScope };\n }\n\n beginMultiClass(mode);\n endMultiClass(mode);\n}\n\n/**\n@typedef {import('highlight.js').Mode} Mode\n@typedef {import('highlight.js').CompiledMode} CompiledMode\n@typedef {import('highlight.js').Language} Language\n@typedef {import('highlight.js').HLJSPlugin} HLJSPlugin\n@typedef {import('highlight.js').CompiledLanguage} CompiledLanguage\n*/\n\n// compilation\n\n/**\n * Compiles a language definition result\n *\n * Given the raw result of a language definition (Language), compiles this so\n * that it is ready for highlighting code.\n * @param {Language} language\n * @returns {CompiledLanguage}\n */\nfunction compileLanguage(language) {\n /**\n * Builds a regex with the case sensitivity of the current language\n *\n * @param {RegExp | string} value\n * @param {boolean} [global]\n */\n function langRe(value, global) {\n return new RegExp(\n source(value),\n 'm'\n + (language.case_insensitive ? 'i' : '')\n + (language.unicodeRegex ? 'u' : '')\n + (global ? 'g' : '')\n );\n }\n\n /**\n Stores multiple regular expressions and allows you to quickly search for\n them all in a string simultaneously - returning the first match. It does\n this by creating a huge (a|b|c) regex - each individual item wrapped with ()\n and joined by `|` - using match groups to track position. When a match is\n found checking which position in the array has content allows us to figure\n out which of the original regexes / match groups triggered the match.\n\n The match object itself (the result of `Regex.exec`) is returned but also\n enhanced by merging in any meta-data that was registered with the regex.\n This is how we keep track of which mode matched, and what type of rule\n (`illegal`, `begin`, end, etc).\n */\n class MultiRegex {\n constructor() {\n this.matchIndexes = {};\n // @ts-ignore\n this.regexes = [];\n this.matchAt = 1;\n this.position = 0;\n }\n\n // @ts-ignore\n addRule(re, opts) {\n opts.position = this.position++;\n // @ts-ignore\n this.matchIndexes[this.matchAt] = opts;\n this.regexes.push([opts, re]);\n this.matchAt += countMatchGroups(re) + 1;\n }\n\n compile() {\n if (this.regexes.length === 0) {\n // avoids the need to check length every time exec is called\n // @ts-ignore\n this.exec = () => null;\n }\n const terminators = this.regexes.map(el => el[1]);\n this.matcherRe = langRe(_rewriteBackreferences(terminators, { joinWith: '|' }), true);\n this.lastIndex = 0;\n }\n\n /** @param {string} s */\n exec(s) {\n this.matcherRe.lastIndex = this.lastIndex;\n const match = this.matcherRe.exec(s);\n if (!match) { return null; }\n\n // eslint-disable-next-line no-undefined\n const i = match.findIndex((el, i) => i > 0 && el !== undefined);\n // @ts-ignore\n const matchData = this.matchIndexes[i];\n // trim off any earlier non-relevant match groups (ie, the other regex\n // match groups that make up the multi-matcher)\n match.splice(0, i);\n\n return Object.assign(match, matchData);\n }\n }\n\n /*\n Created to solve the key deficiently with MultiRegex - there is no way to\n test for multiple matches at a single location. Why would we need to do\n that? In the future a more dynamic engine will allow certain matches to be\n ignored. An example: if we matched say the 3rd regex in a large group but\n decided to ignore it - we'd need to started testing again at the 4th\n regex... but MultiRegex itself gives us no real way to do that.\n\n So what this class creates MultiRegexs on the fly for whatever search\n position they are needed.\n\n NOTE: These additional MultiRegex objects are created dynamically. For most\n grammars most of the time we will never actually need anything more than the\n first MultiRegex - so this shouldn't have too much overhead.\n\n Say this is our search group, and we match regex3, but wish to ignore it.\n\n regex1 | regex2 | regex3 | regex4 | regex5 ' ie, startAt = 0\n\n What we need is a new MultiRegex that only includes the remaining\n possibilities:\n\n regex4 | regex5 ' ie, startAt = 3\n\n This class wraps all that complexity up in a simple API... `startAt` decides\n where in the array of expressions to start doing the matching. It\n auto-increments, so if a match is found at position 2, then startAt will be\n set to 3. If the end is reached startAt will return to 0.\n\n MOST of the time the parser will be setting startAt manually to 0.\n */\n class ResumableMultiRegex {\n constructor() {\n // @ts-ignore\n this.rules = [];\n // @ts-ignore\n this.multiRegexes = [];\n this.count = 0;\n\n this.lastIndex = 0;\n this.regexIndex = 0;\n }\n\n // @ts-ignore\n getMatcher(index) {\n if (this.multiRegexes[index]) return this.multiRegexes[index];\n\n const matcher = new MultiRegex();\n this.rules.slice(index).forEach(([re, opts]) => matcher.addRule(re, opts));\n matcher.compile();\n this.multiRegexes[index] = matcher;\n return matcher;\n }\n\n resumingScanAtSamePosition() {\n return this.regexIndex !== 0;\n }\n\n considerAll() {\n this.regexIndex = 0;\n }\n\n // @ts-ignore\n addRule(re, opts) {\n this.rules.push([re, opts]);\n if (opts.type === \"begin\") this.count++;\n }\n\n /** @param {string} s */\n exec(s) {\n const m = this.getMatcher(this.regexIndex);\n m.lastIndex = this.lastIndex;\n let result = m.exec(s);\n\n // The following is because we have no easy way to say \"resume scanning at the\n // existing position but also skip the current rule ONLY\". What happens is\n // all prior rules are also skipped which can result in matching the wrong\n // thing. Example of matching \"booger\":\n\n // our matcher is [string, \"booger\", number]\n //\n // ....booger....\n\n // if \"booger\" is ignored then we'd really need a regex to scan from the\n // SAME position for only: [string, number] but ignoring \"booger\" (if it\n // was the first match), a simple resume would scan ahead who knows how\n // far looking only for \"number\", ignoring potential string matches (or\n // future \"booger\" matches that might be valid.)\n\n // So what we do: We execute two matchers, one resuming at the same\n // position, but the second full matcher starting at the position after:\n\n // /--- resume first regex match here (for [number])\n // |/---- full match here for [string, \"booger\", number]\n // vv\n // ....booger....\n\n // Which ever results in a match first is then used. So this 3-4 step\n // process essentially allows us to say \"match at this position, excluding\n // a prior rule that was ignored\".\n //\n // 1. Match \"booger\" first, ignore. Also proves that [string] does non match.\n // 2. Resume matching for [number]\n // 3. Match at index + 1 for [string, \"booger\", number]\n // 4. If #2 and #3 result in matches, which came first?\n if (this.resumingScanAtSamePosition()) {\n if (result && result.index === this.lastIndex) ; else { // use the second matcher result\n const m2 = this.getMatcher(0);\n m2.lastIndex = this.lastIndex + 1;\n result = m2.exec(s);\n }\n }\n\n if (result) {\n this.regexIndex += result.position + 1;\n if (this.regexIndex === this.count) {\n // wrap-around to considering all matches again\n this.considerAll();\n }\n }\n\n return result;\n }\n }\n\n /**\n * Given a mode, builds a huge ResumableMultiRegex that can be used to walk\n * the content and find matches.\n *\n * @param {CompiledMode} mode\n * @returns {ResumableMultiRegex}\n */\n function buildModeRegex(mode) {\n const mm = new ResumableMultiRegex();\n\n mode.contains.forEach(term => mm.addRule(term.begin, { rule: term, type: \"begin\" }));\n\n if (mode.terminatorEnd) {\n mm.addRule(mode.terminatorEnd, { type: \"end\" });\n }\n if (mode.illegal) {\n mm.addRule(mode.illegal, { type: \"illegal\" });\n }\n\n return mm;\n }\n\n /** skip vs abort vs ignore\n *\n * @skip - The mode is still entered and exited normally (and contains rules apply),\n * but all content is held and added to the parent buffer rather than being\n * output when the mode ends. Mostly used with `sublanguage` to build up\n * a single large buffer than can be parsed by sublanguage.\n *\n * - The mode begin ands ends normally.\n * - Content matched is added to the parent mode buffer.\n * - The parser cursor is moved forward normally.\n *\n * @abort - A hack placeholder until we have ignore. Aborts the mode (as if it\n * never matched) but DOES NOT continue to match subsequent `contains`\n * modes. Abort is bad/suboptimal because it can result in modes\n * farther down not getting applied because an earlier rule eats the\n * content but then aborts.\n *\n * - The mode does not begin.\n * - Content matched by `begin` is added to the mode buffer.\n * - The parser cursor is moved forward accordingly.\n *\n * @ignore - Ignores the mode (as if it never matched) and continues to match any\n * subsequent `contains` modes. Ignore isn't technically possible with\n * the current parser implementation.\n *\n * - The mode does not begin.\n * - Content matched by `begin` is ignored.\n * - The parser cursor is not moved forward.\n */\n\n /**\n * Compiles an individual mode\n *\n * This can raise an error if the mode contains certain detectable known logic\n * issues.\n * @param {Mode} mode\n * @param {CompiledMode | null} [parent]\n * @returns {CompiledMode | never}\n */\n function compileMode(mode, parent) {\n const cmode = /** @type CompiledMode */ (mode);\n if (mode.isCompiled) return cmode;\n\n [\n scopeClassName,\n // do this early so compiler extensions generally don't have to worry about\n // the distinction between match/begin\n compileMatch,\n MultiClass,\n beforeMatchExt\n ].forEach(ext => ext(mode, parent));\n\n language.compilerExtensions.forEach(ext => ext(mode, parent));\n\n // __beforeBegin is considered private API, internal use only\n mode.__beforeBegin = null;\n\n [\n beginKeywords,\n // do this later so compiler extensions that come earlier have access to the\n // raw array if they wanted to perhaps manipulate it, etc.\n compileIllegal,\n // default to 1 relevance if not specified\n compileRelevance\n ].forEach(ext => ext(mode, parent));\n\n mode.isCompiled = true;\n\n let keywordPattern = null;\n if (typeof mode.keywords === \"object\" && mode.keywords.$pattern) {\n // we need a copy because keywords might be compiled multiple times\n // so we can't go deleting $pattern from the original on the first\n // pass\n mode.keywords = Object.assign({}, mode.keywords);\n keywordPattern = mode.keywords.$pattern;\n delete mode.keywords.$pattern;\n }\n keywordPattern = keywordPattern || /\\w+/;\n\n if (mode.keywords) {\n mode.keywords = compileKeywords(mode.keywords, language.case_insensitive);\n }\n\n cmode.keywordPatternRe = langRe(keywordPattern, true);\n\n if (parent) {\n if (!mode.begin) mode.begin = /\\B|\\b/;\n cmode.beginRe = langRe(cmode.begin);\n if (!mode.end && !mode.endsWithParent) mode.end = /\\B|\\b/;\n if (mode.end) cmode.endRe = langRe(cmode.end);\n cmode.terminatorEnd = source(cmode.end) || '';\n if (mode.endsWithParent && parent.terminatorEnd) {\n cmode.terminatorEnd += (mode.end ? '|' : '') + parent.terminatorEnd;\n }\n }\n if (mode.illegal) cmode.illegalRe = langRe(/** @type {RegExp | string} */ (mode.illegal));\n if (!mode.contains) mode.contains = [];\n\n mode.contains = [].concat(...mode.contains.map(function(c) {\n return expandOrCloneMode(c === 'self' ? mode : c);\n }));\n mode.contains.forEach(function(c) { compileMode(/** @type Mode */ (c), cmode); });\n\n if (mode.starts) {\n compileMode(mode.starts, parent);\n }\n\n cmode.matcher = buildModeRegex(cmode);\n return cmode;\n }\n\n if (!language.compilerExtensions) language.compilerExtensions = [];\n\n // self is not valid at the top-level\n if (language.contains && language.contains.includes('self')) {\n throw new Error(\"ERR: contains `self` is not supported at the top-level of a language. See documentation.\");\n }\n\n // we need a null object, which inherit will guarantee\n language.classNameAliases = inherit$1(language.classNameAliases || {});\n\n return compileMode(/** @type Mode */ (language));\n}\n\n/**\n * Determines if a mode has a dependency on it's parent or not\n *\n * If a mode does have a parent dependency then often we need to clone it if\n * it's used in multiple places so that each copy points to the correct parent,\n * where-as modes without a parent can often safely be re-used at the bottom of\n * a mode chain.\n *\n * @param {Mode | null} mode\n * @returns {boolean} - is there a dependency on the parent?\n * */\nfunction dependencyOnParent(mode) {\n if (!mode) return false;\n\n return mode.endsWithParent || dependencyOnParent(mode.starts);\n}\n\n/**\n * Expands a mode or clones it if necessary\n *\n * This is necessary for modes with parental dependenceis (see notes on\n * `dependencyOnParent`) and for nodes that have `variants` - which must then be\n * exploded into their own individual modes at compile time.\n *\n * @param {Mode} mode\n * @returns {Mode | Mode[]}\n * */\nfunction expandOrCloneMode(mode) {\n if (mode.variants && !mode.cachedVariants) {\n mode.cachedVariants = mode.variants.map(function(variant) {\n return inherit$1(mode, { variants: null }, variant);\n });\n }\n\n // EXPAND\n // if we have variants then essentially \"replace\" the mode with the variants\n // this happens in compileMode, where this function is called from\n if (mode.cachedVariants) {\n return mode.cachedVariants;\n }\n\n // CLONE\n // if we have dependencies on parents then we need a unique\n // instance of ourselves, so we can be reused with many\n // different parents without issue\n if (dependencyOnParent(mode)) {\n return inherit$1(mode, { starts: mode.starts ? inherit$1(mode.starts) : null });\n }\n\n if (Object.isFrozen(mode)) {\n return inherit$1(mode);\n }\n\n // no special dependency issues, just return ourselves\n return mode;\n}\n\nvar version = \"11.11.1\";\n\nclass HTMLInjectionError extends Error {\n constructor(reason, html) {\n super(reason);\n this.name = \"HTMLInjectionError\";\n this.html = html;\n }\n}\n\n/*\nSyntax highlighting with language autodetection.\nhttps://highlightjs.org/\n*/\n\n\n\n/**\n@typedef {import('highlight.js').Mode} Mode\n@typedef {import('highlight.js').CompiledMode} CompiledMode\n@typedef {import('highlight.js').CompiledScope} CompiledScope\n@typedef {import('highlight.js').Language} Language\n@typedef {import('highlight.js').HLJSApi} HLJSApi\n@typedef {import('highlight.js').HLJSPlugin} HLJSPlugin\n@typedef {import('highlight.js').PluginEvent} PluginEvent\n@typedef {import('highlight.js').HLJSOptions} HLJSOptions\n@typedef {import('highlight.js').LanguageFn} LanguageFn\n@typedef {import('highlight.js').HighlightedHTMLElement} HighlightedHTMLElement\n@typedef {import('highlight.js').BeforeHighlightContext} BeforeHighlightContext\n@typedef {import('highlight.js/private').MatchType} MatchType\n@typedef {import('highlight.js/private').KeywordData} KeywordData\n@typedef {import('highlight.js/private').EnhancedMatch} EnhancedMatch\n@typedef {import('highlight.js/private').AnnotatedError} AnnotatedError\n@typedef {import('highlight.js').AutoHighlightResult} AutoHighlightResult\n@typedef {import('highlight.js').HighlightOptions} HighlightOptions\n@typedef {import('highlight.js').HighlightResult} HighlightResult\n*/\n\n\nconst escape = escapeHTML;\nconst inherit = inherit$1;\nconst NO_MATCH = Symbol(\"nomatch\");\nconst MAX_KEYWORD_HITS = 7;\n\n/**\n * @param {any} hljs - object that is extended (legacy)\n * @returns {HLJSApi}\n */\nconst HLJS = function(hljs) {\n // Global internal variables used within the highlight.js library.\n /** @type {Record<string, Language>} */\n const languages = Object.create(null);\n /** @type {Record<string, string>} */\n const aliases = Object.create(null);\n /** @type {HLJSPlugin[]} */\n const plugins = [];\n\n // safe/production mode - swallows more errors, tries to keep running\n // even if a single syntax or parse hits a fatal error\n let SAFE_MODE = true;\n const LANGUAGE_NOT_FOUND = \"Could not find the language '{}', did you forget to load/include a language module?\";\n /** @type {Language} */\n const PLAINTEXT_LANGUAGE = { disableAutodetect: true, name: 'Plain text', contains: [] };\n\n // Global options used when within external APIs. This is modified when\n // calling the `hljs.configure` function.\n /** @type HLJSOptions */\n let options = {\n ignoreUnescapedHTML: false,\n throwUnescapedHTML: false,\n noHighlightRe: /^(no-?highlight)$/i,\n languageDetectRe: /\\blang(?:uage)?-([\\w-]+)\\b/i,\n classPrefix: 'hljs-',\n cssSelector: 'pre code',\n languages: null,\n // beta configuration options, subject to change, welcome to discuss\n // https://github.com/highlightjs/highlight.js/issues/1086\n __emitter: TokenTreeEmitter\n };\n\n /* Utility functions */\n\n /**\n * Tests a language name to see if highlighting should be skipped\n * @param {string} languageName\n */\n function shouldNotHighlight(languageName) {\n return options.noHighlightRe.test(languageName);\n }\n\n /**\n * @param {HighlightedHTMLElement} block - the HTML element to determine language for\n */\n function blockLanguage(block) {\n let classes = block.className + ' ';\n\n classes += block.parentNode ? block.parentNode.className : '';\n\n // language-* takes precedence over non-prefixed class names.\n const match = options.languageDetectRe.exec(classes);\n if (match) {\n const language = getLanguage(match[1]);\n if (!language) {\n warn(LANGUAGE_NOT_FOUND.replace(\"{}\", match[1]));\n warn(\"Falling back to no-highlight mode for this block.\", block);\n }\n return language ? match[1] : 'no-highlight';\n }\n\n return classes\n .split(/\\s+/)\n .find((_class) => shouldNotHighlight(_class) || getLanguage(_class));\n }\n\n /**\n * Core highlighting function.\n *\n * OLD API\n * highlight(lang, code, ignoreIllegals, continuation)\n *\n * NEW API\n * highlight(code, {lang, ignoreIllegals})\n *\n * @param {string} codeOrLanguageName - the language to use for highlighting\n * @param {string | HighlightOptions} optionsOrCode - the code to highlight\n * @param {boolean} [ignoreIllegals] - whether to ignore illegal matches, default is to bail\n *\n * @returns {HighlightResult} Result - an object that represents the result\n * @property {string} language - the language name\n * @property {number} relevance - the relevance score\n * @property {string} value - the highlighted HTML code\n * @property {string} code - the original raw code\n * @property {CompiledMode} top - top of the current mode stack\n * @property {boolean} illegal - indicates whether any illegal matches were found\n */\n function highlight(codeOrLanguageName, optionsOrCode, ignoreIllegals) {\n let code = \"\";\n let languageName = \"\";\n if (typeof optionsOrCode === \"object\") {\n code = codeOrLanguageName;\n ignoreIllegals = optionsOrCode.ignoreIllegals;\n languageName = optionsOrCode.language;\n } else {\n // old API\n deprecated(\"10.7.0\", \"highlight(lang, code, ...args) has been deprecated.\");\n deprecated(\"10.7.0\", \"Please use highlight(code, options) instead.\\nhttps://github.com/highlightjs/highlight.js/issues/2277\");\n languageName = codeOrLanguageName;\n code = optionsOrCode;\n }\n\n // https://github.com/highlightjs/highlight.js/issues/3149\n // eslint-disable-next-line no-undefined\n if (ignoreIllegals === undefined) { ignoreIllegals = true; }\n\n /** @type {BeforeHighlightContext} */\n const context = {\n code,\n language: languageName\n };\n // the plugin can change the desired language or the code to be highlighted\n // just be changing the object it was passed\n fire(\"before:highlight\", context);\n\n // a before plugin can usurp the result completely by providing it's own\n // in which case we don't even need to call highlight\n const result = context.result\n ? context.result\n : _highlight(context.language, context.code, ignoreIllegals);\n\n result.code = context.code;\n // the plugin can change anything in result to suite it\n fire(\"after:highlight\", result);\n\n return result;\n }\n\n /**\n * private highlight that's used internally and does not fire callbacks\n *\n * @param {string} languageName - the language to use for highlighting\n * @param {string} codeToHighlight - the code to highlight\n * @param {boolean?} [ignoreIllegals] - whether to ignore illegal matches, default is to bail\n * @param {CompiledMode?} [continuation] - current continuation mode, if any\n * @returns {HighlightResult} - result of the highlight operation\n */\n function _highlight(languageName, codeToHighlight, ignoreIllegals, continuation) {\n const keywordHits = Object.create(null);\n\n /**\n * Return keyword data if a match is a keyword\n * @param {CompiledMode} mode - current mode\n * @param {string} matchText - the textual match\n * @returns {KeywordData | false}\n */\n function keywordData(mode, matchText) {\n return mode.keywords[matchText];\n }\n\n function processKeywords() {\n if (!top.keywords) {\n emitter.addText(modeBuffer);\n return;\n }\n\n let lastIndex = 0;\n top.keywordPatternRe.lastIndex = 0;\n let match = top.keywordPatternRe.exec(modeBuffer);\n let buf = \"\";\n\n while (match) {\n buf += modeBuffer.substring(lastIndex, match.index);\n const word = language.case_insensitive ? match[0].toLowerCase() : match[0];\n const data = keywordData(top, word);\n if (data) {\n const [kind, keywordRelevance] = data;\n emitter.addText(buf);\n buf = \"\";\n\n keywordHits[word] = (keywordHits[word] || 0) + 1;\n if (keywordHits[word] <= MAX_KEYWORD_HITS) relevance += keywordRelevance;\n if (kind.startsWith(\"_\")) {\n // _ implied for relevance only, do not highlight\n // by applying a class name\n buf += match[0];\n } else {\n const cssClass = language.classNameAliases[kind] || kind;\n emitKeyword(match[0], cssClass);\n }\n } else {\n buf += match[0];\n }\n lastIndex = top.keywordPatternRe.lastIndex;\n match = top.keywordPatternRe.exec(modeBuffer);\n }\n buf += modeBuffer.substring(lastIndex);\n emitter.addText(buf);\n }\n\n function processSubLanguage() {\n if (modeBuffer === \"\") return;\n /** @type HighlightResult */\n let result = null;\n\n if (typeof top.subLanguage === 'string') {\n if (!languages[top.subLanguage]) {\n emitter.addText(modeBuffer);\n return;\n }\n result = _highlight(top.subLanguage, modeBuffer, true, continuations[top.subLanguage]);\n continuations[top.subLanguage] = /** @type {CompiledMode} */ (result._top);\n } else {\n result = highlightAuto(modeBuffer, top.subLanguage.length ? top.subLanguage : null);\n }\n\n // Counting embedded language score towards the host language may be disabled\n // with zeroing the containing mode relevance. Use case in point is Markdown that\n // allows XML everywhere and makes every XML snippet to have a much larger Markdown\n // score.\n if (top.relevance > 0) {\n relevance += result.relevance;\n }\n emitter.__addSublanguage(result._emitter, result.language);\n }\n\n function processBuffer() {\n if (top.subLanguage != null) {\n processSubLanguage();\n } else {\n processKeywords();\n }\n modeBuffer = '';\n }\n\n /**\n * @param {string} text\n * @param {string} scope\n */\n function emitKeyword(keyword, scope) {\n if (keyword === \"\") return;\n\n emitter.startScope(scope);\n emitter.addText(keyword);\n emitter.endScope();\n }\n\n /**\n * @param {CompiledScope} scope\n * @param {RegExpMatchArray} match\n */\n function emitMultiClass(scope, match) {\n let i = 1;\n const max = match.length - 1;\n while (i <= max) {\n if (!scope._emit[i]) { i++; continue; }\n const klass = language.classNameAliases[scope[i]] || scope[i];\n const text = match[i];\n if (klass) {\n emitKeyword(text, klass);\n } else {\n modeBuffer = text;\n processKeywords();\n modeBuffer = \"\";\n }\n i++;\n }\n }\n\n /**\n * @param {CompiledMode} mode - new mode to start\n * @param {RegExpMatchArray} match\n */\n function startNewMode(mode, match) {\n if (mode.scope && typeof mode.scope === \"string\") {\n emitter.openNode(language.classNameAliases[mode.scope] || mode.scope);\n }\n if (mode.beginScope) {\n // beginScope just wraps the begin match itself in a scope\n if (mode.beginScope._wrap) {\n emitKeyword(modeBuffer, language.classNameAliases[mode.beginScope._wrap] || mode.beginScope._wrap);\n modeBuffer = \"\";\n } else if (mode.beginScope._multi) {\n // at this point modeBuffer should just be the match\n emitMultiClass(mode.beginScope, match);\n modeBuffer = \"\";\n }\n }\n\n top = Object.create(mode, { parent: { value: top } });\n return top;\n }\n\n /**\n * @param {CompiledMode } mode - the mode to potentially end\n * @param {RegExpMatchArray} match - the latest match\n * @param {string} matchPlusRemainder - match plus remainder of content\n * @returns {CompiledMode | void} - the next mode, or if void continue on in current mode\n */\n function endOfMode(mode, match, matchPlusRemainder) {\n let matched = startsWith(mode.endRe, matchPlusRemainder);\n\n if (matched) {\n if (mode[\"on:end\"]) {\n const resp = new Response(mode);\n mode[\"on:end\"](match, resp);\n if (resp.isMatchIgnored) matched = false;\n }\n\n if (matched) {\n while (mode.endsParent && mode.parent) {\n mode = mode.parent;\n }\n return mode;\n }\n }\n // even if on:end fires an `ignore` it's still possible\n // that we might trigger the end node because of a parent mode\n if (mode.endsWithParent) {\n return endOfMode(mode.parent, match, matchPlusRemainder);\n }\n }\n\n /**\n * Handle matching but then ignoring a sequence of text\n *\n * @param {string} lexeme - string containing full match text\n */\n function doIgnore(lexeme) {\n if (top.matcher.regexIndex === 0) {\n // no more regexes to potentially match here, so we move the cursor forward one\n // space\n modeBuffer += lexeme[0];\n return 1;\n } else {\n // no need to move the cursor, we still have additional regexes to try and\n // match at this very spot\n resumeScanAtSamePosition = true;\n return 0;\n }\n }\n\n /**\n * Handle the start of a new potential mode match\n *\n * @param {EnhancedMatch} match - the current match\n * @returns {number} how far to advance the parse cursor\n */\n function doBeginMatch(match) {\n const lexeme = match[0];\n const newMode = match.rule;\n\n const resp = new Response(newMode);\n // first internal before callbacks, then the public ones\n const beforeCallbacks = [newMode.__beforeBegin, newMode[\"on:begin\"]];\n for (const cb of beforeCallbacks) {\n if (!cb) continue;\n cb(match, resp);\n if (resp.isMatchIgnored) return doIgnore(lexeme);\n }\n\n if (newMode.skip) {\n modeBuffer += lexeme;\n } else {\n if (newMode.excludeBegin) {\n modeBuffer += lexeme;\n }\n processBuffer();\n if (!newMode.returnBegin && !newMode.excludeBegin) {\n modeBuffer = lexeme;\n }\n }\n startNewMode(newMode, match);\n return newMode.returnBegin ? 0 : lexeme.length;\n }\n\n /**\n * Handle the potential end of mode\n *\n * @param {RegExpMatchArray} match - the current match\n */\n function doEndMatch(match) {\n const lexeme = match[0];\n const matchPlusRemainder = codeToHighlight.substring(match.index);\n\n const endMode = endOfMode(top, match, matchPlusRemainder);\n if (!endMode) { return NO_MATCH; }\n\n const origin = top;\n if (top.endScope && top.endScope._wrap) {\n processBuffer();\n emitKeyword(lexeme, top.endScope._wrap);\n } else if (top.endScope && top.endScope._multi) {\n processBuffer();\n emitMultiClass(top.endScope, match);\n } else if (origin.skip) {\n modeBuffer += lexeme;\n } else {\n if (!(origin.returnEnd || origin.excludeEnd)) {\n modeBuffer += lexeme;\n }\n processBuffer();\n if (origin.excludeEnd) {\n modeBuffer = lexeme;\n }\n }\n do {\n if (top.scope) {\n emitter.closeNode();\n }\n if (!top.skip && !top.subLanguage) {\n relevance += top.relevance;\n }\n top = top.parent;\n } while (top !== endMode.parent);\n if (endMode.starts) {\n startNewMode(endMode.starts, match);\n }\n return origin.returnEnd ? 0 : lexeme.length;\n }\n\n function processContinuations() {\n const list = [];\n for (let current = top; current !== language; current = current.parent) {\n if (current.scope) {\n list.unshift(current.scope);\n }\n }\n list.forEach(item => emitter.openNode(item));\n }\n\n /** @type {{type?: MatchType, index?: number, rule?: Mode}}} */\n let lastMatch = {};\n\n /**\n * Process an individual match\n *\n * @param {string} textBeforeMatch - text preceding the match (since the last match)\n * @param {EnhancedMatch} [match] - the match itself\n */\n function processLexeme(textBeforeMatch, match) {\n const lexeme = match && match[0];\n\n // add non-matched text to the current mode buffer\n modeBuffer += textBeforeMatch;\n\n if (lexeme == null) {\n processBuffer();\n return 0;\n }\n\n // we've found a 0 width match and we're stuck, so we need to advance\n // this happens when we have badly behaved rules that have optional matchers to the degree that\n // sometimes they can end up matching nothing at all\n // Ref: https://github.com/highlightjs/highlight.js/issues/2140\n if (lastMatch.type === \"begin\" && match.type === \"end\" && lastMatch.index === match.index && lexeme === \"\") {\n // spit the \"skipped\" character that our regex choked on back into the output sequence\n modeBuffer += codeToHighlight.slice(match.index, match.index + 1);\n if (!SAFE_MODE) {\n /** @type {AnnotatedError} */\n const err = new Error(`0 width match regex (${languageName})`);\n err.languageName = languageName;\n err.badRule = lastMatch.rule;\n throw err;\n }\n return 1;\n }\n lastMatch = match;\n\n if (match.type === \"begin\") {\n return doBeginMatch(match);\n } else if (match.type === \"illegal\" && !ignoreIllegals) {\n // illegal match, we do not continue processing\n /** @type {AnnotatedError} */\n const err = new Error('Illegal lexeme \"' + lexeme + '\" for mode \"' + (top.scope || '<unnamed>') + '\"');\n err.mode = top;\n throw err;\n } else if (match.type === \"end\") {\n const processed = doEndMatch(match);\n if (processed !== NO_MATCH) {\n return processed;\n }\n }\n\n // edge case for when illegal matches $ (end of line) which is technically\n // a 0 width match but not a begin/end match so it's not caught by the\n // first handler (when ignoreIllegals is true)\n if (match.type === \"illegal\" && lexeme === \"\") {\n // advance so we aren't stuck in an infinite loop\n modeBuffer += \"\\n\";\n return 1;\n }\n\n // infinite loops are BAD, this is a last ditch catch all. if we have a\n // decent number of iterations yet our index (cursor position in our\n // parsing) still 3x behind our index then something is very wrong\n // so we bail\n if (iterations > 100000 && iterations > match.index * 3) {\n const err = new Error('potential infinite loop, way more iterations than matches');\n throw err;\n }\n\n /*\n Why might be find ourselves here? An potential end match that was\n triggered but could not be completed. IE, `doEndMatch` returned NO_MATCH.\n (this could be because a callback requests the match be ignored, etc)\n\n This causes no real harm other than stopping a few times too many.\n */\n\n modeBuffer += lexeme;\n return lexeme.length;\n }\n\n const language = getLanguage(languageName);\n if (!language) {\n error(LANGUAGE_NOT_FOUND.replace(\"{}\", languageName));\n throw new Error('Unknown language: \"' + languageName + '\"');\n }\n\n const md = compileLanguage(language);\n let result = '';\n /** @type {CompiledMode} */\n let top = continuation || md;\n /** @type Record<string,CompiledMode> */\n const continuations = {}; // keep continuations for sub-languages\n const emitter = new options.__emitter(options);\n processContinuations();\n let modeBuffer = '';\n let relevance = 0;\n let index = 0;\n let iterations = 0;\n let resumeScanAtSamePosition = false;\n\n try {\n if (!language.__emitTokens) {\n top.matcher.considerAll();\n\n for (;;) {\n iterations++;\n if (resumeScanAtSamePosition) {\n // only regexes not matched previously will now be\n // considered for a potential match\n resumeScanAtSamePosition = false;\n } else {\n top.matcher.considerAll();\n }\n top.matcher.lastIndex = index;\n\n const match = top.matcher.exec(codeToHighlight);\n // console.log(\"match\", match[0], match.rule && match.rule.begin)\n\n if (!match) break;\n\n const beforeMatch = codeToHighlight.substring(index, match.index);\n const processedCount = processLexeme(beforeMatch, match);\n index = match.index + processedCount;\n }\n processLexeme(codeToHighlight.substring(index));\n } else {\n language.__emitTokens(codeToHighlight, emitter);\n }\n\n emitter.finalize();\n result = emitter.toHTML();\n\n return {\n language: languageName,\n value: result,\n relevance,\n illegal: false,\n _emitter: emitter,\n _top: top\n };\n } catch (err) {\n if (err.message && err.message.includes('Illegal')) {\n return {\n language: languageName,\n value: escape(codeToHighlight),\n illegal: true,\n relevance: 0,\n _illegalBy: {\n message: err.message,\n index,\n context: codeToHighlight.slice(index - 100, index + 100),\n mode: err.mode,\n resultSoFar: result\n },\n _emitter: emitter\n };\n } else if (SAFE_MODE) {\n return {\n language: languageName,\n value: escape(codeToHighlight),\n illegal: false,\n relevance: 0,\n errorRaised: err,\n _emitter: emitter,\n _top: top\n };\n } else {\n throw err;\n }\n }\n }\n\n /**\n * returns a valid highlight result, without actually doing any actual work,\n * auto highlight starts with this and it's possible for small snippets that\n * auto-detection may not find a better match\n * @param {string} code\n * @returns {HighlightResult}\n */\n function justTextHighlightResult(code) {\n const result = {\n value: escape(code),\n illegal: false,\n relevance: 0,\n _top: PLAINTEXT_LANGUAGE,\n _emitter: new options.__emitter(options)\n };\n result._emitter.addText(code);\n return result;\n }\n\n /**\n Highlighting with language detection. Accepts a string with the code to\n highlight. Returns an object with the following properties:\n\n - language (detected language)\n - relevance (int)\n - value (an HTML string with highlighting markup)\n - secondBest (object with the same structure for second-best heuristically\n detected language, may be absent)\n\n @param {string} code\n @param {Array<string>} [languageSubset]\n @returns {AutoHighlightResult}\n */\n function highlightAuto(code, languageSubset) {\n languageSubset = languageSubset || options.languages || Object.keys(languages);\n const plaintext = justTextHighlightResult(code);\n\n const results = languageSubset.filter(getLanguage).filter(autoDetection).map(name =>\n _highlight(name, code, false)\n );\n results.unshift(plaintext); // plaintext is always an option\n\n const sorted = results.sort((a, b) => {\n // sort base on relevance\n if (a.relevance !== b.relevance) return b.relevance - a.relevance;\n\n // always award the tie to the base language\n // ie if C++ and Arduino are tied, it's more likely to be C++\n if (a.language && b.language) {\n if (getLanguage(a.language).supersetOf === b.language) {\n return 1;\n } else if (getLanguage(b.language).supersetOf === a.language) {\n return -1;\n }\n }\n\n // otherwise say they are equal, which has the effect of sorting on\n // relevance while preserving the original ordering - which is how ties\n // have historically been settled, ie the language that comes first always\n // wins in the case of a tie\n return 0;\n });\n\n const [best, secondBest] = sorted;\n\n /** @type {AutoHighlightResult} */\n const result = best;\n result.secondBest = secondBest;\n\n return result;\n }\n\n /**\n * Builds new class name for block given the language name\n *\n * @param {HTMLElement} element\n * @param {string} [currentLang]\n * @param {string} [resultLang]\n */\n function updateClassName(element, currentLang, resultLang) {\n const language = (currentLang && aliases[currentLang]) || resultLang;\n\n element.classList.add(\"hljs\");\n element.classList.add(`language-${language}`);\n }\n\n /**\n * Applies highlighting to a DOM node containing code.\n *\n * @param {HighlightedHTMLElement} element - the HTML element to highlight\n */\n function highlightElement(element) {\n /** @type HTMLElement */\n let node = null;\n const language = blockLanguage(element);\n\n if (shouldNotHighlight(language)) return;\n\n fire(\"before:highlightElement\",\n { el: element, language });\n\n if (element.dataset.highlighted) {\n console.log(\"Element previously highlighted. To highlight again, first unset `dataset.highlighted`.\", element);\n return;\n }\n\n // we should be all text, no child nodes (unescaped HTML) - this is possibly\n // an HTML injection attack - it's likely too late if this is already in\n // production (the code has likely already done its damage by the time\n // we're seeing it)... but we yell loudly about this so that hopefully it's\n // more likely to be caught in development before making it to production\n if (element.children.length > 0) {\n if (!options.ignoreUnescapedHTML) {\n console.warn(\"One of your code blocks includes unescaped HTML. This is a potentially serious security risk.\");\n console.warn(\"https://github.com/highlightjs/highlight.js/wiki/security\");\n console.warn(\"The element with unescaped HTML:\");\n console.warn(element);\n }\n if (options.throwUnescapedHTML) {\n const err = new HTMLInjectionError(\n \"One of your code blocks includes unescaped HTML.\",\n element.innerHTML\n );\n throw err;\n }\n }\n\n node = element;\n const text = node.textContent;\n const result = language ? highlight(text, { language, ignoreIllegals: true }) : highlightAuto(text);\n\n element.innerHTML = result.value;\n element.dataset.highlighted = \"yes\";\n updateClassName(element, language, result.language);\n element.result = {\n language: result.language,\n // TODO: remove with version 11.0\n re: result.relevance,\n relevance: result.relevance\n };\n if (result.secondBest) {\n element.secondBest = {\n language: result.secondBest.language,\n relevance: result.secondBest.relevance\n };\n }\n\n fire(\"after:highlightElement\", { el: element, result, text });\n }\n\n /**\n * Updates highlight.js global options with the passed options\n *\n * @param {Partial<HLJSOptions>} userOptions\n */\n function configure(userOptions) {\n options = inherit(options, userOptions);\n }\n\n // TODO: remove v12, deprecated\n const initHighlighting = () => {\n highlightAll();\n deprecated(\"10.6.0\", \"initHighlighting() deprecated. Use highlightAll() now.\");\n };\n\n // TODO: remove v12, deprecated\n function initHighlightingOnLoad() {\n highlightAll();\n deprecated(\"10.6.0\", \"initHighlightingOnLoad() deprecated. Use highlightAll() now.\");\n }\n\n let wantsHighlight = false;\n\n /**\n * auto-highlights all pre>code elements on the page\n */\n function highlightAll() {\n function boot() {\n // if a highlight was requested before DOM was loaded, do now\n highlightAll();\n }\n\n // if we are called too early in the loading process\n if (document.readyState === \"loading\") {\n // make sure the event listener is only added once\n if (!wantsHighlight) {\n window.addEventListener('DOMContentLoaded', boot, false);\n }\n wantsHighlight = true;\n return;\n }\n\n const blocks = document.querySelectorAll(options.cssSelector);\n blocks.forEach(highlightElement);\n }\n\n /**\n * Register a language grammar module\n *\n * @param {string} languageName\n * @param {LanguageFn} languageDefinition\n */\n function registerLanguage(languageName, languageDefinition) {\n let lang = null;\n try {\n lang = languageDefinition(hljs);\n } catch (error$1) {\n error(\"Language definition for '{}' could not be registered.\".replace(\"{}\", languageName));\n // hard or soft error\n if (!SAFE_MODE) { throw error$1; } else { error(error$1); }\n // languages that have serious errors are replaced with essentially a\n // \"plaintext\" stand-in so that the code blocks will still get normal\n // css classes applied to them - and one bad language won't break the\n // entire highlighter\n lang = PLAINTEXT_LANGUAGE;\n }\n // give it a temporary name if it doesn't have one in the meta-data\n if (!lang.name) lang.name = languageName;\n languages[languageName] = lang;\n lang.rawDefinition = languageDefinition.bind(null, hljs);\n\n if (lang.aliases) {\n registerAliases(lang.aliases, { languageName });\n }\n }\n\n /**\n * Remove a language grammar module\n *\n * @param {string} languageName\n */\n function unregisterLanguage(languageName) {\n delete languages[languageName];\n for (const alias of Object.keys(aliases)) {\n if (aliases[alias] === languageName) {\n delete aliases[alias];\n }\n }\n }\n\n /**\n * @returns {string[]} List of language internal names\n */\n function listLanguages() {\n return Object.keys(languages);\n }\n\n /**\n * @param {string} name - name of the language to retrieve\n * @returns {Language | undefined}\n */\n function getLanguage(name) {\n name = (name || '').toLowerCase();\n return languages[name] || languages[aliases[name]];\n }\n\n /**\n *\n * @param {string|string[]} aliasList - single alias or list of aliases\n * @param {{languageName: string}} opts\n */\n function registerAliases(aliasList, { languageName }) {\n if (typeof aliasList === 'string') {\n aliasList = [aliasList];\n }\n aliasList.forEach(alias => { aliases[alias.toLowerCase()] = languageName; });\n }\n\n /**\n * Determines if a given language has auto-detection enabled\n * @param {string} name - name of the language\n */\n function autoDetection(name) {\n const lang = getLanguage(name);\n return lang && !lang.disableAutodetect;\n }\n\n /**\n * Upgrades the old highlightBlock plugins to the new\n * highlightElement API\n * @param {HLJSPlugin} plugin\n */\n function upgradePluginAPI(plugin) {\n // TODO: remove with v12\n if (plugin[\"before:highlightBlock\"] && !plugin[\"before:highlightElement\"]) {\n plugin[\"before:highlightElement\"] = (data) => {\n plugin[\"before:highlightBlock\"](\n Object.assign({ block: data.el }, data)\n );\n };\n }\n if (plugin[\"after:highlightBlock\"] && !plugin[\"after:highlightElement\"]) {\n plugin[\"after:highlightElement\"] = (data) => {\n plugin[\"after:highlightBlock\"](\n Object.assign({ block: data.el }, data)\n );\n };\n }\n }\n\n /**\n * @param {HLJSPlugin} plugin\n */\n function addPlugin(plugin) {\n upgradePluginAPI(plugin);\n plugins.push(plugin);\n }\n\n /**\n * @param {HLJSPlugin} plugin\n */\n function removePlugin(plugin) {\n const index = plugins.indexOf(plugin);\n if (index !== -1) {\n plugins.splice(index, 1);\n }\n }\n\n /**\n *\n * @param {PluginEvent} event\n * @param {any} args\n */\n function fire(event, args) {\n const cb = event;\n plugins.forEach(function(plugin) {\n if (plugin[cb]) {\n plugin[cb](args);\n }\n });\n }\n\n /**\n * DEPRECATED\n * @param {HighlightedHTMLElement} el\n */\n function deprecateHighlightBlock(el) {\n deprecated(\"10.7.0\", \"highlightBlock will be removed entirely in v12.0\");\n deprecated(\"10.7.0\", \"Please use highlightElement now.\");\n\n return highlightElement(el);\n }\n\n /* Interface definition */\n Object.assign(hljs, {\n highlight,\n highlightAuto,\n highlightAll,\n highlightElement,\n // TODO: Remove with v12 API\n highlightBlock: deprecateHighlightBlock,\n configure,\n initHighlighting,\n initHighlightingOnLoad,\n registerLanguage,\n unregisterLanguage,\n listLanguages,\n getLanguage,\n registerAliases,\n autoDetection,\n inherit,\n addPlugin,\n removePlugin\n });\n\n hljs.debugMode = function() { SAFE_MODE = false; };\n hljs.safeMode = function() { SAFE_MODE = true; };\n hljs.versionString = version;\n\n hljs.regex = {\n concat: concat,\n lookahead: lookahead,\n either: either,\n optional: optional,\n anyNumberOfTimes: anyNumberOfTimes\n };\n\n for (const key in MODES) {\n // @ts-ignore\n if (typeof MODES[key] === \"object\") {\n // @ts-ignore\n deepFreeze(MODES[key]);\n }\n }\n\n // merge all the modes/regexes into our main object\n Object.assign(hljs, MODES);\n\n return hljs;\n};\n\n// Other names for the variable may break build script\nconst highlight = HLJS({});\n\n// returns a new instance of the highlighter to be used for extensions\n// check https://github.com/wooorm/lowlight/issues/47\nhighlight.newInstance = () => HLJS({});\n\nmodule.exports = highlight;\nhighlight.HighlightJS = highlight;\nhighlight.default = highlight;\n", "// Decklight entry point. Bundled by esbuild as an IIFE with globalName\n// \"Decklight\" \u2014 the module namespace becomes the public API (SPEC \u00A79).\n//\n// Terminal subsystem contract: src/terminal/player.mjs, when present, exports\n// `registerTerminals(Decklight, root)` \u2014 async (casts are fetched); providers\n// registered after init are picked up by the engine's late-registration\n// rescan. The build resolves 'virtual:terminal' to it (or to a stub when\n// absent) so the core builds and runs before/without the terminal subsystem.\n\nimport { init as engineInit, registerBuildProvider } from './core/engine.js';\nimport * as terminal from 'virtual:terminal';\n\nexport const version = '0.1.0';\nexport { registerBuildProvider };\n\nexport function init(config = {}) {\n const instance = engineInit(config);\n const register = terminal.registerTerminals || terminal.default?.registerTerminals;\n if (typeof register === 'function') {\n Promise.resolve(register({ registerBuildProvider }, document))\n .catch((err) => console.error('Decklight: terminal subsystem failed to initialize', err));\n }\n return instance;\n}\n\n/** Docs-page use (SPEC \u00A77.3): activate .terminal elements WITHOUT a deck \u2014\n * play mode is fully interactive standalone; step mode renders complete. */\nexport function initTerminals(root = document) {\n const register = terminal.registerTerminals || terminal.default?.registerTerminals;\n return typeof register === 'function'\n ? Promise.resolve(register({ registerBuildProvider }, root))\n : Promise.resolve();\n}\n", "// Engine \u2014 init, navigation, transitions, overview/blackout/help, hash,\n// scaling, print. SPEC \u00A72.2, \u00A74.1, \u00A78, \u00A79.\n\nimport { scanSlide, applyBuildState, stepLabels, registerProvider, providerRegistry } from './builds.js';\nimport { namespaceSvgIds, applyConcepts } from './svg.js';\nimport { runAutoAnimate } from './autoanimate.js';\nimport { initMarkdown } from '../md/markdown.js';\nimport { initCode } from '../code/code.js';\nimport { openSpeakerView, notesSegments } from './speaker.js';\nimport { generateTheme, tokensToCss, luminance } from './themegen.js';\n\nconst DEFAULTS = {\n transition: 'fade',\n hash: true,\n controls: true,\n slideNumber: false,\n width: 1280,\n height: 720,\n pinTitles: false,\n};\n\n// Pinned-title default Y (design px from the stage top). Measured from the\n// course's \"The Single-Agent Limit\" slide \u2014 the reference position chosen\n// for the feature (SPEC \u00A78).\nconst PIN_DEFAULT_Y = 99;\nconst PIN_GAP = 18; // breathing room between a pinned title and the content\nconst PIN_SUB_GAP = 6; // breathing room between a pinned title and its subtitle\nconst PINNABLE_CONTENT = 'ul, ol, svg, pre, table, .terminal, img, .columns';\n\nlet activeInstance = null;\n\nexport function registerBuildProvider(el, provider) {\n registerProvider(el, provider);\n // Post-init registration (async widgets, e.g. terminal casts): rescan the\n // owning slide and re-apply the current state.\n if (activeInstance) activeInstance._rescanFor(el);\n}\n\n/**\n * Pinned titles (SPEC \u00A78): keep slide titles at one vertical position instead\n * of drifting with content height. The leading h1/h2 of each pinnable section\n * is absolutely positioned at --pin-y; --pin-space (pin Y + measured title\n * height + gap) becomes the section's padding-top so the remaining content\n * centers below the title and can never slide under it.\n *\n * Pinnable heuristic: a leading h1/h2 AND real content (list/svg/pre/table/\n * terminal/img/columns) outside the notes \u2014 title cards and quote/statement\n * slides stay centered. Per-slide overrides: data-pin (force), data-pin=\"none\"\n * (opt out), data-pin=\"<number>\" (custom Y).\n */\nfunction leadingHeading(section) {\n for (const el of section.children) {\n if (el.matches('aside, script, style, .decklight-hero-logo')) continue;\n return el.matches('h1, h2') ? el : null;\n }\n return null;\n}\n\n/**\n * Subtitle (SPEC \u00A71/\u00A78): the <p> immediately following a section's leading\n * heading is the slide's subtitle \u2014 one canonical look whether the slide is\n * markdown- or HTML-authored, pinned or centered. Opt out per slide with\n * data-subtitle=\"none\"; an author-placed class=\"subtitle\" is respected as-is.\n */\nfunction detectSubtitle(section, heading) {\n if (!heading || section.getAttribute('data-subtitle') === 'none') return null;\n const next = heading.nextElementSibling;\n if (next && next.matches('p') && !next.hasAttribute('data-build')) {\n next.classList.add('subtitle');\n return next;\n }\n return section.querySelector(':scope > p.subtitle');\n}\n\nfunction setupPinnedTitles(sections, config) {\n const deckY = config.pinTitles === true ? PIN_DEFAULT_Y\n : (typeof config.pinTitles === 'number' && isFinite(config.pinTitles)) ? config.pinTitles\n : null;\n sections.forEach((sec) => {\n const heading = leadingHeading(sec);\n const attr = sec.getAttribute('data-pin');\n let y = null;\n if (attr === 'none') {\n y = null;\n } else if (attr !== null && attr !== '') {\n const n = parseFloat(attr);\n y = isFinite(n) ? n : (deckY ?? PIN_DEFAULT_Y);\n } else if (attr === '') {\n y = deckY ?? PIN_DEFAULT_Y; // bare data-pin forces even when config is off\n } else if (deckY !== null) {\n const hasContent = [...sec.querySelectorAll(PINNABLE_CONTENT)]\n .some((el) => !el.closest('aside') && !el.closest('.decklight-hero-logo'));\n if (hasContent) y = deckY;\n }\n const subtitle = detectSubtitle(sec, heading);\n sec.querySelector(':scope > .pin-title')?.classList.remove('pin-title');\n sec.querySelector(':scope > .pin-subtitle')?.classList.remove('pin-subtitle');\n if (y === null || !heading) {\n sec.removeAttribute('data-pinned');\n sec.style.removeProperty('--pin-y');\n sec.style.removeProperty('--pin-sub-y');\n sec.style.removeProperty('--pin-space');\n return;\n }\n heading.classList.add('pin-title');\n sec.setAttribute('data-pinned', '');\n sec.style.setProperty('--pin-y', y + 'px');\n // Inactive sections are display:none \u2014 measure under a momentary\n // display:flex + visibility:hidden (no paint happens within this task).\n sec.classList.add('pin-measure');\n const h = heading.offsetHeight || 0;\n let headerBottom = y + h;\n if (subtitle) {\n // The subtitle joins the pinned header block, directly under the title.\n subtitle.classList.add('pin-subtitle');\n sec.style.setProperty('--pin-sub-y', Math.round(headerBottom + PIN_SUB_GAP) + 'px');\n headerBottom += PIN_SUB_GAP + (subtitle.offsetHeight || 0);\n }\n sec.classList.remove('pin-measure');\n sec.style.setProperty('--pin-space', Math.round(headerBottom + PIN_GAP) + 'px');\n });\n}\n\n/**\n * Authoring guardrail: content that exceeds the slide silently flex-shrinks\n * into an overflow:auto box and reads as clipped. Warn (console) and mark\n * (data-overflow attribute) so both humans and headless probes can catch it.\n */\nfunction checkOverflow(section, slideNo) {\n if (!section) return;\n // Terminals scroll internally by design (SPEC \u00A77.3 scrollback viewport);\n // any other intentional scroller can opt out with data-scroll-ok.\n const clipped = [section, ...section.querySelectorAll('pre, table, svg, ul, ol, blockquote')]\n .some((el) => el.scrollHeight > el.clientHeight + 2 &&\n getComputedStyle(el).overflowY !== 'visible' &&\n !el.closest('.terminal') && !el.hasAttribute('data-scroll-ok'));\n section.toggleAttribute('data-overflow', clipped);\n if (clipped) console.warn(`Decklight: slide ${slideNo} content overflows and is clipped \u2014 reduce content or font size`);\n}\n\nexport function init(userConfig = {}) {\n const params = new URLSearchParams(location.search);\n const config = { ...DEFAULTS, ...userConfig };\n if (params.has('embedded')) config.controls = false;\n const printMode = params.has('print');\n\n // ----- debug log (D) -------------------------------------------------------\n // Ring buffer lives from init so events are captured even while the panel\n // is closed; D pops the window over the deck. Declared this early because\n // theme restoration logs during init, before the chrome exists.\n const debugT0 = Date.now();\n const debugBuf = [];\n let debugEl = null;\n let ttsSpend = 0; // estimated $ across live-bridge calls (x-tts-cost header)\n function debugLog(kind, msg) {\n debugBuf.push({ t: ((Date.now() - debugT0) / 1000).toFixed(3), kind, msg });\n if (debugBuf.length > 200) debugBuf.shift();\n if (debugEl) {\n appendDebugRow(debugBuf[debugBuf.length - 1]);\n updateDebugState();\n const log = debugEl.querySelector('.dbg-log');\n log.scrollTop = log.scrollHeight;\n }\n }\n\n const root = document.querySelector('.decklight');\n if (!root) throw new Error('Decklight: no .decklight element found');\n\n // ----- playlist (multi-deck navigation) ------------------------------------\n // config.playlist = { modules: [{title, href}\u2026], index: n }. Advancing past\n // the deck's end chains to the next module; reversing before the start goes\n // to the previous module's last slide (the oversized hash clamps there).\n // Embedded instances (previews) never chain.\n const playlist = (!params.has('embedded') && config.playlist?.modules?.length)\n ? config.playlist : null;\n const playlistIndex = playlist ? (playlist.index ?? 0) : 0;\n function gotoModule(delta) {\n if (!playlist) return false;\n const mod = playlist.modules[playlistIndex + delta];\n if (!mod) return false;\n location.href = mod.href + (delta > 0 ? '#/1/0' : '#/999/999');\n return true;\n }\n function navigateToModule(i) {\n const mod = playlist?.modules[i];\n if (mod) location.href = mod.href + '#/1/0';\n }\n\n // In-file module markers (merged single-file decks, SPEC \u00A78): sections\n // carrying data-module mark chapter starts. When markers exist they take\n // precedence over config.playlist \u2014 module navigation becomes goto(), no\n // page loads.\n const hasMarkersDOM = !!root.querySelector('section[data-module]');\n function inFileMarkers() {\n const out = [];\n (instance._sections || []).forEach((s, i) => {\n if (s.hasAttribute('data-module')) out.push({ title: s.getAttribute('data-module'), slide: i + 1 });\n });\n return out;\n }\n function currentMarkerIndex(markers) {\n let idx = -1;\n markers.forEach((m, i) => { if (m.slide <= instance.state.slide) idx = i; });\n return idx;\n }\n\n // ----- theme switching -----------------------------------------------------\n // Two modes. Link mode: the theme is the stylesheet link pointing into\n // themes/, and applyTheme swaps its href. Inline mode (bundled single-file\n // decks): themes are embedded as <style data-theme=\"name\"> blocks and\n // applyTheme toggles which one applies. Toggling uses media=\"not all\" \u2014\n // the HTML `disabled` attribute on <style> is non-functional per spec (only\n // the IDL property works), so media is the declarative mechanism; both\n // forms are normalized here for tolerant authoring.\n const themeStyles = [...document.querySelectorAll('style[data-theme]')];\n const inlineThemes = themeStyles.length > 0;\n const themeLink = inlineThemes ? null\n : document.querySelector('link[rel=\"stylesheet\"][href*=\"themes/\"]');\n if (inlineThemes) {\n let active = themeStyles.find((s) => !s.hasAttribute('disabled') && s.media !== 'not all');\n active = active || themeStyles[0];\n themeStyles.forEach((s) => {\n s.removeAttribute('disabled');\n s.media = s === active ? 'all' : 'not all';\n });\n }\n const hasThemes = inlineThemes || !!themeLink;\n const themeOf = (href) => (href.match(/themes\\/([\\w-]+)\\.css/) || [])[1];\n const themeKey = 'decklight-theme:' + location.pathname;\n\n // \u2500\u2500 generated & saved-custom themes (SPEC \u00A78) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n // Both live as <style data-theme> elements appended LAST in <head>, so an\n // active one wins the cascade over the link/inline base theme (equal\n // specificity, later order). Saved customs persist as token maps in\n // localStorage \u2014 per-origin; the .css download is the portable artifact.\n const CUSTOM_KEY = 'decklight-custom-themes';\n let customThemes = {};\n try { customThemes = JSON.parse(localStorage.getItem(CUSTOM_KEY) || '{}') || {}; } catch { /* ignore */ }\n let genStyle = null; // <style data-generated> of the current roll\n let genTheme = null; // { name, tokens } of the current (unsaved) roll\n const customStyles = {};\n\n function ensureTokenStyle(name, tokens, kind) {\n let el = kind === 'generated' ? genStyle : customStyles[name];\n if (!el) {\n el = document.createElement('style');\n el.media = 'not all';\n if (kind === 'generated') el.dataset.generated = '';\n else el.dataset.custom = '';\n }\n el.dataset.theme = name;\n el.textContent = tokensToCss(name, tokens);\n document.head.appendChild(el); // (re-)append \u2192 last in head \u2192 wins cascade\n if (kind === 'generated') genStyle = el; else customStyles[name] = el;\n return el;\n }\n function deactivateTokenStyles(exceptEl) {\n for (const el of [genStyle, ...Object.values(customStyles)]) {\n if (el && el !== exceptEl) el.media = 'not all';\n }\n }\n const activeTokenStyle = () =>\n [genStyle, ...Object.values(customStyles)].find((el) => el && el.media !== 'not all') || null;\n\n const currentTheme = () => {\n const tokenStyle = activeTokenStyle();\n if (tokenStyle) return tokenStyle.dataset.theme;\n return inlineThemes\n ? themeStyles.find((s) => s.media !== 'not all')?.dataset.theme\n : (themeLink ? themeOf(themeLink.href) : undefined);\n };\n let toastEl, toastTimer;\n function toast(msg, ms = 1200) {\n if (printMode) return;\n if (!toastEl) {\n toastEl = document.createElement('div');\n toastEl.className = 'decklight-toast';\n root.appendChild(toastEl);\n }\n toastEl.textContent = msg;\n toastEl.classList.add('show');\n clearTimeout(toastTimer);\n toastTimer = setTimeout(() => toastEl.classList.remove('show'), ms);\n }\n function applyTheme(name, silent = false) {\n if (!name || !/^[\\w-]+$/.test(name)) return;\n let unsavedGen = false;\n if (genTheme && genStyle && name === genTheme.name) {\n genStyle.media = 'all';\n deactivateTokenStyles(genStyle);\n unsavedGen = !customThemes[name];\n } else if (customThemes[name]) {\n const el = ensureTokenStyle(name, customThemes[name], 'custom');\n el.media = 'all';\n deactivateTokenStyles(el);\n } else {\n if (!hasThemes) return;\n deactivateTokenStyles(null); // stock theme takes over\n if (inlineThemes) {\n const target = themeStyles.find((s) => s.dataset.theme === name);\n if (!target) return; // not embedded in this bundle\n themeStyles.forEach((s) => { s.media = s === target ? 'all' : 'not all'; });\n } else {\n themeLink.href = themeLink.href.replace(/themes\\/[\\w-]+\\.css(\\?.*)?$/, `themes/${name}.css`);\n }\n }\n // Embedded instances (e.g. picker preview iframes) must not persist; nor\n // can an unsaved generated autoname (it wouldn't resolve after reload).\n if (!params.has('embedded') && !unsavedGen) {\n try { localStorage.setItem(themeKey, name); } catch { /* file:// or private mode */ }\n }\n if (!silent) toast(name);\n debugLog('theme', name);\n updateCanvas(); // hoisted; inline/generated swaps take effect synchronously\n }\n // \u2500\u2500 theme packs (SPEC \u00A78) \u2014 baked from themes/packs.json at build time \u2500\u2500\u2500\u2500\n const PACKS = typeof __DECKLIGHT_PACKS__ !== 'undefined' ? __DECKLIGHT_PACKS__ : null;\n const packLabel = (p) => PACKS?.labels?.[p] ?? p;\n function packOf(name) {\n if (customThemes[name]) return 'custom';\n if (genTheme && name === genTheme.name) return 'generated';\n if (PACKS) {\n for (const [p, names] of Object.entries(PACKS.packs)) {\n if (names.includes(name)) return p;\n }\n }\n return 'other';\n }\n const themeList = () => {\n let list;\n if (inlineThemes) {\n const available = themeStyles.map((s) => s.dataset.theme);\n list = config.themes?.length\n ? config.themes.filter((n) => available.includes(n))\n : available;\n } else {\n list = config.themes?.length ? config.themes\n : (typeof __DECKLIGHT_THEMES__ !== 'undefined' ? __DECKLIGHT_THEMES__ : []);\n }\n const extras = Object.keys(customThemes);\n if (genTheme && !customThemes[genTheme.name]) extras.push(genTheme.name);\n list = [...list, ...extras.filter((n) => !list.includes(n))];\n if (PACKS) {\n // cycling and the picker walk pack by pack: order by pack, then by the\n // pack's own order; customs/generated keep their relative order at the end\n const rank = new Map();\n let r = 0;\n for (const p of PACKS.order) for (const n of PACKS.packs[p] ?? []) rank.set(n, r++);\n list = [...list].sort((a, b) => (rank.get(a) ?? 1e9) - (rank.get(b) ?? 1e9));\n }\n return list;\n };\n // [ [packName, [themes\u2026]] \u2026 ] for the available list, dynamic packs last\n function packEntries(list) {\n const out = [];\n for (const p of PACKS.order) {\n const names = (PACKS.packs[p] ?? []).filter((n) => list.includes(n));\n if (names.length) out.push([p, names]);\n }\n for (const extra of ['custom', 'generated']) {\n const names = list.filter((n) => packOf(n) === extra);\n if (names.length) out.push([extra, names]);\n }\n return out;\n }\n\n // \u2500\u2500 theme generator (\u2303T roll \u00B7 \u2303\u21E7T save \u00B7 picker \"Generate new\u2026\") \u2500\u2500\u2500\u2500\u2500\n const b64uEncode = (obj) =>\n btoa(unescape(encodeURIComponent(JSON.stringify(obj))))\n .replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=+$/, '');\n const b64uDecode = (s) =>\n JSON.parse(decodeURIComponent(escape(atob(s.replace(/-/g, '+').replace(/_/g, '/')))));\n\n function adoptGenerated(cand, silent = false) {\n genTheme = { name: cand.name, tokens: cand.tokens };\n const el = ensureTokenStyle(cand.name, cand.tokens, 'generated');\n el.media = 'all';\n deactivateTokenStyles(el);\n if (!silent) toast(`\u2728 ${cand.name} \u2014 \u2303T re-roll \u00B7 \u2303\u21E7T save`, 2800);\n updateCanvas();\n return cand.name;\n }\n function rollTheme() {\n return adoptGenerated(generateTheme());\n }\n function saveGeneratedTheme(inputName) {\n if (!genTheme || !genStyle || genStyle.media === 'not all') {\n toast('no generated theme to save \u2014 \u2303T to generate one');\n return null;\n }\n let name = inputName ?? (window.prompt?.('Save theme as:', genTheme.name.replace(/^gen-/, '')) || '');\n name = String(name).toLowerCase().replace(/[^a-z0-9-]+/g, '-').replace(/^-+|-+$/g, '').slice(0, 40);\n if (!name) return null;\n const shipped = typeof __DECKLIGHT_THEMES__ !== 'undefined' ? __DECKLIGHT_THEMES__ : [];\n if (shipped.includes(name) || themeStyles.some((s) => s.dataset.theme === name)) name = 'custom-' + name;\n customThemes[name] = genTheme.tokens;\n try { localStorage.setItem(CUSTOM_KEY, JSON.stringify(customThemes)); } catch { /* private mode */ }\n const el = ensureTokenStyle(name, customThemes[name], 'custom');\n el.media = 'all';\n genStyle?.remove(); genStyle = null; genTheme = null;\n deactivateTokenStyles(el);\n if (!params.has('embedded')) {\n try { localStorage.setItem(themeKey, name); } catch { /* ignore */ }\n }\n // Portable artifact: saved themes live in THIS browser's localStorage;\n // the .css file is what travels (drop it into themes/ and commit).\n try {\n const blob = new Blob([tokensToCss(name, customThemes[name])], { type: 'text/css' });\n const a = document.createElement('a');\n a.href = URL.createObjectURL(blob);\n a.download = `${name}.css`;\n a.click();\n setTimeout(() => URL.revokeObjectURL(a.href), 5000);\n } catch { /* download denied (headless etc.) \u2014 localStorage still has it */ }\n toast(`saved ${name} \u2014 ${name}.css downloaded`, 2200);\n return name;\n }\n // Crossing into a different pack while cycling needs a confirmation: the\n // same key again applies, the opposite key or Esc cancels, 4s times out.\n let cyclePending = null;\n function cancelCyclePending(silent = false) {\n if (!cyclePending) return false;\n clearTimeout(cyclePending.timer);\n cyclePending = null;\n if (!silent) toast('theme cycle cancelled');\n return true;\n }\n function cycleTheme(dir) {\n const list = themeList();\n if (!hasThemes || list.length < 2) return;\n if (cyclePending) {\n const p = cyclePending;\n clearTimeout(p.timer);\n cyclePending = null;\n if (p.dir === dir) applyTheme(p.name); // repeat = confirm\n else toast('theme cycle cancelled'); // opposite = cancel\n return;\n }\n const cur = currentTheme();\n const i = Math.max(0, list.indexOf(cur));\n const next = list[(i + dir + list.length) % list.length];\n if (PACKS && packOf(next) !== packOf(cur)) {\n const key = dir > 0 ? '.' : ',';\n const opp = dir > 0 ? ',' : '.';\n cyclePending = { dir, name: next, timer: setTimeout(() => { cyclePending = null; }, 4000) };\n toast(`\u2933 ${packLabel(packOf(next))} pack next (${next}) \u2014 ${key} confirms \u00B7 ${opp} or Esc cancels`, 4000);\n return;\n }\n applyTheme(next);\n }\n\n // Embedded preview decks accept theme swaps from their parent (the picker)\n // so the parent can restyle them without a document reload \u2014 in a bundled\n // single-file deck every reload re-parses the whole ~600 KB payload.\n if (params.has('embedded')) {\n window.addEventListener('message', (e) => {\n const m = e.data && e.data.__decklightPreview;\n if (!m || e.source !== window.parent) return;\n if (m.gen) adoptGenerated(m.gen, true);\n else if (m.theme) applyTheme(m.theme, true);\n else if (m.goto) instance.goto(m.goto[0], m.goto[1] ?? 0);\n });\n }\n\n // ----- theme picker: list + live minified preview of the current slide ----\n // First row is \"\u2728 Generate new\u2026\": selecting it rolls a candidate theme and\n // previews it live; \u2303T re-rolls; Enter/click applies it. Printable keys\n // type into the quick filter (which hides the gen row while active).\n // Generated and saved-custom themes have no file, so their previews carry\n // the tokens in the URL (?gen=<base64url JSON>) \u2014 stateless, works on file://.\n const GEN_ROW = '\\u0000generate';\n // pack navigation rows (control-char sentinels can't collide with theme\n // names). Views: 'packs' (pack list) \u00B7 'pack:<name>' (drilled in, \u2190 goes\n // back) \u00B7 'all' (flattened). An active filter always searches globally.\n const PACK_ROW = '\\u0001pack:';\n const BACK_ROW = '\\u0001back';\n const ALL_ROW = '\\u0001all';\n let pickerEl = null, pickerSel = 0, pickerDebounce, pickerEntries = [], pickerCandidate = null, pickerFilter = '';\n let pickerView = 'packs';\n function previewSrc(name) {\n const st = instance.state;\n const hash = '#/' + st.slide + '/' + st.step;\n if (name === GEN_ROW || customThemes[name] || (genTheme && name === genTheme.name)) {\n const cand = name === GEN_ROW ? pickerCandidate\n : customThemes[name] ? { name, tokens: customThemes[name] } : genTheme;\n return location.pathname + '?embedded&gen=' + b64uEncode(cand) + hash;\n }\n return location.pathname + '?embedded&theme=' + encodeURIComponent(name) + hash;\n }\n function genRowLabel(row) {\n row.textContent = pickerCandidate\n ? `\u2728 ${pickerCandidate.name} \u2014 \u2303T re-rolls` : '\u2728 Generate new\u2026';\n }\n function rollPickerCandidate() {\n pickerCandidate = generateTheme();\n const gi = pickerEntries.indexOf(GEN_ROW);\n if (gi < 0) return; // gen row hidden by an active quick filter\n genRowLabel(pickerEl.querySelectorAll('.tp-row')[gi]);\n selectPickerRow(gi, true);\n }\n function renderPickerList() {\n const listBox = pickerEl.querySelector('.tp-list');\n const cur = currentTheme();\n const list = themeList();\n if (pickerFilter) {\n pickerEntries = list.filter((n) => n.includes(pickerFilter));\n } else if (!PACKS || pickerView === 'all') {\n pickerEntries = PACKS ? [GEN_ROW, BACK_ROW, ...list] : [GEN_ROW, ...list];\n } else if (pickerView === 'packs') {\n pickerEntries = [GEN_ROW, ...packEntries(list).map(([p]) => PACK_ROW + p), ALL_ROW];\n } else {\n const p = pickerView.slice(5);\n pickerEntries = [BACK_ROW, ...(packEntries(list).find(([q]) => q === p)?.[1] ?? [])];\n }\n listBox.textContent = '';\n const tag = (row, text) => {\n const t = document.createElement('span');\n t.className = 'tp-tag';\n t.textContent = text;\n row.appendChild(t);\n };\n pickerEntries.forEach((name, i) => {\n const row = document.createElement('div');\n row.setAttribute('role', 'option');\n if (name === GEN_ROW) {\n row.className = 'tp-row tp-gen';\n genRowLabel(row);\n } else if (name === BACK_ROW) {\n row.className = 'tp-row tp-back';\n row.textContent = '\u2190 packs';\n } else if (name === ALL_ROW) {\n row.className = 'tp-row tp-all';\n row.textContent = '\u2733 all themes';\n tag(row, String(list.length));\n } else if (name.startsWith(PACK_ROW)) {\n const p = name.slice(PACK_ROW.length);\n const names = packEntries(list).find(([q]) => q === p)?.[1] ?? [];\n row.className = 'tp-row tp-pack' + (names.includes(cur) ? ' tp-current' : '');\n row.textContent = `\u25B8 ${packLabel(p)}`;\n tag(row, String(names.length));\n } else {\n row.className = 'tp-row' + (name === cur ? ' tp-current' : '');\n row.textContent = name;\n const extra = customThemes[name] ? 'custom'\n : (genTheme && name === genTheme.name) ? 'generated'\n : pickerFilter && PACKS ? packLabel(packOf(name)) : null;\n if (extra) tag(row, extra);\n }\n row.addEventListener('mouseenter', () => selectPickerRow(i, false));\n row.addEventListener('click', () => { selectPickerRow(i, true); commitPicker(); });\n listBox.appendChild(row);\n });\n if (!pickerEntries.length) {\n const none = document.createElement('div');\n none.className = 'tp-none';\n none.textContent = 'no themes match';\n listBox.appendChild(none);\n }\n const bar = pickerEl.querySelector('.tp-filter');\n bar.textContent = pickerFilter || 'type to filter\u2026';\n bar.classList.toggle('tp-active', !!pickerFilter);\n }\n // the sensible selection for the current view: the active theme's row when\n // visible, its pack row in the packs view, else the first useful row\n function pickerHomeIndex() {\n const cur = currentTheme();\n const curIdx = pickerEntries.indexOf(cur);\n if (curIdx >= 0) return curIdx;\n const packIdx = pickerEntries.indexOf(PACK_ROW + packOf(cur));\n if (packIdx >= 0) return packIdx;\n return Math.min(1, pickerEntries.length - 1);\n }\n function setPickerView(view, immediate = false) {\n pickerView = view;\n renderPickerList();\n if (pickerEntries.length) selectPickerRow(pickerHomeIndex(), immediate);\n }\n function setPickerFilter(q) {\n pickerFilter = q.toLowerCase();\n renderPickerList();\n if (pickerEntries.length) {\n selectPickerRow(pickerFilter ? 0 : pickerHomeIndex(), false);\n } else {\n pickerEl.querySelector('.tp-caption').textContent = 'no match';\n }\n }\n function openThemePicker() {\n if (pickerEl) return closeThemePicker();\n const list = themeList();\n if (!hasThemes && !list.length) return;\n pickerFilter = '';\n pickerView = PACKS ? 'packs' : 'all';\n pickerEl = document.createElement('div');\n pickerEl.className = 'decklight-theme-picker';\n pickerEl.innerHTML =\n '<div class=\"tp-panel\">' +\n '<div class=\"tp-side\"><div class=\"tp-filter\"></div>' +\n '<div class=\"tp-list\" role=\"listbox\" aria-label=\"Themes\"></div></div>' +\n '<div class=\"tp-preview\"><iframe title=\"Theme preview\"></iframe>' +\n '<div class=\"tp-caption\"></div></div></div>';\n renderPickerList();\n pickerEl.addEventListener('click', (e) => { if (e.target === pickerEl) closeThemePicker(); });\n root.appendChild(pickerEl);\n // boot the preview on the CURRENT theme \u2014 pack rows never swap it, so the\n // pane must not open empty in the packs view\n const cur = currentTheme();\n if (cur) previewSwap(pickerEl.querySelector('iframe'), cur);\n selectPickerRow(pickerHomeIndex(), !cur);\n }\n function selectPickerRow(i, immediate) {\n if (!pickerEntries.length) return;\n pickerSel = (i + pickerEntries.length) % pickerEntries.length;\n const name = pickerEntries[pickerSel];\n if (name === GEN_ROW && !pickerCandidate) {\n // first visit to the generate row: roll a candidate so there is\n // something to preview (kept until explicitly re-rolled)\n pickerCandidate = generateTheme();\n genRowLabel(pickerEl.querySelectorAll('.tp-row')[pickerSel]);\n }\n const rows = pickerEl.querySelectorAll('.tp-row');\n rows.forEach((r, j) => r.classList.toggle('tp-selected', j === pickerSel));\n rows[pickerSel]?.scrollIntoView({ block: 'nearest' });\n const list = themeList();\n const caption = name === GEN_ROW ? (pickerCandidate ? `\u2728 ${pickerCandidate.name}` : 'generate new')\n : name === BACK_ROW ? 'back to packs'\n : name === ALL_ROW ? `all ${list.length} themes, flattened`\n : name.startsWith(PACK_ROW)\n ? `${packLabel(name.slice(PACK_ROW.length))} \u00B7 ${packEntries(list).find(([q]) => q === name.slice(PACK_ROW.length))?.[1].length ?? 0} themes`\n : PACKS ? `${packLabel(packOf(name))} \u00B7 ${name}` : name;\n pickerEl.querySelector('.tp-caption').textContent = caption;\n clearTimeout(pickerDebounce);\n // navigation rows keep the current preview; only theme/gen rows swap it\n if (name !== GEN_ROW && name.charCodeAt(0) === 1) return;\n const frame = pickerEl.querySelector('iframe');\n if (immediate) previewSwap(frame, name);\n else pickerDebounce = setTimeout(() => previewSwap(frame, name), 60);\n }\n // Lazy preview: the embedded deck loads ONCE per picker session; theme\n // changes are postMessage'd into it (silent applyTheme/adoptGenerated on\n // the embedded instance) instead of swapping src \u2014 instant, and no ~600 KB\n // re-parse per candidate inside bundles. Generated/custom rows travel as\n // tokens; stock rows as names.\n let pickerFrameReady = false, pickerPendingName = null;\n function previewMessage(name) {\n if (name === GEN_ROW || customThemes[name] || (genTheme && name === genTheme.name)) {\n const cand = name === GEN_ROW ? pickerCandidate\n : customThemes[name] ? { name, tokens: customThemes[name] } : genTheme;\n return { gen: cand };\n }\n return { theme: name };\n }\n function previewSwap(frame, name) {\n if (!frame.dataset.booted) {\n frame.dataset.booted = '1';\n pickerFrameReady = false;\n frame.addEventListener('load', () => {\n pickerFrameReady = true;\n if (pickerPendingName !== null && pickerEl) {\n const pending = pickerPendingName;\n pickerPendingName = null;\n previewSwap(frame, pending);\n }\n }, { once: true });\n frame.src = previewSrc(name);\n return;\n }\n if (!pickerFrameReady) { pickerPendingName = name; return; }\n frame.contentWindow?.postMessage({ __decklightPreview: previewMessage(name) }, '*');\n }\n function commitPicker() {\n const name = pickerEntries[pickerSel];\n if (name === undefined) return;\n if (name === GEN_ROW) {\n if (pickerCandidate) adoptGenerated(pickerCandidate);\n closeThemePicker();\n return;\n }\n if (name === BACK_ROW) { setPickerView('packs'); return; }\n if (name === ALL_ROW) { setPickerView('all'); return; }\n if (name.startsWith(PACK_ROW)) { setPickerView('pack:' + name.slice(PACK_ROW.length), true); return; }\n applyTheme(name);\n closeThemePicker();\n }\n function closeThemePicker() {\n clearTimeout(pickerDebounce);\n pickerEl?.remove();\n pickerEl = null;\n }\n\n // ----- slide finder: / opens find-a-slide with live preview ---------------\n // Same panel anatomy and lazy-preview mechanism as the theme picker: the\n // embedded deck boots once, then selections postMessage a goto into it.\n // Matching is word-AND over the slide's text; title hits rank above\n // body-only hits, and each match is listed by its title.\n let finderEl = null, finderSel = 0, finderQuery = '', finderMatches = [], finderDebounce;\n let finderFrameReady = false, finderPending = null;\n function finderIndex() {\n return instance._sections.map((sec, i) => {\n const contentEls = [...sec.children].filter((el) => !el.matches('aside, script, style'));\n const heading = sec.querySelector('h1, h2, h3');\n const body = contentEls.map((el) => el.textContent).join(' ').replace(/\\s+/g, ' ').trim();\n const title = (heading?.textContent || '').replace(/\\s+/g, ' ').trim()\n || (body.slice(0, 60) || `slide ${i + 1}`);\n return { slide: i + 1, title, haystack: body.toLowerCase() };\n });\n }\n function renderFinderList() {\n const listBox = finderEl.querySelector('.tp-list');\n const words = finderQuery.split(/\\s+/).filter(Boolean);\n const titleHits = [], bodyHits = [];\n for (const entry of finderEl.__index) {\n const tl = entry.title.toLowerCase();\n if (words.every((w) => tl.includes(w))) titleHits.push(entry);\n else if (words.every((w) => entry.haystack.includes(w))) bodyHits.push(entry);\n }\n finderMatches = [...titleHits, ...bodyHits];\n listBox.textContent = '';\n finderMatches.forEach((m, i) => {\n const row = document.createElement('div');\n row.className = 'tp-row' + (m.slide === instance.state.slide ? ' tp-current' : '');\n row.textContent = `${m.slide} \u00B7 ${m.title}`;\n row.addEventListener('mouseenter', () => selectFinderRow(i, false));\n row.addEventListener('click', () => { selectFinderRow(i, true); commitFinder(); });\n listBox.appendChild(row);\n });\n if (!finderMatches.length) {\n const none = document.createElement('div');\n none.className = 'tp-none';\n none.textContent = 'no slides match';\n listBox.appendChild(none);\n }\n const bar = finderEl.querySelector('.tp-filter');\n bar.textContent = finderQuery || 'type to find a slide\u2026';\n bar.classList.toggle('tp-active', !!finderQuery);\n }\n function finderPreviewSwap(frame, slide) {\n if (!frame.dataset.booted) {\n frame.dataset.booted = '1';\n finderFrameReady = false;\n frame.addEventListener('load', () => {\n finderFrameReady = true;\n if (finderPending !== null && finderEl) {\n const p = finderPending;\n finderPending = null;\n finderPreviewSwap(frame, p);\n }\n }, { once: true });\n // faithful preview: carry the active theme (generated/custom travel as tokens)\n const name = currentTheme();\n const hash = '#/' + slide + '/0';\n const cand = customThemes[name] ? { name, tokens: customThemes[name] }\n : (genTheme && name === genTheme.name) ? genTheme : null;\n frame.src = location.pathname + (cand\n ? '?embedded&gen=' + b64uEncode(cand)\n : name ? '?embedded&theme=' + encodeURIComponent(name) : '?embedded') + hash;\n return;\n }\n if (!finderFrameReady) { finderPending = slide; return; }\n frame.contentWindow?.postMessage({ __decklightPreview: { goto: [slide, 0] } }, '*');\n }\n function selectFinderRow(i, immediate) {\n if (!finderMatches.length) return;\n finderSel = (i + finderMatches.length) % finderMatches.length;\n const rows = finderEl.querySelectorAll('.tp-row');\n rows.forEach((r, j) => r.classList.toggle('tp-selected', j === finderSel));\n rows[finderSel]?.scrollIntoView({ block: 'nearest' });\n const m = finderMatches[finderSel];\n finderEl.querySelector('.tp-caption').textContent = `slide ${m.slide} \u2014 ${m.title}`;\n clearTimeout(finderDebounce);\n const frame = finderEl.querySelector('iframe');\n if (immediate) finderPreviewSwap(frame, m.slide);\n else finderDebounce = setTimeout(() => finderPreviewSwap(frame, m.slide), 60);\n }\n function setFinderQuery(q) {\n finderQuery = q;\n renderFinderList();\n if (finderMatches.length) selectFinderRow(0, false);\n else finderEl.querySelector('.tp-caption').textContent = 'no match';\n }\n function commitFinder() {\n const m = finderMatches[finderSel];\n closeSlideFinder();\n if (m) instance.goto(m.slide, 0);\n }\n function openSlideFinder() {\n if (finderEl) return closeSlideFinder();\n if (pickerEl) closeThemePicker();\n finderQuery = '';\n finderEl = document.createElement('div');\n finderEl.className = 'decklight-theme-picker decklight-finder';\n finderEl.innerHTML =\n '<div class=\"tp-panel\">' +\n '<div class=\"tp-side\"><div class=\"tp-filter\"></div>' +\n '<div class=\"tp-list\" role=\"listbox\" aria-label=\"Slides\"></div></div>' +\n '<div class=\"tp-preview\"><iframe title=\"Slide preview\"></iframe>' +\n '<div class=\"tp-caption\"></div></div></div>';\n finderEl.__index = finderIndex();\n renderFinderList();\n finderEl.addEventListener('click', (e) => { if (e.target === finderEl) closeSlideFinder(); });\n root.appendChild(finderEl);\n selectFinderRow(Math.max(0, finderMatches.findIndex((m) => m.slide === instance.state.slide)), true);\n }\n function closeSlideFinder() {\n clearTimeout(finderDebounce);\n finderEl?.remove();\n finderEl = null;\n }\n\n // ----- command palette (/) \u2014 SPEC \u00A78 ---------------------------------------\n // A Claude-style palette: / lists every command with its shortcut, typing\n // filters, Enter runs. Commands with arguments drill into their own pickers\n // (theme, font, narration, module, slide finder). Text that matches no\n // command falls back to a \"search slides for \u2026\" row.\n let palEl = null, palSel = 0, palQuery = '', palRows = [];\n function paletteCommands() {\n const has = (fn) => typeof fn === 'function';\n const all = [\n { label: 'Find slide\u2026', hint: 'G', alias: 'search grep goto', run: () => { openSlideFinder(); if (palQuery) setFinderQuery(palQuery); } },\n { label: 'Go to slide\u2026', hint: '#', alias: 'goto', keepOpen: true, run: () => { palQuery = 'goto '; renderPalette(); } },\n { label: 'Theme\u2026', hint: 'T', run: openThemePicker },\n { label: 'Cycle theme', hint: ', \u00B7 .', run: () => cycleTheme(1) },\n { label: 'Generate a theme', hint: '\u2303T', run: rollTheme },\n genTheme && { label: 'Save the generated theme\u2026', hint: '\u2303\u21E7T', run: () => saveGeneratedTheme() },\n { label: 'Font\u2026', hint: '[ \u00B7 ]', run: openFontPicker },\n { label: `Narration ${narrating ? 'off' : 'on'}`, hint: 'V', run: toggleNarration },\n { label: 'Narration track\u2026', hint: 'N', alias: 'voice audio', run: () => openNarrPicker('tracks') },\n { label: 'Live voice\u2026', alias: 'tts synthesize tone gemini', run: () => openNarrPicker('voices') },\n { label: 'Record offline narration\u2026', hint: '\u21E7V', alias: 'export download batch wav tts', run: openRecordDialog },\n { label: 'Voice faster', hint: '>', alias: 'speed rate playback', run: () => changeNarrRate(+0.25) },\n { label: 'Voice slower', hint: '<', alias: 'speed rate playback', run: () => changeNarrRate(-0.25) },\n { label: 'Speaker view', hint: 'S', run: () => {\n const w = instance.__speakerWin;\n if (w && !w.closed) w.__decklightSpeakerToggle?.();\n else instance.__speakerWin = openSpeakerView(instance);\n } },\n { label: 'Overview', hint: 'O', run: toggleOverview },\n (playlist || hasMarkersDOM) && { label: 'Module\u2026', hint: 'M', run: toggleModuleMenu },\n { label: 'Blackout', hint: 'B', run: toggleBlackout },\n { label: 'Debug log', hint: 'D', alias: 'console events state', run: toggleDebug },\n { label: `Captions ${captionsOn ? 'off' : 'on'}`, hint: 'C', alias: 'cc subtitles closed caption', run: toggleCaptions },\n { label: 'Transcript\u2026', alias: 'notes script export text markdown spoken', run: toggleTranscript },\n { label: `Narration ${narrPaused ? 'resume' : 'pause'}`, hint: 'P', alias: 'pause resume voice', run: toggleNarrPause },\n { label: 'Edit speaker notes\u2026', hint: 'E', alias: 'edit mode notes write', run: toggleEditor },\n { label: 'Fullscreen', hint: 'F', run: () => toggleFullscreen() },\n { label: 'Print view (all slides, new tab)', hint: '', run: () => window.open(location.pathname + '?print') },\n { label: 'First slide', hint: 'Home', run: () => instance.goto(1, 0) },\n { label: 'Last slide', hint: 'End', run: () => instance.goto(instance.state.totalSlides, 0) },\n { label: 'Keyboard help', hint: '?', run: toggleHelp },\n ].filter(Boolean).filter((c) => has(c.run));\n return all;\n }\n function renderPalette() {\n const card = palEl.querySelector('.narr-card');\n card.textContent = '';\n const q = palQuery.toLowerCase();\n palRows = paletteCommands().filter((c) => !q || (c.label + ' ' + (c.alias ?? '')).toLowerCase().includes(q));\n // /goto with an inline argument: \"goto 27\" \u2014 or just \"27\" \u2014 jumps there\n const g = palQuery.trim().match(/^(?:goto\\s*)?(\\d+)$/i);\n if (g) {\n const n = Math.max(1, Math.min(parseInt(g[1], 10), instance.state.totalSlides));\n palRows.unshift({ label: `Go to slide ${n} / ${instance.state.totalSlides}`, hint: '\u23CE', run: () => instance.goto(n, 0) });\n }\n if (q && !g && !palRows.some((c) => c.label.toLowerCase().startsWith(q))) {\n // fallback: treat the text as a slide search\n palRows.push({ label: `Search slides for \u201C${palQuery}\u201D`, hint: '', run: () => { openSlideFinder(); setFinderQuery(palQuery); } });\n }\n const bar = document.createElement('div');\n bar.className = 'pal-input' + (palQuery ? ' tp-active' : '');\n bar.textContent = palQuery || 'type a command\u2026';\n card.appendChild(bar);\n palRows.forEach((c, i) => {\n const el = document.createElement('div');\n el.className = 'narr-row pal-row';\n const label = document.createElement('span');\n label.textContent = c.label;\n el.appendChild(label);\n if (c.hint) {\n const kbd = document.createElement('span');\n kbd.className = 'pal-kbd';\n kbd.textContent = c.hint;\n el.appendChild(kbd);\n }\n el.addEventListener('mouseenter', () => selectPalRow(i));\n el.addEventListener('click', () => { selectPalRow(i); commitPalRow(); });\n card.appendChild(el);\n });\n if (!palRows.length) {\n const none = document.createElement('div');\n none.className = 'tp-none';\n none.textContent = 'no matching command';\n card.appendChild(none);\n }\n selectPalRow(0);\n }\n function selectPalRow(i) {\n if (!palRows.length) return;\n palSel = (i + palRows.length) % palRows.length;\n palEl.querySelectorAll('.pal-row').forEach((r, j) => r.classList.toggle('narr-sel', j === palSel));\n palEl.querySelectorAll('.pal-row')[palSel]?.scrollIntoView({ block: 'nearest' });\n }\n function commitPalRow() {\n const cmd = palRows[palSel];\n if (!cmd) return;\n if (!cmd.keepOpen) closePalette();\n cmd.run();\n }\n function openPalette() {\n if (palEl) return closePalette();\n if (finderEl) closeSlideFinder();\n palQuery = '';\n palEl = document.createElement('div');\n palEl.className = 'decklight-narr decklight-palette';\n palEl.innerHTML = '<div class=\"narr-card\" role=\"listbox\" aria-label=\"Commands\"></div>';\n palEl.addEventListener('click', (e) => { if (e.target === palEl) closePalette(); });\n root.appendChild(palEl);\n renderPalette();\n }\n function closePalette() {\n palEl?.remove();\n palEl = null;\n }\n\n // font picker (palette drill-in): the [ / ] stacks as a list\n let fontPickEl = null, fontPickSel = 0;\n function openFontPicker() {\n if (fontPickEl) return closeFontPicker();\n fontPickEl = document.createElement('div');\n fontPickEl.className = 'decklight-narr decklight-font-picker';\n fontPickEl.innerHTML = '<div class=\"narr-card\" role=\"listbox\" aria-label=\"Fonts\"></div>';\n const card = fontPickEl.querySelector('.narr-card');\n FONTS.forEach(([name], i) => {\n const el = document.createElement('div');\n el.className = 'narr-row' + (i === fontIdx ? ' narr-cur' : '');\n el.textContent = name;\n if (i > 0) el.style.fontFamily = FONTS[i][1];\n el.addEventListener('mouseenter', () => selectFontRow(i));\n el.addEventListener('click', () => { applyFont(i); closeFontPicker(); });\n card.appendChild(el);\n });\n fontPickEl.addEventListener('click', (e) => { if (e.target === fontPickEl) closeFontPicker(); });\n root.appendChild(fontPickEl);\n selectFontRow(fontIdx);\n }\n function selectFontRow(i) {\n fontPickSel = (i + FONTS.length) % FONTS.length;\n fontPickEl.querySelectorAll('.narr-row').forEach((r, j) => r.classList.toggle('narr-sel', j === fontPickSel));\n fontPickEl.querySelectorAll('.narr-row')[fontPickSel]?.scrollIntoView({ block: 'nearest' });\n }\n function closeFontPicker() {\n fontPickEl?.remove();\n fontPickEl = null;\n }\n {\n // ?gen=<base64url {name, tokens}> applies a generated theme statelessly \u2014\n // the picker's preview mechanism for themes that have no file. Otherwise\n // ?theme=/saved choice as usual (saved may name a custom theme, which\n // applyTheme materializes from localStorage).\n const genParam = params.get('gen');\n let adopted = false;\n if (genParam) {\n try {\n const cand = b64uDecode(genParam);\n if (cand && cand.tokens) { adoptGenerated({ name: cand.name || 'gen-preview', tokens: cand.tokens }, true); adopted = true; }\n } catch { /* malformed param \u2014 fall through to normal theme resolution */ }\n }\n if (!adopted) {\n let saved = null;\n try { saved = localStorage.getItem(themeKey); } catch { /* ignore */ }\n const requested = params.get('theme') || saved;\n if (requested) applyTheme(requested, true);\n }\n }\n\n // ----- font cycling ([ / ]) \u2014 SPEC \u00A78 -------------------------------------\n // Curated system stacks (offline-safe, same rule as theme fonts \u00A75), applied\n // as inline custom properties on the root so they override any theme \u2014 link,\n // inline, or generated \u2014 and survive theme switching. Entry 0 restores the\n // theme's own type. The choice persists per deck path.\n const FONTS = [\n ['theme default', null],\n ['system sans', \"-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif\"],\n ['rounded', \"ui-rounded, 'SF Pro Rounded', 'Hiragino Maru Gothic ProN', Quicksand, Comfortaa, 'Arial Rounded MT Bold', Calibri, sans-serif\"],\n ['humanist', \"Seravek, 'Gill Sans Nova', Ubuntu, Calibri, 'DejaVu Sans', source-sans-pro, sans-serif\"],\n ['geometric', \"'Avenir Next', Avenir, Montserrat, Corbel, 'URW Gothic', source-sans-pro, sans-serif\"],\n ['classical serif', \"'Iowan Old Style', 'Palatino Linotype', Palatino, Georgia, serif\"],\n ['transitional serif', \"Charter, 'Bitstream Charter', 'Sitka Text', Cambria, Georgia, serif\"],\n ['slab serif', \"Rockwell, 'Rockwell Nova', 'Roboto Slab', 'DejaVu Serif', 'Sitka Small', serif\"],\n ['monospace', \"'SF Mono', SFMono-Regular, ui-monospace, 'Cascadia Code', Menlo, Consolas, monospace\"],\n ];\n const fontKey = 'decklight-font:' + location.pathname;\n let fontIdx = 0;\n function applyFont(i, { silent = false, remeasure = true } = {}) {\n fontIdx = ((i % FONTS.length) + FONTS.length) % FONTS.length;\n const [name, stack] = FONTS[fontIdx];\n if (stack) {\n root.style.setProperty('--font-body', stack);\n root.style.setProperty('--font-heading', stack);\n } else {\n root.style.removeProperty('--font-body');\n root.style.removeProperty('--font-heading');\n }\n if (!params.has('embedded')) {\n try {\n if (stack) localStorage.setItem(fontKey, String(fontIdx));\n else localStorage.removeItem(fontKey);\n } catch { /* private mode */ }\n }\n if (remeasure) {\n // type metrics changed: pinned titles and the overflow guardrail\n // re-derive from real measurements\n setupPinnedTitles(instance._sections, config);\n checkOverflow(instance._sections[instance.state.slide - 1], instance.state.slide);\n }\n if (!silent) toast(`font: ${name}`);\n debugLog('font', name);\n }\n function cycleFont(dir) { applyFont(fontIdx + dir); }\n try {\n // restore BEFORE the first sync so pinned titles measure the real font\n // (remeasure would touch the not-yet-created instance)\n const savedFont = parseInt(localStorage.getItem(fontKey), 10);\n if (savedFont > 0 && savedFont < FONTS.length) applyFont(savedFont, { silent: true, remeasure: false });\n } catch { /* ignore */ }\n\n // ----- brand logo (SPEC \u00A78) ------------------------------------------------\n // config.logo = { onLight, onDark, src?, height?, position? }: a mark shown\n // as chrome on every slide. onLight/onDark are the variants for light/dark\n // canvases \u2014 the engine reads the applied theme's real background luminance\n // and sets data-canvas on the root, so the right variant follows every\n // theme switch, generated themes included. Refs: '#id' clones an inline\n // element (bundle- and file://-safe), '<svg\u2026' is raw markup, anything else\n // is an <img> URL.\n function logoNode(ref) {\n if (!ref) return null;\n if (ref.startsWith('#')) {\n const src = document.querySelector(ref);\n if (!src) return null;\n const clone = src.cloneNode(true);\n clone.removeAttribute('id');\n clone.style.removeProperty('display');\n return clone;\n }\n if (ref.trim().startsWith('<')) {\n const tpl = document.createElement('div');\n tpl.innerHTML = ref;\n return tpl.firstElementChild;\n }\n const img = document.createElement('img');\n img.src = ref;\n img.alt = '';\n return img;\n }\n let logoEl = null; // built after stage setup \u2014 root children move into the stage\n // canvas polarity: luminance of the painted background (first gradient stop\n // for gradient canvases \u2014 computed styles serialize colors to rgb())\n function updateCanvas() {\n const cs = getComputedStyle(root);\n const rgb = (s) => s?.match(/rgba?\\(([\\d.]+)[,\\s]+([\\d.]+)[,\\s]+([\\d.]+)(?:[\\s,/]+([\\d.]+))?\\)/);\n let m = rgb(cs.backgroundColor);\n if (!m || (m[4] !== undefined && +m[4] === 0)) m = rgb(cs.backgroundImage);\n const dark = m ? luminance([+m[1], +m[2], +m[3]]) < 0.5 : false;\n root.setAttribute('data-canvas', dark ? 'dark' : 'light');\n }\n updateCanvas();\n // link-mode theme swaps load a stylesheet asynchronously \u2014 re-read then\n themeLink?.addEventListener('load', updateCanvas);\n\n // ----- stage & structure -------------------------------------------------\n let stage = root.querySelector(':scope > .decklight-stage');\n if (!stage) {\n stage = document.createElement('div');\n stage.className = 'decklight-stage';\n while (root.firstChild) stage.appendChild(root.firstChild);\n root.appendChild(stage);\n }\n stage.style.width = config.width + 'px';\n stage.style.height = config.height + 'px';\n\n // brand logo: chrome on the root (unscaled), so it must attach AFTER the\n // stage swallowed the deck's original children\n if (config.logo && (config.logo.src || config.logo.onLight || config.logo.onDark)) {\n logoEl = document.createElement('div');\n logoEl.className = 'decklight-logo';\n logoEl.setAttribute('data-pos', config.logo.position || 'bottom-left');\n if (config.logo.height) logoEl.style.setProperty('--logo-h', config.logo.height + 'px');\n for (const [key, cls] of [['src', 'on-any'], ['onLight', 'on-light'], ['onDark', 'on-dark']]) {\n const node = logoNode(config.logo[key]);\n if (!node) continue;\n const wrap = document.createElement('span');\n wrap.className = cls;\n wrap.appendChild(node);\n logoEl.appendChild(wrap);\n }\n root.appendChild(logoEl);\n }\n\n // hero logo: data-logo on a section prepends a larger in-flow copy of the\n // mark above the slide's content (module openers, cover slides). Optional\n // value = height in design px (default 96). Same on-light/on-dark variants,\n // toggled by the root's data-canvas like the corner chrome.\n function setupHeroLogos(sections) {\n if (!logoEl) return;\n sections.forEach((sec) => {\n if (!sec.hasAttribute('data-logo') || sec.querySelector(':scope > .decklight-hero-logo')) return;\n const hero = document.createElement('div');\n hero.className = 'decklight-hero-logo';\n const h = parseFloat(sec.getAttribute('data-logo'));\n if (h) hero.style.setProperty('--hero-logo-h', h + 'px');\n hero.innerHTML = logoEl.innerHTML;\n sec.prepend(hero);\n });\n }\n\n // ----- content pipeline --------------------------------------------------\n initMarkdown(stage);\n namespaceSvgIds(stage);\n initCode(stage, registerBuildProvider);\n\n const instance = {\n root, stage, config,\n _sections: [],\n _records: [],\n state: { slide: 1, step: 0, totalSlides: 0 },\n _listeners: new Map(),\n _scale: 1,\n\n on(type, fn) {\n if (!this._listeners.has(type)) this._listeners.set(type, new Set());\n this._listeners.get(type).add(fn);\n return this;\n },\n _emit(type, detail) {\n (this._listeners.get(type) || []).forEach((fn) => fn(detail));\n root.dispatchEvent(new CustomEvent('decklight:' + type, { detail }));\n },\n\n sync() {\n this._sections = [...stage.querySelectorAll(':scope > section')];\n this._sections.forEach((s, i) => s.setAttribute('data-slide-index', String(i + 1)));\n applyConcepts(stage, config.concepts); // idempotent; covers dynamic slides\n setupHeroLogos(this._sections); // idempotent; before pin measurement\n setupPinnedTitles(this._sections, config);\n this._records = this._sections.map((s) => scanSlide(s));\n this.state.totalSlides = this._sections.length;\n this.state.slide = Math.min(this.state.slide, this.state.totalSlides || 1);\n const rec = this._records[this.state.slide - 1];\n if (rec) this.state.step = Math.min(this.state.step, rec.groups.length);\n },\n\n _rescanFor(el) {\n const section = el.closest('section');\n const idx = this._sections.indexOf(section);\n if (idx === -1) return;\n this._records[idx] = scanSlide(section);\n if (printMode) { applyBuildState(this._records[idx], this._records[idx].groups.length); return; }\n if (idx === this.state.slide - 1) {\n // a late-registering provider grew this slide's step count: honor the\n // originally requested (deep-linked) step, then retire the request\n this.state.step = Math.min(this._requestedStep ?? this.state.step, this._records[idx].groups.length);\n this._requestedStep = null;\n withoutAnim(() => applyBuildState(this._records[idx], this.state.step));\n this._updateHash(false);\n } else {\n withoutAnim(() => applyBuildState(this._records[idx], 0));\n }\n this._notify();\n },\n\n _stepLabels(idx) {\n const rec = this._records[idx];\n return rec ? stepLabels(rec) : [];\n },\n\n next() {\n const rec = this._records[this.state.slide - 1];\n if (rec && this.state.step < rec.groups.length) {\n this.goto(this.state.slide, this.state.step + 1, { direction: 'fwd' });\n } else if (this.state.slide < this.state.totalSlides) {\n this.goto(this.state.slide + 1, 0, { direction: 'fwd' });\n } else {\n gotoModule(1); // playlist chaining; no-op on the last module\n }\n },\n prev() {\n if (this.state.step > 0) {\n this.goto(this.state.slide, this.state.step - 1, { direction: 'back' });\n } else if (this.state.slide > 1) {\n const prevRec = this._records[this.state.slide - 2];\n this.goto(this.state.slide - 1, prevRec.groups.length, { direction: 'back' });\n } else {\n gotoModule(-1); // playlist chaining; no-op on the first module\n }\n },\n\n goto(slide, step = 0, opts = {}) {\n slide = Math.max(1, Math.min(slide, this.state.totalSlides));\n const rec = this._records[slide - 1];\n // Remember the PRE-clamp request: build providers (terminal casts)\n // register asynchronously after init, and a deep-linked step on their\n // slide would otherwise be clamped to 0 before they exist and lost.\n // _rescanFor re-clamps from this once the provider lands.\n this._requestedStep = step;\n step = Math.max(0, Math.min(step, rec ? rec.groups.length : 0));\n const sameSlide = slide === this.state.slide;\n if (sameSlide && step === this.state.step && !opts.force) return;\n\n const direction = opts.direction || (slide > this.state.slide ||\n (sameSlide && step > this.state.step) ? 'fwd' : 'back');\n\n if (!sameSlide || opts.force) {\n this._activateSlide(slide, direction, opts);\n this.state.slide = slide;\n this.state.step = step;\n withoutAnim(() => applyBuildState(rec, step));\n this._emit('slide', { slide, total: this.state.totalSlides, direction });\n requestAnimationFrame(() => checkOverflow(this._sections[slide - 1], slide));\n } else {\n this.state.step = step;\n applyBuildState(rec, step);\n this._emit('build', { slide, index: step, total: rec.groups.length, direction });\n }\n this._updateChrome();\n this._updateHash(!sameSlide);\n this._notify();\n },\n\n _activateSlide(slide, direction, opts = {}) {\n const from = this._sections[this.state.slide - 1];\n const to = this._sections[slide - 1];\n // hero-logo slides carry their own large mark \u2014 hide the corner chrome\n root.classList.toggle('has-hero-logo', to?.hasAttribute('data-logo') ?? false);\n if (from === to) { to.classList.add('active'); return; }\n const initial = !from || !from.classList.contains('active');\n\n const autoAnim = from && to && !initial &&\n from.hasAttribute('data-auto-animate') && to.hasAttribute('data-auto-animate') &&\n Math.abs(this._sections.indexOf(to) - this._sections.indexOf(from)) === 1;\n\n this._sections.forEach((s) => s.classList.remove(\n 'active', 'entering', 'leaving', 'dir-fwd', 'dir-back',\n 'tr-none', 'tr-fade', 'tr-slide', 'tr-scale', 'tr-flip'));\n to.classList.add('active');\n\n if (initial || printMode) return;\n\n if (autoAnim) {\n // runAutoAnimate's contract: BOTH sections laid out while it measures.\n // The class sweep above display:none'd the outgoing slide, which made\n // every \"from\" rect 0\u00D70 \u2014 the FLIP started from a singular scale(0)\n // matrix (no visible move, degenerate interpolation). Keep `from`\n // laid out but unpainted for the synchronous measurement, and measure\n // the destination before it paints.\n from.classList.add('leaving');\n from.style.visibility = 'hidden';\n to.style.visibility = 'hidden';\n void to.offsetWidth;\n to.style.visibility = '';\n runAutoAnimate(from, to, this._scale);\n from.classList.remove('leaving');\n from.style.visibility = '';\n return;\n }\n\n const name = to.getAttribute('data-transition') || this.config.transition;\n if (name === 'none') return;\n const dir = 'dir-' + direction;\n to.classList.add('entering', 'tr-' + name, dir);\n from.classList.add('leaving', 'tr-' + name, dir, 'active-out');\n const ms = parseFloat(getComputedStyle(to).getPropertyValue('--transition-duration')) * 1000 || 350;\n setTimeout(() => {\n from.classList.remove('leaving', 'tr-' + name, dir, 'active-out');\n to.classList.remove('entering', 'tr-' + name, dir);\n }, ms + 60);\n },\n\n _updateChrome() {\n if (progressBar) {\n const rec = this._records[this.state.slide - 1];\n const stepsTotal = rec ? rec.groups.length : 0;\n const frac = this.state.totalSlides <= 1 ? 1 :\n ((this.state.slide - 1) + (stepsTotal ? this.state.step / (stepsTotal + 1) : 0)) /\n (this.state.totalSlides - 1);\n progressBar.style.width = (Math.min(frac, 1) * 100).toFixed(2) + '%';\n }\n if (slideNumEl) {\n const num = !this.config.slideNumber ? ''\n : this.config.slideNumber === 'n/N'\n ? `${this.state.slide} / ${this.state.totalSlides}` : String(this.state.slide);\n slideNumEl.textContent = num;\n if (hasMarkersDOM || playlist) {\n const markers = hasMarkersDOM ? inFileMarkers() : null;\n const title = markers\n ? (markers[currentMarkerIndex(markers)]?.title || '')\n : (playlist.modules[playlistIndex]?.title || '');\n const mod = document.createElement('span');\n mod.className = 'mod';\n mod.textContent = title;\n slideNumEl.prepend(mod);\n }\n }\n },\n\n _updateHash(pushSlide) {\n if (!this.config.hash || printMode) return;\n const h = `#/${this.state.slide}/${this.state.step}`;\n if (('#' + hashOf(location.hash)) === h) return;\n suppressHashChange = true;\n if (pushSlide) history.pushState(null, '', h);\n else history.replaceState(null, '', h);\n setTimeout(() => { suppressHashChange = false; });\n },\n\n _notify() {\n if (this.__notifySpeaker) this.__notifySpeaker();\n },\n };\n\n // ----- helpers -----------------------------------------------------------\n function withoutAnim(fn) {\n root.classList.add('decklight-no-anim');\n fn();\n void root.offsetWidth;\n root.classList.remove('decklight-no-anim');\n }\n\n function hashOf(h) {\n return (h || '').replace(/^#/, '');\n }\n\n function parseHash() {\n const m = hashOf(location.hash).match(/^\\/(\\d+)(?:\\/(\\d+))?/);\n if (!m) return null;\n return { slide: parseInt(m[1], 10), step: m[2] ? parseInt(m[2], 10) : 0 };\n }\n\n // ----- chrome ------------------------------------------------------------\n let progressBar = null;\n let slideNumEl = null;\n if (config.controls && !printMode) {\n const controls = document.createElement('div');\n controls.className = 'decklight-controls';\n controls.innerHTML = `\n <button class=\"decklight-arrow prev\" aria-label=\"Previous\">\u2039</button>\n <button class=\"decklight-arrow next\" aria-label=\"Next\">\u203A</button>`;\n root.appendChild(controls);\n controls.querySelector('.prev').addEventListener('click', () => instance.prev());\n controls.querySelector('.next').addEventListener('click', () => instance.next());\n const progress = document.createElement('div');\n progress.className = 'decklight-progress';\n progress.innerHTML = '<div class=\"bar\"></div>';\n root.appendChild(progress);\n progressBar = progress.querySelector('.bar');\n }\n\n // Touch chrome (mounted after narration is set up, below): phones and\n // tablets have no keyboard, so surface the two controls a presenter needs\n // there \u2014 fullscreen and sound (narration on/off). CSS shows the cluster\n // only on pointer:coarse; desktop keeps F and V.\n const TC_ICON = {\n full: '<svg viewBox=\"0 0 24 24\" width=\"22\" height=\"22\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M4 9V4h5M20 9V4h-5M4 15v5h5M20 15v5h-5\"/></svg>',\n unfull: '<svg viewBox=\"0 0 24 24\" width=\"22\" height=\"22\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M9 4v5H4M15 4v5h5M9 20v-5H4M15 20v-5h5\"/></svg>',\n sound: '<svg viewBox=\"0 0 24 24\" width=\"22\" height=\"22\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M11 5 6 9H3v6h3l5 4z\"/><path d=\"M15.5 8.5a5 5 0 0 1 0 7\"/><path d=\"M18.5 5.5a9 9 0 0 1 0 13\"/></svg>',\n mute: '<svg viewBox=\"0 0 24 24\" width=\"22\" height=\"22\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M11 5 6 9H3v6h3l5 4z\"/><path d=\"M17 10l5 4M22 10l-5 4\"/></svg>',\n };\n let fsBtn = null, soundBtn = null;\n function toggleFullscreen() {\n const el = root || document.documentElement;\n if (document.fullscreenElement) document.exitFullscreen?.();\n else el.requestFullscreen?.()?.catch?.(() => {});\n }\n document.addEventListener('fullscreenchange', () => {\n if (fsBtn) fsBtn.innerHTML = document.fullscreenElement ? TC_ICON.unfull : TC_ICON.full;\n });\n function syncSoundBtn() {\n if (!soundBtn) return;\n soundBtn.innerHTML = narrating ? TC_ICON.sound : TC_ICON.mute;\n soundBtn.setAttribute('aria-label', narrating ? 'Mute narration' : 'Play narration');\n soundBtn.setAttribute('aria-pressed', String(narrating));\n }\n\n if ((config.slideNumber || playlist || hasMarkersDOM) && !printMode) {\n slideNumEl = document.createElement('div');\n slideNumEl.className = 'decklight-slide-number';\n if (playlist || hasMarkersDOM) {\n slideNumEl.title = 'M \u2014 module menu';\n slideNumEl.style.cursor = 'pointer';\n slideNumEl.addEventListener('click', () => toggleModuleMenu());\n }\n root.appendChild(slideNumEl);\n }\n\n // ----- overview / blackout / help ---------------------------------------\n let overviewEl = null, ovSel = 0;\n function ovColumns() {\n return getComputedStyle(overviewEl).gridTemplateColumns.split(' ').length || 1;\n }\n function ovSelect(i) {\n const cells = overviewEl.querySelectorAll('.ov-cell');\n ovSel = Math.max(0, Math.min(i, cells.length - 1));\n cells.forEach((c, j) => c.classList.toggle('ov-selected', j === ovSel));\n cells[ovSel]?.scrollIntoView({ block: 'nearest' });\n }\n function ovCommit() {\n const target = ovSel + 1;\n toggleOverview();\n instance.goto(target, 0, { force: true });\n }\n function layoutOverview() {\n // Minify each design-resolution frame to fit its grid cell. Rows are set\n // here from the resolved column width (16:9): CSS-only intrinsic sizing\n // (aspect-ratio, %-padding) contributes nothing to auto rows and collapses.\n if (!overviewEl) return;\n const cell = overviewEl.querySelector('.ov-cell');\n if (!cell) return;\n overviewEl.style.gridAutoRows = Math.round(cell.clientWidth * config.height / config.width) + 'px';\n const scale = cell.clientWidth / config.width;\n overviewEl.querySelectorAll('.ov-frame').forEach((f) => {\n f.style.transform = `scale(${scale})`;\n });\n }\n function toggleOverview() {\n if (overviewEl) {\n window.removeEventListener('resize', layoutOverview);\n overviewEl.remove(); overviewEl = null;\n root.classList.remove('decklight-overview');\n return;\n }\n overviewEl = document.createElement('div');\n overviewEl.className = 'decklight-overview-grid';\n instance._sections.forEach((s, i) => {\n const cell = document.createElement('div');\n cell.className = 'ov-cell' + (i === instance.state.slide - 1 ? ' ov-current' : '');\n const frame = document.createElement('div');\n frame.className = 'ov-frame';\n frame.style.width = config.width + 'px';\n frame.style.height = config.height + 'px';\n const clone = s.cloneNode(true);\n clone.classList.add('active', 'ov-clone');\n clone.querySelectorAll('aside.notes, aside.rehearse').forEach((a) => a.remove());\n // Cloned radios share the original's group (same name, same document):\n // inserting a checked clone UNCHECKS the live slide's input. Detach\n // and inert them \u2014 the overview is a picture, not a form.\n clone.querySelectorAll('input, button, select, textarea').forEach((inp) => {\n inp.removeAttribute('name');\n inp.disabled = true;\n });\n frame.appendChild(clone);\n cell.appendChild(frame);\n const num = document.createElement('span');\n num.className = 'ov-num';\n num.textContent = String(i + 1);\n cell.appendChild(num);\n cell.addEventListener('click', () => { toggleOverview(); instance.goto(i + 1, 0, { force: true }); });\n overviewEl.appendChild(cell);\n });\n root.classList.add('decklight-overview');\n root.appendChild(overviewEl);\n layoutOverview();\n ovSelect(instance.state.slide - 1);\n window.addEventListener('resize', layoutOverview);\n }\n\n // ----- module menu (playlist or in-file markers) ---------------------------\n let moduleMenuEl = null, mmSel = 0, mmMode = null;\n function mmSelect(i) {\n const rows = moduleMenuEl.querySelectorAll('.mm-row');\n mmSel = Math.max(0, Math.min(i, rows.length - 1));\n rows.forEach((r, j) => r.classList.toggle('mm-selected', j === mmSel));\n rows[mmSel]?.scrollIntoView({ block: 'nearest' });\n }\n function mmCommit(i) {\n if (mmMode.useMarkers) {\n const target = mmMode.markers[i];\n toggleModuleMenu();\n if (target) instance.goto(target.slide, 0, { force: true });\n } else if (i === playlistIndex) {\n toggleModuleMenu();\n } else {\n navigateToModule(i);\n }\n }\n function toggleModuleMenu() {\n if (moduleMenuEl) { moduleMenuEl.remove(); moduleMenuEl = null; mmMode = null; return; }\n const markers = inFileMarkers();\n const useMarkers = markers.length > 0; // in-file mode wins over playlist\n if (!useMarkers && !playlist) return;\n mmMode = { useMarkers, markers };\n const entries = useMarkers ? markers : playlist.modules;\n const curIdx = useMarkers ? Math.max(0, currentMarkerIndex(markers)) : playlistIndex;\n moduleMenuEl = document.createElement('div');\n moduleMenuEl.className = 'decklight-module-menu';\n moduleMenuEl.innerHTML =\n '<div class=\"mm-panel\"><div class=\"mm-title\">Modules</div>' +\n '<div class=\"mm-list\" role=\"listbox\" aria-label=\"Modules\"></div></div>';\n const listBox = moduleMenuEl.querySelector('.mm-list');\n entries.forEach((m, i) => {\n const row = document.createElement('div');\n row.className = 'mm-row' + (i === curIdx ? ' mm-current' : '');\n row.setAttribute('role', 'option');\n row.textContent = m.title;\n row.addEventListener('mouseenter', () => mmSelect(i));\n row.addEventListener('click', () => mmCommit(i));\n listBox.appendChild(row);\n });\n moduleMenuEl.addEventListener('click', (e) => { if (e.target === moduleMenuEl) toggleModuleMenu(); });\n root.appendChild(moduleMenuEl);\n mmSelect(curIdx);\n }\n\n let blackoutEl = null;\n function toggleBlackout() {\n if (blackoutEl) { blackoutEl.remove(); blackoutEl = null; return; }\n blackoutEl = document.createElement('div');\n blackoutEl.className = 'decklight-blackout';\n root.appendChild(blackoutEl);\n }\n\n let helpEl = null;\n // ----- debug log window (D) \u2014 UI over the ring buffer declared up top -----\n function debugStateLine() {\n const rec = instance._records?.[instance.state.slide - 1];\n const narrWhat = narrSet?.live\n ? `\u26A1 ${liveCfg.voice} \u00B7 ${liveCfg.tone}`\n : (narrSet ? `\uD83D\uDD0A ${narrSet.label}` : 'none');\n return `slide ${instance.state.slide}/${instance.state.totalSlides}`\n + ` \u00B7 step ${instance.state.step}/${rec ? rec.groups.length : 0}`\n + ` \u00B7 theme ${currentTheme() ?? '\u2014'}`\n + ` \u00B7 narration ${narrating ? (narrPaused ? 'paused' : 'on') : 'off'} (${narrWhat})`\n + (narrRate !== 1 ? ` \u00B7 ${narrRate}\u00D7` : '')\n + (ttsSpend > 0 ? ` \u00B7 tts ~$${ttsSpend.toFixed(4)}` : '');\n }\n function appendDebugRow(e) {\n const row = document.createElement('div');\n row.className = 'dbg-row dbg-' + e.kind;\n for (const [cls, text] of [['dbg-t', e.t], ['dbg-k', e.kind], ['dbg-m', e.msg]]) {\n const span = document.createElement('span');\n span.className = cls;\n span.textContent = text;\n row.appendChild(span);\n }\n debugEl.querySelector('.dbg-log').appendChild(row);\n }\n function updateDebugState() {\n const el = debugEl?.querySelector('.dbg-state');\n if (el) el.textContent = debugStateLine();\n }\n function toggleDebug() {\n if (debugEl) { debugEl.remove(); debugEl = null; return; }\n debugEl = document.createElement('div');\n debugEl.className = 'decklight-debug';\n debugEl.innerHTML = '<div class=\"dbg-head\">debug log \u2014 D closes</div><div class=\"dbg-state\"></div><div class=\"dbg-log\"></div>';\n root.appendChild(debugEl);\n debugBuf.forEach(appendDebugRow);\n updateDebugState();\n const log = debugEl.querySelector('.dbg-log');\n log.scrollTop = log.scrollHeight;\n }\n // feed the log: engine events + page errors (theme/font/narration log at\n // their call sites). The panel is passive chrome \u2014 keys keep driving the\n // deck while it's open, so you can watch events land as you navigate.\n instance.on('ready', (e) => debugLog('ready', `${e.slides} slides${e.print ? ' \u00B7 print' : ''}`));\n instance.on('slide', (e) => { debugLog('slide', `\u2192 ${e.slide}/${e.total} (${e.direction})`); updateDebugState(); });\n instance.on('build', (e) => { debugLog('build', `slide ${e.slide} step ${e.index}/${e.total} (${e.direction})`); updateDebugState(); });\n window.addEventListener('error', (e) => debugLog('error', String(e.message)));\n\n function toggleHelp() {\n if (helpEl) { helpEl.remove(); helpEl = null; return; }\n helpEl = document.createElement('div');\n helpEl.className = 'decklight-help';\n helpEl.innerHTML = `<div class=\"help-card\"><h3>Keyboard</h3><table>\n <tr><td>\u2192 / Space</td><td>next build / slide</td></tr>\n <tr><td>\u2190</td><td>previous</td></tr>\n <tr><td>Home / End</td><td>first / last slide</td></tr>\n <tr><td>O</td><td>overview</td></tr>\n <tr><td>S</td><td>speaker view (again: rehearse mode)</td></tr>\n <tr><td>V</td><td>narration on/off</td></tr>\n <tr><td>N</td><td>narration track</td></tr>\n <tr><td>\u21E7V</td><td>record offline narration (live voice)</td></tr>\n <tr><td>< / ></td><td>voice speed (0.25\u00D7 steps)</td></tr>\n <tr><td>B</td><td>blackout</td></tr>\n <tr><td>D</td><td>debug log</td></tr>\n <tr><td>C</td><td>captions (follow the voice)</td></tr>\n <tr><td>P</td><td>pause / resume narration</td></tr>\n <tr><td>F</td><td>fullscreen</td></tr>\n <tr><td>T</td><td>theme picker (type to filter)</td></tr>\n <tr><td>/</td><td>command palette (find, themes, everything)</td></tr>\n <tr><td>G</td><td>slide finder (live preview)</td></tr>\n <tr><td>E</td><td>edit speaker notes (decklight edit server)</td></tr>\n <tr><td>, / .</td><td>cycle theme</td></tr>\n <tr><td>[ / ]</td><td>cycle font</td></tr>\n <tr><td>\u2303T</td><td>generate a theme (repeat to re-roll)</td></tr>\n <tr><td>\u2303\u21E7T</td><td>save the generated theme</td></tr>\n ${(playlist || hasMarkersDOM) ? '<tr><td>M</td><td>module menu</td></tr>' : ''}\n <tr><td>?</td><td>this help</td></tr></table></div>`;\n helpEl.addEventListener('click', toggleHelp);\n root.appendChild(helpEl);\n }\n\n // ----- input -------------------------------------------------------------\n function onKey(e) {\n if (/^(input|textarea|select)$/i.test(e.target.tagName)) return;\n // \u2303T generates, \u2303\u21E7T saves \u2014 both must precede the modifier early-return\n // (macOS tab shortcuts are \u2318-based, so Ctrl reaches the page; on\n // Windows/Linux the browser owns Ctrl+T and these can't be intercepted).\n if (e.ctrlKey && !e.metaKey && !e.altKey && (e.key === 'T' || e.key === 't')) {\n if (e.shiftKey) saveGeneratedTheme();\n else if (pickerEl && pickerEntries[pickerSel] === GEN_ROW) rollPickerCandidate();\n else rollTheme();\n e.preventDefault();\n return;\n }\n if (e.metaKey || e.ctrlKey || e.altKey) return;\n if (pickerEl) {\n switch (e.key) {\n case 'ArrowDown': selectPickerRow(pickerSel + 1, false); break;\n case 'ArrowUp': selectPickerRow(pickerSel - 1, false); break;\n case 'Enter': commitPicker(); break;\n case 'Backspace': setPickerFilter(pickerFilter.slice(0, -1)); break;\n case 'Escape':\n if (pickerFilter) setPickerFilter('');\n else if (PACKS && pickerView !== 'packs') setPickerView('packs');\n else closeThemePicker();\n break;\n default:\n // quick filter: printable keys type into it \u2014 which is why there\n // are no letter shortcuts in here (\u2303T re-rolls, Esc closes)\n if (e.key.length === 1 && /[a-z0-9-]/i.test(e.key)) { setPickerFilter(pickerFilter + e.key); break; }\n return;\n }\n e.preventDefault();\n return;\n }\n if (palEl) {\n switch (e.key) {\n case 'ArrowDown': selectPalRow(palSel + 1); break;\n case 'ArrowUp': selectPalRow(palSel - 1); break;\n case 'Enter': commitPalRow(); break;\n case 'Backspace': palQuery = palQuery.slice(0, -1); renderPalette(); break;\n case 'Escape': if (palQuery) { palQuery = ''; renderPalette(); } else closePalette(); break;\n default:\n if (e.key.length === 1) { palQuery += e.key; renderPalette(); break; }\n return;\n }\n e.preventDefault();\n return;\n }\n if (fontPickEl) {\n switch (e.key) {\n case 'ArrowDown': selectFontRow(fontPickSel + 1); break;\n case 'ArrowUp': selectFontRow(fontPickSel - 1); break;\n case 'Enter': applyFont(fontPickSel); closeFontPicker(); break;\n case 'Escape': closeFontPicker(); break;\n default: return;\n }\n e.preventDefault();\n return;\n }\n if (transcriptEl) {\n if (e.key === 'Escape') { toggleTranscript(); e.preventDefault(); }\n return; // a reading surface \u2014 trap navigation while it's up\n }\n if (editEl) {\n if (e.key === 'Escape') { toggleEditor(); e.preventDefault(); }\n return; // typing surface \u2014 the textarea handles its own keys\n }\n if (recEl) {\n if (e.key === 'Escape') closeRecordDialog();\n else if (e.key === 'Enter') {\n if (recView === 'confirm') startRecording();\n else if (recView !== 'progress') closeRecordDialog();\n } else return;\n e.preventDefault();\n return;\n }\n if (narrEl) {\n if (narrView === 'custom') {\n if (e.key === 'Enter') { commitCustomTone(); e.preventDefault(); }\n else if (e.key === 'Escape') { narrBack(); e.preventDefault(); }\n return; // everything else types into the input\n }\n switch (e.key) {\n case 'ArrowDown': selectNarrRow(narrSel + 1); break;\n case 'ArrowUp': selectNarrRow(narrSel - 1); break;\n case 'Enter': commitNarrRow(); break;\n case 'Escape': narrBack(); break;\n case 'n': case 'N': closeNarrPicker(); break;\n default: return;\n }\n e.preventDefault();\n return;\n }\n if (finderEl) {\n switch (e.key) {\n case 'ArrowDown': selectFinderRow(finderSel + 1, false); break;\n case 'ArrowUp': selectFinderRow(finderSel - 1, false); break;\n case 'Enter': commitFinder(); break;\n case 'Backspace': setFinderQuery(finderQuery.slice(0, -1)); break;\n case 'Escape': if (finderQuery) setFinderQuery(''); else closeSlideFinder(); break;\n default:\n if (e.key.length === 1) { setFinderQuery(finderQuery + e.key); break; }\n return;\n }\n e.preventDefault();\n return;\n }\n if (moduleMenuEl) {\n switch (e.key) {\n case 'ArrowDown': mmSelect(mmSel + 1); break;\n case 'ArrowUp': mmSelect(mmSel - 1); break;\n case 'Enter': mmCommit(mmSel); break;\n case 'Escape': case 'm': case 'M': toggleModuleMenu(); break;\n default: return;\n }\n e.preventDefault();\n return;\n }\n if (overviewEl) {\n switch (e.key) {\n case 'ArrowRight': ovSelect(ovSel + 1); break;\n case 'ArrowLeft': ovSelect(ovSel - 1); break;\n case 'ArrowDown': ovSelect(ovSel + ovColumns()); break;\n case 'ArrowUp': ovSelect(ovSel - ovColumns()); break;\n case 'Enter': case ' ': ovCommit(); break;\n case 'o': case 'O': case 'Escape': toggleOverview(); break;\n default: return;\n }\n e.preventDefault();\n return;\n }\n switch (e.key) {\n case 'ArrowRight': case ' ': case 'PageDown': instance.next(); break;\n case 'ArrowLeft': case 'PageUp': instance.prev(); break;\n case 'Home': instance.goto(1, 0); break;\n case 'End': instance.goto(instance.state.totalSlides, 0); break;\n case 'o': case 'O': toggleOverview(); break;\n case 'b': case 'B': toggleBlackout(); break;\n case 'd': case 'D': toggleDebug(); break;\n case 'c': case 'C': toggleCaptions(); break;\n case 'p': case 'P': toggleNarrPause(); break;\n // G = go/grep \u2014 a direct slide-finder key. Deliberately NOT \u2318F:\n // browser find is sacred, and / already belongs to the palette.\n case 'g': case 'G': openSlideFinder(); break;\n case 'e': case 'E': toggleEditor(); break;\n case 'f': case 'F': toggleFullscreen(); break;\n case 'v': case 'V': if (e.shiftKey) openRecordDialog(); else toggleNarration(); break;\n case 'n': case 'N': openNarrPicker(); break;\n case 's': case 'S': {\n // first S opens the speaker view; S again toggles speak \u21C4 rehearse\n const w = instance.__speakerWin;\n if (w && !w.closed) w.__decklightSpeakerToggle?.();\n else instance.__speakerWin = openSpeakerView(instance);\n break;\n }\n case 't': case 'T': openThemePicker(); break;\n case '/': openPalette(); break;\n case '.': cycleTheme(1); break;\n case ',': cycleTheme(-1); break;\n case '>': changeNarrRate(+0.25); break; // youtube's \u21E7>\n case '<': changeNarrRate(-0.25); break; // youtube's \u21E7<\n case ']': cycleFont(1); break;\n case '[': cycleFont(-1); break;\n case 'm': case 'M': if (!playlist && !hasMarkersDOM) return; toggleModuleMenu(); break;\n case '?': toggleHelp(); break;\n case 'Escape':\n if (cancelCyclePending()) break;\n if (overviewEl) toggleOverview();\n break;\n default: return;\n }\n e.preventDefault();\n }\n if (!printMode) document.addEventListener('keydown', onKey);\n\n let touchX = null;\n root.addEventListener('touchstart', (e) => { touchX = e.touches[0].clientX; }, { passive: true });\n root.addEventListener('touchend', (e) => {\n if (touchX == null) return;\n const dx = e.changedTouches[0].clientX - touchX;\n if (Math.abs(dx) > 40) (dx < 0 ? instance.next() : instance.prev());\n touchX = null;\n }, { passive: true });\n\n // ----- scaling -----------------------------------------------------------\n function rescale() {\n const box = root.getBoundingClientRect();\n const s = Math.min(box.width / config.width, box.height / config.height) || 1;\n instance._scale = s;\n stage.style.transform = `translate(-50%, -50%) scale(${s})`;\n }\n if (!printMode) {\n new ResizeObserver(rescale).observe(root);\n rescale();\n }\n\n // ----- hash --------------------------------------------------------------\n let suppressHashChange = false;\n if (config.hash && !printMode) {\n window.addEventListener('hashchange', () => {\n if (suppressHashChange) return;\n const t = parseHash();\n if (t) instance.goto(t.slide, t.step, { force: true });\n });\n }\n\n // ----- go ----------------------------------------------------------------\n instance.sync();\n\n // Print stacks slides as pages; root-level chrome would appear once. Give\n // every printed slide its own copy of the brand mark (hero slides already\n // carry a large one \u2014 no doubling).\n if (printMode && logoEl) {\n instance._sections.forEach((s) => {\n if (!s.hasAttribute('data-logo')) s.appendChild(logoEl.cloneNode(true));\n });\n logoEl.remove();\n }\n\n // Webfonts can change a pinned title's wrap/height after the first\n // measurement \u2014 re-measure once the font set settles.\n document.fonts?.ready?.then(() => {\n if (activeInstance === instance || !activeInstance) {\n setupPinnedTitles(instance._sections, config);\n }\n });\n\n instance.theme = (name) => applyTheme(name);\n instance.themePicker = { open: openThemePicker, close: closeThemePicker };\n instance.generateTheme = rollTheme; // \u2303T, programmatic\n instance.cycleFont = cycleFont; // [ / ], programmatic (\u00B11)\n instance.toggleNarration = toggleNarration; // V, programmatic\n\n // \u2500\u2500 narration (V) + picker (N) \u2014 SPEC \u00A78 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n // Two sources, one V toggle. RECORDED: pre-rendered per-slide audio\n // (tools/voiceover.mjs, or \u21E7V below; config.narration.files = '<dir>' or\n // [{ label, dir, ext }, \u2026] \u2014 ext defaults to 'm4a', \u21E7V recordings are\n // 'wav'). LIVE: synthesized on the fly per slide through the local bridge\n // (`decklight tts`) \u2014 pick a Gemini voice and a delivery tone in the\n // picker; responses are cached per (slide, voice, style) and the next\n // slide is prefetched while the current one plays. N opens the picker\n // (tracks \u2192 voices \u2192 tones \u2192 custom-tone input); choice persists per deck.\n // \u21E7V, live voice only: downloads every slide's narration as slide-NN.wav\n // STITCHED FROM THE SENTENCE CACHE (already-heard clips are free; only\n // unheard sentences synthesize), so the deck can later run RECORDED with\n // that set instead of depending on the bridge.\n const narrKey = 'decklight-narration:' + location.pathname;\n const LIVE_URL = config.narration?.liveUrl ?? 'http://127.0.0.1:8787/tts';\n // keep in sync with tools/gemini-tts.mjs GEMINI_VOICES\n const GEMINI_VOICES = [\n ['Zephyr', 'bright'], ['Puck', 'upbeat'], ['Charon', 'informative'],\n ['Kore', 'firm'], ['Fenrir', 'excitable'], ['Leda', 'youthful'],\n ['Orus', 'firm'], ['Aoede', 'breezy'], ['Callirrhoe', 'easy-going'],\n ['Autonoe', 'bright'], ['Enceladus', 'breathy'], ['Iapetus', 'clear'],\n ['Umbriel', 'easy-going'], ['Algieba', 'smooth'], ['Despina', 'smooth'],\n ['Erinome', 'clear'], ['Algenib', 'gravelly'], ['Rasalgethi', 'informative'],\n ['Laomedeia', 'upbeat'], ['Achernar', 'soft'], ['Alnilam', 'firm'],\n ['Schedar', 'even'], ['Gacrux', 'mature'], ['Pulcherrima', 'forward'],\n ['Achird', 'friendly'], ['Zubenelgenubi', 'casual'], ['Vindemiatrix', 'gentle'],\n ['Sadachbia', 'lively'], ['Sadaltager', 'knowledgeable'], ['Sulafat', 'warm'],\n ];\n const TONES = [\n // single directive clauses: instruction-shaped text steers; persona\n // sentences (\"You're a\u2026\") can stochastically be read aloud\n ['Warm senior engineer', 'Read in a warm, welcoming tone, like a friendly battle-hardened senior engineer who is still curious about new technology.'],\n ['Professional', 'Read in a clear, professional tone \u2014 measured, confident, and articulate.'],\n ['Too serious', 'Read in an extremely grave, deadly serious tone, as if announcing news of the utmost importance.'],\n ['Joyful', 'Read in a joyful, light-hearted tone, smiling through every sentence.'],\n ['Super excited', 'Read in a super-excited, high-energy tone, barely containing your enthusiasm.'],\n ['Sad', 'Read in a somber, melancholic tone, on the verge of a sigh.'],\n ];\n const narrSets = (() => {\n const f = config.narration?.files;\n if (!f) return [];\n return Array.isArray(f) ? f : [{ label: 'Narration', dir: f }];\n })();\n const LIVE_TRACK = { live: true };\n let liveCfg = { voice: 'Alnilam', tone: TONES[0][0], style: TONES[0][1] };\n let narrSet = narrSets[0] ?? null;\n try {\n const saved = JSON.parse(localStorage.getItem(narrKey));\n if (saved?.live?.voice) { liveCfg = saved.live; narrSet = LIVE_TRACK; }\n else { const hit = narrSets.find((t) => t.dir === saved?.dir); if (hit) narrSet = hit; }\n } catch { /* ignore */ }\n let narrating = false, narrAudio = null, liveWarned = false;\n // voice speed \u2014 YouTube's \u21E7< / \u21E7> in 0.25\u00D7 steps, clamped 0.25\u20132\u00D7,\n // persisted per deck; applies to live and recorded narration alike\n const narrRateKey = 'decklight-narr-rate:' + location.pathname;\n let narrRate = 1;\n try {\n const v = parseFloat(localStorage.getItem(narrRateKey) ?? '');\n if (v >= 0.25 && v <= 2) narrRate = v;\n } catch { /* ignore */ }\n function changeNarrRate(delta) {\n narrRate = Math.round(Math.min(2, Math.max(0.25, narrRate + delta)) * 100) / 100;\n try { localStorage.setItem(narrRateKey, String(narrRate)); } catch { /* ignore */ }\n if (narrAudio) narrAudio.playbackRate = narrRate;\n toast(`voice speed ${narrRate}\u00D7`);\n debugLog('narr', `rate ${narrRate}\u00D7`);\n updateDebugState();\n }\n // slide|voice|style \u2192 PROMISE of a blob URL. Caching the promise (not the\n // resolved URL) dedups concurrent misses: the prefetch and a play (or a\n // \u21E7V recording pass) for the same slide share one POST instead of racing\n // two and leaking the loser's blob URL. Failures evict themselves so a\n // bridge hiccup isn't cached forever.\n const liveCache = new Map();\n function notesText(sl) {\n const t = instance._sections?.[sl - 1]?.querySelector('aside.notes')?.textContent ?? '';\n return t.replace(/\u27E8CLICK\u27E9/g, ' ').replace(/\\s+/g, ' ').trim();\n }\n // Build-synced narration: the \u27E8CLICK\u27E9 markers that already segment the\n // notes for the speaker view segment the AUDIO too \u2014 segment k narrates\n // build step k (0 = arrival, before any build), exactly like a presenter\n // reading the notes and clicking between segments.\n function notesSegs(sl) {\n const t = instance._sections?.[sl - 1]?.querySelector('aside.notes')?.textContent ?? '';\n return t.split('\u27E8CLICK\u27E9').map((s) => s.replace(/\\s+/g, ' ').trim());\n }\n // resolves { url, blob }: playback needs the object URL, the \u21E7V stitcher\n // needs the raw bytes \u2014 one cache serves both\n function synthLive(text, key, label) {\n if (!text) return Promise.resolve(null);\n if (!liveCache.has(key)) {\n const p = (async () => {\n const t0 = Date.now();\n try {\n const res = await fetch(LIVE_URL, {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ text, voice: liveCfg.voice, style: liveCfg.style }),\n });\n if (!res.ok) throw new Error(String(res.status));\n const blob = await res.blob();\n const cost = parseFloat(res.headers?.get?.('x-tts-cost') ?? '') || 0;\n if (cost) ttsSpend += cost;\n debugLog('tts', `${label} \u00B7 ${liveCfg.voice} \u00B7 ${text.length} chars \u2192 ${((Date.now() - t0) / 1000).toFixed(1)}s`\n + (cost ? ` \u00B7 ~$${cost.toFixed(4)}` : ''));\n return { url: URL.createObjectURL(blob), blob };\n } catch (e) {\n debugLog('tts', `${label} \u00B7 ${liveCfg.voice} FAILED after ${((Date.now() - t0) / 1000).toFixed(1)}s (${String(e.message || e)})`);\n throw e;\n }\n })();\n p.catch(() => { if (liveCache.get(key) === p) liveCache.delete(key); });\n liveCache.set(key, p);\n }\n return liveCache.get(key);\n }\n // The live player's unit is a SENTENCE: each \u27E8CLICK\u27E9 segment splits into\n // sentences and every sentence is its own TTS call and cache entry \u2014 so\n // the first audio of a beat arrives after one short synthesis, not after\n // the whole paragraph renders.\n function splitSentences(text) {\n return ((text ?? '').match(/[^.!?\u2026]+[.!?\u2026]+[\u201D\u2019\"')\\]]*|[^.!?\u2026]+$/g) ?? [])\n .map((s) => s.trim()).filter(Boolean);\n }\n const sentenceKey = (sl, step, i) => `${sl}|s${step}|n${i}|${liveCfg.voice}|${liveCfg.style}`;\n function fetchLiveSentence(sl, step, i) {\n const sentence = splitSentences(notesSegs(sl)[step])[i] ?? '';\n return synthLive(sentence, sentenceKey(sl, step, i), `slide ${sl} seg ${step} #${i + 1}`);\n }\n // data-narration=\"hold\": an interactive slide (quiz, exercise, live\n // demo) \u2014 narration plays whatever notes it has and builds still sync,\n // but the deck NEVER auto-advances off it; the presenter moves on\n // manually and narration resumes on the next slide.\n const narrationHolds = (sl) => instance._sections[sl - 1]?.dataset.narration === 'hold';\n // \u2500\u2500 lookahead buffer \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n // While live narration is ON, keep the next LIVE_LOOKAHEAD segments\n // synthesized in the background. Low priority by construction: ONE\n // buffer request in flight at a time (plus a small yield between calls),\n // so a foreground play never waits behind a burst \u2014 and since buffer and\n // playback share the promise cache, reaching a segment mid-synthesis\n // just awaits the same promise. The loop re-derives its window from the\n // CURRENT position each iteration, so navigation, voice/tone changes\n // (new cache keys) and toggling V off all just work; results land in the\n // (voice, tone) cache and the loop moves on to the next hole.\n const LIVE_LOOKAHEAD = 10; // sentences ahead of the playhead\n const BUFFER_WORKERS = 3; // parallel low-priority synths\n let bufferGen = 0;\n // the next `count` sentences from the current position, inclusive of the\n // current segment (its unspoken sentences matter), across slide boundaries\n function upcomingSentences(count) {\n const out = [];\n let sl = instance.state.slide;\n let step = instance.state.step;\n while (out.length < count && sl <= instance.state.totalSlides) {\n const segs = notesSegs(sl);\n const max = instance._records[sl - 1] ? instance._records[sl - 1].groups.length : 0;\n for (; step <= max && out.length < count; step++) {\n const n = splitSentences(segs[step]).length;\n for (let i = 0; i < n && out.length < count; i++) out.push([sl, step, i]);\n }\n sl += 1;\n step = 0;\n }\n return out;\n }\n async function fillLiveBuffer() {\n const gen = ++bufferGen; // newest fill wins; stale workers exit\n const worker = async () => {\n while (gen === bufferGen && narrating && narrSet?.live) {\n // find+start is synchronous within a worker's turn, and synthLive\n // registers the promise before awaiting \u2014 workers never double-fetch\n const hole = upcomingSentences(LIVE_LOOKAHEAD)\n .find(([sl, step, i]) => !liveCache.has(sentenceKey(sl, step, i)));\n if (!hole) return; // window full \u2014 the next slide/build event re-arms\n try {\n await fetchLiveSentence(hole[0], hole[1], hole[2]);\n } catch {\n return; // bridge unreachable \u2014 stop; the next event retries\n }\n await new Promise((r) => setTimeout(r, 30)); // yield to foreground\n }\n };\n await Promise.all(Array.from({ length: BUFFER_WORKERS }, worker));\n }\n\n // When a segment finishes, reveal the next build; after the last step,\n // move to the next slide. Guarded on (slide, step) so any manual\n // navigation mid-clip silently wins over the pending advance.\n let liveSegGen = 0; // cancels pending silent-beat timers and stale onended\n let narrPaused = false; // P \u2014 freezes audio, captions and auto-advance\n let liveChainActive = false; // a sentence chain is running for liveChainGen\n let liveChainGen = 0;\n function toggleNarrPause() {\n if (!narrating) { toast('narration is off \u2014 V starts it'); return; }\n narrPaused = !narrPaused;\n if (narrPaused) {\n narrAudio?.pause();\n } else if (narrAudio?.src && narrAudio.paused && !narrAudio.ended && narrAudio.currentTime > 0) {\n narrAudio.play().catch(() => { /* autoplay policy */ }); // resume mid-sentence\n } else if (!liveChainActive) {\n playLive(); // nothing parked (e.g. paused on a silent beat) \u2014 re-arm\n } // else: the parked chain's pause-gate resumes on its own\n toast(narrPaused ? '\u23F8 narration paused \u2014 P resumes' : '\u25B6 narration resumed');\n debugLog('narr', narrPaused ? 'paused' : 'resumed');\n updateDebugState();\n }\n function advanceFrom(sl, step) {\n if (!narrating || narrPaused || !narrSet?.live) return;\n if (instance.state.slide !== sl || instance.state.step !== step) return;\n const rec = instance._records[sl - 1];\n if (step < (rec ? rec.groups.length : 0)) instance.next();\n else if (!narrationHolds(sl) && sl < instance.state.totalSlides) instance.goto(sl + 1, 0);\n }\n async function playLive() {\n const sl = instance.state.slide, step = instance.state.step;\n const gen = ++liveSegGen;\n fillLiveBuffer(); // (re-)arm the lookahead from the new position\n if (!notesText(sl)) {\n if (narrationHolds(sl)) { debugLog('narr', `hold on slide ${sl} \u2014 manual advance`); return; }\n // nothing to say on this slide at all \u2014 skip it after a short beat\n setTimeout(() => {\n if (gen !== liveSegGen || !narrating || !narrSet?.live) return;\n if (instance.state.slide === sl && sl < instance.state.totalSlides) instance.goto(sl + 1, 0);\n }, 400);\n return;\n }\n const segs = notesSegs(sl);\n if (!segs[step]) {\n // a build beat with no words \u2014 reveal the next step after a pause\n setTimeout(() => { if (gen === liveSegGen) advanceFrom(sl, step); }, 600);\n return;\n }\n // speak the segment SENTENCE BY SENTENCE: each sentence is one cached\n // clip (short time-to-first-audio), the caption follows the spoken\n // sentence, and the build advances only after the segment's last one\n const sentences = splitSentences(segs[step]);\n const stale = () => gen !== liveSegGen || !narrating || instance.state.slide !== sl || instance.state.step !== step;\n liveChainGen = gen;\n liveChainActive = true;\n try {\n for (let i = 0; i < sentences.length; i++) {\n while (narrPaused) { // P holds the chain between sentences too\n if (stale()) return;\n await new Promise((r) => setTimeout(r, 150));\n }\n if (stale()) return;\n const clip = await fetchLiveSentence(sl, step, i);\n if (stale()) return;\n if (!clip) continue;\n setCaption(sentences[i]); // captions follow the voice, not the notes\n narrAudio ??= new Audio();\n narrAudio.src = clip.url;\n narrAudio.playbackRate = narrRate;\n let blocked = false;\n await new Promise((done) => {\n narrAudio.onended = done;\n narrAudio.play().catch(() => { blocked = true; done(); });\n });\n if (blocked) return; // autoplay policy \u2014 a user gesture restarts\n }\n if (!stale()) advanceFrom(sl, step);\n } catch {\n if (!liveWarned) { toast('live voice bridge unreachable \u2014 run: decklight tts'); liveWarned = true; }\n debugLog('narr', `live synth failed (slide ${sl} step ${step})`);\n } finally {\n if (liveChainGen === gen) liveChainActive = false;\n }\n }\n function playSlideFile() {\n if (!narrSet) return;\n if (narrSet.live) return playLive();\n narrAudio ??= new Audio();\n // state.slide and the files are BOTH 1-based (slide-01 = first section).\n // ext defaults to the pre-render tool's .m4a; \u21E7V-recorded sets are .wav.\n narrAudio.src = `${narrSet.dir}/slide-${String(instance.state.slide).padStart(2, '0')}.${narrSet.ext ?? 'm4a'}`;\n narrAudio.playbackRate = narrRate;\n narrAudio.play().catch(() => { /* no file for this slide */ });\n }\n function toggleNarration() {\n if (!narrSet) { openNarrPicker(narrSets.length ? 'tracks' : 'voices'); return; }\n narrating = !narrating;\n if (narrating) {\n const what = narrSet.live ? `\u26A1 ${liveCfg.voice} \u00B7 ${liveCfg.tone}` : narrSet.label;\n toast(`\uD83D\uDD0A ${what} \u2014 V stops \u00B7 N picks`);\n debugLog('narr', `on \u2014 ${what}`);\n playSlideFile();\n } else {\n liveSegGen++; // cancel any pending silent-beat advance\n bufferGen++; // stop the lookahead loop\n narrPaused = false;\n narrAudio?.pause();\n toast('narration off');\n debugLog('narr', 'off');\n }\n syncSoundBtn();\n }\n instance.on('slide', () => { if (narrating) playSlideFile(); });\n // builds re-sync the live voice too \u2014 whether the advance came from the\n // narration itself or from the presenter pressing \u2192 mid-sentence\n instance.on('build', () => { if (narrating && narrSet?.live) playLive(); });\n\n // \u2500\u2500 closed captions (C) \u2014 SPEC \u00A78 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n // YouTube-style captions: the CURRENT notes segment (the same text the\n // live voice speaks) in a bar at the bottom, synced to slide/step. Works\n // with narration on or off \u2014 it's the deck's transcript. Persists per deck.\n const captionsKey = 'decklight-captions:' + location.pathname;\n let captionsOn = false;\n try { captionsOn = localStorage.getItem(captionsKey) === '1'; } catch { /* ignore */ }\n let captionEl = null;\n function setCaption(text) {\n if (!captionEl) return;\n captionEl.textContent = text;\n captionEl.classList.toggle('show', !!text);\n }\n function updateCaption() {\n if (!captionEl) return;\n // while the live voice speaks, the sentence chain owns the caption \u2014\n // never flash the whole segment; the next spoken sentence fills it\n if (narrating && narrSet?.live) { setCaption(''); return; }\n setCaption(notesSegs(instance.state.slide)[instance.state.step] ?? '');\n }\n function showCaptions() {\n captionEl = document.createElement('div');\n captionEl.className = 'decklight-captions';\n captionEl.setAttribute('aria-live', 'polite');\n root.appendChild(captionEl);\n updateCaption();\n }\n function toggleCaptions() {\n captionsOn = !captionsOn;\n try { localStorage.setItem(captionsKey, captionsOn ? '1' : '0'); } catch { /* ignore */ }\n if (captionsOn) showCaptions();\n else { captionEl?.remove(); captionEl = null; }\n toast(`captions ${captionsOn ? 'on' : 'off'}`);\n debugLog('narr', `captions ${captionsOn ? 'on' : 'off'}`);\n }\n instance.on('slide', updateCaption);\n instance.on('build', updateCaption);\n if (captionsOn && !printMode) showCaptions();\n\n // \u2500\u2500 transcript (palette command) \u2014 SPEC \u00A78 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n // The deck's full spoken script: every slide's notes segments, in order,\n // in a scrollable overlay (titles jump to their slide) with .txt and .md\n // export \u2014 the same segmentation narration and captions use.\n function transcriptData() {\n return (instance._sections || []).map((s, i) => ({\n n: i + 1,\n title: s.querySelector('h1, h2, h3')?.textContent.trim() || `Slide ${i + 1}`,\n segs: notesSegs(i + 1).filter(Boolean),\n }));\n }\n function transcriptString(md) {\n const title = (document.title || 'Deck').trim();\n const out = md ? [`# ${title} \u2014 transcript`, ''] : [`${title} \u2014 transcript`, ''];\n for (const { n, title: t, segs } of transcriptData()) {\n if (!segs.length) continue;\n out.push(md ? `## ${n}. ${t}` : `${n}. ${t}`, '');\n for (const seg of segs) out.push(seg, '');\n }\n return out.join('\\n');\n }\n function downloadTranscript(kind) {\n const md = kind === 'md';\n const url = URL.createObjectURL(new Blob([transcriptString(md)], { type: md ? 'text/markdown' : 'text/plain' }));\n const base = (location.pathname.split('/').pop() || 'deck').replace(/\\.html?$/i, '');\n downloadFromUrl(url, `${base}-transcript.${md ? 'md' : 'txt'}`);\n setTimeout(() => URL.revokeObjectURL(url), 5000);\n debugLog('narr', `transcript exported (.${md ? 'md' : 'txt'})`);\n }\n let transcriptEl = null;\n function toggleTranscript() {\n if (transcriptEl) { transcriptEl.remove(); transcriptEl = null; return; }\n transcriptEl = document.createElement('div');\n transcriptEl.className = 'decklight-narr decklight-transcript';\n const card = document.createElement('div');\n card.className = 'narr-card';\n const head = document.createElement('div');\n head.className = 'narr-head';\n head.textContent = 'transcript \u2014 the deck\u2019s spoken notes \u00B7 Esc closes';\n const actions = document.createElement('div');\n actions.className = 'tr-actions';\n for (const [label, kind] of [['\u2B07 export .txt', 'txt'], ['\u2B07 export .md', 'md']]) {\n const b = document.createElement('button');\n b.type = 'button';\n b.className = 'narr-prev-btn';\n b.textContent = label;\n b.addEventListener('click', () => downloadTranscript(kind));\n actions.appendChild(b);\n }\n card.append(head, actions);\n for (const { n, title, segs } of transcriptData()) {\n if (!segs.length) continue;\n const sec = document.createElement('div');\n sec.className = 'tr-slide';\n const t = document.createElement('div');\n t.className = 'tr-title';\n t.textContent = `${n} \u00B7 ${title}`;\n t.title = 'jump to this slide';\n t.addEventListener('click', () => { toggleTranscript(); instance.goto(n, 0, { force: true }); });\n sec.appendChild(t);\n for (const seg of segs) {\n const p = document.createElement('p');\n p.className = 'tr-seg';\n p.textContent = seg;\n sec.appendChild(p);\n }\n card.appendChild(sec);\n }\n transcriptEl.appendChild(card);\n transcriptEl.addEventListener('click', (e) => { if (e.target === transcriptEl) toggleTranscript(); });\n root.appendChild(transcriptEl);\n }\n instance.transcript = { open: toggleTranscript, text: () => transcriptString(false), markdown: () => transcriptString(true) };\n\n // \u2500\u2500 edit mode (E) + live reload \u2014 SPEC \u00A78 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n // Served by `decklight edit`: the deck subscribes to /edit/events and\n // reloads whenever the file changes on disk (any editor works \u2014 the\n // #/slide/step hash restores the position). E opens a notes editor whose\n // Save writes the current slide's aside back through the server. Decks\n // opened via file:// probe the server at its default localhost port\n // (CORS-open, like the tts bridge) \u2014 the printed URL and a double-clicked\n // file both work; config.edit.url overrides. A basename guard refuses to\n // wire up against a server that's editing a DIFFERENT deck.\n let editAvailable = false;\n let editBase = '';\n if (!printMode && !params.has('embedded')) {\n const bases = config.edit?.url ? [config.edit.url]\n : /^https?:$/.test(location.protocol) ? [''] : ['http://127.0.0.1:8788'];\n (async () => {\n for (const base of bases) {\n try {\n const r = await fetch(base + '/edit/ping');\n if (!r.ok) continue;\n const j = await r.json();\n if (!j?.ok) continue;\n const here = decodeURIComponent(location.pathname.split('/').pop() || '');\n if (here && j.name && here !== j.name) {\n debugLog('edit', `server edits ${j.name}, this deck is ${here} \u2014 not wiring up`);\n continue;\n }\n editBase = base;\n editAvailable = true;\n const es = new EventSource(base + '/edit/events');\n es.onmessage = () => location.reload();\n debugLog('edit', `live reload connected${base ? ` (${base})` : ''}`);\n return;\n } catch { /* not served by decklight edit */ }\n }\n })();\n }\n let editEl = null;\n function toggleEditor() {\n if (editEl) { editEl.remove(); editEl = null; return; }\n const sl = instance.state.slide;\n if (!editAvailable) {\n toast('edit mode needs the server \u2014 run: decklight edit <deck.html>', 2200);\n return;\n }\n if (instance._sections[sl - 1]?.hasAttribute('data-was-markdown')) {\n toast('markdown-authored slide \u2014 its notes live in the template; edit the file', 2200);\n return;\n }\n editEl = document.createElement('div');\n editEl.className = 'decklight-narr decklight-editor';\n const card = document.createElement('div');\n card.className = 'narr-card';\n const head = document.createElement('div');\n head.className = 'narr-head';\n head.textContent = `edit notes \u2014 slide ${sl} \u00B7 \u2318\u23CE saves \u00B7 Esc closes`;\n const ta = document.createElement('textarea');\n ta.className = 'narr-input edit-notes';\n ta.value = notesSegs(sl).filter((s, i, a) => s || i < a.length).join('\\n\\n\u27E8CLICK\u27E9\\n\\n');\n ta.spellcheck = false;\n const save = async () => {\n try {\n const res = await fetch(editBase + '/edit/notes', {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ slide: sl, text: ta.value }),\n });\n if (!res.ok) throw new Error(await res.text());\n debugLog('edit', `notes saved \u2014 slide ${sl}`);\n toast('notes saved \u2014 reloading');\n // the server's watcher broadcasts the reload; nothing else to do\n } catch (e) {\n toast(`save failed: ${String(e.message || e).slice(0, 60)}`);\n }\n };\n ta.addEventListener('keydown', (e) => {\n if (e.key === 'Enter' && (e.metaKey || e.ctrlKey)) { save(); e.preventDefault(); }\n else if (e.key === 'Escape') { toggleEditor(); e.preventDefault(); }\n e.stopPropagation();\n });\n const actions = document.createElement('div');\n actions.className = 'tr-actions';\n const btn = document.createElement('button');\n btn.type = 'button';\n btn.className = 'narr-prev-btn';\n btn.textContent = '\uD83D\uDCBE save to file';\n btn.addEventListener('click', save);\n actions.appendChild(btn);\n card.append(head, ta, actions);\n editEl.appendChild(card);\n editEl.addEventListener('click', (e) => { if (e.target === editEl) toggleEditor(); });\n root.appendChild(editEl);\n setTimeout(() => ta.focus(), 0);\n }\n if (params.has('voiceover') && narrSet && !printMode) {\n // whichever gesture fires first must disarm the OTHER listener too, or\n // the survivor re-arms narration on the next key/click after V stops it\n const arm = () => {\n window.removeEventListener('pointerdown', arm);\n window.removeEventListener('keydown', arm);\n if (!narrating) toggleNarration();\n };\n window.addEventListener('pointerdown', arm, { once: true });\n window.addEventListener('keydown', arm, { once: true });\n }\n\n // ----- touch controls (mount) -------------------------------------------\n // Everything they need (toggleFullscreen, toggleNarration, narrSets) is\n // now in scope. Fullscreen always; sound only when narration is available.\n if (!printMode) {\n const tc = document.createElement('div');\n tc.className = 'decklight-touch-controls';\n fsBtn = document.createElement('button');\n fsBtn.type = 'button';\n fsBtn.className = 'decklight-touch-btn';\n fsBtn.setAttribute('aria-label', 'Fullscreen');\n fsBtn.innerHTML = TC_ICON.full;\n fsBtn.addEventListener('click', toggleFullscreen);\n tc.appendChild(fsBtn);\n if (narrSets.length) {\n soundBtn = document.createElement('button');\n soundBtn.type = 'button';\n soundBtn.className = 'decklight-touch-btn';\n // swallow pointerdown so the ?voiceover first-gesture arm (on window)\n // doesn't fire on this very tap and immediately undo the toggle\n soundBtn.addEventListener('pointerdown', (e) => e.stopPropagation());\n soundBtn.addEventListener('click', () => toggleNarration());\n tc.appendChild(soundBtn);\n syncSoundBtn();\n }\n root.appendChild(tc);\n }\n\n // N: narration picker \u2014 tracks \u2192 live voices \u2192 tones \u2192 custom tone\n let narrEl = null, narrSel = 0, narrView = 'tracks', narrRows = [], liveDraft = null;\n function persistNarr() {\n try {\n localStorage.setItem(narrKey, JSON.stringify(narrSet?.live ? { live: liveCfg } : { dir: narrSet?.dir }));\n } catch { /* ignore */ }\n }\n function applyLive(toneLabel, styleText) {\n liveCfg = { voice: liveDraft ?? liveCfg.voice, tone: toneLabel, style: styleText };\n narrSet = LIVE_TRACK;\n liveWarned = false;\n persistNarr();\n closeNarrPicker();\n if (!narrating) narrating = true;\n toast(`\u26A1 live voice: ${liveCfg.voice} \u00B7 ${liveCfg.tone} \u2014 V stops`);\n debugLog('narr', `live config \u2014 ${liveCfg.voice} \u00B7 ${liveCfg.tone}`);\n playSlideFile();\n }\n function selectNarrRow(i) {\n if (!narrRows.length) return;\n narrSel = (i + narrRows.length) % narrRows.length;\n narrEl.querySelectorAll('.narr-row').forEach((r, j) => r.classList.toggle('narr-sel', j === narrSel));\n }\n function commitNarrRow() { narrRows[narrSel]?.commit(); }\n function narrBack() {\n if (narrView === 'custom') renderNarr('tones');\n else if (narrView === 'tones') renderNarr('voices');\n else if (narrView === 'voices' && narrSets.length) renderNarr('tracks');\n else closeNarrPicker();\n }\n // \u25B6 voice preview: speaks a short test sentence through the live bridge\n // in the row's voice (neutral tone), so voices can be auditioned before\n // committing. TWO caches (voice \u2192 promise of a blob URL): the DEFAULT\n // sentence's cache is permanent \u2014 once an entry resolves it is never\n // invalidated \u2014 while the custom cache holds exactly one sentence and is\n // swapped out (old blobs freed) when the user's text changes. After any\n // preview plays, the remaining 29 voices prefetch sequentially in the\n // background, so auditioning the roster becomes instant.\n const PREVIEW_DEFAULT = 'Hey, this is Decklight';\n let previewText = PREVIEW_DEFAULT;\n let previewAudio = null;\n const previewDefaultCache = new Map();\n let previewCustomCache = new Map();\n let previewCustomText = null;\n const previewPrefetching = new Set(); // texts with a prefetch loop running\n function previewCacheFor(text) {\n if (text === PREVIEW_DEFAULT) return previewDefaultCache;\n if (text !== previewCustomText) {\n // new custom sentence: retire the old bucket and free its audio\n for (const p of previewCustomCache.values()) p.then((u) => URL.revokeObjectURL(u)).catch(() => {});\n previewCustomCache = new Map();\n previewCustomText = text;\n }\n return previewCustomCache;\n }\n const previewKey = (voice, style) => `${voice}|${style || ''}`;\n function ensurePreviewIn(cache, voice, text, style = '') {\n const key = previewKey(voice, style);\n if (!cache.has(key)) {\n const p = (async () => {\n const t0 = Date.now();\n const res = await fetch(LIVE_URL, {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ text, voice, style }),\n });\n if (!res.ok) throw new Error(String(res.status));\n const blob = await res.blob();\n const cost = parseFloat(res.headers?.get?.('x-tts-cost') ?? '') || 0;\n if (cost) ttsSpend += cost;\n debugLog('tts', `preview ${voice}${style ? ' (styled)' : ''} \u00B7 ${((Date.now() - t0) / 1000).toFixed(1)}s`\n + (cost ? ` \u00B7 ~$${cost.toFixed(4)}` : ''));\n return URL.createObjectURL(blob);\n })();\n // failures self-evict so a retry can succeed; resolved entries stay\n p.catch(() => { if (cache.get(key) === p) cache.delete(key); });\n cache.set(key, p);\n }\n return cache.get(key);\n }\n async function prefetchPreviews(text, list, tag) {\n const runKey = `${tag}|${text}`;\n if (previewPrefetching.has(runKey)) return;\n previewPrefetching.add(runKey);\n const isDefault = text === PREVIEW_DEFAULT;\n const cache = isDefault ? previewDefaultCache : previewCustomCache;\n try {\n debugLog('narr', `preview prefetch ${tag} (${isDefault ? 'default' : 'custom'} sentence)`);\n // sequential on purpose: the bridge synthesizes serially and a burst\n // of parallel POSTs would just queue-jump the presenter's own clicks\n for (const { voice, style } of list) {\n if (!isDefault && previewCustomText !== text) return; // superseded\n if (cache.has(previewKey(voice, style))) continue;\n await ensurePreviewIn(cache, voice, text, style).catch(() => { /* background \u2014 no toast */ });\n }\n debugLog('narr', `preview prefetch ${tag} complete`);\n } finally {\n previewPrefetching.delete(runKey);\n }\n }\n // spec: { voice, style, prefetch } \u2014 voice rows preview neutral delivery\n // and warm the whole roster; tone rows preview the drafted voice in that\n // delivery style and warm the other tones for the same voice.\n function previewClip({ voice, style = '', prefetch }, btn) {\n const text = previewText.trim();\n if (!text) return;\n const cache = previewCacheFor(text);\n if (btn) btn.textContent = '\u2026';\n ensurePreviewIn(cache, voice, text, style).then((url) => {\n if (btn?.isConnected) btn.textContent = '\u25B6';\n previewAudio ??= new Audio();\n previewAudio.src = url;\n previewAudio.play().catch(() => { /* autoplay policy */ });\n debugLog('narr', `preview ${voice}${style ? ' \u00B7 styled' : ''}`);\n if (prefetch === 'voices') {\n prefetchPreviews(text, GEMINI_VOICES.map(([n]) => ({ voice: n, style: '' })), 'voices');\n } else if (prefetch === 'tones') {\n prefetchPreviews(text, TONES.map(([, s]) => ({ voice, style: s })), `tones:${voice}`);\n }\n }).catch(() => {\n if (btn?.isConnected) btn.textContent = '\u25B6';\n toast('live voice bridge unreachable \u2014 run: decklight tts');\n debugLog('narr', `preview ${voice} failed`);\n });\n }\n function renderNarr(view) {\n narrView = view;\n const card = narrEl.querySelector('.narr-card');\n card.innerHTML = '';\n const head = document.createElement('div');\n head.className = 'narr-head';\n card.appendChild(head);\n narrRows = [];\n if (view === 'tracks') {\n head.textContent = 'narration';\n narrSets.forEach((t) => narrRows.push({\n text: `\uD83D\uDD0A ${t.label} (${t.dir}/)`,\n cur: t === narrSet,\n commit: () => { narrSet = t; persistNarr(); closeNarrPicker(); toast(`\uD83D\uDD0A track: ${t.label}`); if (narrating) playSlideFile(); },\n }));\n narrRows.push({\n text: '\u26A1 Live voice \u2014 synthesize on the fly\u2026',\n cur: narrSet?.live,\n commit: () => renderNarr('voices'),\n });\n } else if (view === 'voices') {\n head.textContent = 'live voice \u2014 pick a voice \u00B7 \u25B6 previews';\n const wrap = document.createElement('div');\n wrap.className = 'narr-preview-row';\n const test = document.createElement('input');\n test.className = 'narr-input narr-preview-text';\n test.value = previewText;\n test.placeholder = 'Preview sentence';\n test.setAttribute('aria-label', 'Preview sentence');\n test.addEventListener('input', () => { previewText = test.value; });\n // onKey ignores inputs; only Escape needs wiring (back out of the view)\n test.addEventListener('keydown', (e) => {\n if (e.key === 'Escape') { narrBack(); e.preventDefault(); }\n e.stopPropagation();\n });\n const reset = document.createElement('button');\n reset.type = 'button';\n reset.className = 'narr-prev-btn narr-reset-btn';\n reset.textContent = '\u21BA';\n reset.title = 'restore the default sentence';\n reset.setAttribute('aria-label', 'restore the default preview sentence');\n reset.addEventListener('click', (e) => {\n e.stopPropagation();\n previewText = PREVIEW_DEFAULT;\n test.value = PREVIEW_DEFAULT;\n });\n wrap.append(test, reset);\n card.appendChild(wrap);\n GEMINI_VOICES.forEach(([name, flavor]) => narrRows.push({\n text: `${name} <span class=\"narr-flavor\">${flavor}</span>`,\n html: true,\n preview: { voice: name, style: '', prefetch: 'voices' },\n cur: narrSet?.live && liveCfg.voice === name,\n commit: () => { liveDraft = name; renderNarr('tones'); },\n }));\n } else if (view === 'tones') {\n head.textContent = `live voice \u00B7 ${liveDraft ?? liveCfg.voice} \u2014 pick a tone \u00B7 \u25B6 previews`;\n TONES.forEach(([label, styleText]) => narrRows.push({\n text: label,\n preview: { voice: liveDraft ?? liveCfg.voice, style: styleText, prefetch: 'tones' },\n cur: narrSet?.live && liveCfg.tone === label,\n commit: () => applyLive(label, styleText),\n }));\n narrRows.push({ text: 'Custom\u2026', cur: narrSet?.live && liveCfg.tone === 'Custom', commit: () => renderNarr('custom') });\n } else { // custom tone input\n head.textContent = `live voice \u00B7 ${liveDraft ?? liveCfg.voice} \u2014 type the delivery instruction \u00B7 \u25B6 previews`;\n const wrap = document.createElement('div');\n wrap.className = 'narr-preview-row';\n const input = document.createElement('input');\n input.className = 'narr-input';\n input.value = liveCfg.style;\n input.placeholder = 'Read in a \u2026';\n // onKey ignores events targeting inputs \u2014 commit/back live on the field\n input.addEventListener('keydown', (e) => {\n if (e.key === 'Enter') { commitCustomTone(); e.preventDefault(); }\n else if (e.key === 'Escape') { narrBack(); e.preventDefault(); }\n e.stopPropagation();\n });\n // audition the typed instruction before committing it with Enter\n const prev = document.createElement('button');\n prev.type = 'button';\n prev.className = 'narr-prev-btn narr-reset-btn';\n prev.textContent = '\u25B6';\n prev.title = 'preview this delivery instruction';\n prev.setAttribute('aria-label', 'preview this delivery instruction');\n prev.addEventListener('click', (e) => {\n e.stopPropagation();\n const style = input.value.trim();\n if (style) previewClip({ voice: liveDraft ?? liveCfg.voice, style }, prev);\n });\n wrap.append(input, prev);\n card.appendChild(wrap);\n setTimeout(() => { input.focus(); input.select(); }, 0);\n narrRows = [];\n narrSel = 0;\n return;\n }\n narrRows.forEach((row, i) => {\n const el = document.createElement('div');\n el.className = 'narr-row' + (row.cur ? ' narr-cur' : '');\n const label = document.createElement('span');\n label.className = 'narr-row-label';\n if (row.html) label.innerHTML = row.text; else label.textContent = row.text;\n el.appendChild(label);\n if (row.preview) {\n const btn = document.createElement('button');\n btn.type = 'button';\n btn.className = 'narr-prev-btn';\n btn.textContent = '\u25B6';\n btn.title = `preview ${row.preview.voice}`;\n btn.setAttribute('aria-label', `preview ${row.preview.voice}`);\n btn.addEventListener('click', (e) => { e.stopPropagation(); previewClip(row.preview, btn); });\n el.appendChild(btn);\n }\n el.addEventListener('mouseenter', () => selectNarrRow(i));\n el.addEventListener('click', () => { selectNarrRow(i); commitNarrRow(); });\n card.appendChild(el);\n });\n const cur = narrRows.findIndex((r) => r.cur);\n selectNarrRow(Math.max(0, cur));\n narrEl.querySelector('.narr-sel')?.scrollIntoView({ block: 'nearest' });\n }\n function commitCustomTone() {\n const v = narrEl?.querySelector('.narr-input')?.value.trim();\n if (v) applyLive('Custom', v);\n }\n function openNarrPicker(view) {\n if (narrEl && view === undefined) return closeNarrPicker(); // N toggles\n if (!narrEl) {\n narrEl = document.createElement('div');\n narrEl.className = 'decklight-narr';\n narrEl.innerHTML = '<div class=\"narr-card\" role=\"listbox\" aria-label=\"Narration\"></div>';\n narrEl.addEventListener('click', (e) => { if (e.target === narrEl) closeNarrPicker(); });\n root.appendChild(narrEl);\n }\n renderNarr(view ?? (narrSets.length ? 'tracks' : 'voices'));\n }\n function closeNarrPicker() {\n narrEl?.remove();\n narrEl = null;\n }\n\n // \u21E7V: batch-record the whole deck offline with the current live voice/tone.\n // Reuses fetchLive/liveCache (so the recorded slides also warm live\n // playback) and drives each blob straight into a browser download \u2014\n // no server-side write, no zip dependency. The progress card's ETA is a\n // running average: elapsed \u00F7 slides-done \u00D7 slides-left.\n // recRun is a generation counter, not a boolean: closing the dialog bumps\n // it, and a loop only acts while its own run is still current \u2014 a cancel\n // followed by an immediate re-record can't resurrect the old loop.\n let recEl = null, recView = 'confirm', recRun = 0;\n function slidesWithNotes() {\n const out = [];\n for (let sl = 1; sl <= instance.state.totalSlides; sl++) if (notesText(sl)) out.push(sl);\n return out;\n }\n function fmtTime(ms) {\n const s = Math.round(ms / 1000);\n return s < 60 ? `${s}s` : `${Math.floor(s / 60)}m${String(s % 60).padStart(2, '0')}s`;\n }\n function downloadFromUrl(url, filename) {\n const a = document.createElement('a');\n a.href = url;\n a.download = filename;\n document.body.appendChild(a);\n a.click();\n a.remove();\n }\n function renderRecordCard(view, data = {}) {\n recView = view;\n const card = recEl.querySelector('.narr-card');\n if (view === 'confirm') {\n const n = data.total;\n card.innerHTML = `<div class=\"narr-head\">record offline narration</div>\n <div class=\"rec-line\">\u26A1 ${liveCfg.voice} \u00B7 ${liveCfg.tone}</div>\n <div class=\"rec-line\">${n} slide${n === 1 ? '' : 's'} stitched from the sentence cache \u2014 only unheard sentences synthesize</div>\n <div class=\"narr-row narr-sel\">Start recording</div>\n <div class=\"rec-hint\">Enter to start \u00B7 Esc to cancel</div>`;\n card.querySelector('.narr-row').addEventListener('click', startRecording);\n } else if (view === 'progress') {\n const { done, total, elapsedMs } = data;\n const pct = total ? Math.round((done / total) * 100) : 0;\n const eta = done ? fmtTime((elapsedMs / done) * (total - done)) : '\u2026';\n card.innerHTML = `<div class=\"narr-head\">recording\u2026</div>\n <div class=\"rec-bar\"><div class=\"rec-bar-fill\" style=\"width:${pct}%\"></div></div>\n <div class=\"rec-line\">${done} / ${total} slides \u00B7 ${fmtTime(elapsedMs)} elapsed \u00B7 ~${eta} left</div>\n <div class=\"rec-hint\">Esc to cancel</div>`;\n } else {\n const { saved, total, cancelled } = data;\n card.innerHTML = `<div class=\"narr-head\">${cancelled ? 'recording cancelled' : 'recording done'}</div>\n <div class=\"rec-line\">${saved} / ${total} slide${total === 1 ? '' : 's'} saved as slide-NN.wav to your downloads</div>\n <div class=\"rec-line\">Point <code>narration.files</code> at that folder with <code>ext: 'wav'</code> to play them back without the bridge.</div>\n <div class=\"rec-hint\">Enter or Esc to close</div>`;\n }\n }\n // Slide files are STITCHED FROM THE SENTENCE CACHE: every clip already\n // played (or warmed by the lookahead buffer) is reused as-is \u2014 only the\n // sentences never spoken get synthesized. Clips are joined with short\n // silences (breath between sentences, a longer beat between builds).\n const SENT_GAP_S = 0.15;\n const SEG_GAP_S = 0.35;\n function stitchWav(chunks, rate) {\n const dataLen = chunks.reduce((n, c) => n + c.length, 0);\n const h = new DataView(new ArrayBuffer(44));\n const w = (o, s) => { for (let i = 0; i < s.length; i++) h.setUint8(o + i, s.charCodeAt(i)); };\n w(0, 'RIFF'); h.setUint32(4, 36 + dataLen, true); w(8, 'WAVE');\n w(12, 'fmt '); h.setUint32(16, 16, true); h.setUint16(20, 1, true); h.setUint16(22, 1, true);\n h.setUint32(24, rate, true); h.setUint32(28, rate * 2, true); h.setUint16(32, 2, true); h.setUint16(34, 16, true);\n w(36, 'data'); h.setUint32(40, dataLen, true);\n return new Blob([h.buffer, ...chunks], { type: 'audio/wav' });\n }\n const silencePcm = (rate, seconds) => new Uint8Array(2 * Math.round(rate * seconds));\n async function stitchSlideWav(sl, run) {\n const rec = instance._records[sl - 1];\n const max = rec ? rec.groups.length : 0;\n const segs = notesSegs(sl);\n const chunks = [];\n let rate = 24000;\n for (let step = 0; step <= max; step++) {\n const sentences = splitSentences(segs[step]);\n for (let i = 0; i < sentences.length; i++) {\n const clip = await fetchLiveSentence(sl, step, i); // cache-first\n if (run !== recRun) return null;\n if (!clip) continue;\n const buf = await clip.blob.arrayBuffer();\n if (chunks.length === 0) rate = new DataView(buf).getUint32(24, true) || 24000;\n else chunks.push(silencePcm(rate, i === 0 ? SEG_GAP_S : SENT_GAP_S));\n chunks.push(new Uint8Array(buf.slice(44)));\n }\n }\n return chunks.length ? stitchWav(chunks, rate) : null;\n }\n async function startRecording() {\n const list = slidesWithNotes();\n const run = ++recRun;\n const t0 = Date.now();\n let done = 0, saved = 0;\n renderRecordCard('progress', { done, total: list.length, elapsedMs: 0 });\n for (const sl of list) {\n if (run !== recRun) return;\n try {\n const wav = await stitchSlideWav(sl, run);\n if (run !== recRun) return; // cancelled mid-synthesis \u2014 don't download\n if (wav) {\n const url = URL.createObjectURL(wav);\n downloadFromUrl(url, `slide-${String(sl).padStart(2, '0')}.wav`);\n setTimeout(() => URL.revokeObjectURL(url), 5000);\n saved++;\n }\n } catch {\n toast(`slide ${sl}: recording failed`);\n }\n done++;\n if (run === recRun) renderRecordCard('progress', { done, total: list.length, elapsedMs: Date.now() - t0 });\n }\n if (run === recRun) renderRecordCard('done', { saved, total: list.length });\n }\n function openRecordDialog() {\n if (!narrSet?.live) { toast('live voice only \u2014 pick a voice with N first'); return; }\n if (recEl) return;\n recEl = document.createElement('div');\n recEl.className = 'decklight-narr decklight-record';\n recEl.innerHTML = '<div class=\"narr-card\" role=\"dialog\" aria-label=\"Record offline narration\"></div>';\n recEl.addEventListener('click', (e) => { if (e.target === recEl) closeRecordDialog(); });\n root.appendChild(recEl);\n renderRecordCard('confirm', { total: slidesWithNotes().length });\n }\n function closeRecordDialog() {\n recRun++; // invalidate any in-flight recording loop\n recEl?.remove();\n recEl = null;\n }\n instance.saveGeneratedTheme = (name) => saveGeneratedTheme(name); // \u2303\u21E7T; name skips the prompt\n\n if (printMode) {\n root.classList.add('decklight-print');\n instance._sections.forEach((s, i) => {\n s.classList.add('active');\n applyBuildState(instance._records[i], instance._records[i].groups.length);\n });\n // All slides are visible in print \u2014 audit the whole deck for clipping.\n requestAnimationFrame(() => instance._sections.forEach((s, i) => checkOverflow(s, i + 1)));\n root.__decklight = instance;\n activeInstance = instance;\n instance._emit('ready', { slides: instance.state.totalSlides, print: true });\n return instance;\n }\n\n const target = (config.hash && parseHash()) || { slide: 1, step: 0 };\n instance._sections.forEach((s, i) => {\n if (i !== target.slide - 1) applyBuildState(instance._records[i], 0);\n });\n instance.goto(target.slide, target.step, { force: true });\n\n root.__decklight = instance;\n activeInstance = instance;\n instance._emit('ready', { slides: instance.state.totalSlides });\n return instance;\n}\n", "// Builds engine \u2014 SPEC \u00A72.\n// The container opts in; the engine claims children. A step is either a DOM\n// element or one unit of a registered provider's count.\n\nconst CONTAINER_TAGS = new Set(['UL', 'OL', 'TABLE', 'TBODY', 'DL', 'SVG']);\nconst SVG_SKIP = new Set(['defs', 'title', 'desc', 'style', 'metadata']);\n\n// element \u2192 provider registration ({count, apply, label}), shared across instances.\nexport const providerRegistry = new Map();\n\nexport function registerProvider(el, provider) {\n providerRegistry.set(el, provider);\n}\n\nfunction eligibleChildren(el) {\n return [...el.children].filter((c) => {\n const tag = c.tagName.toLowerCase();\n if (SVG_SKIP.has(tag)) return false;\n if (tag === 'aside' && c.classList.contains('notes')) return false;\n if (c.hasAttribute('data-build-stay')) return false;\n return true;\n });\n}\n\n// Container vs leaf: fixed tags are always containers; div/g are containers\n// only with \u22652 eligible children (resolves the spec's \"one g is a leaf\");\n// data-build-self forces leaf.\nfunction isContainer(el) {\n if (el.hasAttribute('data-build-self')) return false;\n const tag = el.tagName.toUpperCase();\n if (CONTAINER_TAGS.has(tag)) return true;\n if (tag === 'DIV' || tag === 'G') return eligibleChildren(el).length >= 2;\n return false;\n}\n\nfunction stepSource(el) {\n const tag = el.tagName.toUpperCase();\n if (tag === 'TABLE') {\n const tbody = el.querySelector(':scope > tbody');\n return tbody ? eligibleChildren(tbody) : eligibleChildren(el).filter((c) => c.tagName === 'TR');\n }\n return eligibleChildren(el);\n}\n\n// Pure sequencing: items = [{key, explicit}] in document/emission order.\n// Returns groups of item indices. Only explicit steps sharing a key merge.\nexport function computeGroups(items) {\n const indexed = items.map((it, i) => ({ ...it, i }));\n indexed.sort((a, b) => a.key - b.key || a.i - b.i);\n const groups = [];\n let cur = null;\n let curKey = null;\n let curExplicit = false;\n for (const it of indexed) {\n if (cur && it.explicit && curExplicit && it.key === curKey) {\n cur.push(it.i);\n continue;\n }\n cur = [it.i];\n curKey = it.key;\n curExplicit = it.explicit;\n groups.push(cur);\n }\n return groups;\n}\n\nfunction markStep(el, style) {\n el.classList.add('build-step');\n el.setAttribute('data-build-style', style);\n el.setAttribute('data-build-state', 'pending');\n if (style === 'draw') prepareDraw(el);\n}\n\nconst STROKED = 'path, line, polyline, polygon, circle, ellipse, rect';\n\nfunction prepareDraw(el) {\n const shapes = el.matches?.(STROKED) ? [el] : [...el.querySelectorAll(STROKED)];\n let anyStroke = false;\n for (const s of shapes) {\n const stroke = s.getAttribute('stroke') ?? getComputedStyle(s).stroke;\n if (!stroke || stroke === 'none') continue;\n let len = 0;\n try { len = s.getTotalLength(); } catch { continue; }\n if (!len) continue;\n anyStroke = true;\n // The draw CSS overrides stroke-dasharray with the path length; remember an\n // authored dasharray so it can be restored once the draw completes.\n const orig = s.getAttribute('stroke-dasharray') || s.style.strokeDasharray;\n if (orig) s.dataset.drawOrig = orig;\n // Markers (arrowheads) are not part of the dash pattern: they'd sit fully\n // visible at the endpoint while the stroke is still drawing toward it.\n // Stash them; they re-attach the moment the draw completes.\n for (const [attr, key] of MARKER_ATTRS) {\n const v = s.getAttribute(attr);\n if (v) s.dataset[key] = v;\n }\n s.classList.add('draw-stroke');\n s.style.setProperty('--draw-len', String(Math.ceil(len)));\n }\n // Non-stroke content (text, filled shapes) fades while strokes draw.\n const others = el.querySelectorAll('text, tspan');\n others.forEach((o) => o.classList.add('draw-fade'));\n if (!anyStroke) el.setAttribute('data-build-style', 'fade'); // spec: fallback\n}\n\nconst MARKER_ATTRS = [\n ['marker-start', 'drawMarkerStart'],\n ['marker-mid', 'drawMarkerMid'],\n ['marker-end', 'drawMarkerEnd'],\n];\nfunction setMarkers(s, on) {\n for (const [attr, key] of MARKER_ATTRS) {\n if (!(key in s.dataset)) continue;\n if (on) s.setAttribute(attr, s.dataset[key]);\n else s.removeAttribute(attr);\n }\n}\n\n/**\n * Sync draw completion state: restore an authored stroke-dasharray after the\n * draw animation (inline styles beat the draw CSS once the step is done), and\n * attach markers (arrowheads) only when the stroke has fully drawn \u2014 a marker\n * is not part of the dash pattern and would otherwise sit at the endpoint\n * before the line reaches it. Both are cleared again when the step returns to\n * pending, so un-building re-arms the draw.\n */\nfunction syncDrawRestore(el, state) {\n for (const s of el.querySelectorAll('.draw-stroke')) {\n const orig = s.dataset.drawOrig;\n const hasMarkers = MARKER_ATTRS.some(([, key]) => key in s.dataset);\n if (!orig && !hasMarkers) continue;\n if (state === 'done') {\n if (orig) { s.style.strokeDasharray = orig; s.style.strokeDashoffset = '0'; }\n setMarkers(s, true);\n } else if (state === 'pending') {\n s.style.removeProperty('stroke-dasharray');\n s.style.removeProperty('stroke-dashoffset');\n setMarkers(s, false);\n } else {\n // current: let the CSS dash-offset animation run (a dashed stroke draws\n // as a solid line, then snaps to its authored dashes on completion).\n s.style.removeProperty('stroke-dasharray');\n s.style.removeProperty('stroke-dashoffset');\n setMarkers(s, false);\n const restore = () => {\n if (el.getAttribute('data-build-state') !== 'pending') {\n if (orig) { s.style.strokeDasharray = orig; s.style.strokeDashoffset = '0'; }\n setMarkers(s, true);\n }\n };\n const dur = parseFloat(getComputedStyle(s).transitionDuration) || 0;\n if (dur === 0) {\n // transitions disabled (print, reduced-motion): restore synchronously\n restore();\n } else {\n s.addEventListener('transitionend', restore, { once: true });\n setTimeout(restore, dur * 1000 + 150); // safety net if the event is lost\n }\n }\n }\n}\n\n/**\n * Scan one slide. Returns a record:\n * { steps: [{kind:'dom', el, container} | {kind:'provider', provider, el, sub}],\n * groups: [[stepIdx\u2026]\u2026], providers: [{el, provider, first, count}] }\n */\nexport function scanSlide(section) {\n const steps = [];\n const items = []; // {key, explicit} parallel to steps\n const claimed = new Set();\n let auto = 0;\n\n const push = (step, orderAttr) => {\n const explicit = orderAttr != null && orderAttr !== '';\n const key = explicit ? parseInt(orderAttr, 10) : auto;\n steps.push(step);\n items.push({ key: Number.isFinite(key) ? key : auto, explicit });\n auto++;\n };\n\n const walker = document.createTreeWalker(section, NodeFilter.SHOW_ELEMENT);\n for (let el = walker.nextNode(); el; el = walker.nextNode()) {\n if (claimed.has(el)) continue;\n const provider = providerRegistry.get(el);\n if (provider) {\n for (let sub = 0; sub < provider.count; sub++) {\n push({ kind: 'provider', provider, el, sub }, null);\n }\n // provider element subtree is opaque to further build scanning\n el.querySelectorAll('*').forEach((d) => claimed.add(d));\n continue;\n }\n if (!el.hasAttribute('data-build')) continue;\n const style = el.getAttribute('data-build') || 'fade';\n if (isContainer(el)) {\n for (const child of stepSource(el)) {\n claimed.add(child);\n // a claimed child's own subtree is not re-scanned for builds\n child.querySelectorAll('[data-build]').forEach((d) => claimed.add(d));\n const childStyle = child.getAttribute('data-build') || style;\n markStep(child, childStyle);\n push({ kind: 'dom', el: child, container: el }, child.getAttribute('data-build-order'));\n }\n el.setAttribute('data-build-container', '');\n } else {\n markStep(el, style);\n push({ kind: 'dom', el, container: null }, el.getAttribute('data-build-order'));\n }\n }\n\n const groups = computeGroups(items);\n\n // provider bookkeeping: first group index covering each provider\n const providers = [];\n const seen = new Map();\n steps.forEach((s, i) => {\n if (s.kind !== 'provider') return;\n if (!seen.has(s.provider)) {\n const rec = { el: s.el, provider: s.provider, stepIdxs: [] };\n seen.set(s.provider, rec);\n providers.push(rec);\n }\n seen.get(s.provider).stepIdxs.push(i);\n });\n\n return { steps, groups, providers };\n}\n\n/**\n * Apply build state for `step` groups revealed (0 = nothing).\n * Idempotent; providers are called with their own revealed count.\n */\nexport function applyBuildState(record, step) {\n const revealedSteps = new Set();\n record.groups.forEach((group, g) => {\n for (const idx of group) if (g < step) revealedSteps.add(idx);\n });\n const currentGroup = step > 0 ? record.groups[step - 1] ?? [] : [];\n const currentSet = new Set(currentGroup);\n\n const touchedContainers = new Set();\n record.steps.forEach((s, i) => {\n if (s.kind !== 'dom') return;\n const state = currentSet.has(i) ? 'current' : revealedSteps.has(i) ? 'done' : 'pending';\n s.el.setAttribute('data-build-state', state);\n if (s.el.getAttribute('data-build-style') === 'draw') syncDrawRestore(s.el, state);\n if (s.container) touchedContainers.add(s.container);\n });\n // highlight style: container dims siblings while one step is current\n for (const c of touchedContainers) {\n const hasCurrentHl = !!c.querySelector(':scope [data-build-style=\"highlight\"][data-build-state=\"current\"]');\n c.classList.toggle('has-current-highlight', hasCurrentHl);\n }\n\n for (const p of record.providers) {\n const k = p.stepIdxs.filter((i) => revealedSteps.has(i) || currentSet.has(i)).length;\n if (p._last !== k) {\n p._last = k;\n p.provider.apply(k);\n }\n }\n}\n\n/** Speaker-view step labels for a slide record. */\nexport function stepLabels(record) {\n return record.groups.map((group) => {\n const s = record.steps[group[0]];\n if (s.kind === 'provider') {\n const sub = s.sub;\n return s.provider.label ? s.provider.label(sub + 1) : 'step';\n }\n const text = s.el.textContent.trim().replace(/\\s+/g, ' ');\n return text.slice(0, 60) || s.el.tagName.toLowerCase();\n });\n}\n", "// SVG id-namespacing \u2014 SPEC \u00A73. Eliminates the defs-collision bug class:\n// every inline <svg> gets a unique prefix on all ids, with url(#\u2026) and\n// href=\"#\u2026\" references rewritten within that svg only.\n//\n// Concept colors \u2014 SPEC \u00A73. `data-concept=\"agent\"` pins a shape (or a\n// group's shapes) to ONE diagram-fill slot deck-wide, so a recurring concept\n// never changes color between diagrams. Slot resolution: config.concepts\n// override \u2192 stable name hash. The indirection targets a slot\n// (var(--d-fill-N)), not a color, so it survives every theme.\n\nconst SHAPES = 'rect, circle, ellipse, polygon, polyline, path';\n\n// stable across sessions and decks: the same concept name always lands on\n// the same slot with zero configuration (djb2 over the name, mod 6)\nexport function conceptSlot(name) {\n let h = 5381;\n for (const c of String(name)) h = ((h * 33) ^ c.charCodeAt(0)) >>> 0;\n return 1 + (h % 6);\n}\n\n/** name \u2192 CSS fill value, honoring config overrides (slot number or raw CSS color). */\nexport function conceptFill(name, concepts = {}) {\n const conf = concepts[name];\n if (typeof conf === 'number') return `var(--d-fill-${conf})`;\n if (typeof conf === 'string') return conf;\n return `var(--d-fill-${conceptSlot(name)})`;\n}\n\nexport function applyConcepts(root, concepts = {}) {\n const seen = new Map(); // slot \u2192 first concept name (collision warning)\n root.querySelectorAll('svg [data-concept]').forEach((el) => {\n const name = el.getAttribute('data-concept');\n if (!name) return;\n const fill = conceptFill(name, concepts);\n const m = fill.match(/--d-fill-(\\d)/);\n if (m) {\n const owner = seen.get(m[1]);\n if (owner && owner !== name) {\n console.warn(`Decklight: concepts \"${owner}\" and \"${name}\" share fill slot ${m[1]} \u2014 pin one explicitly via init({ concepts: { ${name}: <1-6> } })`);\n } else {\n seen.set(m[1], name);\n }\n }\n // a group recolors its direct-child shapes; text keeps --d-text (fill on\n // SVG text is its ink \u2014 concept identity lives in the box, not the label)\n const targets = el.matches(SHAPES) ? [el]\n : [...el.children].filter((c) => c.matches(SHAPES));\n for (const t of targets) t.style.setProperty('fill', fill);\n });\n}\n\nconst REF_ATTRS = [\n 'fill', 'stroke', 'filter', 'clip-path', 'mask',\n 'marker-start', 'marker-mid', 'marker-end', 'style',\n];\n\nexport function namespaceSvgIds(root) {\n root.querySelectorAll('svg').forEach((svg, n) => {\n const prefix = `svg${n}-`;\n const map = new Map();\n svg.querySelectorAll('[id]').forEach((el) => {\n const old = el.id;\n map.set(old, prefix + old);\n el.id = prefix + old;\n });\n if (map.size === 0) return;\n\n const rewriteUrl = (value) =>\n value.replace(/url\\(['\"]?#([^'\")]+)['\"]?\\)/g, (m, id) =>\n map.has(id) ? `url(#${map.get(id)})` : m);\n\n svg.querySelectorAll('*').forEach((el) => {\n for (const attr of REF_ATTRS) {\n const v = el.getAttribute(attr);\n if (v && v.includes('url(#')) el.setAttribute(attr, rewriteUrl(v));\n }\n for (const attr of ['href', 'xlink:href']) {\n const v = el.getAttribute(attr);\n if (v && v.startsWith('#') && map.has(v.slice(1))) {\n el.setAttribute(attr, '#' + map.get(v.slice(1)));\n }\n }\n });\n });\n}\n", "// Auto-animate (Magic Move) \u2014 SPEC \u00A74.2. FLIP on data-id matches between two\n// adjacent sections, plus opacity/color/background/border-radius/font-size.\n\nconst VISUAL_PROPS = ['opacity', 'color', 'backgroundColor', 'borderRadius', 'fontSize'];\n\nfunction snapshot(el) {\n const cs = getComputedStyle(el);\n const snap = { rect: el.getBoundingClientRect() };\n for (const p of VISUAL_PROPS) snap[p] = cs[p];\n return snap;\n}\n\n// Screen-px \u2192 element-local units. SVG children need CTM math (viewBox\n// scaling); HTML children just divide by the stage scale.\nfunction localFactor(el, stageScale) {\n if (el.ownerSVGElement) {\n const ctm = el.getScreenCTM?.();\n if (ctm && ctm.a && ctm.d) return { x: ctm.a, y: ctm.d };\n }\n return { x: stageScale, y: stageScale };\n}\n\n/**\n * Animate from `fromSection` to `toSection`. Both must be laid out (the\n * engine displays `toSection` with visibility:hidden to measure first).\n * Returns the animation duration in ms.\n */\nexport function runAutoAnimate(fromSection, toSection, stageScale) {\n // --auto-animate-duration may be authored in ms or s \u2014 parse the unit\n // (blind `* 1000` turned \"500ms\" into 500 seconds: a crawl, not a move)\n const raw = getComputedStyle(toSection).getPropertyValue('--auto-animate-duration').trim();\n const duration = (raw.endsWith('ms') ? parseFloat(raw)\n : raw.endsWith('s') ? parseFloat(raw) * 1000\n : parseFloat(raw)) || 500;\n\n const olds = new Map();\n fromSection.querySelectorAll('[data-id]').forEach((el) => {\n olds.set(el.getAttribute('data-id'), snapshot(el));\n });\n\n const matched = [];\n toSection.querySelectorAll('[data-id]').forEach((el) => {\n const o = olds.get(el.getAttribute('data-id'));\n if (o) matched.push({ el, o });\n });\n\n for (const { el, o } of matched) {\n const n = snapshot(el);\n const f = localFactor(el, stageScale);\n const dx = (o.rect.left - n.rect.left) / f.x;\n const dy = (o.rect.top - n.rect.top) / f.y;\n const textOnly = el.children.length === 0 && o.fontSize !== n.fontSize;\n const sx = textOnly ? 1 : (n.rect.width ? o.rect.width / n.rect.width : 1);\n const sy = textOnly ? 1 : (n.rect.height ? o.rect.height / n.rect.height : 1);\n\n // Authored inline styles must survive the move \u2014 and per-property capture\n // can't do it: `background: var(--accent)` is a pending-substitution\n // shorthand whose longhands read back as '' and which is DROPPED the\n // moment any longhand is set through el.style. Snapshot the whole style\n // attribute, animate toward the COMPUTED target values, and restore the\n // authored attribute verbatim when the move completes.\n const authoredCss = el.getAttribute('style') ?? '';\n\n el.style.transition = 'none';\n if (el.ownerSVGElement) {\n el.style.transformBox = 'fill-box';\n el.style.transformOrigin = '0 0';\n } else {\n el.style.transformOrigin = '0 0';\n }\n el.style.transform = `translate(${dx}px, ${dy}px) scale(${sx}, ${sy})`;\n for (const p of VISUAL_PROPS) el.style[p] = o[p];\n\n void el.offsetWidth; // commit \"from\" state\n el.style.transition =\n `transform ${duration}ms ease, opacity ${duration}ms ease, color ${duration}ms ease, ` +\n `background-color ${duration}ms ease, border-radius ${duration}ms ease, font-size ${duration}ms ease`;\n el.style.transform = '';\n for (const p of VISUAL_PROPS) el.style[p] = n[p];\n\n const cleanup = () => {\n if (authoredCss) el.setAttribute('style', authoredCss);\n else el.removeAttribute('style');\n el.removeEventListener('transitionend', cleanup);\n };\n el.addEventListener('transitionend', cleanup);\n setTimeout(cleanup, duration + 80);\n }\n\n // Unmatched top-level content fades in.\n const matchedEls = new Set(matched.map((m) => m.el));\n [...toSection.children].forEach((child) => {\n if (child.matches('aside.notes')) return;\n const containsMatch = matchedEls.has(child) ||\n [...matchedEls].some((m) => child.contains(m));\n if (containsMatch) return;\n child.classList.add('aa-fresh');\n requestAnimationFrame(() => requestAnimationFrame(() => child.classList.add('aa-in')));\n setTimeout(() => child.classList.remove('aa-fresh', 'aa-in'), duration + 120);\n });\n\n return duration;\n}\n", "// Markdown slides \u2014 SPEC \u00A71 + \u00A72.1 (`::: build` directive).\n// Pure string transforms are exported for node:test; DOM application is in\n// initMarkdown (browser only).\n\nimport { marked } from 'marked';\n\nmarked.setOptions({ gfm: true, breaks: false });\n\n/** Strip the common leading indentation of a template block. */\nexport function dedent(text) {\n const lines = text.replace(/^\\n+/, '').replace(/\\s+$/, '').split('\\n');\n let indent = Infinity;\n for (const l of lines) {\n if (!l.trim()) continue;\n indent = Math.min(indent, l.match(/^[ \\t]*/)[0].length);\n }\n if (!Number.isFinite(indent) || indent === 0) return lines.join('\\n');\n return lines.map((l) => l.slice(indent)).join('\\n');\n}\n\n/**\n * Split body and speaker notes at the first line that is exactly `Note:`.\n * Inside the notes, a line that is exactly `Rehearse:` starts the condensed\n * cue-card variant (SPEC \u00A78 speaker-view rehearse mode) \u2014 same \u27E8CLICK\u27E9\n * segmentation as the notes, a few words per segment.\n */\nexport function splitNotes(md) {\n const m = md.match(/^Note:\\s*$/m);\n if (!m) return { body: md, notes: null, rehearse: null };\n const body = md.slice(0, m.index).replace(/\\s+$/, '');\n let notes = md.slice(m.index + m[0].length).replace(/^\\n/, '');\n let rehearse = null;\n const r = notes.match(/^Rehearse:\\s*$/m);\n if (r) {\n rehearse = notes.slice(r.index + r[0].length).replace(/^\\n/, '');\n notes = notes.slice(0, r.index).replace(/\\s+$/, '');\n }\n return { body, notes, rehearse };\n}\n\n// `::: build` \u2026 `:::` \u2192 an html block wrapping the content in <div data-build>.\n// Blank lines around the tags keep CommonMark parsing the inner markdown.\n// NB: `[ \\t]*` not `\\s*` \u2014 \\s matches newlines and would swallow the blank\n// line that terminates the closing HTML block (breaking whatever follows).\nexport function applyBuildDirective(md) {\n return md\n .replace(/^:::[ \\t]*build[ \\t]*([\\w-]*)[ \\t]*$/gm, (m, style) =>\n style ? `<div data-build=\"${style}\">\\n` : '<div data-build>\\n')\n .replace(/^:::[ \\t]*$/gm, '\\n</div>');\n}\n\n// A `::: build` wrapping exactly one list/table should step that container's\n// children, not reveal the wrapper as a single block: hoist the attribute.\nexport function hoistBuildWrappers(rootEl) {\n rootEl.querySelectorAll('div[data-build]').forEach((div) => {\n const kids = [...div.children];\n if (kids.length !== 1) return;\n const child = kids[0];\n if (!/^(UL|OL|TABLE|DL)$/.test(child.tagName)) return;\n const style = div.getAttribute('data-build');\n if (!child.hasAttribute('data-build')) {\n child.setAttribute('data-build', style || '');\n }\n div.removeAttribute('data-build');\n });\n}\n\n/** Full transform: template text \u2192 { html, notesHtml, rehearseHtml }. */\nexport function renderMarkdownSlide(template) {\n const { body, notes, rehearse } = splitNotes(dedent(template));\n const html = marked.parse(applyBuildDirective(body));\n const notesHtml = notes ? marked.parse(notes) : null;\n const rehearseHtml = rehearse ? marked.parse(rehearse) : null;\n return { html, notesHtml, rehearseHtml };\n}\n\n/** Browser: expand every `section[data-markdown]` in place. */\nexport function initMarkdown(root) {\n root.querySelectorAll('section[data-markdown]').forEach((section) => {\n const tpl = section.querySelector('script[type=\"text/template\"]');\n const source = tpl ? tpl.textContent : section.textContent;\n const { html, notesHtml, rehearseHtml } = renderMarkdownSlide(source);\n section.innerHTML = html;\n hoistBuildWrappers(section);\n for (const [cls, content] of [['notes', notesHtml], ['rehearse', rehearseHtml]]) {\n if (!content) continue;\n const aside = document.createElement('aside');\n aside.className = cls;\n aside.innerHTML = content;\n section.appendChild(aside);\n }\n section.removeAttribute('data-markdown');\n section.setAttribute('data-was-markdown', '');\n });\n}\n", "import type { MarkedOptions } from './MarkedOptions.ts';\n\n/**\n * Gets the original marked default options.\n */\nexport function _getDefaults(): MarkedOptions {\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}\n\nexport let _defaults = _getDefaults();\n\nexport function changeDefaults(newDefaults: MarkedOptions) {\n _defaults = newDefaults;\n}\n", "const noopTest = { exec: () => null } as unknown as RegExp;\n\nfunction edit(regex: string | RegExp, opt = '') {\n let source = typeof regex === 'string' ? regex : regex.source;\n const obj = {\n replace: (name: string | RegExp, val: string | RegExp) => {\n let valSource = typeof val === 'string' ? val : val.source;\n valSource = valSource.replace(other.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}\n\nexport const other = {\n codeRemoveIndent: /^(?: {1,4}| {0,3}\\t)/gm,\n outputLinkReplace: /\\\\([\\[\\]])/g,\n indentCodeCompensation: /^(\\s+)(?:```)/,\n beginningSpace: /^\\s+/,\n endingHash: /#$/,\n startingSpaceChar: /^ /,\n endingSpaceChar: / $/,\n nonSpaceChar: /[^ ]/,\n newLineCharGlobal: /\\n/g,\n tabCharGlobal: /\\t/g,\n multipleSpaceGlobal: /\\s+/g,\n blankLine: /^[ \\t]*$/,\n doubleBlankLine: /\\n[ \\t]*\\n[ \\t]*$/,\n blockquoteStart: /^ {0,3}>/,\n blockquoteSetextReplace: /\\n {0,3}((?:=+|-+) *)(?=\\n|$)/g,\n blockquoteSetextReplace2: /^ {0,3}>[ \\t]?/gm,\n listReplaceTabs: /^\\t+/,\n listReplaceNesting: /^ {1,4}(?=( {4})*[^ ])/g,\n listIsTask: /^\\[[ xX]\\] /,\n listReplaceTask: /^\\[[ xX]\\] +/,\n anyLine: /\\n.*\\n/,\n hrefBrackets: /^<(.*)>$/,\n tableDelimiter: /[:|]/,\n tableAlignChars: /^\\||\\| *$/g,\n tableRowBlankLine: /\\n[ \\t]*$/,\n tableAlignRight: /^ *-+: *$/,\n tableAlignCenter: /^ *:-+: *$/,\n tableAlignLeft: /^ *:-+ *$/,\n startATag: /^<a /i,\n endATag: /^<\\/a>/i,\n startPreScriptTag: /^<(pre|code|kbd|script)(\\s|>)/i,\n endPreScriptTag: /^<\\/(pre|code|kbd|script)(\\s|>)/i,\n startAngleBracket: /^</,\n endAngleBracket: />$/,\n pedanticHrefTitle: /^([^'\"]*[^\\s])\\s+(['\"])(.*)\\2/,\n unicodeAlphaNumeric: /[\\p{L}\\p{N}]/u,\n escapeTest: /[&<>\"']/,\n escapeReplace: /[&<>\"']/g,\n escapeTestNoEncode: /[<>\"']|&(?!(#\\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\\w+);)/,\n escapeReplaceNoEncode: /[<>\"']|&(?!(#\\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\\w+);)/g,\n unescapeTest: /&(#(?:\\d+)|(?:#x[0-9A-Fa-f]+)|(?:\\w+));?/ig,\n caret: /(^|[^\\[])\\^/g,\n percentDecode: /%25/g,\n findPipe: /\\|/g,\n splitPipe: / \\|/,\n slashPipe: /\\\\\\|/g,\n carriageReturn: /\\r\\n|\\r/g,\n spaceLine: /^ +$/gm,\n notSpaceStart: /^\\S*/,\n endingNewline: /\\n$/,\n listItemRegex: (bull: string) => new RegExp(`^( {0,3}${bull})((?:[\\t ][^\\\\n]*)?(?:\\\\n|$))`),\n nextBulletRegex: (indent: number) => new RegExp(`^ {0,${Math.min(3, indent - 1)}}(?:[*+-]|\\\\d{1,9}[.)])((?:[ \\t][^\\\\n]*)?(?:\\\\n|$))`),\n hrRegex: (indent: number) => new RegExp(`^ {0,${Math.min(3, indent - 1)}}((?:- *){3,}|(?:_ *){3,}|(?:\\\\* *){3,})(?:\\\\n+|$)`),\n fencesBeginRegex: (indent: number) => new RegExp(`^ {0,${Math.min(3, indent - 1)}}(?:\\`\\`\\`|~~~)`),\n headingBeginRegex: (indent: number) => new RegExp(`^ {0,${Math.min(3, indent - 1)}}#`),\n htmlBeginRegex: (indent: number) => new RegExp(`^ {0,${Math.min(3, indent - 1)}}<(?:[a-z].*>|!--)`, 'i'),\n};\n\n/**\n * Block-Level Grammar\n */\n\nconst newline = /^(?:[ \\t]*(?:\\n|$))+/;\nconst blockCode = /^((?: {4}| {0,3}\\t)[^\\n]+(?:\\n(?:[ \\t]*(?:\\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 lheadingCore = /^(?!bull |blockCode|fences|blockquote|heading|html|table)((?:.|\\n(?!\\s*?\\n|bull |blockCode|fences|blockquote|heading|html|table))+?)\\n {0,3}(=+|-+) *(?:\\n+|$)/;\nconst lheading = edit(lheadingCore)\n .replace(/bull/g, bullet) // lists can interrupt\n .replace(/blockCode/g, /(?: {4}| {0,3}\\t)/) // indented code blocks can interrupt\n .replace(/fences/g, / {0,3}(?:`{3,}|~{3,})/) // fenced code blocks can interrupt\n .replace(/blockquote/g, / {0,3}>/) // blockquote can interrupt\n .replace(/heading/g, / {0,3}#{1,6}/) // ATX heading can interrupt\n .replace(/html/g, / {0,3}<[^\\n>]+>\\n/) // block html can interrupt\n .replace(/\\|table/g, '') // table not in commonmark\n .getRegex();\nconst lheadingGfm = edit(lheadingCore)\n .replace(/bull/g, bullet) // lists can interrupt\n .replace(/blockCode/g, /(?: {4}| {0,3}\\t)/) // indented code blocks can interrupt\n .replace(/fences/g, / {0,3}(?:`{3,}|~{3,})/) // fenced code blocks can interrupt\n .replace(/blockquote/g, / {0,3}>/) // blockquote can interrupt\n .replace(/heading/g, / {0,3}#{1,6}/) // ATX heading can interrupt\n .replace(/html/g, / {0,3}<[^\\n>]+>\\n/) // block html can interrupt\n .replace(/table/g, / {0,3}\\|?(?:[:\\- ]*\\|)+[\\:\\- ]*\\n/) // table 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[ \\t]*)?([^<\\s][^\\s]*|<.*?>)(?:(?: +(?:\\n[ \\t]*)?| *\\n[ \\t]*)(title))? *(?:\\n+|$)/)\n .replace('label', _blockLabel)\n .replace('title', /(?:\"(?:\\\\\"?|[^\"\\\\])*\"|'[^'\\n]*(?:\\n[^'\\n]+)*\\n?'|\\([^()]*\\))/)\n .getRegex();\n\nconst list = edit(/^( {0,3}bull)([ \\t][^\\n]+?)?(?:\\n|$)/)\n .replace(/bull/g, bullet)\n .getRegex();\n\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(\n '^ {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[ \\t]*)+\\\\n|$)' // (6)\n+ '|<(?!script|pre|style|textarea)([a-z][\\\\w-]*)(?:attribute)*? */?>(?=[ \\\\t]*(?:\\\\n|$))[\\\\s\\\\S]*?(?:(?:\\\\n[ \\t]*)+\\\\n|$)' // (7) open tag\n+ '|</(?!script|pre|style|textarea)[a-z][\\\\w-]*\\\\s*>(?=[ \\\\t]*(?:\\\\n|$))[\\\\s\\\\S]*?(?:(?:\\\\n[ \\t]*)+\\\\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();\n\nconst paragraph = edit(_paragraph)\n .replace('hr', hr)\n .replace('heading', ' {0,3}#{1,6}(?:\\\\s|$)')\n .replace('|lheading', '') // setext 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();\n\nconst blockquote = edit(/^( {0,3}> ?(paragraph|[^\\n]*)(?:\\n|$))+/)\n .replace('paragraph', paragraph)\n .getRegex();\n\n/**\n * Normal Block Grammar\n */\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\ntype BlockKeys = keyof typeof blockNormal;\n\n/**\n * GFM Block Grammar\n */\n\nconst gfmTable = edit(\n '^ *([^\\\\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}| {0,3}\\t)[^\\\\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();\n\nconst blockGfm: Record<BlockKeys, RegExp> = {\n ...blockNormal,\n lheading: lheadingGfm,\n table: gfmTable,\n paragraph: edit(_paragraph)\n .replace('hr', hr)\n .replace('heading', ' {0,3}#{1,6}(?:\\\\s|$)')\n .replace('|lheading', '') // setext 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/**\n * Pedantic grammar (original John Gruber's loose markdown specification)\n */\n\nconst blockPedantic: Record<BlockKeys, RegExp> = {\n ...blockNormal,\n html: edit(\n '^ *(?: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/**\n * Inline-Level Grammar\n */\n\nconst escape = /^\\\\([!\"#$%&'()*+,\\-./:;<=>?@\\[\\]\\\\^_`{|}~])/;\nconst inlineCode = /^(`+)([^`]|[^`][\\s\\S]*?[^`])\\1(?!`)/;\nconst br = /^( {2,}|\\\\)\\n(?!\\s*$)/;\nconst inlineText = /^(`+|[^`])(?:(?= {2,}\\n)|[\\s\\S]*?(?:(?=[\\\\<!\\[`*_]|\\b_|$)|[^ ](?= {2,}\\n)))/;\n\n// list of unicode punctuation marks, plus any missing characters from CommonMark spec\nconst _punctuation = /[\\p{P}\\p{S}]/u;\nconst _punctuationOrSpace = /[\\s\\p{P}\\p{S}]/u;\nconst _notPunctuationOrSpace = /[^\\s\\p{P}\\p{S}]/u;\nconst punctuation = edit(/^((?![*_])punctSpace)/, 'u')\n .replace(/punctSpace/g, _punctuationOrSpace).getRegex();\n\n// GFM allows ~ inside strong and em for strikethrough\nconst _punctuationGfmStrongEm = /(?!~)[\\p{P}\\p{S}]/u;\nconst _punctuationOrSpaceGfmStrongEm = /(?!~)[\\s\\p{P}\\p{S}]/u;\nconst _notPunctuationOrSpaceGfmStrongEm = /(?:[^\\s\\p{P}\\p{S}]|~)/u;\n\n// sequences em should skip over [title](link), `code`, <html>\nconst blockSkip = /\\[[^[\\]]*?\\]\\((?:\\\\.|[^\\\\\\(\\)]|\\((?:\\\\.|[^\\\\\\(\\)])*\\))*\\)|`[^`]*?`|<[^<>]*?>/g;\n\nconst emStrongLDelimCore = /^(?:\\*+(?:((?!\\*)punct)|[^\\s*]))|^_+(?:((?!_)punct)|([^\\s_]))/;\n\nconst emStrongLDelim = edit(emStrongLDelimCore, 'u')\n .replace(/punct/g, _punctuation)\n .getRegex();\n\nconst emStrongLDelimGfm = edit(emStrongLDelimCore, 'u')\n .replace(/punct/g, _punctuationGfmStrongEm)\n .getRegex();\n\nconst emStrongRDelimAstCore =\n '^[^_*]*?__[^_*]*?\\\\*[^_*]*?(?=__)' // Skip orphan inside strong\n+ '|[^*]+(?=[^*])' // Consume to delim\n+ '|(?!\\\\*)punct(\\\\*+)(?=[\\\\s]|$)' // (1) #*** can only be a Right Delimiter\n+ '|notPunctSpace(\\\\*+)(?!\\\\*)(?=punctSpace|$)' // (2) a***#, a*** can only be a Right Delimiter\n+ '|(?!\\\\*)punctSpace(\\\\*+)(?=notPunctSpace)' // (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+ '|notPunctSpace(\\\\*+)(?=notPunctSpace)'; // (6) a***a can be either Left or Right Delimiter\n\nconst emStrongRDelimAst = edit(emStrongRDelimAstCore, 'gu')\n .replace(/notPunctSpace/g, _notPunctuationOrSpace)\n .replace(/punctSpace/g, _punctuationOrSpace)\n .replace(/punct/g, _punctuation)\n .getRegex();\n\nconst emStrongRDelimAstGfm = edit(emStrongRDelimAstCore, 'gu')\n .replace(/notPunctSpace/g, _notPunctuationOrSpaceGfmStrongEm)\n .replace(/punctSpace/g, _punctuationOrSpaceGfmStrongEm)\n .replace(/punct/g, _punctuationGfmStrongEm)\n .getRegex();\n\n// (6) Not allowed for _\nconst emStrongRDelimUnd = edit(\n '^[^_*]*?\\\\*\\\\*[^_*]*?_[^_*]*?(?=\\\\*\\\\*)' // Skip orphan inside strong\n+ '|[^_]+(?=[^_])' // Consume to delim\n+ '|(?!_)punct(_+)(?=[\\\\s]|$)' // (1) #___ can only be a Right Delimiter\n+ '|notPunctSpace(_+)(?!_)(?=punctSpace|$)' // (2) a___#, a___ can only be a Right Delimiter\n+ '|(?!_)punctSpace(_+)(?=notPunctSpace)' // (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(/notPunctSpace/g, _notPunctuationOrSpace)\n .replace(/punctSpace/g, _punctuationOrSpace)\n .replace(/punct/g, _punctuation)\n .getRegex();\n\nconst anyPunctuation = edit(/\\\\(punct)/, 'gu')\n .replace(/punct/g, _punctuation)\n .getRegex();\n\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();\n\nconst _inlineComment = edit(_comment).replace('(?:-->|$)', '-->').getRegex();\nconst tag = edit(\n '^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();\n\nconst _inlineLabel = /(?:\\[(?:\\\\.|[^\\[\\]\\\\])*\\]|\\\\.|`[^`]*`|[^\\[\\]\\\\`])*?/;\n\nconst link = edit(/^!?\\[(label)\\]\\(\\s*(href)(?:(?:[ \\t]*(?:\\n[ \\t]*)?)(title))?\\s*\\)/)\n .replace('label', _inlineLabel)\n .replace('href', /<(?:\\\\.|[^\\n<>\\\\])+>|[^ \\t\\n\\x00-\\x1f]*/)\n .replace('title', /\"(?:\\\\\"?|[^\"\\\\])*\"|'(?:\\\\'?|[^'\\\\])*'|\\((?:\\\\\\)?|[^)\\\\])*\\)/)\n .getRegex();\n\nconst reflink = edit(/^!?\\[(label)\\]\\[(ref)\\]/)\n .replace('label', _inlineLabel)\n .replace('ref', _blockLabel)\n .getRegex();\n\nconst nolink = edit(/^!?\\[(ref)\\](?:\\[\\])?/)\n .replace('ref', _blockLabel)\n .getRegex();\n\nconst reflinkSearch = edit('reflink|nolink(?!\\\\()', 'g')\n .replace('reflink', reflink)\n .replace('nolink', nolink)\n .getRegex();\n\n/**\n * Normal Inline Grammar\n */\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\ntype InlineKeys = keyof typeof inlineNormal;\n\n/**\n * Pedantic Inline Grammar\n */\n\nconst inlinePedantic: Record<InlineKeys, RegExp> = {\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/**\n * GFM Inline Grammar\n */\n\nconst inlineGfm: Record<InlineKeys, RegExp> = {\n ...inlineNormal,\n emStrongRDelimAst: emStrongRDelimAstGfm,\n emStrongLDelim: emStrongLDelimGfm,\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~\\\\]))\\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/**\n * GFM + Line Breaks Inline Grammar\n */\n\nconst inlineBreaks: Record<InlineKeys, RegExp> = {\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/**\n * exports\n */\n\nexport const block = {\n normal: blockNormal,\n gfm: blockGfm,\n pedantic: blockPedantic,\n};\n\nexport const inline = {\n normal: inlineNormal,\n gfm: inlineGfm,\n breaks: inlineBreaks,\n pedantic: inlinePedantic,\n};\n\nexport interface Rules {\n other: typeof other\n block: Record<BlockKeys, RegExp>\n inline: Record<InlineKeys, RegExp>\n}\n", "import { other } from './rules.ts';\n\n/**\n * Helpers\n */\nconst escapeReplacements: { [index: string]: string } = {\n '&': '&',\n '<': '<',\n '>': '>',\n '\"': '"',\n \"'\": ''',\n};\nconst getEscapeReplacement = (ch: string) => escapeReplacements[ch];\n\nexport function escape(html: string, encode?: boolean) {\n if (encode) {\n if (other.escapeTest.test(html)) {\n return html.replace(other.escapeReplace, getEscapeReplacement);\n }\n } else {\n if (other.escapeTestNoEncode.test(html)) {\n return html.replace(other.escapeReplaceNoEncode, getEscapeReplacement);\n }\n }\n\n return html;\n}\n\nexport function unescape(html: string) {\n // explicitly match decimal, hex, and named HTML entities\n return html.replace(other.unescapeTest, (_, n) => {\n n = n.toLowerCase();\n if (n === 'colon') 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}\n\nexport function cleanUrl(href: string) {\n try {\n href = encodeURI(href).replace(other.percentDecode, '%');\n } catch {\n return null;\n }\n return href;\n}\n\nexport function splitCells(tableRow: string, count?: number) {\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(other.findPipe, (match, offset, str) => {\n let escaped = false;\n let curr = offset;\n while (--curr >= 0 && str[curr] === '\\\\') escaped = !escaped;\n if (escaped) {\n // odd number of slashes means | is escaped\n // so we leave it alone\n return '|';\n } else {\n // add space before unescaped |\n return ' |';\n }\n }),\n cells = row.split(other.splitPipe);\n let i = 0;\n\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.at(-1)?.trim()) {\n cells.pop();\n }\n\n if (count) {\n if (cells.length > count) {\n cells.splice(count);\n } else {\n while (cells.length < count) cells.push('');\n }\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(other.slashPipe, '|');\n }\n return cells;\n}\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 */\nexport function rtrim(str: string, c: string, invert?: boolean) {\n const l = str.length;\n if (l === 0) {\n return '';\n }\n\n // Length of suffix matching the invert condition.\n let suffLen = 0;\n\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 } else if (currChar !== c && invert) {\n suffLen++;\n } else {\n break;\n }\n }\n\n return str.slice(0, l - suffLen);\n}\n\nexport function findClosingBracket(str: string, b: string) {\n if (str.indexOf(b[1]) === -1) {\n return -1;\n }\n\n let level = 0;\n for (let i = 0; i < str.length; i++) {\n if (str[i] === '\\\\') {\n i++;\n } else if (str[i] === b[0]) {\n level++;\n } else if (str[i] === b[1]) {\n level--;\n if (level < 0) {\n return i;\n }\n }\n }\n if (level > 0) {\n return -2;\n }\n\n return -1;\n}\n", "import { _defaults } from './defaults.ts';\nimport {\n rtrim,\n splitCells,\n findClosingBracket,\n} from './helpers.ts';\nimport type { Rules } from './rules.ts';\nimport type { _Lexer } from './Lexer.ts';\nimport type { Links, Tokens, Token } from './Tokens.ts';\nimport type { MarkedOptions } from './MarkedOptions.ts';\n\nfunction outputLink(cap: string[], link: Pick<Tokens.Link, 'href' | 'title'>, raw: string, lexer: _Lexer, rules: Rules): Tokens.Link | Tokens.Image {\n const href = link.href;\n const title = link.title || null;\n const text = cap[1].replace(rules.other.outputLinkReplace, '$1');\n\n lexer.state.inLink = true;\n const token: Tokens.Link | Tokens.Image = {\n type: cap[0].charAt(0) === '!' ? 'image' : '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\nfunction indentCodeCompensation(raw: string, text: string, rules: Rules) {\n const matchIndentToCode = raw.match(rules.other.indentCodeCompensation);\n\n if (matchIndentToCode === null) {\n return text;\n }\n\n const indentToCode = matchIndentToCode[1];\n\n return text\n .split('\\n')\n .map(node => {\n const matchIndentInNode = node.match(rules.other.beginningSpace);\n if (matchIndentInNode === null) {\n return node;\n }\n\n const [indentInNode] = matchIndentInNode;\n\n if (indentInNode.length >= indentToCode.length) {\n return node.slice(indentToCode.length);\n }\n\n return node;\n })\n .join('\\n');\n}\n\n/**\n * Tokenizer\n */\nexport class _Tokenizer {\n options: MarkedOptions;\n rules!: Rules; // set by the lexer\n lexer!: _Lexer; // set by the lexer\n\n constructor(options?: MarkedOptions) {\n this.options = options || _defaults;\n }\n\n space(src: string): Tokens.Space | undefined {\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\n code(src: string): Tokens.Code | undefined {\n const cap = this.rules.block.code.exec(src);\n if (cap) {\n const text = cap[0].replace(this.rules.other.codeRemoveIndent, '');\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\n fences(src: string): Tokens.Code | undefined {\n const cap = this.rules.block.fences.exec(src);\n if (cap) {\n const raw = cap[0];\n const text = indentCodeCompensation(raw, cap[3] || '', this.rules);\n\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\n heading(src: string): Tokens.Heading | undefined {\n const cap = this.rules.block.heading.exec(src);\n if (cap) {\n let text = cap[2].trim();\n\n // remove trailing #s\n if (this.rules.other.endingHash.test(text)) {\n const trimmed = rtrim(text, '#');\n if (this.options.pedantic) {\n text = trimmed.trim();\n } else if (!trimmed || this.rules.other.endingSpaceChar.test(trimmed)) {\n // CommonMark requires space before trailing #s\n text = trimmed.trim();\n }\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\n hr(src: string): Tokens.Hr | undefined {\n const cap = this.rules.block.hr.exec(src);\n if (cap) {\n return {\n type: 'hr',\n raw: rtrim(cap[0], '\\n'),\n };\n }\n }\n\n blockquote(src: string): Tokens.Blockquote | undefined {\n const cap = this.rules.block.blockquote.exec(src);\n if (cap) {\n let lines = rtrim(cap[0], '\\n').split('\\n');\n let raw = '';\n let text = '';\n const tokens: Token[] = [];\n\n while (lines.length > 0) {\n let inBlockquote = false;\n const currentLines = [];\n\n let i;\n for (i = 0; i < lines.length; i++) {\n // get lines up to a continuation\n if (this.rules.other.blockquoteStart.test(lines[i])) {\n currentLines.push(lines[i]);\n inBlockquote = true;\n } else if (!inBlockquote) {\n currentLines.push(lines[i]);\n } else {\n break;\n }\n }\n lines = lines.slice(i);\n\n const currentRaw = currentLines.join('\\n');\n const currentText = currentRaw\n // precede setext continuation with 4 spaces so it isn't a setext\n .replace(this.rules.other.blockquoteSetextReplace, '\\n $1')\n .replace(this.rules.other.blockquoteSetextReplace2, '');\n raw = raw ? `${raw}\\n${currentRaw}` : currentRaw;\n text = text ? `${text}\\n${currentText}` : currentText;\n\n // parse blockquote lines as top level tokens\n // merge paragraphs if this is a continuation\n const top = this.lexer.state.top;\n this.lexer.state.top = true;\n this.lexer.blockTokens(currentText, tokens, true);\n this.lexer.state.top = top;\n\n // if there is no continuation then we are done\n if (lines.length === 0) {\n break;\n }\n\n const lastToken = tokens.at(-1);\n\n if (lastToken?.type === 'code') {\n // blockquote continuation cannot be preceded by a code block\n break;\n } else if (lastToken?.type === 'blockquote') {\n // include continuation in nested blockquote\n const oldToken = lastToken as Tokens.Blockquote;\n const newText = oldToken.raw + '\\n' + lines.join('\\n');\n const newToken = this.blockquote(newText)!;\n tokens[tokens.length - 1] = newToken;\n\n raw = raw.substring(0, raw.length - oldToken.raw.length) + newToken.raw;\n text = text.substring(0, text.length - oldToken.text.length) + newToken.text;\n break;\n } else if (lastToken?.type === 'list') {\n // include continuation in nested list\n const oldToken = lastToken as Tokens.List;\n const newText = oldToken.raw + '\\n' + lines.join('\\n');\n const newToken = this.list(newText)!;\n tokens[tokens.length - 1] = newToken;\n\n raw = raw.substring(0, raw.length - lastToken.raw.length) + newToken.raw;\n text = text.substring(0, text.length - oldToken.raw.length) + newToken.raw;\n lines = newText.substring(tokens.at(-1)!.raw.length).split('\\n');\n continue;\n }\n }\n\n return {\n type: 'blockquote',\n raw,\n tokens,\n text,\n };\n }\n }\n\n list(src: string): Tokens.List | undefined {\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\n const list: Tokens.List = {\n type: 'list',\n raw: '',\n ordered: isordered,\n start: isordered ? +bull.slice(0, -1) : '',\n loose: false,\n items: [],\n };\n\n bull = isordered ? `\\\\d{1,9}\\\\${bull.slice(-1)}` : `\\\\${bull}`;\n\n if (this.options.pedantic) {\n bull = isordered ? bull : '[*+-]';\n }\n\n // Get next list item\n const itemRegex = this.rules.other.listItemRegex(bull);\n let endsWithBlankLine = false;\n // Check if current bullet point can start a new List Item\n while (src) {\n let endEarly = false;\n let raw = '';\n let itemContents = '';\n if (!(cap = itemRegex.exec(src))) {\n break;\n }\n\n if (this.rules.block.hr.test(src)) { // End list if bullet was actually HR (possibly move into itemRegex?)\n break;\n }\n\n raw = cap[0];\n src = src.substring(raw.length);\n\n let line = cap[2].split('\\n', 1)[0].replace(this.rules.other.listReplaceTabs, (t: string) => ' '.repeat(3 * t.length));\n let nextLine = src.split('\\n', 1)[0];\n let blankLine = !line.trim();\n\n let indent = 0;\n if (this.options.pedantic) {\n indent = 2;\n itemContents = line.trimStart();\n } else if (blankLine) {\n indent = cap[1].length + 1;\n } else {\n indent = cap[2].search(this.rules.other.nonSpaceChar); // 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\n if (blankLine && this.rules.other.blankLine.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\n if (!endEarly) {\n const nextBulletRegex = this.rules.other.nextBulletRegex(indent);\n const hrRegex = this.rules.other.hrRegex(indent);\n const fencesBeginRegex = this.rules.other.fencesBeginRegex(indent);\n const headingBeginRegex = this.rules.other.headingBeginRegex(indent);\n const htmlBeginRegex = this.rules.other.htmlBeginRegex(indent);\n\n // Check if following lines should be included in List Item\n while (src) {\n const rawLine = src.split('\\n', 1)[0];\n let nextLineWithoutTabs;\n nextLine = rawLine;\n\n // Re-align to follow commonmark nesting rules\n if (this.options.pedantic) {\n nextLine = nextLine.replace(this.rules.other.listReplaceNesting, ' ');\n nextLineWithoutTabs = nextLine;\n } else {\n nextLineWithoutTabs = nextLine.replace(this.rules.other.tabCharGlobal, ' ');\n }\n\n // End list item if found code fences\n if (fencesBeginRegex.test(nextLine)) {\n break;\n }\n\n // End list item if found start of new heading\n if (headingBeginRegex.test(nextLine)) {\n break;\n }\n\n // End list item if found start of html block\n if (htmlBeginRegex.test(nextLine)) {\n break;\n }\n\n // End list item if found start of new bullet\n if (nextBulletRegex.test(nextLine)) {\n break;\n }\n\n // Horizontal rule found\n if (hrRegex.test(nextLine)) {\n break;\n }\n\n if (nextLineWithoutTabs.search(this.rules.other.nonSpaceChar) >= indent || !nextLine.trim()) { // Dedent if possible\n itemContents += '\\n' + nextLineWithoutTabs.slice(indent);\n } else {\n // not enough indentation\n if (blankLine) {\n break;\n }\n\n // paragraph continuation unless last line was a different block level element\n if (line.replace(this.rules.other.tabCharGlobal, ' ').search(this.rules.other.nonSpaceChar) >= 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\n itemContents += '\\n' + nextLine;\n }\n\n if (!blankLine && !nextLine.trim()) { // Check if current line is blank\n blankLine = true;\n }\n\n raw += rawLine + '\\n';\n src = src.substring(rawLine.length + 1);\n line = nextLineWithoutTabs.slice(indent);\n }\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 } else if (this.rules.other.doubleBlankLine.test(raw)) {\n endsWithBlankLine = true;\n }\n }\n\n let istask: RegExpExecArray | null = null;\n let ischecked: boolean | undefined;\n // Check for task list items\n if (this.options.gfm) {\n istask = this.rules.other.listIsTask.exec(itemContents);\n if (istask) {\n ischecked = istask[0] !== '[ ] ';\n itemContents = itemContents.replace(this.rules.other.listReplaceTask, '');\n }\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\n list.raw += raw;\n }\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 const lastItem = list.items.at(-1);\n if (lastItem) {\n lastItem.raw = lastItem.raw.trimEnd();\n lastItem.text = lastItem.text.trimEnd();\n } else {\n // not a list since there were no items\n return;\n }\n list.raw = list.raw.trimEnd();\n\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\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 => this.rules.other.anyLine.test(t.raw));\n\n list.loose = hasMultipleLineBreaks;\n }\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\n return list;\n }\n }\n\n html(src: string): Tokens.HTML | undefined {\n const cap = this.rules.block.html.exec(src);\n if (cap) {\n const token: Tokens.HTML = {\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\n def(src: string): Tokens.Def | undefined {\n const cap = this.rules.block.def.exec(src);\n if (cap) {\n const tag = cap[1].toLowerCase().replace(this.rules.other.multipleSpaceGlobal, ' ');\n const href = cap[2] ? cap[2].replace(this.rules.other.hrefBrackets, '$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\n table(src: string): Tokens.Table | undefined {\n const cap = this.rules.block.table.exec(src);\n if (!cap) {\n return;\n }\n\n if (!this.rules.other.tableDelimiter.test(cap[2])) {\n // delimiter row must have a pipe (|) or colon (:) otherwise it is a setext heading\n return;\n }\n\n const headers = splitCells(cap[1]);\n const aligns = cap[2].replace(this.rules.other.tableAlignChars, '').split('|');\n const rows = cap[3]?.trim() ? cap[3].replace(this.rules.other.tableRowBlankLine, '').split('\\n') : [];\n\n const item: Tokens.Table = {\n type: 'table',\n raw: cap[0],\n header: [],\n align: [],\n rows: [],\n };\n\n if (headers.length !== aligns.length) {\n // header and align columns must be equal, rows can be different.\n return;\n }\n\n for (const align of aligns) {\n if (this.rules.other.tableAlignRight.test(align)) {\n item.align.push('right');\n } else if (this.rules.other.tableAlignCenter.test(align)) {\n item.align.push('center');\n } else if (this.rules.other.tableAlignLeft.test(align)) {\n item.align.push('left');\n } else {\n item.align.push(null);\n }\n }\n\n for (let i = 0; i < headers.length; i++) {\n item.header.push({\n text: headers[i],\n tokens: this.lexer.inline(headers[i]),\n header: true,\n align: item.align[i],\n });\n }\n\n for (const row of rows) {\n item.rows.push(splitCells(row, item.header.length).map((cell, i) => {\n return {\n text: cell,\n tokens: this.lexer.inline(cell),\n header: false,\n align: item.align[i],\n };\n }));\n }\n\n return item;\n }\n\n lheading(src: string): Tokens.Heading | undefined {\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\n paragraph(src: string): Tokens.Paragraph | undefined {\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\n text(src: string): Tokens.Text | undefined {\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\n escape(src: string): Tokens.Escape | undefined {\n const cap = this.rules.inline.escape.exec(src);\n if (cap) {\n return {\n type: 'escape',\n raw: cap[0],\n text: cap[1],\n };\n }\n }\n\n tag(src: string): Tokens.Tag | undefined {\n const cap = this.rules.inline.tag.exec(src);\n if (cap) {\n if (!this.lexer.state.inLink && this.rules.other.startATag.test(cap[0])) {\n this.lexer.state.inLink = true;\n } else if (this.lexer.state.inLink && this.rules.other.endATag.test(cap[0])) {\n this.lexer.state.inLink = false;\n }\n if (!this.lexer.state.inRawBlock && this.rules.other.startPreScriptTag.test(cap[0])) {\n this.lexer.state.inRawBlock = true;\n } else if (this.lexer.state.inRawBlock && this.rules.other.endPreScriptTag.test(cap[0])) {\n this.lexer.state.inRawBlock = false;\n }\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\n link(src: string): Tokens.Link | Tokens.Image | undefined {\n const cap = this.rules.inline.link.exec(src);\n if (cap) {\n const trimmedUrl = cap[2].trim();\n if (!this.options.pedantic && this.rules.other.startAngleBracket.test(trimmedUrl)) {\n // commonmark requires matching angle brackets\n if (!(this.rules.other.endAngleBracket.test(trimmedUrl))) {\n return;\n }\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 } else {\n // find closing parenthesis\n const lastParenIndex = findClosingBracket(cap[2], '()');\n if (lastParenIndex === -2) {\n // more open parens than closed\n return;\n }\n\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 = this.rules.other.pedanticHrefTitle.exec(href);\n\n if (link) {\n href = link[1];\n title = link[3];\n }\n } else {\n title = cap[3] ? cap[3].slice(1, -1) : '';\n }\n\n href = href.trim();\n if (this.rules.other.startAngleBracket.test(href)) {\n if (this.options.pedantic && !(this.rules.other.endAngleBracket.test(trimmedUrl))) {\n // pedantic allows starting angle bracket without ending angle bracket\n href = href.slice(1);\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, this.rules);\n }\n }\n\n reflink(src: string, links: Links): Tokens.Link | Tokens.Image | Tokens.Text | undefined {\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(this.rules.other.multipleSpaceGlobal, ' ');\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, this.rules);\n }\n }\n\n emStrong(src: string, maskedSrc: string, prevChar = ''): Tokens.Em | Tokens.Strong | undefined {\n let match = this.rules.inline.emStrongLDelim.exec(src);\n if (!match) return;\n\n // _ can't be between two alphanumerics. \\p{L}\\p{N} includes non-english alphabet/numbers as well\n if (match[3] && prevChar.match(this.rules.other.unicodeAlphaNumeric)) return;\n\n const nextChar = match[1] || match[2] || '';\n\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\n const endReg = match[0][0] === '*' ? this.rules.inline.emStrongRDelimAst : this.rules.inline.emStrongRDelimUnd;\n endReg.lastIndex = 0;\n\n // Clip maskedSrc to same section of string as src (move to lexer?)\n maskedSrc = maskedSrc.slice(-1 * src.length + lLength);\n\n while ((match = endReg.exec(maskedSrc)) != null) {\n rDelim = match[1] || match[2] || match[3] || match[4] || match[5] || match[6];\n\n if (!rDelim) continue; // skip single * in __abc*abc__\n\n rLength = [...rDelim].length;\n\n if (match[3] || match[4]) { // found another Left Delim\n delimTotal += rLength;\n continue;\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\n delimTotal -= rLength;\n\n if (delimTotal > 0) continue; // Haven't found enough closing delimiters\n\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\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\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\n codespan(src: string): Tokens.Codespan | undefined {\n const cap = this.rules.inline.code.exec(src);\n if (cap) {\n let text = cap[2].replace(this.rules.other.newLineCharGlobal, ' ');\n const hasNonSpaceChars = this.rules.other.nonSpaceChar.test(text);\n const hasSpaceCharsOnBothEnds = this.rules.other.startingSpaceChar.test(text) && this.rules.other.endingSpaceChar.test(text);\n if (hasNonSpaceChars && hasSpaceCharsOnBothEnds) {\n text = text.substring(1, text.length - 1);\n }\n return {\n type: 'codespan',\n raw: cap[0],\n text,\n };\n }\n }\n\n br(src: string): Tokens.Br | undefined {\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\n del(src: string): Tokens.Del | undefined {\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\n autolink(src: string): Tokens.Link | undefined {\n const cap = this.rules.inline.autolink.exec(src);\n if (cap) {\n let text, href;\n if (cap[2] === '@') {\n text = cap[1];\n href = 'mailto:' + text;\n } else {\n text = cap[1];\n href = text;\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\n url(src: string): Tokens.Link | undefined {\n let cap;\n if (cap = this.rules.inline.url.exec(src)) {\n let text, href;\n if (cap[2] === '@') {\n text = cap[0];\n href = 'mailto:' + text;\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 = cap[0];\n if (cap[1] === 'www.') {\n href = 'http://' + cap[0];\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\n inlineText(src: string): Tokens.Text | undefined {\n const cap = this.rules.inline.text.exec(src);\n if (cap) {\n const escaped = this.lexer.state.inRawBlock;\n return {\n type: 'text',\n raw: cap[0],\n text: cap[0],\n escaped,\n };\n }\n }\n}\n", "import { _Tokenizer } from './Tokenizer.ts';\nimport { _defaults } from './defaults.ts';\nimport { other, block, inline } from './rules.ts';\nimport type { Token, TokensList, Tokens } from './Tokens.ts';\nimport type { MarkedOptions } from './MarkedOptions.ts';\n\n/**\n * Block Lexer\n */\nexport class _Lexer {\n tokens: TokensList;\n options: MarkedOptions;\n state: {\n inLink: boolean;\n inRawBlock: boolean;\n top: boolean;\n };\n\n private tokenizer: _Tokenizer;\n private inlineQueue: { src: string, tokens: Token[] }[];\n\n constructor(options?: MarkedOptions) {\n // TokenList cannot be created in one go\n this.tokens = [] as unknown as TokensList;\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\n const rules = {\n other,\n block: block.normal,\n inline: inline.normal,\n };\n\n if (this.options.pedantic) {\n rules.block = block.pedantic;\n rules.inline = inline.pedantic;\n } else if (this.options.gfm) {\n rules.block = block.gfm;\n if (this.options.breaks) {\n rules.inline = inline.breaks;\n } else {\n rules.inline = inline.gfm;\n }\n }\n this.tokenizer.rules = rules;\n }\n\n /**\n * Expose Rules\n */\n static get rules() {\n return {\n block,\n inline,\n };\n }\n\n /**\n * Static Lex Method\n */\n static lex(src: string, options?: MarkedOptions) {\n const lexer = new _Lexer(options);\n return lexer.lex(src);\n }\n\n /**\n * Static Lex Inline Method\n */\n static lexInline(src: string, options?: MarkedOptions) {\n const lexer = new _Lexer(options);\n return lexer.inlineTokens(src);\n }\n\n /**\n * Preprocessing\n */\n lex(src: string) {\n src = src.replace(other.carriageReturn, '\\n');\n\n this.blockTokens(src, this.tokens);\n\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\n return this.tokens;\n }\n\n /**\n * Lexing\n */\n blockTokens(src: string, tokens?: Token[], lastParagraphClipped?: boolean): Token[];\n blockTokens(src: string, tokens?: TokensList, lastParagraphClipped?: boolean): TokensList;\n blockTokens(src: string, tokens: Token[] = [], lastParagraphClipped = false) {\n if (this.options.pedantic) {\n src = src.replace(other.tabCharGlobal, ' ').replace(other.spaceLine, '');\n }\n\n while (src) {\n let token: Tokens.Generic | undefined;\n\n if (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\n // newline\n if (token = this.tokenizer.space(src)) {\n src = src.substring(token.raw.length);\n const lastToken = tokens.at(-1);\n if (token.raw.length === 1 && lastToken !== undefined) {\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 lastToken.raw += '\\n';\n } else {\n tokens.push(token);\n }\n continue;\n }\n\n // code\n if (token = this.tokenizer.code(src)) {\n src = src.substring(token.raw.length);\n const lastToken = tokens.at(-1);\n // An indented code block cannot interrupt a paragraph.\n if (lastToken?.type === 'paragraph' || lastToken?.type === 'text') {\n lastToken.raw += '\\n' + token.raw;\n lastToken.text += '\\n' + token.text;\n this.inlineQueue.at(-1)!.src = lastToken.text;\n } else {\n tokens.push(token);\n }\n continue;\n }\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\n // heading\n if (token = this.tokenizer.heading(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\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\n // blockquote\n if (token = this.tokenizer.blockquote(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\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\n // html\n if (token = this.tokenizer.html(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n\n // def\n if (token = this.tokenizer.def(src)) {\n src = src.substring(token.raw.length);\n const lastToken = tokens.at(-1);\n if (lastToken?.type === 'paragraph' || lastToken?.type === 'text') {\n lastToken.raw += '\\n' + token.raw;\n lastToken.text += '\\n' + token.raw;\n this.inlineQueue.at(-1)!.src = lastToken.text;\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\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\n // lheading\n if (token = this.tokenizer.lheading(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n\n // top-level paragraph\n // prevent paragraph consuming extensions by clipping 'src' to extension start\n let cutSrc = src;\n if (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 const lastToken = tokens.at(-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.at(-1)!.src = lastToken.text;\n } else {\n tokens.push(token);\n }\n lastParagraphClipped = cutSrc.length !== src.length;\n src = src.substring(token.raw.length);\n continue;\n }\n\n // text\n if (token = this.tokenizer.text(src)) {\n src = src.substring(token.raw.length);\n const lastToken = tokens.at(-1);\n if (lastToken?.type === 'text') {\n lastToken.raw += '\\n' + token.raw;\n lastToken.text += '\\n' + token.text;\n this.inlineQueue.pop();\n this.inlineQueue.at(-1)!.src = lastToken.text;\n } else {\n tokens.push(token);\n }\n continue;\n }\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 } else {\n throw new Error(errMsg);\n }\n }\n }\n\n this.state.top = true;\n return tokens;\n }\n\n inline(src: string, tokens: Token[] = []) {\n this.inlineQueue.push({ src, tokens });\n return tokens;\n }\n\n /**\n * Lexing/Compiling\n */\n inlineTokens(src: string, tokens: Token[] = []): Token[] {\n // String with links masked to avoid interference with em and strong\n let maskedSrc = src;\n let match: RegExpExecArray | null = null;\n\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)\n + '[' + 'a'.repeat(match[0].length - 2) + ']'\n + maskedSrc.slice(this.tokenizer.rules.inline.reflinkSearch.lastIndex);\n }\n }\n }\n }\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\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\n let keepPrevChar = false;\n let prevChar = '';\n while (src) {\n if (!keepPrevChar) {\n prevChar = '';\n }\n keepPrevChar = false;\n\n let token: Tokens.Generic | undefined;\n\n // extensions\n if (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\n // escape\n if (token = this.tokenizer.escape(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n\n // tag\n if (token = this.tokenizer.tag(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\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\n // reflink, nolink\n if (token = this.tokenizer.reflink(src, this.tokens.links)) {\n src = src.substring(token.raw.length);\n const lastToken = tokens.at(-1);\n if (token.type === 'text' && lastToken?.type === 'text') {\n lastToken.raw += token.raw;\n lastToken.text += token.text;\n } else {\n tokens.push(token);\n }\n continue;\n }\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\n // code\n if (token = this.tokenizer.codespan(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\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\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\n // autolink\n if (token = this.tokenizer.autolink(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\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\n // text\n // prevent inlineText consuming extensions by clipping 'src' to extension start\n let cutSrc = src;\n if (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 const lastToken = tokens.at(-1);\n if (lastToken?.type === 'text') {\n lastToken.raw += token.raw;\n lastToken.text += token.text;\n } else {\n tokens.push(token);\n }\n continue;\n }\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 } else {\n throw new Error(errMsg);\n }\n }\n }\n\n return tokens;\n }\n}\n", "import { _defaults } from './defaults.ts';\nimport {\n cleanUrl,\n escape,\n} from './helpers.ts';\nimport { other } from './rules.ts';\nimport type { MarkedOptions } from './MarkedOptions.ts';\nimport type { Tokens } from './Tokens.ts';\nimport type { _Parser } from './Parser.ts';\n\n/**\n * Renderer\n */\nexport class _Renderer {\n options: MarkedOptions;\n parser!: _Parser; // set by the parser\n constructor(options?: MarkedOptions) {\n this.options = options || _defaults;\n }\n\n space(token: Tokens.Space): string {\n return '';\n }\n\n code({ text, lang, escaped }: Tokens.Code): string {\n const langString = (lang || '').match(other.notSpaceStart)?.[0];\n\n const code = text.replace(other.endingNewline, '') + '\\n';\n\n if (!langString) {\n return '<pre><code>'\n + (escaped ? code : escape(code, true))\n + '</code></pre>\\n';\n }\n\n return '<pre><code class=\"language-'\n + escape(langString)\n + '\">'\n + (escaped ? code : escape(code, true))\n + '</code></pre>\\n';\n }\n\n blockquote({ tokens }: Tokens.Blockquote): string {\n const body = this.parser.parse(tokens);\n return `<blockquote>\\n${body}</blockquote>\\n`;\n }\n\n html({ text }: Tokens.HTML | Tokens.Tag) : string {\n return text;\n }\n\n heading({ tokens, depth }: Tokens.Heading): string {\n return `<h${depth}>${this.parser.parseInline(tokens)}</h${depth}>\\n`;\n }\n\n hr(token: Tokens.Hr): string {\n return '<hr>\\n';\n }\n\n list(token: Tokens.List): string {\n const ordered = token.ordered;\n const start = token.start;\n\n let body = '';\n for (let j = 0; j < token.items.length; j++) {\n const item = token.items[j];\n body += this.listitem(item);\n }\n\n const type = ordered ? 'ol' : 'ul';\n const startAttr = (ordered && start !== 1) ? (' start=\"' + start + '\"') : '';\n return '<' + type + startAttr + '>\\n' + body + '</' + type + '>\\n';\n }\n\n listitem(item: Tokens.ListItem): string {\n let itemBody = '';\n if (item.task) {\n const checkbox = this.checkbox({ checked: !!item.checked });\n if (item.loose) {\n if (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 + ' ' + escape(item.tokens[0].tokens[0].text);\n item.tokens[0].tokens[0].escaped = true;\n }\n } else {\n item.tokens.unshift({\n type: 'text',\n raw: checkbox + ' ',\n text: checkbox + ' ',\n escaped: true,\n });\n }\n } else {\n itemBody += checkbox + ' ';\n }\n }\n\n itemBody += this.parser.parse(item.tokens, !!item.loose);\n\n return `<li>${itemBody}</li>\\n`;\n }\n\n checkbox({ checked }: Tokens.Checkbox): string {\n return '<input '\n + (checked ? 'checked=\"\" ' : '')\n + 'disabled=\"\" type=\"checkbox\">';\n }\n\n paragraph({ tokens }: Tokens.Paragraph): string {\n return `<p>${this.parser.parseInline(tokens)}</p>\\n`;\n }\n\n table(token: Tokens.Table): string {\n let header = '';\n\n // header\n let cell = '';\n for (let j = 0; j < token.header.length; j++) {\n cell += this.tablecell(token.header[j]);\n }\n header += this.tablerow({ text: cell });\n\n let body = '';\n for (let j = 0; j < token.rows.length; j++) {\n const row = token.rows[j];\n\n cell = '';\n for (let k = 0; k < row.length; k++) {\n cell += this.tablecell(row[k]);\n }\n\n body += this.tablerow({ text: cell });\n }\n if (body) body = `<tbody>${body}</tbody>`;\n\n return '<table>\\n'\n + '<thead>\\n'\n + header\n + '</thead>\\n'\n + body\n + '</table>\\n';\n }\n\n tablerow({ text }: Tokens.TableRow): string {\n return `<tr>\\n${text}</tr>\\n`;\n }\n\n tablecell(token: Tokens.TableCell): string {\n const content = this.parser.parseInline(token.tokens);\n const type = token.header ? 'th' : 'td';\n const tag = token.align\n ? `<${type} align=\"${token.align}\">`\n : `<${type}>`;\n return tag + content + `</${type}>\\n`;\n }\n\n /**\n * span level renderer\n */\n strong({ tokens }: Tokens.Strong): string {\n return `<strong>${this.parser.parseInline(tokens)}</strong>`;\n }\n\n em({ tokens }: Tokens.Em): string {\n return `<em>${this.parser.parseInline(tokens)}</em>`;\n }\n\n codespan({ text }: Tokens.Codespan): string {\n return `<code>${escape(text, true)}</code>`;\n }\n\n br(token: Tokens.Br): string {\n return '<br>';\n }\n\n del({ tokens }: Tokens.Del): string {\n return `<del>${this.parser.parseInline(tokens)}</del>`;\n }\n\n link({ href, title, tokens }: Tokens.Link): string {\n const text = this.parser.parseInline(tokens);\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=\"' + (escape(title)) + '\"';\n }\n out += '>' + text + '</a>';\n return out;\n }\n\n image({ href, title, text, tokens }: Tokens.Image): string {\n if (tokens) {\n text = this.parser.parseInline(tokens, this.parser.textRenderer);\n }\n const cleanHref = cleanUrl(href);\n if (cleanHref === null) {\n return escape(text);\n }\n href = cleanHref;\n\n let out = `<img src=\"${href}\" alt=\"${text}\"`;\n if (title) {\n out += ` title=\"${escape(title)}\"`;\n }\n out += '>';\n return out;\n }\n\n text(token: Tokens.Text | Tokens.Escape) : string {\n return 'tokens' in token && token.tokens\n ? this.parser.parseInline(token.tokens)\n : ('escaped' in token && token.escaped ? token.text : escape(token.text));\n }\n}\n", "import type { Tokens } from './Tokens.ts';\n\n/**\n * TextRenderer\n * returns only the textual part of the token\n */\nexport class _TextRenderer {\n // no need for block level renderers\n strong({ text }: Tokens.Strong) {\n return text;\n }\n\n em({ text }: Tokens.Em) {\n return text;\n }\n\n codespan({ text }: Tokens.Codespan) {\n return text;\n }\n\n del({ text }: Tokens.Del) {\n return text;\n }\n\n html({ text }: Tokens.HTML | Tokens.Tag) {\n return text;\n }\n\n text({ text }: Tokens.Text | Tokens.Escape | Tokens.Tag) {\n return text;\n }\n\n link({ text }: Tokens.Link) {\n return '' + text;\n }\n\n image({ text }: Tokens.Image) {\n return '' + text;\n }\n\n br() {\n return '';\n }\n}\n", "import { _Renderer } from './Renderer.ts';\nimport { _TextRenderer } from './TextRenderer.ts';\nimport { _defaults } from './defaults.ts';\nimport type { MarkedToken, Token, Tokens } from './Tokens.ts';\nimport type { MarkedOptions } from './MarkedOptions.ts';\n\n/**\n * Parsing & Compiling\n */\nexport class _Parser {\n options: MarkedOptions;\n renderer: _Renderer;\n textRenderer: _TextRenderer;\n constructor(options?: MarkedOptions) {\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.renderer.parser = this;\n this.textRenderer = new _TextRenderer();\n }\n\n /**\n * Static Parse Method\n */\n static parse(tokens: Token[], options?: MarkedOptions) {\n const parser = new _Parser(options);\n return parser.parse(tokens);\n }\n\n /**\n * Static Parse Inline Method\n */\n static parseInline(tokens: Token[], options?: MarkedOptions) {\n const parser = new _Parser(options);\n return parser.parseInline(tokens);\n }\n\n /**\n * Parse Loop\n */\n parse(tokens: Token[], top = true): string {\n let out = '';\n\n for (let i = 0; i < tokens.length; i++) {\n const anyToken = tokens[i];\n\n // Run any renderer extensions\n if (this.options.extensions?.renderers?.[anyToken.type]) {\n const genericToken = anyToken as Tokens.Generic;\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\n const token = anyToken as MarkedToken;\n\n switch (token.type) {\n case 'space': {\n out += this.renderer.space(token);\n continue;\n }\n case 'hr': {\n out += this.renderer.hr(token);\n continue;\n }\n case 'heading': {\n out += this.renderer.heading(token);\n continue;\n }\n case 'code': {\n out += this.renderer.code(token);\n continue;\n }\n case 'table': {\n out += this.renderer.table(token);\n continue;\n }\n case 'blockquote': {\n out += this.renderer.blockquote(token);\n continue;\n }\n case 'list': {\n out += this.renderer.list(token);\n continue;\n }\n case 'html': {\n out += this.renderer.html(token);\n continue;\n }\n case 'paragraph': {\n out += this.renderer.paragraph(token);\n continue;\n }\n case 'text': {\n let textToken = token;\n let body = this.renderer.text(textToken);\n while (i + 1 < tokens.length && tokens[i + 1].type === 'text') {\n textToken = tokens[++i] as Tokens.Text;\n body += '\\n' + this.renderer.text(textToken);\n }\n if (top) {\n out += this.renderer.paragraph({\n type: 'paragraph',\n raw: body,\n text: body,\n tokens: [{ type: 'text', raw: body, text: body, escaped: true }],\n });\n } else {\n out += body;\n }\n continue;\n }\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 } else {\n throw new Error(errMsg);\n }\n }\n }\n }\n\n return out;\n }\n\n /**\n * Parse Inline Tokens\n */\n parseInline(tokens: Token[], renderer: _Renderer | _TextRenderer = this.renderer): string {\n let out = '';\n\n for (let i = 0; i < tokens.length; i++) {\n const anyToken = tokens[i];\n\n // Run any renderer extensions\n if (this.options.extensions?.renderers?.[anyToken.type]) {\n const ret = this.options.extensions.renderers[anyToken.type].call({ parser: this }, anyToken);\n if (ret !== false || !['escape', 'html', 'link', 'image', 'strong', 'em', 'codespan', 'br', 'del', 'text'].includes(anyToken.type)) {\n out += ret || '';\n continue;\n }\n }\n\n const token = anyToken as MarkedToken;\n\n switch (token.type) {\n case 'escape': {\n out += renderer.text(token);\n break;\n }\n case 'html': {\n out += renderer.html(token);\n break;\n }\n case 'link': {\n out += renderer.link(token);\n break;\n }\n case 'image': {\n out += renderer.image(token);\n break;\n }\n case 'strong': {\n out += renderer.strong(token);\n break;\n }\n case 'em': {\n out += renderer.em(token);\n break;\n }\n case 'codespan': {\n out += renderer.codespan(token);\n break;\n }\n case 'br': {\n out += renderer.br(token);\n break;\n }\n case 'del': {\n out += renderer.del(token);\n break;\n }\n case 'text': {\n out += renderer.text(token);\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 } else {\n throw new Error(errMsg);\n }\n }\n }\n }\n return out;\n }\n}\n", "import { _defaults } from './defaults.ts';\nimport { _Lexer } from './Lexer.ts';\nimport { _Parser } from './Parser.ts';\nimport type { MarkedOptions } from './MarkedOptions.ts';\nimport type { Token, TokensList } from './Tokens.ts';\n\nexport class _Hooks {\n options: MarkedOptions;\n block?: boolean;\n\n constructor(options?: MarkedOptions) {\n this.options = options || _defaults;\n }\n\n static passThroughHooks = new Set([\n 'preprocess',\n 'postprocess',\n 'processAllTokens',\n ]);\n\n /**\n * Process markdown before marked\n */\n preprocess(markdown: string) {\n return markdown;\n }\n\n /**\n * Process HTML after marked is finished\n */\n postprocess(html: string) {\n return html;\n }\n\n /**\n * Process all tokens before walk tokens\n */\n processAllTokens(tokens: Token[] | TokensList) {\n return tokens;\n }\n\n /**\n * Provide function to tokenize markdown\n */\n provideLexer() {\n return this.block ? _Lexer.lex : _Lexer.lexInline;\n }\n\n /**\n * Provide function to parse tokens\n */\n provideParser() {\n return this.block ? _Parser.parse : _Parser.parseInline;\n }\n}\n", "import { _getDefaults } from './defaults.ts';\nimport { _Lexer } from './Lexer.ts';\nimport { _Parser } from './Parser.ts';\nimport { _Hooks } from './Hooks.ts';\nimport { _Renderer } from './Renderer.ts';\nimport { _Tokenizer } from './Tokenizer.ts';\nimport { _TextRenderer } from './TextRenderer.ts';\nimport { escape } from './helpers.ts';\nimport type { MarkedExtension, MarkedOptions } from './MarkedOptions.ts';\nimport type { Token, Tokens, TokensList } from './Tokens.ts';\n\nexport type MaybePromise = void | Promise<void>;\n\ntype UnknownFunction = (...args: unknown[]) => unknown;\ntype GenericRendererFunction = (...args: unknown[]) => string | false;\n\nexport class Marked {\n defaults = _getDefaults();\n options = this.setOptions;\n\n parse = this.parseMarkdown(true);\n parseInline = this.parseMarkdown(false);\n\n Parser = _Parser;\n Renderer = _Renderer;\n TextRenderer = _TextRenderer;\n Lexer = _Lexer;\n Tokenizer = _Tokenizer;\n Hooks = _Hooks;\n\n constructor(...args: MarkedExtension[]) {\n this.use(...args);\n }\n\n /**\n * Run callback for every token\n */\n walkTokens(tokens: Token[] | TokensList, callback: (token: Token) => MaybePromise | MaybePromise[]) {\n let values: MaybePromise[] = [];\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 as Tokens.Table;\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 as Tokens.List;\n values = values.concat(this.walkTokens(listToken.items, callback));\n break;\n }\n default: {\n const genericToken = token as Tokens.Generic;\n if (this.defaults.extensions?.childTokens?.[genericToken.type]) {\n this.defaults.extensions.childTokens[genericToken.type].forEach((childTokens) => {\n const tokens = genericToken[childTokens].flat(Infinity) as Token[] | TokensList;\n values = values.concat(this.walkTokens(tokens, callback));\n });\n } else if (genericToken.tokens) {\n values = values.concat(this.walkTokens(genericToken.tokens, callback));\n }\n }\n }\n }\n return values;\n }\n\n use(...args: MarkedExtension[]) {\n const extensions: MarkedOptions['extensions'] = this.defaults.extensions || { renderers: {}, childTokens: {} };\n\n args.forEach((pack) => {\n // copy options to new object\n const opts = { ...pack } as MarkedOptions;\n\n // set async to true if it was set to true before\n opts.async = this.defaults.async || opts.async || false;\n\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 } 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 } 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 } else {\n extensions.startBlock = [ext.start];\n }\n } else if (ext.level === 'inline') {\n if (extensions.startInline) {\n extensions.startInline.push(ext.start);\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\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 (['options', 'parser'].includes(prop)) {\n // ignore options property\n continue;\n }\n const rendererProp = prop as Exclude<keyof _Renderer, 'options' | 'parser'>;\n const rendererFunc = pack.renderer[rendererProp] as GenericRendererFunction;\n const prevRenderer = renderer[rendererProp] as GenericRendererFunction;\n // Replace renderer with func to run extension, but fall back if false\n renderer[rendererProp] = (...args: unknown[]) => {\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 as Exclude<keyof _Tokenizer, 'options' | 'rules' | 'lexer'>;\n const tokenizerFunc = pack.tokenizer[tokenizerProp] as UnknownFunction;\n const prevTokenizer = tokenizer[tokenizerProp] as UnknownFunction;\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: unknown[]) => {\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\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 (['options', 'block'].includes(prop)) {\n // ignore options and block properties\n continue;\n }\n const hooksProp = prop as Exclude<keyof _Hooks, 'options' | 'block'>;\n const hooksFunc = pack.hooks[hooksProp] as UnknownFunction;\n const prevHook = hooks[hooksProp] as UnknownFunction;\n if (_Hooks.passThroughHooks.has(prop)) {\n // @ts-expect-error cannot type hook function dynamically\n hooks[hooksProp] = (arg: unknown) => {\n if (this.defaults.async) {\n return Promise.resolve(hooksFunc.call(hooks, arg)).then(ret => {\n return prevHook.call(hooks, ret);\n });\n }\n\n const ret = hooksFunc.call(hooks, arg);\n return prevHook.call(hooks, ret);\n };\n } else {\n // @ts-expect-error cannot type hook function dynamically\n hooks[hooksProp] = (...args: unknown[]) => {\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\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: MaybePromise[] = [];\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\n this.defaults = { ...this.defaults, ...opts };\n });\n\n return this;\n }\n\n setOptions(opt: MarkedOptions) {\n this.defaults = { ...this.defaults, ...opt };\n return this;\n }\n\n lexer(src: string, options?: MarkedOptions) {\n return _Lexer.lex(src, options ?? this.defaults);\n }\n\n parser(tokens: Token[], options?: MarkedOptions) {\n return _Parser.parse(tokens, options ?? this.defaults);\n }\n\n private parseMarkdown(blockType: boolean) {\n type overloadedParse = {\n (src: string, options: MarkedOptions & { async: true }): Promise<string>;\n (src: string, options: MarkedOptions & { async: false }): string;\n (src: string, options?: MarkedOptions | null): string | Promise<string>;\n };\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const parse: overloadedParse = (src: string, options?: MarkedOptions | null): any => {\n const origOpt = { ...options };\n const opt = { ...this.defaults, ...origOpt };\n\n const throwError = this.onError(!!opt.silent, !!opt.async);\n\n // throw error if an extension set async to true but parse was called with async: false\n if (this.defaults.async === true && origOpt.async === false) {\n return throwError(new Error('marked(): The async option was set to true by an extension. Remove async: false from the parse options object to return a Promise.'));\n }\n\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\n if (opt.hooks) {\n opt.hooks.options = opt;\n opt.hooks.block = blockType;\n }\n\n const lexer = opt.hooks ? opt.hooks.provideLexer() : (blockType ? _Lexer.lex : _Lexer.lexInline);\n const parser = opt.hooks ? opt.hooks.provideParser() : (blockType ? _Parser.parse : _Parser.parseInline);\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\n try {\n if (opt.hooks) {\n src = opt.hooks.preprocess(src) as string;\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) as string;\n }\n return html;\n } catch (e) {\n return throwError(e as Error);\n }\n };\n\n return parse;\n }\n\n private onError(silent: boolean, async: boolean) {\n return (e: Error): string | Promise<string> => {\n e.message += '\\nPlease report this to https://github.com/markedjs/marked.';\n\n if (silent) {\n const msg = '<p>An error occurred:</p><pre>'\n + escape(e.message + '', true)\n + '</pre>';\n if (async) {\n return Promise.resolve(msg);\n }\n return msg;\n }\n\n if (async) {\n return Promise.reject(e);\n }\n throw e;\n };\n }\n}\n", "import { _Lexer } from './Lexer.ts';\nimport { _Parser } from './Parser.ts';\nimport { _Tokenizer } from './Tokenizer.ts';\nimport { _Renderer } from './Renderer.ts';\nimport { _TextRenderer } from './TextRenderer.ts';\nimport { _Hooks } from './Hooks.ts';\nimport { Marked } from './Instance.ts';\nimport {\n _getDefaults,\n changeDefaults,\n _defaults,\n} from './defaults.ts';\nimport type { MarkedExtension, MarkedOptions } from './MarkedOptions.ts';\nimport type { Token, TokensList } from './Tokens.ts';\nimport type { MaybePromise } from './Instance.ts';\n\nconst markedInstance = new Marked();\n\n/**\n * Compiles markdown to HTML asynchronously.\n *\n * @param src String of markdown source to be compiled\n * @param options Hash of options, having async: true\n * @return Promise of string of compiled HTML\n */\nexport function marked(src: string, options: MarkedOptions & { async: true }): Promise<string>;\n\n/**\n * Compiles markdown to HTML.\n *\n * @param src String of markdown source to be compiled\n * @param options Optional hash of options\n * @return String of compiled HTML. Will be a Promise of string if async is set to true by any extensions.\n */\nexport function marked(src: string, options: MarkedOptions & { async: false }): string;\nexport function marked(src: string, options: MarkedOptions & { async: true }): Promise<string>;\nexport function marked(src: string, options?: MarkedOptions | null): string | Promise<string>;\nexport function marked(src: string, opt?: MarkedOptions | null): string | Promise<string> {\n return markedInstance.parse(src, opt);\n}\n\n/**\n * Sets the default options.\n *\n * @param options Hash of options\n */\nmarked.options =\nmarked.setOptions = function(options: MarkedOptions) {\n markedInstance.setOptions(options);\n marked.defaults = markedInstance.defaults;\n changeDefaults(marked.defaults);\n return marked;\n};\n\n/**\n * Gets the original marked default options.\n */\nmarked.getDefaults = _getDefaults;\n\nmarked.defaults = _defaults;\n\n/**\n * Use Extension\n */\n\nmarked.use = function(...args: MarkedExtension[]) {\n markedInstance.use(...args);\n marked.defaults = markedInstance.defaults;\n changeDefaults(marked.defaults);\n return marked;\n};\n\n/**\n * Run callback for every token\n */\n\nmarked.walkTokens = function(tokens: Token[] | TokensList, callback: (token: Token) => MaybePromise | MaybePromise[]) {\n return markedInstance.walkTokens(tokens, callback);\n};\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/**\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;\n\nexport const options = marked.options;\nexport const setOptions = marked.setOptions;\nexport const use = marked.use;\nexport const walkTokens = marked.walkTokens;\nexport const parseInline = marked.parseInline;\nexport const parse = marked;\nexport const parser = _Parser.parse;\nexport const lexer = _Lexer.lex;\nexport { _defaults as defaults, _getDefaults as getDefaults } from './defaults.ts';\nexport { _Lexer as Lexer } from './Lexer.ts';\nexport { _Parser as Parser } from './Parser.ts';\nexport { _Tokenizer as Tokenizer } from './Tokenizer.ts';\nexport { _Renderer as Renderer } from './Renderer.ts';\nexport { _TextRenderer as TextRenderer } from './TextRenderer.ts';\nexport { _Hooks as Hooks } from './Hooks.ts';\nexport { Marked } from './Instance.ts';\nexport type * from './MarkedOptions.ts';\nexport type * from './Tokens.ts';\n", "// Code highlighting + line stepping \u2014 SPEC \u00A76.\n// Slim highlight.js registration (13 languages), themed via --hl-* tokens.\n// `data-lines` registers a build provider (one step per segment).\n\nimport hljs from 'highlight.js/lib/core';\nimport sql from 'highlight.js/lib/languages/sql';\nimport javascript from 'highlight.js/lib/languages/javascript';\nimport typescript from 'highlight.js/lib/languages/typescript';\nimport python from 'highlight.js/lib/languages/python';\nimport bash from 'highlight.js/lib/languages/bash';\nimport yaml from 'highlight.js/lib/languages/yaml';\nimport json from 'highlight.js/lib/languages/json';\nimport java from 'highlight.js/lib/languages/java';\nimport go from 'highlight.js/lib/languages/go';\nimport rust from 'highlight.js/lib/languages/rust';\nimport xml from 'highlight.js/lib/languages/xml';\nimport css from 'highlight.js/lib/languages/css';\nimport plaintext from 'highlight.js/lib/languages/plaintext';\n\nhljs.registerLanguage('sql', sql);\nhljs.registerLanguage('javascript', javascript);\nhljs.registerLanguage('typescript', typescript);\nhljs.registerLanguage('python', python);\nhljs.registerLanguage('bash', bash);\nhljs.registerLanguage('yaml', yaml);\nhljs.registerLanguage('json', json);\nhljs.registerLanguage('java', java);\nhljs.registerLanguage('go', go);\nhljs.registerLanguage('rust', rust);\nhljs.registerLanguage('xml', xml);\nhljs.registerLanguage('css', css);\nhljs.registerLanguage('plaintext', plaintext);\nhljs.registerAliases(['js'], { languageName: 'javascript' });\nhljs.registerAliases(['ts'], { languageName: 'typescript' });\nhljs.registerAliases(['shell', 'sh', 'zsh'], { languageName: 'bash' });\nhljs.registerAliases(['html'], { languageName: 'xml' });\nhljs.registerAliases(['text', 'plain'], { languageName: 'plaintext' });\n\n/**\n * Parse `data-lines` (\"1|3-5|all\") into 1-based line-number segments.\n * Pure \u2014 unit-tested in test/builds.test.mjs.\n */\nexport function parseLineRanges(spec, totalLines) {\n return spec.split('|').map((seg) => {\n seg = seg.trim();\n if (seg === '' || seg === 'all') {\n return Array.from({ length: totalLines }, (_, i) => i + 1);\n }\n const out = [];\n for (const part of seg.split(',')) {\n const m = part.trim().match(/^(\\d+)(?:-(\\d+))?$/);\n if (!m) continue;\n const a = parseInt(m[1], 10);\n const b = m[2] ? parseInt(m[2], 10) : a;\n for (let n = a; n <= Math.min(b, totalLines); n++) out.push(n);\n }\n return out;\n });\n}\n\n// Split highlighted code into .code-line blocks, re-opening any hljs span\n// that crosses a newline (multi-line comments/strings) on each new line.\nfunction wrapLines(codeEl) {\n const lines = [[]];\n (function visit(node, path) {\n for (const child of node.childNodes) {\n if (child.nodeType === Node.TEXT_NODE) {\n const parts = child.nodeValue.split('\\n');\n parts.forEach((t, i) => {\n if (i > 0) lines.push([]);\n if (t) lines[lines.length - 1].push({ path, text: t });\n });\n } else if (child.nodeType === Node.ELEMENT_NODE) {\n visit(child, [...path, child]);\n }\n }\n })(codeEl, []);\n\n while (lines.length && lines[lines.length - 1].length === 0) lines.pop();\n\n codeEl.textContent = '';\n for (const parts of lines) {\n const lineEl = document.createElement('span');\n lineEl.className = 'code-line';\n for (const { path, text } of parts) {\n let parent = lineEl;\n for (const orig of path) {\n let tail = parent.lastChild;\n if (!(tail && tail.__orig === orig)) {\n tail = orig.cloneNode(false);\n tail.__orig = orig;\n parent.appendChild(tail);\n }\n parent = tail;\n }\n parent.appendChild(document.createTextNode(text));\n }\n codeEl.appendChild(lineEl);\n }\n return codeEl.querySelectorAll(':scope > .code-line');\n}\n\nfunction segmentLabel(seg, totalLines) {\n if (seg.length === totalLines) return 'all lines';\n const sorted = [...seg];\n const ranges = [];\n let start = sorted[0];\n let prev = sorted[0];\n for (const n of sorted.slice(1)) {\n if (n === prev + 1) { prev = n; continue; }\n ranges.push(start === prev ? `${start}` : `${start}-${prev}`);\n start = prev = n;\n }\n ranges.push(start === prev ? `${start}` : `${start}-${prev}`);\n return `lines ${ranges.join(',')}`;\n}\n\nexport function initCode(root, registerBuildProvider) {\n root.querySelectorAll('pre > code').forEach((codeEl) => {\n const langClass = [...codeEl.classList].find((c) => c.startsWith('language-'));\n const lang = langClass ? langClass.slice('language-'.length) : null;\n const source = codeEl.textContent.replace(/^\\n/, '').replace(/\\s+$/, '');\n if (lang && hljs.getLanguage(lang)) {\n codeEl.innerHTML = hljs.highlight(source, { language: lang }).value;\n } else {\n codeEl.textContent = source;\n }\n codeEl.classList.add('hljs');\n\n const pre = codeEl.parentElement;\n const lineEls = wrapLines(codeEl);\n if (pre.hasAttribute('data-lines-numbers')) pre.classList.add('line-numbers');\n\n const spec = pre.getAttribute('data-lines');\n if (!spec) return;\n const segments = parseLineRanges(spec, lineEls.length);\n pre.classList.add('stepping');\n\n registerBuildProvider(pre, {\n count: segments.length,\n label: (i) => (i === 0 ? 'code' : segmentLabel(segments[i - 1], lineEls.length)),\n apply(i) {\n lineEls.forEach((l) => l.classList.remove('line-hl', 'line-dim'));\n if (i === 0) return;\n const seg = new Set(segments[i - 1]);\n const highlightAll = seg.size === lineEls.length;\n lineEls.forEach((l, idx) => {\n if (seg.has(idx + 1)) l.classList.add('line-hl');\n else if (!highlightAll) l.classList.add('line-dim');\n });\n },\n });\n });\n}\n", "// https://nodejs.org/api/packages.html#packages_writing_dual_packages_while_avoiding_or_minimizing_hazards\nimport HighlightJS from '../lib/core.js';\nexport { HighlightJS };\nexport default HighlightJS;\n", "/*\n Language: SQL\n Website: https://en.wikipedia.org/wiki/SQL\n Category: common, database\n */\n\n/*\n\nGoals:\n\nSQL is intended to highlight basic/common SQL keywords and expressions\n\n- If pretty much every single SQL server includes supports, then it's a canidate.\n- It is NOT intended to include tons of vendor specific keywords (Oracle, MySQL,\n PostgreSQL) although the list of data types is purposely a bit more expansive.\n- For more specific SQL grammars please see:\n - PostgreSQL and PL/pgSQL - core\n - T-SQL - https://github.com/highlightjs/highlightjs-tsql\n - sql_more (core)\n\n */\n\nfunction sql(hljs) {\n const regex = hljs.regex;\n const COMMENT_MODE = hljs.COMMENT('--', '$');\n const STRING = {\n scope: 'string',\n variants: [\n {\n begin: /'/,\n end: /'/,\n contains: [ { match: /''/ } ]\n }\n ]\n };\n const QUOTED_IDENTIFIER = {\n begin: /\"/,\n end: /\"/,\n contains: [ { match: /\"\"/ } ]\n };\n\n const LITERALS = [\n \"true\",\n \"false\",\n // Not sure it's correct to call NULL literal, and clauses like IS [NOT] NULL look strange that way.\n // \"null\",\n \"unknown\"\n ];\n\n const MULTI_WORD_TYPES = [\n \"double precision\",\n \"large object\",\n \"with timezone\",\n \"without timezone\"\n ];\n\n const TYPES = [\n 'bigint',\n 'binary',\n 'blob',\n 'boolean',\n 'char',\n 'character',\n 'clob',\n 'date',\n 'dec',\n 'decfloat',\n 'decimal',\n 'float',\n 'int',\n 'integer',\n 'interval',\n 'nchar',\n 'nclob',\n 'national',\n 'numeric',\n 'real',\n 'row',\n 'smallint',\n 'time',\n 'timestamp',\n 'varchar',\n 'varying', // modifier (character varying)\n 'varbinary'\n ];\n\n const NON_RESERVED_WORDS = [\n \"add\",\n \"asc\",\n \"collation\",\n \"desc\",\n \"final\",\n \"first\",\n \"last\",\n \"view\"\n ];\n\n // https://jakewheat.github.io/sql-overview/sql-2016-foundation-grammar.html#reserved-word\n const RESERVED_WORDS = [\n \"abs\",\n \"acos\",\n \"all\",\n \"allocate\",\n \"alter\",\n \"and\",\n \"any\",\n \"are\",\n \"array\",\n \"array_agg\",\n \"array_max_cardinality\",\n \"as\",\n \"asensitive\",\n \"asin\",\n \"asymmetric\",\n \"at\",\n \"atan\",\n \"atomic\",\n \"authorization\",\n \"avg\",\n \"begin\",\n \"begin_frame\",\n \"begin_partition\",\n \"between\",\n \"bigint\",\n \"binary\",\n \"blob\",\n \"boolean\",\n \"both\",\n \"by\",\n \"call\",\n \"called\",\n \"cardinality\",\n \"cascaded\",\n \"case\",\n \"cast\",\n \"ceil\",\n \"ceiling\",\n \"char\",\n \"char_length\",\n \"character\",\n \"character_length\",\n \"check\",\n \"classifier\",\n \"clob\",\n \"close\",\n \"coalesce\",\n \"collate\",\n \"collect\",\n \"column\",\n \"commit\",\n \"condition\",\n \"connect\",\n \"constraint\",\n \"contains\",\n \"convert\",\n \"copy\",\n \"corr\",\n \"corresponding\",\n \"cos\",\n \"cosh\",\n \"count\",\n \"covar_pop\",\n \"covar_samp\",\n \"create\",\n \"cross\",\n \"cube\",\n \"cume_dist\",\n \"current\",\n \"current_catalog\",\n \"current_date\",\n \"current_default_transform_group\",\n \"current_path\",\n \"current_role\",\n \"current_row\",\n \"current_schema\",\n \"current_time\",\n \"current_timestamp\",\n \"current_path\",\n \"current_role\",\n \"current_transform_group_for_type\",\n \"current_user\",\n \"cursor\",\n \"cycle\",\n \"date\",\n \"day\",\n \"deallocate\",\n \"dec\",\n \"decimal\",\n \"decfloat\",\n \"declare\",\n \"default\",\n \"define\",\n \"delete\",\n \"dense_rank\",\n \"deref\",\n \"describe\",\n \"deterministic\",\n \"disconnect\",\n \"distinct\",\n \"double\",\n \"drop\",\n \"dynamic\",\n \"each\",\n \"element\",\n \"else\",\n \"empty\",\n \"end\",\n \"end_frame\",\n \"end_partition\",\n \"end-exec\",\n \"equals\",\n \"escape\",\n \"every\",\n \"except\",\n \"exec\",\n \"execute\",\n \"exists\",\n \"exp\",\n \"external\",\n \"extract\",\n \"false\",\n \"fetch\",\n \"filter\",\n \"first_value\",\n \"float\",\n \"floor\",\n \"for\",\n \"foreign\",\n \"frame_row\",\n \"free\",\n \"from\",\n \"full\",\n \"function\",\n \"fusion\",\n \"get\",\n \"global\",\n \"grant\",\n \"group\",\n \"grouping\",\n \"groups\",\n \"having\",\n \"hold\",\n \"hour\",\n \"identity\",\n \"in\",\n \"indicator\",\n \"initial\",\n \"inner\",\n \"inout\",\n \"insensitive\",\n \"insert\",\n \"int\",\n \"integer\",\n \"intersect\",\n \"intersection\",\n \"interval\",\n \"into\",\n \"is\",\n \"join\",\n \"json_array\",\n \"json_arrayagg\",\n \"json_exists\",\n \"json_object\",\n \"json_objectagg\",\n \"json_query\",\n \"json_table\",\n \"json_table_primitive\",\n \"json_value\",\n \"lag\",\n \"language\",\n \"large\",\n \"last_value\",\n \"lateral\",\n \"lead\",\n \"leading\",\n \"left\",\n \"like\",\n \"like_regex\",\n \"listagg\",\n \"ln\",\n \"local\",\n \"localtime\",\n \"localtimestamp\",\n \"log\",\n \"log10\",\n \"lower\",\n \"match\",\n \"match_number\",\n \"match_recognize\",\n \"matches\",\n \"max\",\n \"member\",\n \"merge\",\n \"method\",\n \"min\",\n \"minute\",\n \"mod\",\n \"modifies\",\n \"module\",\n \"month\",\n \"multiset\",\n \"national\",\n \"natural\",\n \"nchar\",\n \"nclob\",\n \"new\",\n \"no\",\n \"none\",\n \"normalize\",\n \"not\",\n \"nth_value\",\n \"ntile\",\n \"null\",\n \"nullif\",\n \"numeric\",\n \"octet_length\",\n \"occurrences_regex\",\n \"of\",\n \"offset\",\n \"old\",\n \"omit\",\n \"on\",\n \"one\",\n \"only\",\n \"open\",\n \"or\",\n \"order\",\n \"out\",\n \"outer\",\n \"over\",\n \"overlaps\",\n \"overlay\",\n \"parameter\",\n \"partition\",\n \"pattern\",\n \"per\",\n \"percent\",\n \"percent_rank\",\n \"percentile_cont\",\n \"percentile_disc\",\n \"period\",\n \"portion\",\n \"position\",\n \"position_regex\",\n \"power\",\n \"precedes\",\n \"precision\",\n \"prepare\",\n \"primary\",\n \"procedure\",\n \"ptf\",\n \"range\",\n \"rank\",\n \"reads\",\n \"real\",\n \"recursive\",\n \"ref\",\n \"references\",\n \"referencing\",\n \"regr_avgx\",\n \"regr_avgy\",\n \"regr_count\",\n \"regr_intercept\",\n \"regr_r2\",\n \"regr_slope\",\n \"regr_sxx\",\n \"regr_sxy\",\n \"regr_syy\",\n \"release\",\n \"result\",\n \"return\",\n \"returns\",\n \"revoke\",\n \"right\",\n \"rollback\",\n \"rollup\",\n \"row\",\n \"row_number\",\n \"rows\",\n \"running\",\n \"savepoint\",\n \"scope\",\n \"scroll\",\n \"search\",\n \"second\",\n \"seek\",\n \"select\",\n \"sensitive\",\n \"session_user\",\n \"set\",\n \"show\",\n \"similar\",\n \"sin\",\n \"sinh\",\n \"skip\",\n \"smallint\",\n \"some\",\n \"specific\",\n \"specifictype\",\n \"sql\",\n \"sqlexception\",\n \"sqlstate\",\n \"sqlwarning\",\n \"sqrt\",\n \"start\",\n \"static\",\n \"stddev_pop\",\n \"stddev_samp\",\n \"submultiset\",\n \"subset\",\n \"substring\",\n \"substring_regex\",\n \"succeeds\",\n \"sum\",\n \"symmetric\",\n \"system\",\n \"system_time\",\n \"system_user\",\n \"table\",\n \"tablesample\",\n \"tan\",\n \"tanh\",\n \"then\",\n \"time\",\n \"timestamp\",\n \"timezone_hour\",\n \"timezone_minute\",\n \"to\",\n \"trailing\",\n \"translate\",\n \"translate_regex\",\n \"translation\",\n \"treat\",\n \"trigger\",\n \"trim\",\n \"trim_array\",\n \"true\",\n \"truncate\",\n \"uescape\",\n \"union\",\n \"unique\",\n \"unknown\",\n \"unnest\",\n \"update\",\n \"upper\",\n \"user\",\n \"using\",\n \"value\",\n \"values\",\n \"value_of\",\n \"var_pop\",\n \"var_samp\",\n \"varbinary\",\n \"varchar\",\n \"varying\",\n \"versioning\",\n \"when\",\n \"whenever\",\n \"where\",\n \"width_bucket\",\n \"window\",\n \"with\",\n \"within\",\n \"without\",\n \"year\",\n ];\n\n // these are reserved words we have identified to be functions\n // and should only be highlighted in a dispatch-like context\n // ie, array_agg(...), etc.\n const RESERVED_FUNCTIONS = [\n \"abs\",\n \"acos\",\n \"array_agg\",\n \"asin\",\n \"atan\",\n \"avg\",\n \"cast\",\n \"ceil\",\n \"ceiling\",\n \"coalesce\",\n \"corr\",\n \"cos\",\n \"cosh\",\n \"count\",\n \"covar_pop\",\n \"covar_samp\",\n \"cume_dist\",\n \"dense_rank\",\n \"deref\",\n \"element\",\n \"exp\",\n \"extract\",\n \"first_value\",\n \"floor\",\n \"json_array\",\n \"json_arrayagg\",\n \"json_exists\",\n \"json_object\",\n \"json_objectagg\",\n \"json_query\",\n \"json_table\",\n \"json_table_primitive\",\n \"json_value\",\n \"lag\",\n \"last_value\",\n \"lead\",\n \"listagg\",\n \"ln\",\n \"log\",\n \"log10\",\n \"lower\",\n \"max\",\n \"min\",\n \"mod\",\n \"nth_value\",\n \"ntile\",\n \"nullif\",\n \"percent_rank\",\n \"percentile_cont\",\n \"percentile_disc\",\n \"position\",\n \"position_regex\",\n \"power\",\n \"rank\",\n \"regr_avgx\",\n \"regr_avgy\",\n \"regr_count\",\n \"regr_intercept\",\n \"regr_r2\",\n \"regr_slope\",\n \"regr_sxx\",\n \"regr_sxy\",\n \"regr_syy\",\n \"row_number\",\n \"sin\",\n \"sinh\",\n \"sqrt\",\n \"stddev_pop\",\n \"stddev_samp\",\n \"substring\",\n \"substring_regex\",\n \"sum\",\n \"tan\",\n \"tanh\",\n \"translate\",\n \"translate_regex\",\n \"treat\",\n \"trim\",\n \"trim_array\",\n \"unnest\",\n \"upper\",\n \"value_of\",\n \"var_pop\",\n \"var_samp\",\n \"width_bucket\",\n ];\n\n // these functions can\n const POSSIBLE_WITHOUT_PARENS = [\n \"current_catalog\",\n \"current_date\",\n \"current_default_transform_group\",\n \"current_path\",\n \"current_role\",\n \"current_schema\",\n \"current_transform_group_for_type\",\n \"current_user\",\n \"session_user\",\n \"system_time\",\n \"system_user\",\n \"current_time\",\n \"localtime\",\n \"current_timestamp\",\n \"localtimestamp\"\n ];\n\n // those exist to boost relevance making these very\n // \"SQL like\" keyword combos worth +1 extra relevance\n const COMBOS = [\n \"create table\",\n \"insert into\",\n \"primary key\",\n \"foreign key\",\n \"not null\",\n \"alter table\",\n \"add constraint\",\n \"grouping sets\",\n \"on overflow\",\n \"character set\",\n \"respect nulls\",\n \"ignore nulls\",\n \"nulls first\",\n \"nulls last\",\n \"depth first\",\n \"breadth first\"\n ];\n\n const FUNCTIONS = RESERVED_FUNCTIONS;\n\n const KEYWORDS = [\n ...RESERVED_WORDS,\n ...NON_RESERVED_WORDS\n ].filter((keyword) => {\n return !RESERVED_FUNCTIONS.includes(keyword);\n });\n\n const VARIABLE = {\n scope: \"variable\",\n match: /@[a-z0-9][a-z0-9_]*/,\n };\n\n const OPERATOR = {\n scope: \"operator\",\n match: /[-+*/=%^~]|&&?|\\|\\|?|!=?|<(?:=>?|<|>)?|>[>=]?/,\n relevance: 0,\n };\n\n const FUNCTION_CALL = {\n match: regex.concat(/\\b/, regex.either(...FUNCTIONS), /\\s*\\(/),\n relevance: 0,\n keywords: { built_in: FUNCTIONS }\n };\n\n // turns a multi-word keyword combo into a regex that doesn't\n // care about extra whitespace etc.\n // input: \"START QUERY\"\n // output: /\\bSTART\\s+QUERY\\b/\n function kws_to_regex(list) {\n return regex.concat(\n /\\b/,\n regex.either(...list.map((kw) => {\n return kw.replace(/\\s+/, \"\\\\s+\")\n })),\n /\\b/\n )\n }\n\n const MULTI_WORD_KEYWORDS = {\n scope: \"keyword\",\n match: kws_to_regex(COMBOS),\n relevance: 0,\n };\n\n // keywords with less than 3 letters are reduced in relevancy\n function reduceRelevancy(list, {\n exceptions, when\n } = {}) {\n const qualifyFn = when;\n exceptions = exceptions || [];\n return list.map((item) => {\n if (item.match(/\\|\\d+$/) || exceptions.includes(item)) {\n return item;\n } else if (qualifyFn(item)) {\n return `${item}|0`;\n } else {\n return item;\n }\n });\n }\n\n return {\n name: 'SQL',\n case_insensitive: true,\n // does not include {} or HTML tags `</`\n illegal: /[{}]|<\\//,\n keywords: {\n $pattern: /\\b[\\w\\.]+/,\n keyword:\n reduceRelevancy(KEYWORDS, { when: (x) => x.length < 3 }),\n literal: LITERALS,\n type: TYPES,\n built_in: POSSIBLE_WITHOUT_PARENS\n },\n contains: [\n {\n scope: \"type\",\n match: kws_to_regex(MULTI_WORD_TYPES)\n },\n MULTI_WORD_KEYWORDS,\n FUNCTION_CALL,\n VARIABLE,\n STRING,\n QUOTED_IDENTIFIER,\n hljs.C_NUMBER_MODE,\n hljs.C_BLOCK_COMMENT_MODE,\n COMMENT_MODE,\n OPERATOR\n ]\n };\n}\n\nexport { sql as default };\n", "const IDENT_RE = '[A-Za-z$_][0-9A-Za-z$_]*';\nconst KEYWORDS = [\n \"as\", // for exports\n \"in\",\n \"of\",\n \"if\",\n \"for\",\n \"while\",\n \"finally\",\n \"var\",\n \"new\",\n \"function\",\n \"do\",\n \"return\",\n \"void\",\n \"else\",\n \"break\",\n \"catch\",\n \"instanceof\",\n \"with\",\n \"throw\",\n \"case\",\n \"default\",\n \"try\",\n \"switch\",\n \"continue\",\n \"typeof\",\n \"delete\",\n \"let\",\n \"yield\",\n \"const\",\n \"class\",\n // JS handles these with a special rule\n // \"get\",\n // \"set\",\n \"debugger\",\n \"async\",\n \"await\",\n \"static\",\n \"import\",\n \"from\",\n \"export\",\n \"extends\",\n // It's reached stage 3, which is \"recommended for implementation\":\n \"using\"\n];\nconst LITERALS = [\n \"true\",\n \"false\",\n \"null\",\n \"undefined\",\n \"NaN\",\n \"Infinity\"\n];\n\n// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects\nconst TYPES = [\n // Fundamental objects\n \"Object\",\n \"Function\",\n \"Boolean\",\n \"Symbol\",\n // numbers and dates\n \"Math\",\n \"Date\",\n \"Number\",\n \"BigInt\",\n // text\n \"String\",\n \"RegExp\",\n // Indexed collections\n \"Array\",\n \"Float32Array\",\n \"Float64Array\",\n \"Int8Array\",\n \"Uint8Array\",\n \"Uint8ClampedArray\",\n \"Int16Array\",\n \"Int32Array\",\n \"Uint16Array\",\n \"Uint32Array\",\n \"BigInt64Array\",\n \"BigUint64Array\",\n // Keyed collections\n \"Set\",\n \"Map\",\n \"WeakSet\",\n \"WeakMap\",\n // Structured data\n \"ArrayBuffer\",\n \"SharedArrayBuffer\",\n \"Atomics\",\n \"DataView\",\n \"JSON\",\n // Control abstraction objects\n \"Promise\",\n \"Generator\",\n \"GeneratorFunction\",\n \"AsyncFunction\",\n // Reflection\n \"Reflect\",\n \"Proxy\",\n // Internationalization\n \"Intl\",\n // WebAssembly\n \"WebAssembly\"\n];\n\nconst ERROR_TYPES = [\n \"Error\",\n \"EvalError\",\n \"InternalError\",\n \"RangeError\",\n \"ReferenceError\",\n \"SyntaxError\",\n \"TypeError\",\n \"URIError\"\n];\n\nconst BUILT_IN_GLOBALS = [\n \"setInterval\",\n \"setTimeout\",\n \"clearInterval\",\n \"clearTimeout\",\n\n \"require\",\n \"exports\",\n\n \"eval\",\n \"isFinite\",\n \"isNaN\",\n \"parseFloat\",\n \"parseInt\",\n \"decodeURI\",\n \"decodeURIComponent\",\n \"encodeURI\",\n \"encodeURIComponent\",\n \"escape\",\n \"unescape\"\n];\n\nconst BUILT_IN_VARIABLES = [\n \"arguments\",\n \"this\",\n \"super\",\n \"console\",\n \"window\",\n \"document\",\n \"localStorage\",\n \"sessionStorage\",\n \"module\",\n \"global\" // Node.js\n];\n\nconst BUILT_INS = [].concat(\n BUILT_IN_GLOBALS,\n TYPES,\n ERROR_TYPES\n);\n\n/*\nLanguage: JavaScript\nDescription: JavaScript (JS) is a lightweight, interpreted, or just-in-time compiled programming language with first-class functions.\nCategory: common, scripting, web\nWebsite: https://developer.mozilla.org/en-US/docs/Web/JavaScript\n*/\n\n\n/** @type LanguageFn */\nfunction javascript(hljs) {\n const regex = hljs.regex;\n /**\n * Takes a string like \"<Booger\" and checks to see\n * if we can find a matching \"</Booger\" later in the\n * content.\n * @param {RegExpMatchArray} match\n * @param {{after:number}} param1\n */\n const hasClosingTag = (match, { after }) => {\n const tag = \"</\" + match[0].slice(1);\n const pos = match.input.indexOf(tag, after);\n return pos !== -1;\n };\n\n const IDENT_RE$1 = IDENT_RE;\n const FRAGMENT = {\n begin: '<>',\n end: '</>'\n };\n // to avoid some special cases inside isTrulyOpeningTag\n const XML_SELF_CLOSING = /<[A-Za-z0-9\\\\._:-]+\\s*\\/>/;\n const XML_TAG = {\n begin: /<[A-Za-z0-9\\\\._:-]+/,\n end: /\\/[A-Za-z0-9\\\\._:-]+>|\\/>/,\n /**\n * @param {RegExpMatchArray} match\n * @param {CallbackResponse} response\n */\n isTrulyOpeningTag: (match, response) => {\n const afterMatchIndex = match[0].length + match.index;\n const nextChar = match.input[afterMatchIndex];\n if (\n // HTML should not include another raw `<` inside a tag\n // nested type?\n // `<Array<Array<number>>`, etc.\n nextChar === \"<\" ||\n // the , gives away that this is not HTML\n // `<T, A extends keyof T, V>`\n nextChar === \",\"\n ) {\n response.ignoreMatch();\n return;\n }\n\n // `<something>`\n // Quite possibly a tag, lets look for a matching closing tag...\n if (nextChar === \">\") {\n // if we cannot find a matching closing tag, then we\n // will ignore it\n if (!hasClosingTag(match, { after: afterMatchIndex })) {\n response.ignoreMatch();\n }\n }\n\n // `<blah />` (self-closing)\n // handled by simpleSelfClosing rule\n\n let m;\n const afterMatch = match.input.substring(afterMatchIndex);\n\n // some more template typing stuff\n // <T = any>(key?: string) => Modify<\n if ((m = afterMatch.match(/^\\s*=/))) {\n response.ignoreMatch();\n return;\n }\n\n // `<From extends string>`\n // technically this could be HTML, but it smells like a type\n // NOTE: This is ugh, but added specifically for https://github.com/highlightjs/highlight.js/issues/3276\n if ((m = afterMatch.match(/^\\s+extends\\s+/))) {\n if (m.index === 0) {\n response.ignoreMatch();\n // eslint-disable-next-line no-useless-return\n return;\n }\n }\n }\n };\n const KEYWORDS$1 = {\n $pattern: IDENT_RE,\n keyword: KEYWORDS,\n literal: LITERALS,\n built_in: BUILT_INS,\n \"variable.language\": BUILT_IN_VARIABLES\n };\n\n // https://tc39.es/ecma262/#sec-literals-numeric-literals\n const decimalDigits = '[0-9](_?[0-9])*';\n const frac = `\\\\.(${decimalDigits})`;\n // DecimalIntegerLiteral, including Annex B NonOctalDecimalIntegerLiteral\n // https://tc39.es/ecma262/#sec-additional-syntax-numeric-literals\n const decimalInteger = `0|[1-9](_?[0-9])*|0[0-7]*[89][0-9]*`;\n const NUMBER = {\n className: 'number',\n variants: [\n // DecimalLiteral\n { begin: `(\\\\b(${decimalInteger})((${frac})|\\\\.)?|(${frac}))` +\n `[eE][+-]?(${decimalDigits})\\\\b` },\n { begin: `\\\\b(${decimalInteger})\\\\b((${frac})\\\\b|\\\\.)?|(${frac})\\\\b` },\n\n // DecimalBigIntegerLiteral\n { begin: `\\\\b(0|[1-9](_?[0-9])*)n\\\\b` },\n\n // NonDecimalIntegerLiteral\n { begin: \"\\\\b0[xX][0-9a-fA-F](_?[0-9a-fA-F])*n?\\\\b\" },\n { begin: \"\\\\b0[bB][0-1](_?[0-1])*n?\\\\b\" },\n { begin: \"\\\\b0[oO][0-7](_?[0-7])*n?\\\\b\" },\n\n // LegacyOctalIntegerLiteral (does not include underscore separators)\n // https://tc39.es/ecma262/#sec-additional-syntax-numeric-literals\n { begin: \"\\\\b0[0-7]+n?\\\\b\" },\n ],\n relevance: 0\n };\n\n const SUBST = {\n className: 'subst',\n begin: '\\\\$\\\\{',\n end: '\\\\}',\n keywords: KEYWORDS$1,\n contains: [] // defined later\n };\n const HTML_TEMPLATE = {\n begin: '\\.?html`',\n end: '',\n starts: {\n end: '`',\n returnEnd: false,\n contains: [\n hljs.BACKSLASH_ESCAPE,\n SUBST\n ],\n subLanguage: 'xml'\n }\n };\n const CSS_TEMPLATE = {\n begin: '\\.?css`',\n end: '',\n starts: {\n end: '`',\n returnEnd: false,\n contains: [\n hljs.BACKSLASH_ESCAPE,\n SUBST\n ],\n subLanguage: 'css'\n }\n };\n const GRAPHQL_TEMPLATE = {\n begin: '\\.?gql`',\n end: '',\n starts: {\n end: '`',\n returnEnd: false,\n contains: [\n hljs.BACKSLASH_ESCAPE,\n SUBST\n ],\n subLanguage: 'graphql'\n }\n };\n const TEMPLATE_STRING = {\n className: 'string',\n begin: '`',\n end: '`',\n contains: [\n hljs.BACKSLASH_ESCAPE,\n SUBST\n ]\n };\n const JSDOC_COMMENT = hljs.COMMENT(\n /\\/\\*\\*(?!\\/)/,\n '\\\\*/',\n {\n relevance: 0,\n contains: [\n {\n begin: '(?=@[A-Za-z]+)',\n relevance: 0,\n contains: [\n {\n className: 'doctag',\n begin: '@[A-Za-z]+'\n },\n {\n className: 'type',\n begin: '\\\\{',\n end: '\\\\}',\n excludeEnd: true,\n excludeBegin: true,\n relevance: 0\n },\n {\n className: 'variable',\n begin: IDENT_RE$1 + '(?=\\\\s*(-)|$)',\n endsParent: true,\n relevance: 0\n },\n // eat spaces (not newlines) so we can find\n // types or variables\n {\n begin: /(?=[^\\n])\\s/,\n relevance: 0\n }\n ]\n }\n ]\n }\n );\n const COMMENT = {\n className: \"comment\",\n variants: [\n JSDOC_COMMENT,\n hljs.C_BLOCK_COMMENT_MODE,\n hljs.C_LINE_COMMENT_MODE\n ]\n };\n const SUBST_INTERNALS = [\n hljs.APOS_STRING_MODE,\n hljs.QUOTE_STRING_MODE,\n HTML_TEMPLATE,\n CSS_TEMPLATE,\n GRAPHQL_TEMPLATE,\n TEMPLATE_STRING,\n // Skip numbers when they are part of a variable name\n { match: /\\$\\d+/ },\n NUMBER,\n // This is intentional:\n // See https://github.com/highlightjs/highlight.js/issues/3288\n // hljs.REGEXP_MODE\n ];\n SUBST.contains = SUBST_INTERNALS\n .concat({\n // we need to pair up {} inside our subst to prevent\n // it from ending too early by matching another }\n begin: /\\{/,\n end: /\\}/,\n keywords: KEYWORDS$1,\n contains: [\n \"self\"\n ].concat(SUBST_INTERNALS)\n });\n const SUBST_AND_COMMENTS = [].concat(COMMENT, SUBST.contains);\n const PARAMS_CONTAINS = SUBST_AND_COMMENTS.concat([\n // eat recursive parens in sub expressions\n {\n begin: /(\\s*)\\(/,\n end: /\\)/,\n keywords: KEYWORDS$1,\n contains: [\"self\"].concat(SUBST_AND_COMMENTS)\n }\n ]);\n const PARAMS = {\n className: 'params',\n // convert this to negative lookbehind in v12\n begin: /(\\s*)\\(/, // to match the parms with\n end: /\\)/,\n excludeBegin: true,\n excludeEnd: true,\n keywords: KEYWORDS$1,\n contains: PARAMS_CONTAINS\n };\n\n // ES6 classes\n const CLASS_OR_EXTENDS = {\n variants: [\n // class Car extends vehicle\n {\n match: [\n /class/,\n /\\s+/,\n IDENT_RE$1,\n /\\s+/,\n /extends/,\n /\\s+/,\n regex.concat(IDENT_RE$1, \"(\", regex.concat(/\\./, IDENT_RE$1), \")*\")\n ],\n scope: {\n 1: \"keyword\",\n 3: \"title.class\",\n 5: \"keyword\",\n 7: \"title.class.inherited\"\n }\n },\n // class Car\n {\n match: [\n /class/,\n /\\s+/,\n IDENT_RE$1\n ],\n scope: {\n 1: \"keyword\",\n 3: \"title.class\"\n }\n },\n\n ]\n };\n\n const CLASS_REFERENCE = {\n relevance: 0,\n match:\n regex.either(\n // Hard coded exceptions\n /\\bJSON/,\n // Float32Array, OutT\n /\\b[A-Z][a-z]+([A-Z][a-z]*|\\d)*/,\n // CSSFactory, CSSFactoryT\n /\\b[A-Z]{2,}([A-Z][a-z]+|\\d)+([A-Z][a-z]*)*/,\n // FPs, FPsT\n /\\b[A-Z]{2,}[a-z]+([A-Z][a-z]+|\\d)*([A-Z][a-z]*)*/,\n // P\n // single letters are not highlighted\n // BLAH\n // this will be flagged as a UPPER_CASE_CONSTANT instead\n ),\n className: \"title.class\",\n keywords: {\n _: [\n // se we still get relevance credit for JS library classes\n ...TYPES,\n ...ERROR_TYPES\n ]\n }\n };\n\n const USE_STRICT = {\n label: \"use_strict\",\n className: 'meta',\n relevance: 10,\n begin: /^\\s*['\"]use (strict|asm)['\"]/\n };\n\n const FUNCTION_DEFINITION = {\n variants: [\n {\n match: [\n /function/,\n /\\s+/,\n IDENT_RE$1,\n /(?=\\s*\\()/\n ]\n },\n // anonymous function\n {\n match: [\n /function/,\n /\\s*(?=\\()/\n ]\n }\n ],\n className: {\n 1: \"keyword\",\n 3: \"title.function\"\n },\n label: \"func.def\",\n contains: [ PARAMS ],\n illegal: /%/\n };\n\n const UPPER_CASE_CONSTANT = {\n relevance: 0,\n match: /\\b[A-Z][A-Z_0-9]+\\b/,\n className: \"variable.constant\"\n };\n\n function noneOf(list) {\n return regex.concat(\"(?!\", list.join(\"|\"), \")\");\n }\n\n const FUNCTION_CALL = {\n match: regex.concat(\n /\\b/,\n noneOf([\n ...BUILT_IN_GLOBALS,\n \"super\",\n \"import\"\n ].map(x => `${x}\\\\s*\\\\(`)),\n IDENT_RE$1, regex.lookahead(/\\s*\\(/)),\n className: \"title.function\",\n relevance: 0\n };\n\n const PROPERTY_ACCESS = {\n begin: regex.concat(/\\./, regex.lookahead(\n regex.concat(IDENT_RE$1, /(?![0-9A-Za-z$_(])/)\n )),\n end: IDENT_RE$1,\n excludeBegin: true,\n keywords: \"prototype\",\n className: \"property\",\n relevance: 0\n };\n\n const GETTER_OR_SETTER = {\n match: [\n /get|set/,\n /\\s+/,\n IDENT_RE$1,\n /(?=\\()/\n ],\n className: {\n 1: \"keyword\",\n 3: \"title.function\"\n },\n contains: [\n { // eat to avoid empty params\n begin: /\\(\\)/\n },\n PARAMS\n ]\n };\n\n const FUNC_LEAD_IN_RE = '(\\\\(' +\n '[^()]*(\\\\(' +\n '[^()]*(\\\\(' +\n '[^()]*' +\n '\\\\)[^()]*)*' +\n '\\\\)[^()]*)*' +\n '\\\\)|' + hljs.UNDERSCORE_IDENT_RE + ')\\\\s*=>';\n\n const FUNCTION_VARIABLE = {\n match: [\n /const|var|let/, /\\s+/,\n IDENT_RE$1, /\\s*/,\n /=\\s*/,\n /(async\\s*)?/, // async is optional\n regex.lookahead(FUNC_LEAD_IN_RE)\n ],\n keywords: \"async\",\n className: {\n 1: \"keyword\",\n 3: \"title.function\"\n },\n contains: [\n PARAMS\n ]\n };\n\n return {\n name: 'JavaScript',\n aliases: ['js', 'jsx', 'mjs', 'cjs'],\n keywords: KEYWORDS$1,\n // this will be extended by TypeScript\n exports: { PARAMS_CONTAINS, CLASS_REFERENCE },\n illegal: /#(?![$_A-z])/,\n contains: [\n hljs.SHEBANG({\n label: \"shebang\",\n binary: \"node\",\n relevance: 5\n }),\n USE_STRICT,\n hljs.APOS_STRING_MODE,\n hljs.QUOTE_STRING_MODE,\n HTML_TEMPLATE,\n CSS_TEMPLATE,\n GRAPHQL_TEMPLATE,\n TEMPLATE_STRING,\n COMMENT,\n // Skip numbers when they are part of a variable name\n { match: /\\$\\d+/ },\n NUMBER,\n CLASS_REFERENCE,\n {\n scope: 'attr',\n match: IDENT_RE$1 + regex.lookahead(':'),\n relevance: 0\n },\n FUNCTION_VARIABLE,\n { // \"value\" container\n begin: '(' + hljs.RE_STARTERS_RE + '|\\\\b(case|return|throw)\\\\b)\\\\s*',\n keywords: 'return throw case',\n relevance: 0,\n contains: [\n COMMENT,\n hljs.REGEXP_MODE,\n {\n className: 'function',\n // we have to count the parens to make sure we actually have the\n // correct bounding ( ) before the =>. There could be any number of\n // sub-expressions inside also surrounded by parens.\n begin: FUNC_LEAD_IN_RE,\n returnBegin: true,\n end: '\\\\s*=>',\n contains: [\n {\n className: 'params',\n variants: [\n {\n begin: hljs.UNDERSCORE_IDENT_RE,\n relevance: 0\n },\n {\n className: null,\n begin: /\\(\\s*\\)/,\n skip: true\n },\n {\n begin: /(\\s*)\\(/,\n end: /\\)/,\n excludeBegin: true,\n excludeEnd: true,\n keywords: KEYWORDS$1,\n contains: PARAMS_CONTAINS\n }\n ]\n }\n ]\n },\n { // could be a comma delimited list of params to a function call\n begin: /,/,\n relevance: 0\n },\n {\n match: /\\s+/,\n relevance: 0\n },\n { // JSX\n variants: [\n { begin: FRAGMENT.begin, end: FRAGMENT.end },\n { match: XML_SELF_CLOSING },\n {\n begin: XML_TAG.begin,\n // we carefully check the opening tag to see if it truly\n // is a tag and not a false positive\n 'on:begin': XML_TAG.isTrulyOpeningTag,\n end: XML_TAG.end\n }\n ],\n subLanguage: 'xml',\n contains: [\n {\n begin: XML_TAG.begin,\n end: XML_TAG.end,\n skip: true,\n contains: ['self']\n }\n ]\n }\n ],\n },\n FUNCTION_DEFINITION,\n {\n // prevent this from getting swallowed up by function\n // since they appear \"function like\"\n beginKeywords: \"while if switch catch for\"\n },\n {\n // we have to count the parens to make sure we actually have the correct\n // bounding ( ). There could be any number of sub-expressions inside\n // also surrounded by parens.\n begin: '\\\\b(?!function)' + hljs.UNDERSCORE_IDENT_RE +\n '\\\\(' + // first parens\n '[^()]*(\\\\(' +\n '[^()]*(\\\\(' +\n '[^()]*' +\n '\\\\)[^()]*)*' +\n '\\\\)[^()]*)*' +\n '\\\\)\\\\s*\\\\{', // end parens\n returnBegin:true,\n label: \"func.def\",\n contains: [\n PARAMS,\n hljs.inherit(hljs.TITLE_MODE, { begin: IDENT_RE$1, className: \"title.function\" })\n ]\n },\n // catch ... so it won't trigger the property rule below\n {\n match: /\\.\\.\\./,\n relevance: 0\n },\n PROPERTY_ACCESS,\n // hack: prevents detection of keywords in some circumstances\n // .keyword()\n // $keyword = x\n {\n match: '\\\\$' + IDENT_RE$1,\n relevance: 0\n },\n {\n match: [ /\\bconstructor(?=\\s*\\()/ ],\n className: { 1: \"title.function\" },\n contains: [ PARAMS ]\n },\n FUNCTION_CALL,\n UPPER_CASE_CONSTANT,\n CLASS_OR_EXTENDS,\n GETTER_OR_SETTER,\n {\n match: /\\$[(.]/ // relevance booster for a pattern common to JS libs: `$(something)` and `$.something`\n }\n ]\n };\n}\n\nexport { javascript as default };\n", "const IDENT_RE = '[A-Za-z$_][0-9A-Za-z$_]*';\nconst KEYWORDS = [\n \"as\", // for exports\n \"in\",\n \"of\",\n \"if\",\n \"for\",\n \"while\",\n \"finally\",\n \"var\",\n \"new\",\n \"function\",\n \"do\",\n \"return\",\n \"void\",\n \"else\",\n \"break\",\n \"catch\",\n \"instanceof\",\n \"with\",\n \"throw\",\n \"case\",\n \"default\",\n \"try\",\n \"switch\",\n \"continue\",\n \"typeof\",\n \"delete\",\n \"let\",\n \"yield\",\n \"const\",\n \"class\",\n // JS handles these with a special rule\n // \"get\",\n // \"set\",\n \"debugger\",\n \"async\",\n \"await\",\n \"static\",\n \"import\",\n \"from\",\n \"export\",\n \"extends\",\n // It's reached stage 3, which is \"recommended for implementation\":\n \"using\"\n];\nconst LITERALS = [\n \"true\",\n \"false\",\n \"null\",\n \"undefined\",\n \"NaN\",\n \"Infinity\"\n];\n\n// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects\nconst TYPES = [\n // Fundamental objects\n \"Object\",\n \"Function\",\n \"Boolean\",\n \"Symbol\",\n // numbers and dates\n \"Math\",\n \"Date\",\n \"Number\",\n \"BigInt\",\n // text\n \"String\",\n \"RegExp\",\n // Indexed collections\n \"Array\",\n \"Float32Array\",\n \"Float64Array\",\n \"Int8Array\",\n \"Uint8Array\",\n \"Uint8ClampedArray\",\n \"Int16Array\",\n \"Int32Array\",\n \"Uint16Array\",\n \"Uint32Array\",\n \"BigInt64Array\",\n \"BigUint64Array\",\n // Keyed collections\n \"Set\",\n \"Map\",\n \"WeakSet\",\n \"WeakMap\",\n // Structured data\n \"ArrayBuffer\",\n \"SharedArrayBuffer\",\n \"Atomics\",\n \"DataView\",\n \"JSON\",\n // Control abstraction objects\n \"Promise\",\n \"Generator\",\n \"GeneratorFunction\",\n \"AsyncFunction\",\n // Reflection\n \"Reflect\",\n \"Proxy\",\n // Internationalization\n \"Intl\",\n // WebAssembly\n \"WebAssembly\"\n];\n\nconst ERROR_TYPES = [\n \"Error\",\n \"EvalError\",\n \"InternalError\",\n \"RangeError\",\n \"ReferenceError\",\n \"SyntaxError\",\n \"TypeError\",\n \"URIError\"\n];\n\nconst BUILT_IN_GLOBALS = [\n \"setInterval\",\n \"setTimeout\",\n \"clearInterval\",\n \"clearTimeout\",\n\n \"require\",\n \"exports\",\n\n \"eval\",\n \"isFinite\",\n \"isNaN\",\n \"parseFloat\",\n \"parseInt\",\n \"decodeURI\",\n \"decodeURIComponent\",\n \"encodeURI\",\n \"encodeURIComponent\",\n \"escape\",\n \"unescape\"\n];\n\nconst BUILT_IN_VARIABLES = [\n \"arguments\",\n \"this\",\n \"super\",\n \"console\",\n \"window\",\n \"document\",\n \"localStorage\",\n \"sessionStorage\",\n \"module\",\n \"global\" // Node.js\n];\n\nconst BUILT_INS = [].concat(\n BUILT_IN_GLOBALS,\n TYPES,\n ERROR_TYPES\n);\n\n/*\nLanguage: JavaScript\nDescription: JavaScript (JS) is a lightweight, interpreted, or just-in-time compiled programming language with first-class functions.\nCategory: common, scripting, web\nWebsite: https://developer.mozilla.org/en-US/docs/Web/JavaScript\n*/\n\n\n/** @type LanguageFn */\nfunction javascript(hljs) {\n const regex = hljs.regex;\n /**\n * Takes a string like \"<Booger\" and checks to see\n * if we can find a matching \"</Booger\" later in the\n * content.\n * @param {RegExpMatchArray} match\n * @param {{after:number}} param1\n */\n const hasClosingTag = (match, { after }) => {\n const tag = \"</\" + match[0].slice(1);\n const pos = match.input.indexOf(tag, after);\n return pos !== -1;\n };\n\n const IDENT_RE$1 = IDENT_RE;\n const FRAGMENT = {\n begin: '<>',\n end: '</>'\n };\n // to avoid some special cases inside isTrulyOpeningTag\n const XML_SELF_CLOSING = /<[A-Za-z0-9\\\\._:-]+\\s*\\/>/;\n const XML_TAG = {\n begin: /<[A-Za-z0-9\\\\._:-]+/,\n end: /\\/[A-Za-z0-9\\\\._:-]+>|\\/>/,\n /**\n * @param {RegExpMatchArray} match\n * @param {CallbackResponse} response\n */\n isTrulyOpeningTag: (match, response) => {\n const afterMatchIndex = match[0].length + match.index;\n const nextChar = match.input[afterMatchIndex];\n if (\n // HTML should not include another raw `<` inside a tag\n // nested type?\n // `<Array<Array<number>>`, etc.\n nextChar === \"<\" ||\n // the , gives away that this is not HTML\n // `<T, A extends keyof T, V>`\n nextChar === \",\"\n ) {\n response.ignoreMatch();\n return;\n }\n\n // `<something>`\n // Quite possibly a tag, lets look for a matching closing tag...\n if (nextChar === \">\") {\n // if we cannot find a matching closing tag, then we\n // will ignore it\n if (!hasClosingTag(match, { after: afterMatchIndex })) {\n response.ignoreMatch();\n }\n }\n\n // `<blah />` (self-closing)\n // handled by simpleSelfClosing rule\n\n let m;\n const afterMatch = match.input.substring(afterMatchIndex);\n\n // some more template typing stuff\n // <T = any>(key?: string) => Modify<\n if ((m = afterMatch.match(/^\\s*=/))) {\n response.ignoreMatch();\n return;\n }\n\n // `<From extends string>`\n // technically this could be HTML, but it smells like a type\n // NOTE: This is ugh, but added specifically for https://github.com/highlightjs/highlight.js/issues/3276\n if ((m = afterMatch.match(/^\\s+extends\\s+/))) {\n if (m.index === 0) {\n response.ignoreMatch();\n // eslint-disable-next-line no-useless-return\n return;\n }\n }\n }\n };\n const KEYWORDS$1 = {\n $pattern: IDENT_RE,\n keyword: KEYWORDS,\n literal: LITERALS,\n built_in: BUILT_INS,\n \"variable.language\": BUILT_IN_VARIABLES\n };\n\n // https://tc39.es/ecma262/#sec-literals-numeric-literals\n const decimalDigits = '[0-9](_?[0-9])*';\n const frac = `\\\\.(${decimalDigits})`;\n // DecimalIntegerLiteral, including Annex B NonOctalDecimalIntegerLiteral\n // https://tc39.es/ecma262/#sec-additional-syntax-numeric-literals\n const decimalInteger = `0|[1-9](_?[0-9])*|0[0-7]*[89][0-9]*`;\n const NUMBER = {\n className: 'number',\n variants: [\n // DecimalLiteral\n { begin: `(\\\\b(${decimalInteger})((${frac})|\\\\.)?|(${frac}))` +\n `[eE][+-]?(${decimalDigits})\\\\b` },\n { begin: `\\\\b(${decimalInteger})\\\\b((${frac})\\\\b|\\\\.)?|(${frac})\\\\b` },\n\n // DecimalBigIntegerLiteral\n { begin: `\\\\b(0|[1-9](_?[0-9])*)n\\\\b` },\n\n // NonDecimalIntegerLiteral\n { begin: \"\\\\b0[xX][0-9a-fA-F](_?[0-9a-fA-F])*n?\\\\b\" },\n { begin: \"\\\\b0[bB][0-1](_?[0-1])*n?\\\\b\" },\n { begin: \"\\\\b0[oO][0-7](_?[0-7])*n?\\\\b\" },\n\n // LegacyOctalIntegerLiteral (does not include underscore separators)\n // https://tc39.es/ecma262/#sec-additional-syntax-numeric-literals\n { begin: \"\\\\b0[0-7]+n?\\\\b\" },\n ],\n relevance: 0\n };\n\n const SUBST = {\n className: 'subst',\n begin: '\\\\$\\\\{',\n end: '\\\\}',\n keywords: KEYWORDS$1,\n contains: [] // defined later\n };\n const HTML_TEMPLATE = {\n begin: '\\.?html`',\n end: '',\n starts: {\n end: '`',\n returnEnd: false,\n contains: [\n hljs.BACKSLASH_ESCAPE,\n SUBST\n ],\n subLanguage: 'xml'\n }\n };\n const CSS_TEMPLATE = {\n begin: '\\.?css`',\n end: '',\n starts: {\n end: '`',\n returnEnd: false,\n contains: [\n hljs.BACKSLASH_ESCAPE,\n SUBST\n ],\n subLanguage: 'css'\n }\n };\n const GRAPHQL_TEMPLATE = {\n begin: '\\.?gql`',\n end: '',\n starts: {\n end: '`',\n returnEnd: false,\n contains: [\n hljs.BACKSLASH_ESCAPE,\n SUBST\n ],\n subLanguage: 'graphql'\n }\n };\n const TEMPLATE_STRING = {\n className: 'string',\n begin: '`',\n end: '`',\n contains: [\n hljs.BACKSLASH_ESCAPE,\n SUBST\n ]\n };\n const JSDOC_COMMENT = hljs.COMMENT(\n /\\/\\*\\*(?!\\/)/,\n '\\\\*/',\n {\n relevance: 0,\n contains: [\n {\n begin: '(?=@[A-Za-z]+)',\n relevance: 0,\n contains: [\n {\n className: 'doctag',\n begin: '@[A-Za-z]+'\n },\n {\n className: 'type',\n begin: '\\\\{',\n end: '\\\\}',\n excludeEnd: true,\n excludeBegin: true,\n relevance: 0\n },\n {\n className: 'variable',\n begin: IDENT_RE$1 + '(?=\\\\s*(-)|$)',\n endsParent: true,\n relevance: 0\n },\n // eat spaces (not newlines) so we can find\n // types or variables\n {\n begin: /(?=[^\\n])\\s/,\n relevance: 0\n }\n ]\n }\n ]\n }\n );\n const COMMENT = {\n className: \"comment\",\n variants: [\n JSDOC_COMMENT,\n hljs.C_BLOCK_COMMENT_MODE,\n hljs.C_LINE_COMMENT_MODE\n ]\n };\n const SUBST_INTERNALS = [\n hljs.APOS_STRING_MODE,\n hljs.QUOTE_STRING_MODE,\n HTML_TEMPLATE,\n CSS_TEMPLATE,\n GRAPHQL_TEMPLATE,\n TEMPLATE_STRING,\n // Skip numbers when they are part of a variable name\n { match: /\\$\\d+/ },\n NUMBER,\n // This is intentional:\n // See https://github.com/highlightjs/highlight.js/issues/3288\n // hljs.REGEXP_MODE\n ];\n SUBST.contains = SUBST_INTERNALS\n .concat({\n // we need to pair up {} inside our subst to prevent\n // it from ending too early by matching another }\n begin: /\\{/,\n end: /\\}/,\n keywords: KEYWORDS$1,\n contains: [\n \"self\"\n ].concat(SUBST_INTERNALS)\n });\n const SUBST_AND_COMMENTS = [].concat(COMMENT, SUBST.contains);\n const PARAMS_CONTAINS = SUBST_AND_COMMENTS.concat([\n // eat recursive parens in sub expressions\n {\n begin: /(\\s*)\\(/,\n end: /\\)/,\n keywords: KEYWORDS$1,\n contains: [\"self\"].concat(SUBST_AND_COMMENTS)\n }\n ]);\n const PARAMS = {\n className: 'params',\n // convert this to negative lookbehind in v12\n begin: /(\\s*)\\(/, // to match the parms with\n end: /\\)/,\n excludeBegin: true,\n excludeEnd: true,\n keywords: KEYWORDS$1,\n contains: PARAMS_CONTAINS\n };\n\n // ES6 classes\n const CLASS_OR_EXTENDS = {\n variants: [\n // class Car extends vehicle\n {\n match: [\n /class/,\n /\\s+/,\n IDENT_RE$1,\n /\\s+/,\n /extends/,\n /\\s+/,\n regex.concat(IDENT_RE$1, \"(\", regex.concat(/\\./, IDENT_RE$1), \")*\")\n ],\n scope: {\n 1: \"keyword\",\n 3: \"title.class\",\n 5: \"keyword\",\n 7: \"title.class.inherited\"\n }\n },\n // class Car\n {\n match: [\n /class/,\n /\\s+/,\n IDENT_RE$1\n ],\n scope: {\n 1: \"keyword\",\n 3: \"title.class\"\n }\n },\n\n ]\n };\n\n const CLASS_REFERENCE = {\n relevance: 0,\n match:\n regex.either(\n // Hard coded exceptions\n /\\bJSON/,\n // Float32Array, OutT\n /\\b[A-Z][a-z]+([A-Z][a-z]*|\\d)*/,\n // CSSFactory, CSSFactoryT\n /\\b[A-Z]{2,}([A-Z][a-z]+|\\d)+([A-Z][a-z]*)*/,\n // FPs, FPsT\n /\\b[A-Z]{2,}[a-z]+([A-Z][a-z]+|\\d)*([A-Z][a-z]*)*/,\n // P\n // single letters are not highlighted\n // BLAH\n // this will be flagged as a UPPER_CASE_CONSTANT instead\n ),\n className: \"title.class\",\n keywords: {\n _: [\n // se we still get relevance credit for JS library classes\n ...TYPES,\n ...ERROR_TYPES\n ]\n }\n };\n\n const USE_STRICT = {\n label: \"use_strict\",\n className: 'meta',\n relevance: 10,\n begin: /^\\s*['\"]use (strict|asm)['\"]/\n };\n\n const FUNCTION_DEFINITION = {\n variants: [\n {\n match: [\n /function/,\n /\\s+/,\n IDENT_RE$1,\n /(?=\\s*\\()/\n ]\n },\n // anonymous function\n {\n match: [\n /function/,\n /\\s*(?=\\()/\n ]\n }\n ],\n className: {\n 1: \"keyword\",\n 3: \"title.function\"\n },\n label: \"func.def\",\n contains: [ PARAMS ],\n illegal: /%/\n };\n\n const UPPER_CASE_CONSTANT = {\n relevance: 0,\n match: /\\b[A-Z][A-Z_0-9]+\\b/,\n className: \"variable.constant\"\n };\n\n function noneOf(list) {\n return regex.concat(\"(?!\", list.join(\"|\"), \")\");\n }\n\n const FUNCTION_CALL = {\n match: regex.concat(\n /\\b/,\n noneOf([\n ...BUILT_IN_GLOBALS,\n \"super\",\n \"import\"\n ].map(x => `${x}\\\\s*\\\\(`)),\n IDENT_RE$1, regex.lookahead(/\\s*\\(/)),\n className: \"title.function\",\n relevance: 0\n };\n\n const PROPERTY_ACCESS = {\n begin: regex.concat(/\\./, regex.lookahead(\n regex.concat(IDENT_RE$1, /(?![0-9A-Za-z$_(])/)\n )),\n end: IDENT_RE$1,\n excludeBegin: true,\n keywords: \"prototype\",\n className: \"property\",\n relevance: 0\n };\n\n const GETTER_OR_SETTER = {\n match: [\n /get|set/,\n /\\s+/,\n IDENT_RE$1,\n /(?=\\()/\n ],\n className: {\n 1: \"keyword\",\n 3: \"title.function\"\n },\n contains: [\n { // eat to avoid empty params\n begin: /\\(\\)/\n },\n PARAMS\n ]\n };\n\n const FUNC_LEAD_IN_RE = '(\\\\(' +\n '[^()]*(\\\\(' +\n '[^()]*(\\\\(' +\n '[^()]*' +\n '\\\\)[^()]*)*' +\n '\\\\)[^()]*)*' +\n '\\\\)|' + hljs.UNDERSCORE_IDENT_RE + ')\\\\s*=>';\n\n const FUNCTION_VARIABLE = {\n match: [\n /const|var|let/, /\\s+/,\n IDENT_RE$1, /\\s*/,\n /=\\s*/,\n /(async\\s*)?/, // async is optional\n regex.lookahead(FUNC_LEAD_IN_RE)\n ],\n keywords: \"async\",\n className: {\n 1: \"keyword\",\n 3: \"title.function\"\n },\n contains: [\n PARAMS\n ]\n };\n\n return {\n name: 'JavaScript',\n aliases: ['js', 'jsx', 'mjs', 'cjs'],\n keywords: KEYWORDS$1,\n // this will be extended by TypeScript\n exports: { PARAMS_CONTAINS, CLASS_REFERENCE },\n illegal: /#(?![$_A-z])/,\n contains: [\n hljs.SHEBANG({\n label: \"shebang\",\n binary: \"node\",\n relevance: 5\n }),\n USE_STRICT,\n hljs.APOS_STRING_MODE,\n hljs.QUOTE_STRING_MODE,\n HTML_TEMPLATE,\n CSS_TEMPLATE,\n GRAPHQL_TEMPLATE,\n TEMPLATE_STRING,\n COMMENT,\n // Skip numbers when they are part of a variable name\n { match: /\\$\\d+/ },\n NUMBER,\n CLASS_REFERENCE,\n {\n scope: 'attr',\n match: IDENT_RE$1 + regex.lookahead(':'),\n relevance: 0\n },\n FUNCTION_VARIABLE,\n { // \"value\" container\n begin: '(' + hljs.RE_STARTERS_RE + '|\\\\b(case|return|throw)\\\\b)\\\\s*',\n keywords: 'return throw case',\n relevance: 0,\n contains: [\n COMMENT,\n hljs.REGEXP_MODE,\n {\n className: 'function',\n // we have to count the parens to make sure we actually have the\n // correct bounding ( ) before the =>. There could be any number of\n // sub-expressions inside also surrounded by parens.\n begin: FUNC_LEAD_IN_RE,\n returnBegin: true,\n end: '\\\\s*=>',\n contains: [\n {\n className: 'params',\n variants: [\n {\n begin: hljs.UNDERSCORE_IDENT_RE,\n relevance: 0\n },\n {\n className: null,\n begin: /\\(\\s*\\)/,\n skip: true\n },\n {\n begin: /(\\s*)\\(/,\n end: /\\)/,\n excludeBegin: true,\n excludeEnd: true,\n keywords: KEYWORDS$1,\n contains: PARAMS_CONTAINS\n }\n ]\n }\n ]\n },\n { // could be a comma delimited list of params to a function call\n begin: /,/,\n relevance: 0\n },\n {\n match: /\\s+/,\n relevance: 0\n },\n { // JSX\n variants: [\n { begin: FRAGMENT.begin, end: FRAGMENT.end },\n { match: XML_SELF_CLOSING },\n {\n begin: XML_TAG.begin,\n // we carefully check the opening tag to see if it truly\n // is a tag and not a false positive\n 'on:begin': XML_TAG.isTrulyOpeningTag,\n end: XML_TAG.end\n }\n ],\n subLanguage: 'xml',\n contains: [\n {\n begin: XML_TAG.begin,\n end: XML_TAG.end,\n skip: true,\n contains: ['self']\n }\n ]\n }\n ],\n },\n FUNCTION_DEFINITION,\n {\n // prevent this from getting swallowed up by function\n // since they appear \"function like\"\n beginKeywords: \"while if switch catch for\"\n },\n {\n // we have to count the parens to make sure we actually have the correct\n // bounding ( ). There could be any number of sub-expressions inside\n // also surrounded by parens.\n begin: '\\\\b(?!function)' + hljs.UNDERSCORE_IDENT_RE +\n '\\\\(' + // first parens\n '[^()]*(\\\\(' +\n '[^()]*(\\\\(' +\n '[^()]*' +\n '\\\\)[^()]*)*' +\n '\\\\)[^()]*)*' +\n '\\\\)\\\\s*\\\\{', // end parens\n returnBegin:true,\n label: \"func.def\",\n contains: [\n PARAMS,\n hljs.inherit(hljs.TITLE_MODE, { begin: IDENT_RE$1, className: \"title.function\" })\n ]\n },\n // catch ... so it won't trigger the property rule below\n {\n match: /\\.\\.\\./,\n relevance: 0\n },\n PROPERTY_ACCESS,\n // hack: prevents detection of keywords in some circumstances\n // .keyword()\n // $keyword = x\n {\n match: '\\\\$' + IDENT_RE$1,\n relevance: 0\n },\n {\n match: [ /\\bconstructor(?=\\s*\\()/ ],\n className: { 1: \"title.function\" },\n contains: [ PARAMS ]\n },\n FUNCTION_CALL,\n UPPER_CASE_CONSTANT,\n CLASS_OR_EXTENDS,\n GETTER_OR_SETTER,\n {\n match: /\\$[(.]/ // relevance booster for a pattern common to JS libs: `$(something)` and `$.something`\n }\n ]\n };\n}\n\n/*\nLanguage: TypeScript\nAuthor: Panu Horsmalahti <panu.horsmalahti@iki.fi>\nContributors: Ike Ku <dempfi@yahoo.com>\nDescription: TypeScript is a strict superset of JavaScript\nWebsite: https://www.typescriptlang.org\nCategory: common, scripting\n*/\n\n\n/** @type LanguageFn */\nfunction typescript(hljs) {\n const regex = hljs.regex;\n const tsLanguage = javascript(hljs);\n\n const IDENT_RE$1 = IDENT_RE;\n const TYPES = [\n \"any\",\n \"void\",\n \"number\",\n \"boolean\",\n \"string\",\n \"object\",\n \"never\",\n \"symbol\",\n \"bigint\",\n \"unknown\"\n ];\n const NAMESPACE = {\n begin: [\n /namespace/,\n /\\s+/,\n hljs.IDENT_RE\n ],\n beginScope: {\n 1: \"keyword\",\n 3: \"title.class\"\n }\n };\n const INTERFACE = {\n beginKeywords: 'interface',\n end: /\\{/,\n excludeEnd: true,\n keywords: {\n keyword: 'interface extends',\n built_in: TYPES\n },\n contains: [ tsLanguage.exports.CLASS_REFERENCE ]\n };\n const USE_STRICT = {\n className: 'meta',\n relevance: 10,\n begin: /^\\s*['\"]use strict['\"]/\n };\n const TS_SPECIFIC_KEYWORDS = [\n \"type\",\n // \"namespace\",\n \"interface\",\n \"public\",\n \"private\",\n \"protected\",\n \"implements\",\n \"declare\",\n \"abstract\",\n \"readonly\",\n \"enum\",\n \"override\",\n \"satisfies\"\n ];\n /*\n namespace is a TS keyword but it's fine to use it as a variable name too.\n const message = 'foo';\n const namespace = 'bar';\n */\n const KEYWORDS$1 = {\n $pattern: IDENT_RE,\n keyword: KEYWORDS.concat(TS_SPECIFIC_KEYWORDS),\n literal: LITERALS,\n built_in: BUILT_INS.concat(TYPES),\n \"variable.language\": BUILT_IN_VARIABLES\n };\n\n const DECORATOR = {\n className: 'meta',\n begin: '@' + IDENT_RE$1,\n };\n\n const swapMode = (mode, label, replacement) => {\n const indx = mode.contains.findIndex(m => m.label === label);\n if (indx === -1) { throw new Error(\"can not find mode to replace\"); }\n\n mode.contains.splice(indx, 1, replacement);\n };\n\n\n // this should update anywhere keywords is used since\n // it will be the same actual JS object\n Object.assign(tsLanguage.keywords, KEYWORDS$1);\n\n tsLanguage.exports.PARAMS_CONTAINS.push(DECORATOR);\n\n // highlight the function params\n const ATTRIBUTE_HIGHLIGHT = tsLanguage.contains.find(c => c.scope === \"attr\");\n\n // take default attr rule and extend it to support optionals\n const OPTIONAL_KEY_OR_ARGUMENT = Object.assign({},\n ATTRIBUTE_HIGHLIGHT,\n { match: regex.concat(IDENT_RE$1, regex.lookahead(/\\s*\\?:/)) }\n );\n tsLanguage.exports.PARAMS_CONTAINS.push([\n tsLanguage.exports.CLASS_REFERENCE, // class reference for highlighting the params types\n ATTRIBUTE_HIGHLIGHT, // highlight the params key\n OPTIONAL_KEY_OR_ARGUMENT, // Added for optional property assignment highlighting\n ]);\n\n // Add the optional property assignment highlighting for objects or classes\n tsLanguage.contains = tsLanguage.contains.concat([\n DECORATOR,\n NAMESPACE,\n INTERFACE,\n OPTIONAL_KEY_OR_ARGUMENT, // Added for optional property assignment highlighting\n ]);\n\n // TS gets a simpler shebang rule than JS\n swapMode(tsLanguage, \"shebang\", hljs.SHEBANG());\n // JS use strict rule purposely excludes `asm` which makes no sense\n swapMode(tsLanguage, \"use_strict\", USE_STRICT);\n\n const functionDeclaration = tsLanguage.contains.find(m => m.label === \"func.def\");\n functionDeclaration.relevance = 0; // () => {} is more typical in TypeScript\n\n Object.assign(tsLanguage, {\n name: 'TypeScript',\n aliases: [\n 'ts',\n 'tsx',\n 'mts',\n 'cts'\n ]\n });\n\n return tsLanguage;\n}\n\nexport { typescript as default };\n", "/*\nLanguage: Python\nDescription: Python is an interpreted, object-oriented, high-level programming language with dynamic semantics.\nWebsite: https://www.python.org\nCategory: common\n*/\n\nfunction python(hljs) {\n const regex = hljs.regex;\n const IDENT_RE = /[\\p{XID_Start}_]\\p{XID_Continue}*/u;\n const RESERVED_WORDS = [\n 'and',\n 'as',\n 'assert',\n 'async',\n 'await',\n 'break',\n 'case',\n 'class',\n 'continue',\n 'def',\n 'del',\n 'elif',\n 'else',\n 'except',\n 'finally',\n 'for',\n 'from',\n 'global',\n 'if',\n 'import',\n 'in',\n 'is',\n 'lambda',\n 'match',\n 'nonlocal|10',\n 'not',\n 'or',\n 'pass',\n 'raise',\n 'return',\n 'try',\n 'while',\n 'with',\n 'yield'\n ];\n\n const BUILT_INS = [\n '__import__',\n 'abs',\n 'all',\n 'any',\n 'ascii',\n 'bin',\n 'bool',\n 'breakpoint',\n 'bytearray',\n 'bytes',\n 'callable',\n 'chr',\n 'classmethod',\n 'compile',\n 'complex',\n 'delattr',\n 'dict',\n 'dir',\n 'divmod',\n 'enumerate',\n 'eval',\n 'exec',\n 'filter',\n 'float',\n 'format',\n 'frozenset',\n 'getattr',\n 'globals',\n 'hasattr',\n 'hash',\n 'help',\n 'hex',\n 'id',\n 'input',\n 'int',\n 'isinstance',\n 'issubclass',\n 'iter',\n 'len',\n 'list',\n 'locals',\n 'map',\n 'max',\n 'memoryview',\n 'min',\n 'next',\n 'object',\n 'oct',\n 'open',\n 'ord',\n 'pow',\n 'print',\n 'property',\n 'range',\n 'repr',\n 'reversed',\n 'round',\n 'set',\n 'setattr',\n 'slice',\n 'sorted',\n 'staticmethod',\n 'str',\n 'sum',\n 'super',\n 'tuple',\n 'type',\n 'vars',\n 'zip'\n ];\n\n const LITERALS = [\n '__debug__',\n 'Ellipsis',\n 'False',\n 'None',\n 'NotImplemented',\n 'True'\n ];\n\n // https://docs.python.org/3/library/typing.html\n // TODO: Could these be supplemented by a CamelCase matcher in certain\n // contexts, leaving these remaining only for relevance hinting?\n const TYPES = [\n \"Any\",\n \"Callable\",\n \"Coroutine\",\n \"Dict\",\n \"List\",\n \"Literal\",\n \"Generic\",\n \"Optional\",\n \"Sequence\",\n \"Set\",\n \"Tuple\",\n \"Type\",\n \"Union\"\n ];\n\n const KEYWORDS = {\n $pattern: /[A-Za-z]\\w+|__\\w+__/,\n keyword: RESERVED_WORDS,\n built_in: BUILT_INS,\n literal: LITERALS,\n type: TYPES\n };\n\n const PROMPT = {\n className: 'meta',\n begin: /^(>>>|\\.\\.\\.) /\n };\n\n const SUBST = {\n className: 'subst',\n begin: /\\{/,\n end: /\\}/,\n keywords: KEYWORDS,\n illegal: /#/\n };\n\n const LITERAL_BRACKET = {\n begin: /\\{\\{/,\n relevance: 0\n };\n\n const STRING = {\n className: 'string',\n contains: [ hljs.BACKSLASH_ESCAPE ],\n variants: [\n {\n begin: /([uU]|[bB]|[rR]|[bB][rR]|[rR][bB])?'''/,\n end: /'''/,\n contains: [\n hljs.BACKSLASH_ESCAPE,\n PROMPT\n ],\n relevance: 10\n },\n {\n begin: /([uU]|[bB]|[rR]|[bB][rR]|[rR][bB])?\"\"\"/,\n end: /\"\"\"/,\n contains: [\n hljs.BACKSLASH_ESCAPE,\n PROMPT\n ],\n relevance: 10\n },\n {\n begin: /([fF][rR]|[rR][fF]|[fF])'''/,\n end: /'''/,\n contains: [\n hljs.BACKSLASH_ESCAPE,\n PROMPT,\n LITERAL_BRACKET,\n SUBST\n ]\n },\n {\n begin: /([fF][rR]|[rR][fF]|[fF])\"\"\"/,\n end: /\"\"\"/,\n contains: [\n hljs.BACKSLASH_ESCAPE,\n PROMPT,\n LITERAL_BRACKET,\n SUBST\n ]\n },\n {\n begin: /([uU]|[rR])'/,\n end: /'/,\n relevance: 10\n },\n {\n begin: /([uU]|[rR])\"/,\n end: /\"/,\n relevance: 10\n },\n {\n begin: /([bB]|[bB][rR]|[rR][bB])'/,\n end: /'/\n },\n {\n begin: /([bB]|[bB][rR]|[rR][bB])\"/,\n end: /\"/\n },\n {\n begin: /([fF][rR]|[rR][fF]|[fF])'/,\n end: /'/,\n contains: [\n hljs.BACKSLASH_ESCAPE,\n LITERAL_BRACKET,\n SUBST\n ]\n },\n {\n begin: /([fF][rR]|[rR][fF]|[fF])\"/,\n end: /\"/,\n contains: [\n hljs.BACKSLASH_ESCAPE,\n LITERAL_BRACKET,\n SUBST\n ]\n },\n hljs.APOS_STRING_MODE,\n hljs.QUOTE_STRING_MODE\n ]\n };\n\n // https://docs.python.org/3.9/reference/lexical_analysis.html#numeric-literals\n const digitpart = '[0-9](_?[0-9])*';\n const pointfloat = `(\\\\b(${digitpart}))?\\\\.(${digitpart})|\\\\b(${digitpart})\\\\.`;\n // Whitespace after a number (or any lexical token) is needed only if its absence\n // would change the tokenization\n // https://docs.python.org/3.9/reference/lexical_analysis.html#whitespace-between-tokens\n // We deviate slightly, requiring a word boundary or a keyword\n // to avoid accidentally recognizing *prefixes* (e.g., `0` in `0x41` or `08` or `0__1`)\n const lookahead = `\\\\b|${RESERVED_WORDS.join('|')}`;\n const NUMBER = {\n className: 'number',\n relevance: 0,\n variants: [\n // exponentfloat, pointfloat\n // https://docs.python.org/3.9/reference/lexical_analysis.html#floating-point-literals\n // optionally imaginary\n // https://docs.python.org/3.9/reference/lexical_analysis.html#imaginary-literals\n // Note: no leading \\b because floats can start with a decimal point\n // and we don't want to mishandle e.g. `fn(.5)`,\n // no trailing \\b for pointfloat because it can end with a decimal point\n // and we don't want to mishandle e.g. `0..hex()`; this should be safe\n // because both MUST contain a decimal point and so cannot be confused with\n // the interior part of an identifier\n {\n begin: `(\\\\b(${digitpart})|(${pointfloat}))[eE][+-]?(${digitpart})[jJ]?(?=${lookahead})`\n },\n {\n begin: `(${pointfloat})[jJ]?`\n },\n\n // decinteger, bininteger, octinteger, hexinteger\n // https://docs.python.org/3.9/reference/lexical_analysis.html#integer-literals\n // optionally \"long\" in Python 2\n // https://docs.python.org/2.7/reference/lexical_analysis.html#integer-and-long-integer-literals\n // decinteger is optionally imaginary\n // https://docs.python.org/3.9/reference/lexical_analysis.html#imaginary-literals\n {\n begin: `\\\\b([1-9](_?[0-9])*|0+(_?0)*)[lLjJ]?(?=${lookahead})`\n },\n {\n begin: `\\\\b0[bB](_?[01])+[lL]?(?=${lookahead})`\n },\n {\n begin: `\\\\b0[oO](_?[0-7])+[lL]?(?=${lookahead})`\n },\n {\n begin: `\\\\b0[xX](_?[0-9a-fA-F])+[lL]?(?=${lookahead})`\n },\n\n // imagnumber (digitpart-based)\n // https://docs.python.org/3.9/reference/lexical_analysis.html#imaginary-literals\n {\n begin: `\\\\b(${digitpart})[jJ](?=${lookahead})`\n }\n ]\n };\n const COMMENT_TYPE = {\n className: \"comment\",\n begin: regex.lookahead(/# type:/),\n end: /$/,\n keywords: KEYWORDS,\n contains: [\n { // prevent keywords from coloring `type`\n begin: /# type:/\n },\n // comment within a datatype comment includes no keywords\n {\n begin: /#/,\n end: /\\b\\B/,\n endsWithParent: true\n }\n ]\n };\n const PARAMS = {\n className: 'params',\n variants: [\n // Exclude params in functions without params\n {\n className: \"\",\n begin: /\\(\\s*\\)/,\n skip: true\n },\n {\n begin: /\\(/,\n end: /\\)/,\n excludeBegin: true,\n excludeEnd: true,\n keywords: KEYWORDS,\n contains: [\n 'self',\n PROMPT,\n NUMBER,\n STRING,\n hljs.HASH_COMMENT_MODE\n ]\n }\n ]\n };\n SUBST.contains = [\n STRING,\n NUMBER,\n PROMPT\n ];\n\n return {\n name: 'Python',\n aliases: [\n 'py',\n 'gyp',\n 'ipython'\n ],\n unicodeRegex: true,\n keywords: KEYWORDS,\n illegal: /(<\\/|\\?)|=>/,\n contains: [\n PROMPT,\n NUMBER,\n {\n // very common convention\n scope: 'variable.language',\n match: /\\bself\\b/\n },\n {\n // eat \"if\" prior to string so that it won't accidentally be\n // labeled as an f-string\n beginKeywords: \"if\",\n relevance: 0\n },\n { match: /\\bor\\b/, scope: \"keyword\" },\n STRING,\n COMMENT_TYPE,\n hljs.HASH_COMMENT_MODE,\n {\n match: [\n /\\bdef/, /\\s+/,\n IDENT_RE,\n ],\n scope: {\n 1: \"keyword\",\n 3: \"title.function\"\n },\n contains: [ PARAMS ]\n },\n {\n variants: [\n {\n match: [\n /\\bclass/, /\\s+/,\n IDENT_RE, /\\s*/,\n /\\(\\s*/, IDENT_RE,/\\s*\\)/\n ],\n },\n {\n match: [\n /\\bclass/, /\\s+/,\n IDENT_RE\n ],\n }\n ],\n scope: {\n 1: \"keyword\",\n 3: \"title.class\",\n 6: \"title.class.inherited\",\n }\n },\n {\n className: 'meta',\n begin: /^[\\t ]*@/,\n end: /(?=#)|$/,\n contains: [\n NUMBER,\n PARAMS,\n STRING\n ]\n }\n ]\n };\n}\n\nexport { python as default };\n", "/*\nLanguage: Bash\nAuthor: vah <vahtenberg@gmail.com>\nContributrors: Benjamin Pannell <contact@sierrasoftworks.com>\nWebsite: https://www.gnu.org/software/bash/\nCategory: common, scripting\n*/\n\n/** @type LanguageFn */\nfunction bash(hljs) {\n const regex = hljs.regex;\n const VAR = {};\n const BRACED_VAR = {\n begin: /\\$\\{/,\n end: /\\}/,\n contains: [\n \"self\",\n {\n begin: /:-/,\n contains: [ VAR ]\n } // default values\n ]\n };\n Object.assign(VAR, {\n className: 'variable',\n variants: [\n { begin: regex.concat(/\\$[\\w\\d#@][\\w\\d_]*/,\n // negative look-ahead tries to avoid matching patterns that are not\n // Perl at all like $ident$, @ident@, etc.\n `(?![\\\\w\\\\d])(?![$])`) },\n BRACED_VAR\n ]\n });\n\n const SUBST = {\n className: 'subst',\n begin: /\\$\\(/,\n end: /\\)/,\n contains: [ hljs.BACKSLASH_ESCAPE ]\n };\n const COMMENT = hljs.inherit(\n hljs.COMMENT(),\n {\n match: [\n /(^|\\s)/,\n /#.*$/\n ],\n scope: {\n 2: 'comment'\n }\n }\n );\n const HERE_DOC = {\n begin: /<<-?\\s*(?=\\w+)/,\n starts: { contains: [\n hljs.END_SAME_AS_BEGIN({\n begin: /(\\w+)/,\n end: /(\\w+)/,\n className: 'string'\n })\n ] }\n };\n const QUOTE_STRING = {\n className: 'string',\n begin: /\"/,\n end: /\"/,\n contains: [\n hljs.BACKSLASH_ESCAPE,\n VAR,\n SUBST\n ]\n };\n SUBST.contains.push(QUOTE_STRING);\n const ESCAPED_QUOTE = {\n match: /\\\\\"/\n };\n const APOS_STRING = {\n className: 'string',\n begin: /'/,\n end: /'/\n };\n const ESCAPED_APOS = {\n match: /\\\\'/\n };\n const ARITHMETIC = {\n begin: /\\$?\\(\\(/,\n end: /\\)\\)/,\n contains: [\n {\n begin: /\\d+#[0-9a-f]+/,\n className: \"number\"\n },\n hljs.NUMBER_MODE,\n VAR\n ]\n };\n const SH_LIKE_SHELLS = [\n \"fish\",\n \"bash\",\n \"zsh\",\n \"sh\",\n \"csh\",\n \"ksh\",\n \"tcsh\",\n \"dash\",\n \"scsh\",\n ];\n const KNOWN_SHEBANG = hljs.SHEBANG({\n binary: `(${SH_LIKE_SHELLS.join(\"|\")})`,\n relevance: 10\n });\n const FUNCTION = {\n className: 'function',\n begin: /\\w[\\w\\d_]*\\s*\\(\\s*\\)\\s*\\{/,\n returnBegin: true,\n contains: [ hljs.inherit(hljs.TITLE_MODE, { begin: /\\w[\\w\\d_]*/ }) ],\n relevance: 0\n };\n\n const KEYWORDS = [\n \"if\",\n \"then\",\n \"else\",\n \"elif\",\n \"fi\",\n \"time\",\n \"for\",\n \"while\",\n \"until\",\n \"in\",\n \"do\",\n \"done\",\n \"case\",\n \"esac\",\n \"coproc\",\n \"function\",\n \"select\"\n ];\n\n const LITERALS = [\n \"true\",\n \"false\"\n ];\n\n // to consume paths to prevent keyword matches inside them\n const PATH_MODE = { match: /(\\/[a-z._-]+)+/ };\n\n // http://www.gnu.org/software/bash/manual/html_node/Shell-Builtin-Commands.html\n const SHELL_BUILT_INS = [\n \"break\",\n \"cd\",\n \"continue\",\n \"eval\",\n \"exec\",\n \"exit\",\n \"export\",\n \"getopts\",\n \"hash\",\n \"pwd\",\n \"readonly\",\n \"return\",\n \"shift\",\n \"test\",\n \"times\",\n \"trap\",\n \"umask\",\n \"unset\"\n ];\n\n const BASH_BUILT_INS = [\n \"alias\",\n \"bind\",\n \"builtin\",\n \"caller\",\n \"command\",\n \"declare\",\n \"echo\",\n \"enable\",\n \"help\",\n \"let\",\n \"local\",\n \"logout\",\n \"mapfile\",\n \"printf\",\n \"read\",\n \"readarray\",\n \"source\",\n \"sudo\",\n \"type\",\n \"typeset\",\n \"ulimit\",\n \"unalias\"\n ];\n\n const ZSH_BUILT_INS = [\n \"autoload\",\n \"bg\",\n \"bindkey\",\n \"bye\",\n \"cap\",\n \"chdir\",\n \"clone\",\n \"comparguments\",\n \"compcall\",\n \"compctl\",\n \"compdescribe\",\n \"compfiles\",\n \"compgroups\",\n \"compquote\",\n \"comptags\",\n \"comptry\",\n \"compvalues\",\n \"dirs\",\n \"disable\",\n \"disown\",\n \"echotc\",\n \"echoti\",\n \"emulate\",\n \"fc\",\n \"fg\",\n \"float\",\n \"functions\",\n \"getcap\",\n \"getln\",\n \"history\",\n \"integer\",\n \"jobs\",\n \"kill\",\n \"limit\",\n \"log\",\n \"noglob\",\n \"popd\",\n \"print\",\n \"pushd\",\n \"pushln\",\n \"rehash\",\n \"sched\",\n \"setcap\",\n \"setopt\",\n \"stat\",\n \"suspend\",\n \"ttyctl\",\n \"unfunction\",\n \"unhash\",\n \"unlimit\",\n \"unsetopt\",\n \"vared\",\n \"wait\",\n \"whence\",\n \"where\",\n \"which\",\n \"zcompile\",\n \"zformat\",\n \"zftp\",\n \"zle\",\n \"zmodload\",\n \"zparseopts\",\n \"zprof\",\n \"zpty\",\n \"zregexparse\",\n \"zsocket\",\n \"zstyle\",\n \"ztcp\"\n ];\n\n const GNU_CORE_UTILS = [\n \"chcon\",\n \"chgrp\",\n \"chown\",\n \"chmod\",\n \"cp\",\n \"dd\",\n \"df\",\n \"dir\",\n \"dircolors\",\n \"ln\",\n \"ls\",\n \"mkdir\",\n \"mkfifo\",\n \"mknod\",\n \"mktemp\",\n \"mv\",\n \"realpath\",\n \"rm\",\n \"rmdir\",\n \"shred\",\n \"sync\",\n \"touch\",\n \"truncate\",\n \"vdir\",\n \"b2sum\",\n \"base32\",\n \"base64\",\n \"cat\",\n \"cksum\",\n \"comm\",\n \"csplit\",\n \"cut\",\n \"expand\",\n \"fmt\",\n \"fold\",\n \"head\",\n \"join\",\n \"md5sum\",\n \"nl\",\n \"numfmt\",\n \"od\",\n \"paste\",\n \"ptx\",\n \"pr\",\n \"sha1sum\",\n \"sha224sum\",\n \"sha256sum\",\n \"sha384sum\",\n \"sha512sum\",\n \"shuf\",\n \"sort\",\n \"split\",\n \"sum\",\n \"tac\",\n \"tail\",\n \"tr\",\n \"tsort\",\n \"unexpand\",\n \"uniq\",\n \"wc\",\n \"arch\",\n \"basename\",\n \"chroot\",\n \"date\",\n \"dirname\",\n \"du\",\n \"echo\",\n \"env\",\n \"expr\",\n \"factor\",\n // \"false\", // keyword literal already\n \"groups\",\n \"hostid\",\n \"id\",\n \"link\",\n \"logname\",\n \"nice\",\n \"nohup\",\n \"nproc\",\n \"pathchk\",\n \"pinky\",\n \"printenv\",\n \"printf\",\n \"pwd\",\n \"readlink\",\n \"runcon\",\n \"seq\",\n \"sleep\",\n \"stat\",\n \"stdbuf\",\n \"stty\",\n \"tee\",\n \"test\",\n \"timeout\",\n // \"true\", // keyword literal already\n \"tty\",\n \"uname\",\n \"unlink\",\n \"uptime\",\n \"users\",\n \"who\",\n \"whoami\",\n \"yes\"\n ];\n\n return {\n name: 'Bash',\n aliases: [\n 'sh',\n 'zsh'\n ],\n keywords: {\n $pattern: /\\b[a-z][a-z0-9._-]+\\b/,\n keyword: KEYWORDS,\n literal: LITERALS,\n built_in: [\n ...SHELL_BUILT_INS,\n ...BASH_BUILT_INS,\n // Shell modifiers\n \"set\",\n \"shopt\",\n ...ZSH_BUILT_INS,\n ...GNU_CORE_UTILS\n ]\n },\n contains: [\n KNOWN_SHEBANG, // to catch known shells and boost relevancy\n hljs.SHEBANG(), // to catch unknown shells but still highlight the shebang\n FUNCTION,\n ARITHMETIC,\n COMMENT,\n HERE_DOC,\n PATH_MODE,\n QUOTE_STRING,\n ESCAPED_QUOTE,\n APOS_STRING,\n ESCAPED_APOS,\n VAR\n ]\n };\n}\n\nexport { bash as default };\n", "/*\nLanguage: YAML\nDescription: Yet Another Markdown Language\nAuthor: Stefan Wienert <stwienert@gmail.com>\nContributors: Carl Baxter <carl@cbax.tech>\nRequires: ruby.js\nWebsite: https://yaml.org\nCategory: common, config\n*/\nfunction yaml(hljs) {\n const LITERALS = 'true false yes no null';\n\n // YAML spec allows non-reserved URI characters in tags.\n const URI_CHARACTERS = '[\\\\w#;/?:@&=+$,.~*\\'()[\\\\]]+';\n\n // Define keys as starting with a word character\n // ...containing word chars, spaces, colons, forward-slashes, hyphens and periods\n // ...and ending with a colon followed immediately by a space, tab or newline.\n // The YAML spec allows for much more than this, but this covers most use-cases.\n const KEY = {\n className: 'attr',\n variants: [\n // added brackets support and special char support\n { begin: /[\\w*@][\\w*@ :()\\./-]*:(?=[ \\t]|$)/ },\n { // double quoted keys - with brackets and special char support\n begin: /\"[\\w*@][\\w*@ :()\\./-]*\":(?=[ \\t]|$)/ },\n { // single quoted keys - with brackets and special char support\n begin: /'[\\w*@][\\w*@ :()\\./-]*':(?=[ \\t]|$)/ },\n ]\n };\n \n const TEMPLATE_VARIABLES = {\n className: 'template-variable',\n variants: [\n { // jinja templates Ansible\n begin: /\\{\\{/,\n end: /\\}\\}/\n },\n { // Ruby i18n\n begin: /%\\{/,\n end: /\\}/\n }\n ]\n };\n\n const SINGLE_QUOTE_STRING = {\n className: 'string',\n relevance: 0,\n begin: /'/,\n end: /'/,\n contains: [\n {\n match: /''/,\n scope: 'char.escape',\n relevance: 0\n }\n ]\n };\n\n const STRING = {\n className: 'string',\n relevance: 0,\n variants: [\n {\n begin: /\"/,\n end: /\"/\n },\n { begin: /\\S+/ }\n ],\n contains: [\n hljs.BACKSLASH_ESCAPE,\n TEMPLATE_VARIABLES\n ]\n };\n\n // Strings inside of value containers (objects) can't contain braces,\n // brackets, or commas\n const CONTAINER_STRING = hljs.inherit(STRING, { variants: [\n {\n begin: /'/,\n end: /'/,\n contains: [\n {\n begin: /''/,\n relevance: 0\n }\n ]\n },\n {\n begin: /\"/,\n end: /\"/\n },\n { begin: /[^\\s,{}[\\]]+/ }\n ] });\n\n const DATE_RE = '[0-9]{4}(-[0-9][0-9]){0,2}';\n const TIME_RE = '([Tt \\\\t][0-9][0-9]?(:[0-9][0-9]){2})?';\n const FRACTION_RE = '(\\\\.[0-9]*)?';\n const ZONE_RE = '([ \\\\t])*(Z|[-+][0-9][0-9]?(:[0-9][0-9])?)?';\n const TIMESTAMP = {\n className: 'number',\n begin: '\\\\b' + DATE_RE + TIME_RE + FRACTION_RE + ZONE_RE + '\\\\b'\n };\n\n const VALUE_CONTAINER = {\n end: ',',\n endsWithParent: true,\n excludeEnd: true,\n keywords: LITERALS,\n relevance: 0\n };\n const OBJECT = {\n begin: /\\{/,\n end: /\\}/,\n contains: [ VALUE_CONTAINER ],\n illegal: '\\\\n',\n relevance: 0\n };\n const ARRAY = {\n begin: '\\\\[',\n end: '\\\\]',\n contains: [ VALUE_CONTAINER ],\n illegal: '\\\\n',\n relevance: 0\n };\n\n const MODES = [\n KEY,\n {\n className: 'meta',\n begin: '^---\\\\s*$',\n relevance: 10\n },\n { // multi line string\n // Blocks start with a | or > followed by a newline\n //\n // Indentation of subsequent lines must be the same to\n // be considered part of the block\n className: 'string',\n begin: '[\\\\|>]([1-9]?[+-])?[ ]*\\\\n( +)[^ ][^\\\\n]*\\\\n(\\\\2[^\\\\n]+\\\\n?)*'\n },\n { // Ruby/Rails erb\n begin: '<%[%=-]?',\n end: '[%-]?%>',\n subLanguage: 'ruby',\n excludeBegin: true,\n excludeEnd: true,\n relevance: 0\n },\n { // named tags\n className: 'type',\n begin: '!\\\\w+!' + URI_CHARACTERS\n },\n // https://yaml.org/spec/1.2/spec.html#id2784064\n { // verbatim tags\n className: 'type',\n begin: '!<' + URI_CHARACTERS + \">\"\n },\n { // primary tags\n className: 'type',\n begin: '!' + URI_CHARACTERS\n },\n { // secondary tags\n className: 'type',\n begin: '!!' + URI_CHARACTERS\n },\n { // fragment id &ref\n className: 'meta',\n begin: '&' + hljs.UNDERSCORE_IDENT_RE + '$'\n },\n { // fragment reference *ref\n className: 'meta',\n begin: '\\\\*' + hljs.UNDERSCORE_IDENT_RE + '$'\n },\n { // array listing\n className: 'bullet',\n // TODO: remove |$ hack when we have proper look-ahead support\n begin: '-(?=[ ]|$)',\n relevance: 0\n },\n hljs.HASH_COMMENT_MODE,\n {\n beginKeywords: LITERALS,\n keywords: { literal: LITERALS }\n },\n TIMESTAMP,\n // numbers are any valid C-style number that\n // sit isolated from other words\n {\n className: 'number',\n begin: hljs.C_NUMBER_RE + '\\\\b',\n relevance: 0\n },\n OBJECT,\n ARRAY,\n SINGLE_QUOTE_STRING,\n STRING\n ];\n\n const VALUE_MODES = [ ...MODES ];\n VALUE_MODES.pop();\n VALUE_MODES.push(CONTAINER_STRING);\n VALUE_CONTAINER.contains = VALUE_MODES;\n\n return {\n name: 'YAML',\n case_insensitive: true,\n aliases: [ 'yml' ],\n contains: MODES\n };\n}\n\nexport { yaml as default };\n", "/*\nLanguage: JSON\nDescription: JSON (JavaScript Object Notation) is a lightweight data-interchange format.\nAuthor: Ivan Sagalaev <maniac@softwaremaniacs.org>\nWebsite: http://www.json.org\nCategory: common, protocols, web\n*/\n\nfunction json(hljs) {\n const ATTRIBUTE = {\n className: 'attr',\n begin: /\"(\\\\.|[^\\\\\"\\r\\n])*\"(?=\\s*:)/,\n relevance: 1.01\n };\n const PUNCTUATION = {\n match: /[{}[\\],:]/,\n className: \"punctuation\",\n relevance: 0\n };\n const LITERALS = [\n \"true\",\n \"false\",\n \"null\"\n ];\n // NOTE: normally we would rely on `keywords` for this but using a mode here allows us\n // - to use the very tight `illegal: \\S` rule later to flag any other character\n // - as illegal indicating that despite looking like JSON we do not truly have\n // - JSON and thus improve false-positively greatly since JSON will try and claim\n // - all sorts of JSON looking stuff\n const LITERALS_MODE = {\n scope: \"literal\",\n beginKeywords: LITERALS.join(\" \"),\n };\n\n return {\n name: 'JSON',\n aliases: ['jsonc'],\n keywords:{\n literal: LITERALS,\n },\n contains: [\n ATTRIBUTE,\n PUNCTUATION,\n hljs.QUOTE_STRING_MODE,\n LITERALS_MODE,\n hljs.C_NUMBER_MODE,\n hljs.C_LINE_COMMENT_MODE,\n hljs.C_BLOCK_COMMENT_MODE\n ],\n illegal: '\\\\S'\n };\n}\n\nexport { json as default };\n", "// https://docs.oracle.com/javase/specs/jls/se15/html/jls-3.html#jls-3.10\nvar decimalDigits = '[0-9](_*[0-9])*';\nvar frac = `\\\\.(${decimalDigits})`;\nvar hexDigits = '[0-9a-fA-F](_*[0-9a-fA-F])*';\nvar NUMERIC = {\n className: 'number',\n variants: [\n // DecimalFloatingPointLiteral\n // including ExponentPart\n { begin: `(\\\\b(${decimalDigits})((${frac})|\\\\.)?|(${frac}))` +\n `[eE][+-]?(${decimalDigits})[fFdD]?\\\\b` },\n // excluding ExponentPart\n { begin: `\\\\b(${decimalDigits})((${frac})[fFdD]?\\\\b|\\\\.([fFdD]\\\\b)?)` },\n { begin: `(${frac})[fFdD]?\\\\b` },\n { begin: `\\\\b(${decimalDigits})[fFdD]\\\\b` },\n\n // HexadecimalFloatingPointLiteral\n { begin: `\\\\b0[xX]((${hexDigits})\\\\.?|(${hexDigits})?\\\\.(${hexDigits}))` +\n `[pP][+-]?(${decimalDigits})[fFdD]?\\\\b` },\n\n // DecimalIntegerLiteral\n { begin: '\\\\b(0|[1-9](_*[0-9])*)[lL]?\\\\b' },\n\n // HexIntegerLiteral\n { begin: `\\\\b0[xX](${hexDigits})[lL]?\\\\b` },\n\n // OctalIntegerLiteral\n { begin: '\\\\b0(_*[0-7])*[lL]?\\\\b' },\n\n // BinaryIntegerLiteral\n { begin: '\\\\b0[bB][01](_*[01])*[lL]?\\\\b' },\n ],\n relevance: 0\n};\n\n/*\nLanguage: Java\nAuthor: Vsevolod Solovyov <vsevolod.solovyov@gmail.com>\nCategory: common, enterprise\nWebsite: https://www.java.com/\n*/\n\n\n/**\n * Allows recursive regex expressions to a given depth\n *\n * ie: recurRegex(\"(abc~~~)\", /~~~/g, 2) becomes:\n * (abc(abc(abc)))\n *\n * @param {string} re\n * @param {RegExp} substitution (should be a g mode regex)\n * @param {number} depth\n * @returns {string}``\n */\nfunction recurRegex(re, substitution, depth) {\n if (depth === -1) return \"\";\n\n return re.replace(substitution, _ => {\n return recurRegex(re, substitution, depth - 1);\n });\n}\n\n/** @type LanguageFn */\nfunction java(hljs) {\n const regex = hljs.regex;\n const JAVA_IDENT_RE = '[\\u00C0-\\u02B8a-zA-Z_$][\\u00C0-\\u02B8a-zA-Z_$0-9]*';\n const GENERIC_IDENT_RE = JAVA_IDENT_RE\n + recurRegex('(?:<' + JAVA_IDENT_RE + '~~~(?:\\\\s*,\\\\s*' + JAVA_IDENT_RE + '~~~)*>)?', /~~~/g, 2);\n const MAIN_KEYWORDS = [\n 'synchronized',\n 'abstract',\n 'private',\n 'var',\n 'static',\n 'if',\n 'const ',\n 'for',\n 'while',\n 'strictfp',\n 'finally',\n 'protected',\n 'import',\n 'native',\n 'final',\n 'void',\n 'enum',\n 'else',\n 'break',\n 'transient',\n 'catch',\n 'instanceof',\n 'volatile',\n 'case',\n 'assert',\n 'package',\n 'default',\n 'public',\n 'try',\n 'switch',\n 'continue',\n 'throws',\n 'protected',\n 'public',\n 'private',\n 'module',\n 'requires',\n 'exports',\n 'do',\n 'sealed',\n 'yield',\n 'permits',\n 'goto',\n 'when'\n ];\n\n const BUILT_INS = [\n 'super',\n 'this'\n ];\n\n const LITERALS = [\n 'false',\n 'true',\n 'null'\n ];\n\n const TYPES = [\n 'char',\n 'boolean',\n 'long',\n 'float',\n 'int',\n 'byte',\n 'short',\n 'double'\n ];\n\n const KEYWORDS = {\n keyword: MAIN_KEYWORDS,\n literal: LITERALS,\n type: TYPES,\n built_in: BUILT_INS\n };\n\n const ANNOTATION = {\n className: 'meta',\n begin: '@' + JAVA_IDENT_RE,\n contains: [\n {\n begin: /\\(/,\n end: /\\)/,\n contains: [ \"self\" ] // allow nested () inside our annotation\n }\n ]\n };\n const PARAMS = {\n className: 'params',\n begin: /\\(/,\n end: /\\)/,\n keywords: KEYWORDS,\n relevance: 0,\n contains: [ hljs.C_BLOCK_COMMENT_MODE ],\n endsParent: true\n };\n\n return {\n name: 'Java',\n aliases: [ 'jsp' ],\n keywords: KEYWORDS,\n illegal: /<\\/|#/,\n contains: [\n hljs.COMMENT(\n '/\\\\*\\\\*',\n '\\\\*/',\n {\n relevance: 0,\n contains: [\n {\n // eat up @'s in emails to prevent them to be recognized as doctags\n begin: /\\w+@/,\n relevance: 0\n },\n {\n className: 'doctag',\n begin: '@[A-Za-z]+'\n }\n ]\n }\n ),\n // relevance boost\n {\n begin: /import java\\.[a-z]+\\./,\n keywords: \"import\",\n relevance: 2\n },\n hljs.C_LINE_COMMENT_MODE,\n hljs.C_BLOCK_COMMENT_MODE,\n {\n begin: /\"\"\"/,\n end: /\"\"\"/,\n className: \"string\",\n contains: [ hljs.BACKSLASH_ESCAPE ]\n },\n hljs.APOS_STRING_MODE,\n hljs.QUOTE_STRING_MODE,\n {\n match: [\n /\\b(?:class|interface|enum|extends|implements|new)/,\n /\\s+/,\n JAVA_IDENT_RE\n ],\n className: {\n 1: \"keyword\",\n 3: \"title.class\"\n }\n },\n {\n // Exceptions for hyphenated keywords\n match: /non-sealed/,\n scope: \"keyword\"\n },\n {\n begin: [\n regex.concat(/(?!else)/, JAVA_IDENT_RE),\n /\\s+/,\n JAVA_IDENT_RE,\n /\\s+/,\n /=(?!=)/\n ],\n className: {\n 1: \"type\",\n 3: \"variable\",\n 5: \"operator\"\n }\n },\n {\n begin: [\n /record/,\n /\\s+/,\n JAVA_IDENT_RE\n ],\n className: {\n 1: \"keyword\",\n 3: \"title.class\"\n },\n contains: [\n PARAMS,\n hljs.C_LINE_COMMENT_MODE,\n hljs.C_BLOCK_COMMENT_MODE\n ]\n },\n {\n // Expression keywords prevent 'keyword Name(...)' from being\n // recognized as a function definition\n beginKeywords: 'new throw return else',\n relevance: 0\n },\n {\n begin: [\n '(?:' + GENERIC_IDENT_RE + '\\\\s+)',\n hljs.UNDERSCORE_IDENT_RE,\n /\\s*(?=\\()/\n ],\n className: { 2: \"title.function\" },\n keywords: KEYWORDS,\n contains: [\n {\n className: 'params',\n begin: /\\(/,\n end: /\\)/,\n keywords: KEYWORDS,\n relevance: 0,\n contains: [\n ANNOTATION,\n hljs.APOS_STRING_MODE,\n hljs.QUOTE_STRING_MODE,\n NUMERIC,\n hljs.C_BLOCK_COMMENT_MODE\n ]\n },\n hljs.C_LINE_COMMENT_MODE,\n hljs.C_BLOCK_COMMENT_MODE\n ]\n },\n NUMERIC,\n ANNOTATION\n ]\n };\n}\n\nexport { java as default };\n", "/*\nLanguage: Go\nAuthor: Stephan Kountso aka StepLg <steplg@gmail.com>\nContributors: Evgeny Stepanischev <imbolk@gmail.com>\nDescription: Google go language (golang). For info about language\nWebsite: http://golang.org/\nCategory: common, system\n*/\n\nfunction go(hljs) {\n const LITERALS = [\n \"true\",\n \"false\",\n \"iota\",\n \"nil\"\n ];\n const BUILT_INS = [\n \"append\",\n \"cap\",\n \"close\",\n \"complex\",\n \"copy\",\n \"imag\",\n \"len\",\n \"make\",\n \"new\",\n \"panic\",\n \"print\",\n \"println\",\n \"real\",\n \"recover\",\n \"delete\"\n ];\n const TYPES = [\n \"bool\",\n \"byte\",\n \"complex64\",\n \"complex128\",\n \"error\",\n \"float32\",\n \"float64\",\n \"int8\",\n \"int16\",\n \"int32\",\n \"int64\",\n \"string\",\n \"uint8\",\n \"uint16\",\n \"uint32\",\n \"uint64\",\n \"int\",\n \"uint\",\n \"uintptr\",\n \"rune\"\n ];\n const KWS = [\n \"break\",\n \"case\",\n \"chan\",\n \"const\",\n \"continue\",\n \"default\",\n \"defer\",\n \"else\",\n \"fallthrough\",\n \"for\",\n \"func\",\n \"go\",\n \"goto\",\n \"if\",\n \"import\",\n \"interface\",\n \"map\",\n \"package\",\n \"range\",\n \"return\",\n \"select\",\n \"struct\",\n \"switch\",\n \"type\",\n \"var\",\n ];\n const KEYWORDS = {\n keyword: KWS,\n type: TYPES,\n literal: LITERALS,\n built_in: BUILT_INS\n };\n return {\n name: 'Go',\n aliases: [ 'golang' ],\n keywords: KEYWORDS,\n illegal: '</',\n contains: [\n hljs.C_LINE_COMMENT_MODE,\n hljs.C_BLOCK_COMMENT_MODE,\n {\n className: 'string',\n variants: [\n hljs.QUOTE_STRING_MODE,\n hljs.APOS_STRING_MODE,\n {\n begin: '`',\n end: '`'\n }\n ]\n },\n {\n className: 'number',\n variants: [\n {\n match: /-?\\b0[xX]\\.[a-fA-F0-9](_?[a-fA-F0-9])*[pP][+-]?\\d(_?\\d)*i?/, // hex without a present digit before . (making a digit afterwards required)\n relevance: 0\n },\n {\n match: /-?\\b0[xX](_?[a-fA-F0-9])+((\\.([a-fA-F0-9](_?[a-fA-F0-9])*)?)?[pP][+-]?\\d(_?\\d)*)?i?/, // hex with a present digit before . (making a digit afterwards optional)\n relevance: 0\n },\n {\n match: /-?\\b0[oO](_?[0-7])*i?/, // leading 0o octal\n relevance: 0\n },\n {\n match: /-?\\.\\d(_?\\d)*([eE][+-]?\\d(_?\\d)*)?i?/, // decimal without a present digit before . (making a digit afterwards required)\n relevance: 0\n },\n {\n match: /-?\\b\\d(_?\\d)*(\\.(\\d(_?\\d)*)?)?([eE][+-]?\\d(_?\\d)*)?i?/, // decimal with a present digit before . (making a digit afterwards optional)\n relevance: 0\n }\n ]\n },\n { begin: /:=/ // relevance booster\n },\n {\n className: 'function',\n beginKeywords: 'func',\n end: '\\\\s*(\\\\{|$)',\n excludeEnd: true,\n contains: [\n hljs.TITLE_MODE,\n {\n className: 'params',\n begin: /\\(/,\n end: /\\)/,\n endsParent: true,\n keywords: KEYWORDS,\n illegal: /[\"']/\n }\n ]\n }\n ]\n };\n}\n\nexport { go as default };\n", "/*\nLanguage: Rust\nAuthor: Andrey Vlasovskikh <andrey.vlasovskikh@gmail.com>\nContributors: Roman Shmatov <romanshmatov@gmail.com>, Kasper Andersen <kma_untrusted@protonmail.com>\nWebsite: https://www.rust-lang.org\nCategory: common, system\n*/\n\n/** @type LanguageFn */\n\nfunction rust(hljs) {\n const regex = hljs.regex;\n // ============================================\n // Added to support the r# keyword, which is a raw identifier in Rust.\n const RAW_IDENTIFIER = /(r#)?/;\n const UNDERSCORE_IDENT_RE = regex.concat(RAW_IDENTIFIER, hljs.UNDERSCORE_IDENT_RE);\n const IDENT_RE = regex.concat(RAW_IDENTIFIER, hljs.IDENT_RE);\n // ============================================\n const FUNCTION_INVOKE = {\n className: \"title.function.invoke\",\n relevance: 0,\n begin: regex.concat(\n /\\b/,\n /(?!let|for|while|if|else|match\\b)/,\n IDENT_RE,\n regex.lookahead(/\\s*\\(/))\n };\n const NUMBER_SUFFIX = '([ui](8|16|32|64|128|size)|f(32|64))\\?';\n const KEYWORDS = [\n \"abstract\",\n \"as\",\n \"async\",\n \"await\",\n \"become\",\n \"box\",\n \"break\",\n \"const\",\n \"continue\",\n \"crate\",\n \"do\",\n \"dyn\",\n \"else\",\n \"enum\",\n \"extern\",\n \"false\",\n \"final\",\n \"fn\",\n \"for\",\n \"if\",\n \"impl\",\n \"in\",\n \"let\",\n \"loop\",\n \"macro\",\n \"match\",\n \"mod\",\n \"move\",\n \"mut\",\n \"override\",\n \"priv\",\n \"pub\",\n \"ref\",\n \"return\",\n \"self\",\n \"Self\",\n \"static\",\n \"struct\",\n \"super\",\n \"trait\",\n \"true\",\n \"try\",\n \"type\",\n \"typeof\",\n \"union\",\n \"unsafe\",\n \"unsized\",\n \"use\",\n \"virtual\",\n \"where\",\n \"while\",\n \"yield\"\n ];\n const LITERALS = [\n \"true\",\n \"false\",\n \"Some\",\n \"None\",\n \"Ok\",\n \"Err\"\n ];\n const BUILTINS = [\n // functions\n 'drop ',\n // traits\n \"Copy\",\n \"Send\",\n \"Sized\",\n \"Sync\",\n \"Drop\",\n \"Fn\",\n \"FnMut\",\n \"FnOnce\",\n \"ToOwned\",\n \"Clone\",\n \"Debug\",\n \"PartialEq\",\n \"PartialOrd\",\n \"Eq\",\n \"Ord\",\n \"AsRef\",\n \"AsMut\",\n \"Into\",\n \"From\",\n \"Default\",\n \"Iterator\",\n \"Extend\",\n \"IntoIterator\",\n \"DoubleEndedIterator\",\n \"ExactSizeIterator\",\n \"SliceConcatExt\",\n \"ToString\",\n // macros\n \"assert!\",\n \"assert_eq!\",\n \"bitflags!\",\n \"bytes!\",\n \"cfg!\",\n \"col!\",\n \"concat!\",\n \"concat_idents!\",\n \"debug_assert!\",\n \"debug_assert_eq!\",\n \"env!\",\n \"eprintln!\",\n \"panic!\",\n \"file!\",\n \"format!\",\n \"format_args!\",\n \"include_bytes!\",\n \"include_str!\",\n \"line!\",\n \"local_data_key!\",\n \"module_path!\",\n \"option_env!\",\n \"print!\",\n \"println!\",\n \"select!\",\n \"stringify!\",\n \"try!\",\n \"unimplemented!\",\n \"unreachable!\",\n \"vec!\",\n \"write!\",\n \"writeln!\",\n \"macro_rules!\",\n \"assert_ne!\",\n \"debug_assert_ne!\"\n ];\n const TYPES = [\n \"i8\",\n \"i16\",\n \"i32\",\n \"i64\",\n \"i128\",\n \"isize\",\n \"u8\",\n \"u16\",\n \"u32\",\n \"u64\",\n \"u128\",\n \"usize\",\n \"f32\",\n \"f64\",\n \"str\",\n \"char\",\n \"bool\",\n \"Box\",\n \"Option\",\n \"Result\",\n \"String\",\n \"Vec\"\n ];\n return {\n name: 'Rust',\n aliases: [ 'rs' ],\n keywords: {\n $pattern: hljs.IDENT_RE + '!?',\n type: TYPES,\n keyword: KEYWORDS,\n literal: LITERALS,\n built_in: BUILTINS\n },\n illegal: '</',\n contains: [\n hljs.C_LINE_COMMENT_MODE,\n hljs.COMMENT('/\\\\*', '\\\\*/', { contains: [ 'self' ] }),\n hljs.inherit(hljs.QUOTE_STRING_MODE, {\n begin: /b?\"/,\n illegal: null\n }),\n {\n className: 'symbol',\n // negative lookahead to avoid matching `'`\n begin: /'[a-zA-Z_][a-zA-Z0-9_]*(?!')/\n },\n {\n scope: 'string',\n variants: [\n { begin: /b?r(#*)\"(.|\\n)*?\"\\1(?!#)/ },\n {\n begin: /b?'/,\n end: /'/,\n contains: [\n {\n scope: \"char.escape\",\n match: /\\\\('|\\w|x\\w{2}|u\\w{4}|U\\w{8})/\n }\n ]\n }\n ]\n },\n {\n className: 'number',\n variants: [\n { begin: '\\\\b0b([01_]+)' + NUMBER_SUFFIX },\n { begin: '\\\\b0o([0-7_]+)' + NUMBER_SUFFIX },\n { begin: '\\\\b0x([A-Fa-f0-9_]+)' + NUMBER_SUFFIX },\n { begin: '\\\\b(\\\\d[\\\\d_]*(\\\\.[0-9_]+)?([eE][+-]?[0-9_]+)?)'\n + NUMBER_SUFFIX }\n ],\n relevance: 0\n },\n {\n begin: [\n /fn/,\n /\\s+/,\n UNDERSCORE_IDENT_RE\n ],\n className: {\n 1: \"keyword\",\n 3: \"title.function\"\n }\n },\n {\n className: 'meta',\n begin: '#!?\\\\[',\n end: '\\\\]',\n contains: [\n {\n className: 'string',\n begin: /\"/,\n end: /\"/,\n contains: [\n hljs.BACKSLASH_ESCAPE\n ]\n }\n ]\n },\n {\n begin: [\n /let/,\n /\\s+/,\n /(?:mut\\s+)?/,\n UNDERSCORE_IDENT_RE\n ],\n className: {\n 1: \"keyword\",\n 3: \"keyword\",\n 4: \"variable\"\n }\n },\n // must come before impl/for rule later\n {\n begin: [\n /for/,\n /\\s+/,\n UNDERSCORE_IDENT_RE,\n /\\s+/,\n /in/\n ],\n className: {\n 1: \"keyword\",\n 3: \"variable\",\n 5: \"keyword\"\n }\n },\n {\n begin: [\n /type/,\n /\\s+/,\n UNDERSCORE_IDENT_RE\n ],\n className: {\n 1: \"keyword\",\n 3: \"title.class\"\n }\n },\n {\n begin: [\n /(?:trait|enum|struct|union|impl|for)/,\n /\\s+/,\n UNDERSCORE_IDENT_RE\n ],\n className: {\n 1: \"keyword\",\n 3: \"title.class\"\n }\n },\n {\n begin: hljs.IDENT_RE + '::',\n keywords: {\n keyword: \"Self\",\n built_in: BUILTINS,\n type: TYPES\n }\n },\n {\n className: \"punctuation\",\n begin: '->'\n },\n FUNCTION_INVOKE\n ]\n };\n}\n\nexport { rust as default };\n", "/*\nLanguage: HTML, XML\nWebsite: https://www.w3.org/XML/\nCategory: common, web\nAudit: 2020\n*/\n\n/** @type LanguageFn */\nfunction xml(hljs) {\n const regex = hljs.regex;\n // XML names can have the following additional letters: https://www.w3.org/TR/xml/#NT-NameChar\n // OTHER_NAME_CHARS = /[:\\-.0-9\\u00B7\\u0300-\\u036F\\u203F-\\u2040]/;\n // Element names start with NAME_START_CHAR followed by optional other Unicode letters, ASCII digits, hyphens, underscores, and periods\n // const TAG_NAME_RE = regex.concat(/[A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD]/, regex.optional(/[A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD\\-.0-9\\u00B7\\u0300-\\u036F\\u203F-\\u2040]*:/), /[A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD\\-.0-9\\u00B7\\u0300-\\u036F\\u203F-\\u2040]*/);;\n // const XML_IDENT_RE = /[A-Z_a-z:\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD\\-.0-9\\u00B7\\u0300-\\u036F\\u203F-\\u2040]+/;\n // const TAG_NAME_RE = regex.concat(/[A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD]/, regex.optional(/[A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD\\-.0-9\\u00B7\\u0300-\\u036F\\u203F-\\u2040]*:/), /[A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD\\-.0-9\\u00B7\\u0300-\\u036F\\u203F-\\u2040]*/);\n // however, to cater for performance and more Unicode support rely simply on the Unicode letter class\n const TAG_NAME_RE = regex.concat(/[\\p{L}_]/u, regex.optional(/[\\p{L}0-9_.-]*:/u), /[\\p{L}0-9_.-]*/u);\n const XML_IDENT_RE = /[\\p{L}0-9._:-]+/u;\n const XML_ENTITIES = {\n className: 'symbol',\n begin: /&[a-z]+;|&#[0-9]+;|&#x[a-f0-9]+;/\n };\n const XML_META_KEYWORDS = {\n begin: /\\s/,\n contains: [\n {\n className: 'keyword',\n begin: /#?[a-z_][a-z1-9_-]+/,\n illegal: /\\n/\n }\n ]\n };\n const XML_META_PAR_KEYWORDS = hljs.inherit(XML_META_KEYWORDS, {\n begin: /\\(/,\n end: /\\)/\n });\n const APOS_META_STRING_MODE = hljs.inherit(hljs.APOS_STRING_MODE, { className: 'string' });\n const QUOTE_META_STRING_MODE = hljs.inherit(hljs.QUOTE_STRING_MODE, { className: 'string' });\n const TAG_INTERNALS = {\n endsWithParent: true,\n illegal: /</,\n relevance: 0,\n contains: [\n {\n className: 'attr',\n begin: XML_IDENT_RE,\n relevance: 0\n },\n {\n begin: /=\\s*/,\n relevance: 0,\n contains: [\n {\n className: 'string',\n endsParent: true,\n variants: [\n {\n begin: /\"/,\n end: /\"/,\n contains: [ XML_ENTITIES ]\n },\n {\n begin: /'/,\n end: /'/,\n contains: [ XML_ENTITIES ]\n },\n { begin: /[^\\s\"'=<>`]+/ }\n ]\n }\n ]\n }\n ]\n };\n return {\n name: 'HTML, XML',\n aliases: [\n 'html',\n 'xhtml',\n 'rss',\n 'atom',\n 'xjb',\n 'xsd',\n 'xsl',\n 'plist',\n 'wsf',\n 'svg'\n ],\n case_insensitive: true,\n unicodeRegex: true,\n contains: [\n {\n className: 'meta',\n begin: /<![a-z]/,\n end: />/,\n relevance: 10,\n contains: [\n XML_META_KEYWORDS,\n QUOTE_META_STRING_MODE,\n APOS_META_STRING_MODE,\n XML_META_PAR_KEYWORDS,\n {\n begin: /\\[/,\n end: /\\]/,\n contains: [\n {\n className: 'meta',\n begin: /<![a-z]/,\n end: />/,\n contains: [\n XML_META_KEYWORDS,\n XML_META_PAR_KEYWORDS,\n QUOTE_META_STRING_MODE,\n APOS_META_STRING_MODE\n ]\n }\n ]\n }\n ]\n },\n hljs.COMMENT(\n /<!--/,\n /-->/,\n { relevance: 10 }\n ),\n {\n begin: /<!\\[CDATA\\[/,\n end: /\\]\\]>/,\n relevance: 10\n },\n XML_ENTITIES,\n // xml processing instructions\n {\n className: 'meta',\n end: /\\?>/,\n variants: [\n {\n begin: /<\\?xml/,\n relevance: 10,\n contains: [\n QUOTE_META_STRING_MODE\n ]\n },\n {\n begin: /<\\?[a-z][a-z0-9]+/,\n }\n ]\n\n },\n {\n className: 'tag',\n /*\n The lookahead pattern (?=...) ensures that 'begin' only matches\n '<style' as a single word, followed by a whitespace or an\n ending bracket.\n */\n begin: /<style(?=\\s|>)/,\n end: />/,\n keywords: { name: 'style' },\n contains: [ TAG_INTERNALS ],\n starts: {\n end: /<\\/style>/,\n returnEnd: true,\n subLanguage: [\n 'css',\n 'xml'\n ]\n }\n },\n {\n className: 'tag',\n // See the comment in the <style tag about the lookahead pattern\n begin: /<script(?=\\s|>)/,\n end: />/,\n keywords: { name: 'script' },\n contains: [ TAG_INTERNALS ],\n starts: {\n end: /<\\/script>/,\n returnEnd: true,\n subLanguage: [\n 'javascript',\n 'handlebars',\n 'xml'\n ]\n }\n },\n // we need this for now for jSX\n {\n className: 'tag',\n begin: /<>|<\\/>/\n },\n // open tag\n {\n className: 'tag',\n begin: regex.concat(\n /</,\n regex.lookahead(regex.concat(\n TAG_NAME_RE,\n // <tag/>\n // <tag>\n // <tag ...\n regex.either(/\\/>/, />/, /\\s/)\n ))\n ),\n end: /\\/?>/,\n contains: [\n {\n className: 'name',\n begin: TAG_NAME_RE,\n relevance: 0,\n starts: TAG_INTERNALS\n }\n ]\n },\n // close tag\n {\n className: 'tag',\n begin: regex.concat(\n /<\\//,\n regex.lookahead(regex.concat(\n TAG_NAME_RE, />/\n ))\n ),\n contains: [\n {\n className: 'name',\n begin: TAG_NAME_RE,\n relevance: 0\n },\n {\n begin: />/,\n relevance: 0,\n endsParent: true\n }\n ]\n }\n ]\n };\n}\n\nexport { xml as default };\n", "const MODES = (hljs) => {\n return {\n IMPORTANT: {\n scope: 'meta',\n begin: '!important'\n },\n BLOCK_COMMENT: hljs.C_BLOCK_COMMENT_MODE,\n HEXCOLOR: {\n scope: 'number',\n begin: /#(([0-9a-fA-F]{3,4})|(([0-9a-fA-F]{2}){3,4}))\\b/\n },\n FUNCTION_DISPATCH: {\n className: \"built_in\",\n begin: /[\\w-]+(?=\\()/\n },\n ATTRIBUTE_SELECTOR_MODE: {\n scope: 'selector-attr',\n begin: /\\[/,\n end: /\\]/,\n illegal: '$',\n contains: [\n hljs.APOS_STRING_MODE,\n hljs.QUOTE_STRING_MODE\n ]\n },\n CSS_NUMBER_MODE: {\n scope: 'number',\n begin: hljs.NUMBER_RE + '(' +\n '%|em|ex|ch|rem' +\n '|vw|vh|vmin|vmax' +\n '|cm|mm|in|pt|pc|px' +\n '|deg|grad|rad|turn' +\n '|s|ms' +\n '|Hz|kHz' +\n '|dpi|dpcm|dppx' +\n ')?',\n relevance: 0\n },\n CSS_VARIABLE: {\n className: \"attr\",\n begin: /--[A-Za-z_][A-Za-z0-9_-]*/\n }\n };\n};\n\nconst HTML_TAGS = [\n 'a',\n 'abbr',\n 'address',\n 'article',\n 'aside',\n 'audio',\n 'b',\n 'blockquote',\n 'body',\n 'button',\n 'canvas',\n 'caption',\n 'cite',\n 'code',\n 'dd',\n 'del',\n 'details',\n 'dfn',\n 'div',\n 'dl',\n 'dt',\n 'em',\n 'fieldset',\n 'figcaption',\n 'figure',\n 'footer',\n 'form',\n 'h1',\n 'h2',\n 'h3',\n 'h4',\n 'h5',\n 'h6',\n 'header',\n 'hgroup',\n 'html',\n 'i',\n 'iframe',\n 'img',\n 'input',\n 'ins',\n 'kbd',\n 'label',\n 'legend',\n 'li',\n 'main',\n 'mark',\n 'menu',\n 'nav',\n 'object',\n 'ol',\n 'optgroup',\n 'option',\n 'p',\n 'picture',\n 'q',\n 'quote',\n 'samp',\n 'section',\n 'select',\n 'source',\n 'span',\n 'strong',\n 'summary',\n 'sup',\n 'table',\n 'tbody',\n 'td',\n 'textarea',\n 'tfoot',\n 'th',\n 'thead',\n 'time',\n 'tr',\n 'ul',\n 'var',\n 'video'\n];\n\nconst SVG_TAGS = [\n 'defs',\n 'g',\n 'marker',\n 'mask',\n 'pattern',\n 'svg',\n 'switch',\n 'symbol',\n 'feBlend',\n 'feColorMatrix',\n 'feComponentTransfer',\n 'feComposite',\n 'feConvolveMatrix',\n 'feDiffuseLighting',\n 'feDisplacementMap',\n 'feFlood',\n 'feGaussianBlur',\n 'feImage',\n 'feMerge',\n 'feMorphology',\n 'feOffset',\n 'feSpecularLighting',\n 'feTile',\n 'feTurbulence',\n 'linearGradient',\n 'radialGradient',\n 'stop',\n 'circle',\n 'ellipse',\n 'image',\n 'line',\n 'path',\n 'polygon',\n 'polyline',\n 'rect',\n 'text',\n 'use',\n 'textPath',\n 'tspan',\n 'foreignObject',\n 'clipPath'\n];\n\nconst TAGS = [\n ...HTML_TAGS,\n ...SVG_TAGS,\n];\n\n// Sorting, then reversing makes sure longer attributes/elements like\n// `font-weight` are matched fully instead of getting false positives on say `font`\n\nconst MEDIA_FEATURES = [\n 'any-hover',\n 'any-pointer',\n 'aspect-ratio',\n 'color',\n 'color-gamut',\n 'color-index',\n 'device-aspect-ratio',\n 'device-height',\n 'device-width',\n 'display-mode',\n 'forced-colors',\n 'grid',\n 'height',\n 'hover',\n 'inverted-colors',\n 'monochrome',\n 'orientation',\n 'overflow-block',\n 'overflow-inline',\n 'pointer',\n 'prefers-color-scheme',\n 'prefers-contrast',\n 'prefers-reduced-motion',\n 'prefers-reduced-transparency',\n 'resolution',\n 'scan',\n 'scripting',\n 'update',\n 'width',\n // TODO: find a better solution?\n 'min-width',\n 'max-width',\n 'min-height',\n 'max-height'\n].sort().reverse();\n\n// https://developer.mozilla.org/en-US/docs/Web/CSS/Pseudo-classes\nconst PSEUDO_CLASSES = [\n 'active',\n 'any-link',\n 'blank',\n 'checked',\n 'current',\n 'default',\n 'defined',\n 'dir', // dir()\n 'disabled',\n 'drop',\n 'empty',\n 'enabled',\n 'first',\n 'first-child',\n 'first-of-type',\n 'fullscreen',\n 'future',\n 'focus',\n 'focus-visible',\n 'focus-within',\n 'has', // has()\n 'host', // host or host()\n 'host-context', // host-context()\n 'hover',\n 'indeterminate',\n 'in-range',\n 'invalid',\n 'is', // is()\n 'lang', // lang()\n 'last-child',\n 'last-of-type',\n 'left',\n 'link',\n 'local-link',\n 'not', // not()\n 'nth-child', // nth-child()\n 'nth-col', // nth-col()\n 'nth-last-child', // nth-last-child()\n 'nth-last-col', // nth-last-col()\n 'nth-last-of-type', //nth-last-of-type()\n 'nth-of-type', //nth-of-type()\n 'only-child',\n 'only-of-type',\n 'optional',\n 'out-of-range',\n 'past',\n 'placeholder-shown',\n 'read-only',\n 'read-write',\n 'required',\n 'right',\n 'root',\n 'scope',\n 'target',\n 'target-within',\n 'user-invalid',\n 'valid',\n 'visited',\n 'where' // where()\n].sort().reverse();\n\n// https://developer.mozilla.org/en-US/docs/Web/CSS/Pseudo-elements\nconst PSEUDO_ELEMENTS = [\n 'after',\n 'backdrop',\n 'before',\n 'cue',\n 'cue-region',\n 'first-letter',\n 'first-line',\n 'grammar-error',\n 'marker',\n 'part',\n 'placeholder',\n 'selection',\n 'slotted',\n 'spelling-error'\n].sort().reverse();\n\nconst ATTRIBUTES = [\n 'accent-color',\n 'align-content',\n 'align-items',\n 'align-self',\n 'alignment-baseline',\n 'all',\n 'anchor-name',\n 'animation',\n 'animation-composition',\n 'animation-delay',\n 'animation-direction',\n 'animation-duration',\n 'animation-fill-mode',\n 'animation-iteration-count',\n 'animation-name',\n 'animation-play-state',\n 'animation-range',\n 'animation-range-end',\n 'animation-range-start',\n 'animation-timeline',\n 'animation-timing-function',\n 'appearance',\n 'aspect-ratio',\n 'backdrop-filter',\n 'backface-visibility',\n 'background',\n 'background-attachment',\n 'background-blend-mode',\n 'background-clip',\n 'background-color',\n 'background-image',\n 'background-origin',\n 'background-position',\n 'background-position-x',\n 'background-position-y',\n 'background-repeat',\n 'background-size',\n 'baseline-shift',\n 'block-size',\n 'border',\n 'border-block',\n 'border-block-color',\n 'border-block-end',\n 'border-block-end-color',\n 'border-block-end-style',\n 'border-block-end-width',\n 'border-block-start',\n 'border-block-start-color',\n 'border-block-start-style',\n 'border-block-start-width',\n 'border-block-style',\n 'border-block-width',\n 'border-bottom',\n 'border-bottom-color',\n 'border-bottom-left-radius',\n 'border-bottom-right-radius',\n 'border-bottom-style',\n 'border-bottom-width',\n 'border-collapse',\n 'border-color',\n 'border-end-end-radius',\n 'border-end-start-radius',\n 'border-image',\n 'border-image-outset',\n 'border-image-repeat',\n 'border-image-slice',\n 'border-image-source',\n 'border-image-width',\n 'border-inline',\n 'border-inline-color',\n 'border-inline-end',\n 'border-inline-end-color',\n 'border-inline-end-style',\n 'border-inline-end-width',\n 'border-inline-start',\n 'border-inline-start-color',\n 'border-inline-start-style',\n 'border-inline-start-width',\n 'border-inline-style',\n 'border-inline-width',\n 'border-left',\n 'border-left-color',\n 'border-left-style',\n 'border-left-width',\n 'border-radius',\n 'border-right',\n 'border-right-color',\n 'border-right-style',\n 'border-right-width',\n 'border-spacing',\n 'border-start-end-radius',\n 'border-start-start-radius',\n 'border-style',\n 'border-top',\n 'border-top-color',\n 'border-top-left-radius',\n 'border-top-right-radius',\n 'border-top-style',\n 'border-top-width',\n 'border-width',\n 'bottom',\n 'box-align',\n 'box-decoration-break',\n 'box-direction',\n 'box-flex',\n 'box-flex-group',\n 'box-lines',\n 'box-ordinal-group',\n 'box-orient',\n 'box-pack',\n 'box-shadow',\n 'box-sizing',\n 'break-after',\n 'break-before',\n 'break-inside',\n 'caption-side',\n 'caret-color',\n 'clear',\n 'clip',\n 'clip-path',\n 'clip-rule',\n 'color',\n 'color-interpolation',\n 'color-interpolation-filters',\n 'color-profile',\n 'color-rendering',\n 'color-scheme',\n 'column-count',\n 'column-fill',\n 'column-gap',\n 'column-rule',\n 'column-rule-color',\n 'column-rule-style',\n 'column-rule-width',\n 'column-span',\n 'column-width',\n 'columns',\n 'contain',\n 'contain-intrinsic-block-size',\n 'contain-intrinsic-height',\n 'contain-intrinsic-inline-size',\n 'contain-intrinsic-size',\n 'contain-intrinsic-width',\n 'container',\n 'container-name',\n 'container-type',\n 'content',\n 'content-visibility',\n 'counter-increment',\n 'counter-reset',\n 'counter-set',\n 'cue',\n 'cue-after',\n 'cue-before',\n 'cursor',\n 'cx',\n 'cy',\n 'direction',\n 'display',\n 'dominant-baseline',\n 'empty-cells',\n 'enable-background',\n 'field-sizing',\n 'fill',\n 'fill-opacity',\n 'fill-rule',\n 'filter',\n 'flex',\n 'flex-basis',\n 'flex-direction',\n 'flex-flow',\n 'flex-grow',\n 'flex-shrink',\n 'flex-wrap',\n 'float',\n 'flood-color',\n 'flood-opacity',\n 'flow',\n 'font',\n 'font-display',\n 'font-family',\n 'font-feature-settings',\n 'font-kerning',\n 'font-language-override',\n 'font-optical-sizing',\n 'font-palette',\n 'font-size',\n 'font-size-adjust',\n 'font-smooth',\n 'font-smoothing',\n 'font-stretch',\n 'font-style',\n 'font-synthesis',\n 'font-synthesis-position',\n 'font-synthesis-small-caps',\n 'font-synthesis-style',\n 'font-synthesis-weight',\n 'font-variant',\n 'font-variant-alternates',\n 'font-variant-caps',\n 'font-variant-east-asian',\n 'font-variant-emoji',\n 'font-variant-ligatures',\n 'font-variant-numeric',\n 'font-variant-position',\n 'font-variation-settings',\n 'font-weight',\n 'forced-color-adjust',\n 'gap',\n 'glyph-orientation-horizontal',\n 'glyph-orientation-vertical',\n 'grid',\n 'grid-area',\n 'grid-auto-columns',\n 'grid-auto-flow',\n 'grid-auto-rows',\n 'grid-column',\n 'grid-column-end',\n 'grid-column-start',\n 'grid-gap',\n 'grid-row',\n 'grid-row-end',\n 'grid-row-start',\n 'grid-template',\n 'grid-template-areas',\n 'grid-template-columns',\n 'grid-template-rows',\n 'hanging-punctuation',\n 'height',\n 'hyphenate-character',\n 'hyphenate-limit-chars',\n 'hyphens',\n 'icon',\n 'image-orientation',\n 'image-rendering',\n 'image-resolution',\n 'ime-mode',\n 'initial-letter',\n 'initial-letter-align',\n 'inline-size',\n 'inset',\n 'inset-area',\n 'inset-block',\n 'inset-block-end',\n 'inset-block-start',\n 'inset-inline',\n 'inset-inline-end',\n 'inset-inline-start',\n 'isolation',\n 'justify-content',\n 'justify-items',\n 'justify-self',\n 'kerning',\n 'left',\n 'letter-spacing',\n 'lighting-color',\n 'line-break',\n 'line-height',\n 'line-height-step',\n 'list-style',\n 'list-style-image',\n 'list-style-position',\n 'list-style-type',\n 'margin',\n 'margin-block',\n 'margin-block-end',\n 'margin-block-start',\n 'margin-bottom',\n 'margin-inline',\n 'margin-inline-end',\n 'margin-inline-start',\n 'margin-left',\n 'margin-right',\n 'margin-top',\n 'margin-trim',\n 'marker',\n 'marker-end',\n 'marker-mid',\n 'marker-start',\n 'marks',\n 'mask',\n 'mask-border',\n 'mask-border-mode',\n 'mask-border-outset',\n 'mask-border-repeat',\n 'mask-border-slice',\n 'mask-border-source',\n 'mask-border-width',\n 'mask-clip',\n 'mask-composite',\n 'mask-image',\n 'mask-mode',\n 'mask-origin',\n 'mask-position',\n 'mask-repeat',\n 'mask-size',\n 'mask-type',\n 'masonry-auto-flow',\n 'math-depth',\n 'math-shift',\n 'math-style',\n 'max-block-size',\n 'max-height',\n 'max-inline-size',\n 'max-width',\n 'min-block-size',\n 'min-height',\n 'min-inline-size',\n 'min-width',\n 'mix-blend-mode',\n 'nav-down',\n 'nav-index',\n 'nav-left',\n 'nav-right',\n 'nav-up',\n 'none',\n 'normal',\n 'object-fit',\n 'object-position',\n 'offset',\n 'offset-anchor',\n 'offset-distance',\n 'offset-path',\n 'offset-position',\n 'offset-rotate',\n 'opacity',\n 'order',\n 'orphans',\n 'outline',\n 'outline-color',\n 'outline-offset',\n 'outline-style',\n 'outline-width',\n 'overflow',\n 'overflow-anchor',\n 'overflow-block',\n 'overflow-clip-margin',\n 'overflow-inline',\n 'overflow-wrap',\n 'overflow-x',\n 'overflow-y',\n 'overlay',\n 'overscroll-behavior',\n 'overscroll-behavior-block',\n 'overscroll-behavior-inline',\n 'overscroll-behavior-x',\n 'overscroll-behavior-y',\n 'padding',\n 'padding-block',\n 'padding-block-end',\n 'padding-block-start',\n 'padding-bottom',\n 'padding-inline',\n 'padding-inline-end',\n 'padding-inline-start',\n 'padding-left',\n 'padding-right',\n 'padding-top',\n 'page',\n 'page-break-after',\n 'page-break-before',\n 'page-break-inside',\n 'paint-order',\n 'pause',\n 'pause-after',\n 'pause-before',\n 'perspective',\n 'perspective-origin',\n 'place-content',\n 'place-items',\n 'place-self',\n 'pointer-events',\n 'position',\n 'position-anchor',\n 'position-visibility',\n 'print-color-adjust',\n 'quotes',\n 'r',\n 'resize',\n 'rest',\n 'rest-after',\n 'rest-before',\n 'right',\n 'rotate',\n 'row-gap',\n 'ruby-align',\n 'ruby-position',\n 'scale',\n 'scroll-behavior',\n 'scroll-margin',\n 'scroll-margin-block',\n 'scroll-margin-block-end',\n 'scroll-margin-block-start',\n 'scroll-margin-bottom',\n 'scroll-margin-inline',\n 'scroll-margin-inline-end',\n 'scroll-margin-inline-start',\n 'scroll-margin-left',\n 'scroll-margin-right',\n 'scroll-margin-top',\n 'scroll-padding',\n 'scroll-padding-block',\n 'scroll-padding-block-end',\n 'scroll-padding-block-start',\n 'scroll-padding-bottom',\n 'scroll-padding-inline',\n 'scroll-padding-inline-end',\n 'scroll-padding-inline-start',\n 'scroll-padding-left',\n 'scroll-padding-right',\n 'scroll-padding-top',\n 'scroll-snap-align',\n 'scroll-snap-stop',\n 'scroll-snap-type',\n 'scroll-timeline',\n 'scroll-timeline-axis',\n 'scroll-timeline-name',\n 'scrollbar-color',\n 'scrollbar-gutter',\n 'scrollbar-width',\n 'shape-image-threshold',\n 'shape-margin',\n 'shape-outside',\n 'shape-rendering',\n 'speak',\n 'speak-as',\n 'src', // @font-face\n 'stop-color',\n 'stop-opacity',\n 'stroke',\n 'stroke-dasharray',\n 'stroke-dashoffset',\n 'stroke-linecap',\n 'stroke-linejoin',\n 'stroke-miterlimit',\n 'stroke-opacity',\n 'stroke-width',\n 'tab-size',\n 'table-layout',\n 'text-align',\n 'text-align-all',\n 'text-align-last',\n 'text-anchor',\n 'text-combine-upright',\n 'text-decoration',\n 'text-decoration-color',\n 'text-decoration-line',\n 'text-decoration-skip',\n 'text-decoration-skip-ink',\n 'text-decoration-style',\n 'text-decoration-thickness',\n 'text-emphasis',\n 'text-emphasis-color',\n 'text-emphasis-position',\n 'text-emphasis-style',\n 'text-indent',\n 'text-justify',\n 'text-orientation',\n 'text-overflow',\n 'text-rendering',\n 'text-shadow',\n 'text-size-adjust',\n 'text-transform',\n 'text-underline-offset',\n 'text-underline-position',\n 'text-wrap',\n 'text-wrap-mode',\n 'text-wrap-style',\n 'timeline-scope',\n 'top',\n 'touch-action',\n 'transform',\n 'transform-box',\n 'transform-origin',\n 'transform-style',\n 'transition',\n 'transition-behavior',\n 'transition-delay',\n 'transition-duration',\n 'transition-property',\n 'transition-timing-function',\n 'translate',\n 'unicode-bidi',\n 'user-modify',\n 'user-select',\n 'vector-effect',\n 'vertical-align',\n 'view-timeline',\n 'view-timeline-axis',\n 'view-timeline-inset',\n 'view-timeline-name',\n 'view-transition-name',\n 'visibility',\n 'voice-balance',\n 'voice-duration',\n 'voice-family',\n 'voice-pitch',\n 'voice-range',\n 'voice-rate',\n 'voice-stress',\n 'voice-volume',\n 'white-space',\n 'white-space-collapse',\n 'widows',\n 'width',\n 'will-change',\n 'word-break',\n 'word-spacing',\n 'word-wrap',\n 'writing-mode',\n 'x',\n 'y',\n 'z-index',\n 'zoom'\n].sort().reverse();\n\n/*\nLanguage: CSS\nCategory: common, css, web\nWebsite: https://developer.mozilla.org/en-US/docs/Web/CSS\n*/\n\n\n/** @type LanguageFn */\nfunction css(hljs) {\n const regex = hljs.regex;\n const modes = MODES(hljs);\n const VENDOR_PREFIX = { begin: /-(webkit|moz|ms|o)-(?=[a-z])/ };\n const AT_MODIFIERS = \"and or not only\";\n const AT_PROPERTY_RE = /@-?\\w[\\w]*(-\\w+)*/; // @-webkit-keyframes\n const IDENT_RE = '[a-zA-Z-][a-zA-Z0-9_-]*';\n const STRINGS = [\n hljs.APOS_STRING_MODE,\n hljs.QUOTE_STRING_MODE\n ];\n\n return {\n name: 'CSS',\n case_insensitive: true,\n illegal: /[=|'\\$]/,\n keywords: { keyframePosition: \"from to\" },\n classNameAliases: {\n // for visual continuity with `tag {}` and because we\n // don't have a great class for this?\n keyframePosition: \"selector-tag\" },\n contains: [\n modes.BLOCK_COMMENT,\n VENDOR_PREFIX,\n // to recognize keyframe 40% etc which are outside the scope of our\n // attribute value mode\n modes.CSS_NUMBER_MODE,\n {\n className: 'selector-id',\n begin: /#[A-Za-z0-9_-]+/,\n relevance: 0\n },\n {\n className: 'selector-class',\n begin: '\\\\.' + IDENT_RE,\n relevance: 0\n },\n modes.ATTRIBUTE_SELECTOR_MODE,\n {\n className: 'selector-pseudo',\n variants: [\n { begin: ':(' + PSEUDO_CLASSES.join('|') + ')' },\n { begin: ':(:)?(' + PSEUDO_ELEMENTS.join('|') + ')' }\n ]\n },\n // we may actually need this (12/2020)\n // { // pseudo-selector params\n // begin: /\\(/,\n // end: /\\)/,\n // contains: [ hljs.CSS_NUMBER_MODE ]\n // },\n modes.CSS_VARIABLE,\n {\n className: 'attribute',\n begin: '\\\\b(' + ATTRIBUTES.join('|') + ')\\\\b'\n },\n // attribute values\n {\n begin: /:/,\n end: /[;}{]/,\n contains: [\n modes.BLOCK_COMMENT,\n modes.HEXCOLOR,\n modes.IMPORTANT,\n modes.CSS_NUMBER_MODE,\n ...STRINGS,\n // needed to highlight these as strings and to avoid issues with\n // illegal characters that might be inside urls that would tigger the\n // languages illegal stack\n {\n begin: /(url|data-uri)\\(/,\n end: /\\)/,\n relevance: 0, // from keywords\n keywords: { built_in: \"url data-uri\" },\n contains: [\n ...STRINGS,\n {\n className: \"string\",\n // any character other than `)` as in `url()` will be the start\n // of a string, which ends with `)` (from the parent mode)\n begin: /[^)]/,\n endsWithParent: true,\n excludeEnd: true\n }\n ]\n },\n modes.FUNCTION_DISPATCH\n ]\n },\n {\n begin: regex.lookahead(/@/),\n end: '[{;]',\n relevance: 0,\n illegal: /:/, // break on Less variables @var: ...\n contains: [\n {\n className: 'keyword',\n begin: AT_PROPERTY_RE\n },\n {\n begin: /\\s/,\n endsWithParent: true,\n excludeEnd: true,\n relevance: 0,\n keywords: {\n $pattern: /[a-z-]+/,\n keyword: AT_MODIFIERS,\n attribute: MEDIA_FEATURES.join(\" \")\n },\n contains: [\n {\n begin: /[a-z-]+(?=:)/,\n className: \"attribute\"\n },\n ...STRINGS,\n modes.CSS_NUMBER_MODE\n ]\n }\n ]\n },\n {\n className: 'selector-tag',\n begin: '\\\\b(' + TAGS.join('|') + ')\\\\b'\n }\n ]\n };\n}\n\nexport { css as default };\n", "/*\nLanguage: Plain text\nAuthor: Egor Rogov (e.rogov@postgrespro.ru)\nDescription: Plain text without any highlighting.\nCategory: common\n*/\n\nfunction plaintext(hljs) {\n return {\n name: 'Plain text',\n aliases: [\n 'text',\n 'txt'\n ],\n disableAutodetect: true\n };\n}\n\nexport { plaintext as default };\n", "// Speaker view \u2014 SPEC \u00A78. Opened with S; a popup written into about:blank\n// (inherits the opener's origin, so the direct window.opener bridge works on\n// file:// too \u2014 no server needed). Thumbnails are iframes of the same deck\n// in ?embedded mode, driven by src hash.\n\nconst CLICK_MARK = /\u27E8CLICK\u27E9|<CLICK>|<click(?:\\s[^>]*)?>(?:<\\/click>)?/gi;\n\nexport function notesSegments(notesHtml) {\n return (notesHtml || '').split(CLICK_MARK);\n}\n\nexport function openSpeakerView(instance) {\n const FEATURES = 'width=1100,height=700';\n let win = window.open('', 'decklight-speaker', FEATURES);\n if (!win) return null;\n // Reloading the deck (e.g. an IDE's reload-on-save) orphans an open speaker\n // popup: the named-window lookup still finds it, but its realm is dead and\n // on file:// its inherited opaque origin no longer matches \u2014 document\n // access throws SecurityError and the old flow died mid-write, leaving the\n // popup blank or frozen. openSpeakerView only runs when no live popup is\n // tracked, so ANY discovered window with content is an orphan: close it\n // and take a fresh one.\n let orphaned = false;\n try { orphaned = win.document.body ? win.document.body.childNodes.length > 0 : false; }\n catch { orphaned = true; }\n if (orphaned) {\n try { win.close(); } catch { /* cross-origin close is allowed; be safe */ }\n win = window.open('', 'decklight-speaker', FEATURES);\n if (!win) return null;\n try { void win.document; } catch { return null; } // still blocked \u2014 give up cleanly\n }\n\n const deckUrl = () => {\n const u = new URL(location.href);\n u.searchParams.set('embedded', '');\n u.hash = '';\n return u.href;\n };\n\n // Bridge lives on the opener. Install it BEFORE writing the popup \u2014\n // document.write parsing runs the popup's script synchronously, so\n // assigning afterwards is a race the popup loses on http (it happened to\n // win on file://). The popup also polls as a second line of defense.\n window.__decklightBridge = {\n subscribe(cb) { instance.__speakerCb = cb; },\n getState: () => speakerState(instance, deckUrl()),\n next: () => instance.next(),\n prev: () => instance.prev(),\n };\n instance.__notifySpeaker = () => {\n if (instance.__speakerCb && !win.closed) instance.__speakerCb(speakerState(instance, deckUrl()));\n };\n\n const ar = `${instance.config.width} / ${instance.config.height}`;\n win.document.write(`<!doctype html><html><head><meta charset=\"utf-8\">\n<title>Decklight \u2014 speaker view</title>\n<style>\n body { margin:0; background:#111; color:#eee; font:14px/1.5 -apple-system, system-ui, sans-serif;\n display:grid; grid-template-columns: 1.4fr 1fr; grid-template-rows:auto auto 1fr auto; gap:10px; padding:10px; height:100vh; box-sizing:border-box; }\n header { grid-column:1/3; display:flex; gap:16px; align-items:center; }\n #timer { font-size:22px; font-variant-numeric:tabular-nums; }\n #pos { color:#999; }\n button { background:#333; color:#eee; border:0; border-radius:6px; padding:6px 12px; cursor:pointer; }\n #mode { margin-left:auto; text-transform:uppercase; font-size:11px; letter-spacing:.09em; }\n #mode.on { background:#5c4d00; color:#ffe38a; }\n /* rehearse mode: cue cards, not prose \u2014 one cue per line, same type size */\n body.rehearse aside { font-weight:600; }\n body.rehearse aside .seg { display:block; margin:.35em 0; }\n .thumbs { display:flex; flex-direction:column; gap:10px; min-height:0; align-items:start; }\n /* Panes keep the presentation's aspect ratio: width-driven, capped so a\n short window can't push the notes off screen. */\n .thumb { width:min(100%, calc(42vh * (${ar}))); aspect-ratio:${ar}; border:1px solid #333; border-radius:8px; overflow:hidden; position:relative; }\n .thumb .tag { position:absolute; top:6px; left:8px; z-index:2; background:#0009; padding:1px 8px; border-radius:4px; font-size:11px; }\n iframe { width:100%; height:100%; border:0; background:#000; }\n aside { grid-column:1/3; overflow:auto; background:#1b1b1b; border-radius:8px; padding:14px 16px; font-size:16px; line-height:1.65; }\n aside .seg { opacity:.45; }\n aside .seg.now { opacity:1; background:#2d2d00; outline:2px solid #665; border-radius:4px; }\n aside .seg.said { opacity:.8; }\n .cue { display:inline-block; background:#553; color:#ffc; font-size:11px; border-radius:4px; padding:0 6px; margin:0 4px; }\n footer { grid-column:1/3; color:#888; font-size:12px; display:flex; gap:14px; overflow:auto; white-space:nowrap; }\n footer .step.now { color:#ffc; }\n</style></head><body>\n<header>\n <span id=\"timer\">00:00</span>\n <button id=\"resetTimer\">reset</button>\n <span id=\"pos\"></span>\n <button id=\"prev\">\u25C0 prev</button>\n <button id=\"next\">next \u25B6</button>\n <button id=\"mode\" title=\"S toggles rehearse mode (cue cards instead of prose)\">speak</button>\n</header>\n<div class=\"thumbs\">\n <div class=\"thumb\"><span class=\"tag\">current</span><iframe id=\"cur\"></iframe></div>\n</div>\n<div class=\"thumbs\">\n <div class=\"thumb\"><span class=\"tag\">next</span><iframe id=\"nxt\"></iframe></div>\n</div>\n<aside id=\"notes\"></aside>\n<footer id=\"steps\"></footer>\n<script>\n const opener = window.opener;\n let api = null;\n const $ = (s) => document.querySelector(s);\n const start = Date.now();\n let t0 = start;\n setInterval(() => {\n const s = Math.floor((Date.now() - t0) / 1000);\n $('#timer').textContent = String(Math.floor(s/60)).padStart(2,'0') + ':' + String(s%60).padStart(2,'0');\n }, 500);\n $('#resetTimer').onclick = () => { t0 = Date.now(); };\n $('#prev').onclick = () => api && api.prev();\n $('#next').onclick = () => api && api.next();\n // speak = full prose notes; rehearse = the deck's aside.rehearse cue cards\n // (same \u27E8CLICK\u27E9 segmentation, a few words per segment). S toggles \u2014 from\n // this window or remotely via window.__decklightSpeakerToggle (deck's S).\n let mode = 'speak', lastSt = null;\n window.__decklightSpeakerToggle = () => {\n mode = mode === 'speak' ? 'rehearse' : 'speak';\n document.body.classList.toggle('rehearse', mode === 'rehearse');\n $('#mode').textContent = mode;\n $('#mode').classList.toggle('on', mode === 'rehearse');\n if (lastSt) render(lastSt);\n };\n $('#mode').onclick = window.__decklightSpeakerToggle;\n document.addEventListener('keydown', (e) => {\n if (e.key === 'ArrowRight' || e.key === ' ') api && api.next();\n if (e.key === 'ArrowLeft') api && api.prev();\n if (e.key === 's' || e.key === 'S') window.__decklightSpeakerToggle();\n });\n let last = { slide: -1, nextHash: '' };\n function render(st) {\n lastSt = st;\n $('#pos').textContent = 'slide ' + st.slide + ' / ' + st.totalSlides + ' \u00B7 step ' + st.step + ' / ' + st.totalSteps;\n if (st.slide !== last.slide) $('#cur').src = st.url + '#/' + st.slide + '/999';\n if (st.nextHash !== last.nextHash) $('#nxt').src = st.url + '#' + st.nextHash;\n last = { slide: st.slide, nextHash: st.nextHash };\n const segs = (mode === 'rehearse' && st.rehearseSegments) ? st.rehearseSegments : st.notesSegments;\n // Splitting on \u27E8CLICK\u27E9 can cut through a paragraph, leaving fragments\n // with dangling open tags that would swallow the following segments \u2014\n // re-serialize each fragment so every segment is balanced markup.\n const bal = (h) => { const d = document.createElement('div'); d.innerHTML = h; return d.innerHTML; };\n $('#notes').innerHTML = segs.map((s, i) => {\n const cls = i < st.step ? 'said' : i === st.step ? 'now' : '';\n return '<span class=\"seg ' + cls + '\">' + bal(s) + '</span>' + (i < segs.length - 1 ? '<span class=\"cue\">CLICK</span>' : '');\n }).join('');\n // Keep the live segment on screen as builds land: rehearse mode centers\n // the current cue; prose just scrolls when the segment would otherwise\n // be out of view.\n const now = $('#notes .seg.now');\n if (now) now.scrollIntoView({ block: mode === 'rehearse' ? 'center' : 'nearest', behavior: 'smooth' });\n $('#steps').innerHTML = st.labels.map((l, i) =>\n '<span class=\"step ' + (i === st.step - 1 ? 'now' : '') + '\">' + (i + 1) + '. ' + l + '</span>').join('');\n }\n // The opener assigns the bridge around the same moment this script runs\n // (document.write parsing is synchronous) \u2014 poll briefly instead of\n // deciding on a single racy read.\n function connect(tries) {\n api = opener && !opener.closed && opener.__decklightBridge;\n if (api) { api.subscribe(render); render(api.getState()); return; }\n if (tries > 0) return setTimeout(() => connect(tries - 1), 100);\n document.body.innerHTML = '<p style=\"padding:2em\">Lost connection to the deck window.</p>';\n }\n connect(30);\n</script>\n</body></html>`);\n win.document.close();\n\n return win;\n}\n\nexport function speakerState(instance, url) {\n const { slide, step, totalSlides } = instance.state;\n const rec = instance._records[slide - 1];\n const totalSteps = rec ? rec.groups.length : 0;\n const nextHash = step < totalSteps ? `/${slide}/${step + 1}`\n : slide < totalSlides ? `/${slide + 1}/0` : `/${slide}/${step}`;\n const notesEl = instance._sections[slide - 1]?.querySelector('aside.notes');\n const rehearseEl = instance._sections[slide - 1]?.querySelector('aside.rehearse');\n return {\n slide, step, totalSlides, totalSteps, url,\n nextHash,\n notesSegments: notesSegments(notesEl ? notesEl.innerHTML : ''),\n rehearseSegments: rehearseEl ? notesSegments(rehearseEl.innerHTML) : null,\n labels: instance._stepLabels(slide - 1),\n };\n}\n", "// Theme generator \u2014 SPEC \u00A75/\u00A78. Pure module (no DOM): generates a complete,\n// contract-satisfying token set with WCAG-gated color engineering. Every\n// token is derived with luminance math and iterated until it passes the same\n// gates test/contrast.mjs enforces on shipped themes \u2014 generation must never\n// emit a failing theme.\n//\n// generateTheme(seed?) \u2192 { name, seed, tokens: { '--bg': \u2026, \u2026 } }\n// tokensToCss(name, tokens) \u2192 theme-file-shaped CSS text\n\n// \u2500\u2500 seeded PRNG (mulberry32: tiny, deterministic) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nfunction mulberry32(a) {\n return function () {\n a |= 0; a = (a + 0x6D2B79F5) | 0;\n let t = Math.imul(a ^ (a >>> 15), 1 | a);\n t = (t + Math.imul(t ^ (t >>> 7), 61 | t)) ^ t;\n return ((t ^ (t >>> 14)) >>> 0) / 4294967296;\n };\n}\n\n// \u2500\u2500 color math (same WCAG formulas as test/contrast.mjs) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nfunction hslToRgb(h, s, l) {\n h = ((h % 360) + 360) % 360; s = Math.max(0, Math.min(100, s)) / 100; l = Math.max(0, Math.min(100, l)) / 100;\n const c = (1 - Math.abs(2 * l - 1)) * s;\n const x = c * (1 - Math.abs(((h / 60) % 2) - 1));\n const m = l - c / 2;\n const seg = Math.floor(h / 60) % 6;\n const rgb = [[c, x, 0], [x, c, 0], [0, c, x], [0, x, c], [x, 0, c], [c, 0, x]][seg];\n return rgb.map((v) => Math.round((v + m) * 255));\n}\n\nfunction rgbToHex([r, g, b]) {\n return '#' + [r, g, b].map((v) => v.toString(16).padStart(2, '0')).join('');\n}\n\nexport function luminance([r, g, b]) {\n const lin = [r, g, b].map((v) => {\n v /= 255;\n return v <= 0.03928 ? v / 12.92 : Math.pow((v + 0.055) / 1.055, 2.4);\n });\n return 0.2126 * lin[0] + 0.7152 * lin[1] + 0.0722 * lin[2];\n}\n\nexport function contrast(c1, c2) {\n const [l1, l2] = [luminance(c1), luminance(c2)].sort((a, b) => b - a);\n return (l1 + 0.05) / (l2 + 0.05);\n}\n\nconst minContrastVs = (rgb, stops) => Math.min(...stops.map((s) => contrast(rgb, s)));\n\n/**\n * The workhorse: take a hue/sat wish and walk lightness away from the\n * background until the color clears `min` against EVERY bg stop. Desaturates\n * and retries if lightness alone can't get there; the final fallback is a\n * near-neutral at the extreme, which always clears the contract's ratios\n * against the near-extreme canvases this generator produces.\n */\nfunction fitContrast(h, s, startL, stops, min) {\n const bgLum = stops.reduce((a, c) => a + luminance(c), 0) / stops.length;\n const preferred = bgLum < 0.5 ? 1 : -1; // lighten on dark canvases, darken on light\n const sats = [];\n for (let sat = s; sat > 0; sat -= 15) sats.push(sat);\n sats.push(0);\n for (const dir of [preferred, -preferred]) {\n for (const sat of sats) {\n // L clamped off the poles: L 0/100 is pure black/white whatever the\n // saturation, and neutrals must keep their tint (R6)\n for (let l = startL; l >= 2 && l <= 98; l += dir) {\n const rgb = hslToRgb(h, sat, l);\n if (minContrastVs(rgb, stops) >= min) return rgb;\n }\n }\n }\n // absolute fallback: whichever pole clears the bar better (mid-luminance\n // backgrounds can only be beaten by one of the extremes). Near-poles, not\n // pure #fff/#000 (R6) \u2014 but close enough to still clear the gates.\n const white = [253, 253, 254], black = [8, 9, 10];\n return minContrastVs(white, stops) >= minContrastVs(black, stops) ? white : black;\n}\n\n// \u2500\u2500 personality tables \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nconst ADJECTIVES = [\n 'amber', 'boreal', 'cinder', 'coral', 'drift', 'ember', 'fable', 'fjord',\n 'gale', 'harbor', 'iris', 'juniper', 'kelp', 'lumen', 'mesa', 'nectar',\n 'onyx', 'pluma', 'quartz', 'reef', 'sable', 'tundra', 'umbra', 'verdant',\n 'wisp', 'yonder', 'zephyr',\n];\n\nconst SANS = '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif';\nconst SANS_ROUNDED = 'ui-rounded, \"SF Pro Rounded\", \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif';\nconst SERIF = '\"Iowan Old Style\", \"Palatino Linotype\", Palatino, Georgia, serif';\nconst MONO = '\"SF Mono\", SFMono-Regular, ui-monospace, \"Cascadia Code\", Menlo, Consolas, monospace';\n\nconst HEADING_FONTS = [SANS, SANS, SANS_ROUNDED, SERIF]; // serif ~1 in 4\nconst HEADING_WEIGHTS = [600, 650, 700, 750, 800];\nconst RADII = ['4px', '6px', '8px', '10px', '12px', '14px', '18px'];\n\n// harmony schemes: offsets (degrees) from the base hue; [accent, spread\u2026]\nconst HARMONIES = {\n analogous: [30, -30, 60, 15, -15],\n complementary: [180, 150, 210, 30, -30],\n split: [150, 210, 30, 180, -30],\n triadic: [120, 240, 60, 180, 300],\n};\n\n// \u2500\u2500 codified palette rules \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n// Distilled from the most-loved editor/UI themes (Solarized, Nord, Catppuccin,\n// Gruvbox) and classic UI color doctrine (the 60-30-10 rule). Each rule is\n// tagged R1\u2013R8 where the generator applies it and property-tested across\n// seeds in test/themegen.test.mjs.\n// R1 limited palette \u2014 one base hue + the harmony's \u22645 accent hues, REUSED\n// across roles (syntax, links, diagram fills); never a fresh hue per\n// token. (Solarized: 8 fixed accents; Nord: 16 colors total.)\n// R2 quiet dominant areas \u2014 the canvas (the 60% of 60-30-10) stays\n// near-neutral; chroma belongs to small accents, not large surfaces.\n// R3 dimmed pastels \u2014 accents are muted, never neon: vivid rolls are biased\n// toward muted and saturation is hard-capped. (Nord \"dimmed pastels\",\n// Catppuccin \"not too dull, not too bright\".)\n// R4 one accent lightness band \u2014 all accent-family colors start from a\n// shared lightness AND saturation, so no color shouts louder than its\n// peers. (Solarized's accents share near-equal CIELAB L*.)\n// R5 selective contrast \u2014 syntax roles differ by HUE at similar brightness,\n// not by brightness spikes (Solarized's core idea); R4 is what makes\n// this hold in practice.\n// R6 no pure black or white \u2014 every \"neutral\" carries the base-hue tint\n// (Solarized base03 and Nord Polar Night are tinted, never #000/#fff).\n// R7 gradients sparingly \u2014 rare, low-drift, same-family canvas washes only.\n// R8 semantic anchors \u2014 terminal red/green/yellow keep their recognizable\n// hue even when muted (Nord Aurora's error/warning/success colors).\nconst RULES = {\n bgSatMax: { dark: 18, light: 12 }, // R2/R6 (HSL sat; extreme L damps chroma further)\n accentSat: [42, 68], // R3\n hlSat: [36, 58], // R3/R4/R5\n ansiSat: [46, 66], // R3/R8\n gradientChance: 0.15, // R7\n gradientHueDrift: [8, 20], // R7\n};\n\n// \u2500\u2500 generator \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nexport function generateTheme(seed) {\n seed = (seed ?? Math.floor(Math.random() * 0xffffffff)) >>> 0;\n const rnd = mulberry32(seed);\n const pick = (arr) => arr[Math.floor(rnd() * arr.length)];\n const range = (lo, hi) => lo + rnd() * (hi - lo);\n\n const dark = rnd() < 0.5;\n const baseHue = Math.floor(rnd() * 360);\n const harmonyName = pick(Object.keys(HARMONIES));\n const H = HARMONIES[harmonyName];\n const accentHue = baseHue + H[0];\n const vivid = rnd() * rnd(); // 0 muted \u2026 1 vivid \u2014 R3: biased muted (mean \u2248 \u2153)\n const chroma = (lo, hi) => lo + vivid * (hi - lo);\n\n // \u2500\u2500 canvas \u2500\u2500\n const bgSat = chroma(5, RULES.bgSatMax[dark ? 'dark' : 'light']); // R2 quiet canvas, R6 tinted (floor 5, never grey)\n const bgL = dark ? range(6, 13) : range(94, 97.5);\n const bg1 = hslToRgb(baseHue, bgSat, bgL);\n let bgValue = rgbToHex(bg1);\n let bgStops = [bg1];\n if (rnd() < RULES.gradientChance) { // R7: rare, subtle, same-family wash (validate every stop)\n const bg2 = hslToRgb(baseHue + range(...RULES.gradientHueDrift), bgSat + range(0, 8), bgL + (dark ? range(2.5, 5) : -range(2, 4)));\n const angle = Math.round(range(120, 210));\n bgValue = `linear-gradient(${angle}deg, ${rgbToHex(bg1)} 0%, ${rgbToHex(bg2)} 100%)`;\n bgStops = [bg1, bg2];\n }\n const surface = hslToRgb(baseHue, Math.min(bgSat + 4, 35), dark ? bgL + 4 : bgL - 4);\n\n // \u2500\u2500 ink \u2500\u2500\n const fg = fitContrast(baseHue, 12, dark ? 86 : 18, bgStops, 4.6);\n const muted = fitContrast(baseHue, 10, dark ? 64 : 44, bgStops, 3.1);\n const headingTinted = rnd() < 0.5;\n const heading = headingTinted\n ? fitContrast(accentHue, chroma(20, 55), dark ? 80 : 26, bgStops, 3.2)\n : fitContrast(baseHue, 8, dark ? 92 : 12, bgStops, 4.6);\n\n // \u2500\u2500 accent \u2500\u2500\n const accentSat = chroma(...RULES.accentSat); // R3: pastel ceiling, never neon\n let accentL = dark ? range(55, 68) : range(34, 48);\n let accent = hslToRgb(accentHue, accentSat, accentL);\n // The accent hosts --accent-contrast text: nudge it out of the mid-luminance\n // dead zone where neither near-pole (R6 forbids pure #fff/#000) can reach\n // 4.6:1 on top of it. Mode-consistent direction: dark themes brighten the\n // accent (dark label on bright chip), light themes deepen it (light label).\n while (Math.max(minContrastVs([253, 253, 254], [accent]), minContrastVs([8, 9, 10], [accent])) < 4.7) {\n accentL += dark ? 1 : -1;\n accent = hslToRgb(accentHue, accentSat, accentL);\n }\n const accentContrast = fitContrast(accentHue, 18, luminance(accent) < 0.4 ? 96 : 10, [accent], 4.6);\n // R1: the link reuses a palette hue (accent or second harmony hue) \u2014 no fresh hue\n const link = fitContrast(rnd() < 0.5 ? accentHue : baseHue + (H[1] ?? 30), chroma(35, 60), dark ? 70 : 34, bgStops, 3.2);\n\n // \u2500\u2500 blocks \u2500\u2500\n const blockBg = rgbToHex(surface);\n const blockBorder = `1px solid ${rgbToHex(hslToRgb(baseHue, Math.min(bgSat + 6, 40), dark ? bgL + 10 : bgL - 10))}`;\n const radius = pick(RADII);\n const shadow = dark\n ? `0 ${Math.round(range(4, 10))}px ${Math.round(range(18, 30))}px rgba(0, 0, 0, 0.${Math.round(range(35, 55))})`\n : `0 ${Math.round(range(3, 6))}px ${Math.round(range(12, 20))}px rgba(30, 30, 40, 0.${String(Math.round(range(8, 14))).padStart(2, '0')})`;\n\n // \u2500\u2500 code panel \u2500\u2500\n const codeBgRgb = hslToRgb(baseHue, Math.min(bgSat + 2, 28), dark ? Math.max(bgL - 3, 3) : Math.min(bgL - 3, 93));\n const codeStops = [codeBgRgb];\n const codeFg = fitContrast(baseHue, 8, dark ? 85 : 20, codeStops, 4.6);\n // R1: syntax hues come from the harmony palette only. R4/R5: one shared\n // saturation and starting lightness \u2014 roles differ by hue, not loudness.\n const hlHueOffsets = { keyword: H[0], string: H[3] ?? 120, number: H[2] ?? 60, function: H[1] ?? 210, type: H[4] ?? 280 };\n const hlSat = chroma(...RULES.hlSat);\n const hlL = dark ? 68 : 36;\n const hl = {};\n for (const [tok, off] of Object.entries(hlHueOffsets)) {\n hl[tok] = fitContrast(baseHue + off, hlSat, hlL, codeStops, 4.6);\n }\n hl.comment = fitContrast(baseHue, 12, dark ? 60 : 46, codeStops, 3.2);\n hl.punct = fitContrast(baseHue, 10, dark ? 74 : 32, codeStops, 4.6);\n\n // \u2500\u2500 diagram \u2500\u2500 (R1: fills reuse the harmony hues; R2: low chroma \u2014 fills\n // are large areas, so they stay near the canvas, not the accents. Ink must\n // clear BOTH the canvas and every panel: labels sit on the fills.)\n const fillHues = [0, H[0], H[1] ?? 40, H[2] ?? 90, (H[3] ?? 160), (H[4] ?? 230)];\n const dFillsRgb = fillHues.map((off, i) =>\n hslToRgb(baseHue + off, chroma(14, 34), dark ? bgL + 8 + (i % 3) * 2 : bgL - 6 - (i % 3) * 2));\n const dInkStops = [...bgStops, ...dFillsRgb];\n const dStroke = fitContrast(baseHue, 14, dark ? 60 : 42, bgStops, 2.2);\n const dText = fitContrast(baseHue, 10, dark ? 84 : 20, dInkStops, 3.4);\n const dMuted = fitContrast(baseHue, 10, dark ? 62 : 46, dInkStops, 2.7);\n const dAccent = fitContrast(accentHue, accentSat, dark ? 68 : 38, dInkStops, 2.7);\n const dFills = dFillsRgb.map(rgbToHex);\n\n // \u2500\u2500 terminal (dark panel in every theme, matching the shipped set) \u2500\u2500\n const termBgRgb = hslToRgb(baseHue, Math.min(bgSat + 4, 30), dark ? Math.max(bgL - 4, 3) : range(12, 18));\n const termStops = [termBgRgb];\n const termFg = fitContrast(baseHue, 8, 82, termStops, 4.6);\n const termPrompt = fitContrast(accentHue, chroma(...RULES.ansiSat), 66, termStops, 3.2);\n // R8: ANSI colors anchor to their semantic hue (red reads red, green reads\n // green) with only a small base-hue lean; R3/R4: one muted band for all.\n const ansiAnchor = { red: 8, green: 125, yellow: 45, blue: 215, magenta: 290, cyan: 175 };\n const ansi = { black: fitContrast(baseHue, 10, 58, termStops, 3.1), white: fitContrast(baseHue, 6, 88, termStops, 4.6) };\n for (const [nameA, hue] of Object.entries(ansiAnchor)) {\n ansi[nameA] = fitContrast(hue + (baseHue % 16) - 8, chroma(...RULES.ansiSat), 66, termStops, 3.1);\n }\n const bright = (rgb) => {\n // lift toward white, then re-fit to be safe\n const [r, g, b] = rgb.map((v) => Math.min(255, Math.round(v + (255 - v) * 0.35)));\n return minContrastVs([r, g, b], termStops) >= 3.0 ? [r, g, b] : fitContrast(baseHue, 8, 90, termStops, 3.1);\n };\n\n // \u2500\u2500 assemble \u2500\u2500\n const name = `gen-${pick(ADJECTIVES)}-${(seed % 0xffff).toString(16).padStart(4, '0')}`;\n const hx = rgbToHex;\n const tokens = {\n '--bg': bgValue,\n '--bg-accent': rgbToHex(surface),\n '--fg': hx(fg),\n '--muted': hx(muted),\n '--font-body': SANS,\n '--font-heading': pick(HEADING_FONTS),\n '--font-mono': MONO,\n '--heading-color': hx(heading),\n '--heading-weight': String(pick(HEADING_WEIGHTS)),\n '--link': hx(link),\n '--accent': hx(accent),\n '--accent-contrast': hx(accentContrast),\n '--block-bg': blockBg,\n '--block-border': blockBorder,\n '--block-radius': radius,\n '--shadow': shadow,\n '--code-bg': hx(codeBgRgb),\n '--code-fg': hx(codeFg),\n '--hl-keyword': hx(hl.keyword),\n '--hl-string': hx(hl.string),\n '--hl-number': hx(hl.number),\n '--hl-comment': hx(hl.comment),\n '--hl-function': hx(hl.function),\n '--hl-type': hx(hl.type),\n '--hl-punct': hx(hl.punct),\n '--d-stroke': hx(dStroke),\n '--d-text': hx(dText),\n '--d-muted': hx(dMuted),\n '--d-accent': hx(dAccent),\n '--d-fill-1': dFills[0],\n '--d-fill-2': dFills[1],\n '--d-fill-3': dFills[2],\n '--d-fill-4': dFills[3],\n '--d-fill-5': dFills[4],\n '--d-fill-6': dFills[5],\n '--term-bg': hx(termBgRgb),\n '--term-fg': hx(termFg),\n '--term-prompt': hx(termPrompt),\n '--term-cursor': hx(termPrompt),\n '--term-selection': `rgba(${accent[0]}, ${accent[1]}, ${accent[2]}, 0.30)`,\n '--ansi-black': hx(ansi.black),\n '--ansi-red': hx(ansi.red),\n '--ansi-green': hx(ansi.green),\n '--ansi-yellow': hx(ansi.yellow),\n '--ansi-blue': hx(ansi.blue),\n '--ansi-magenta': hx(ansi.magenta),\n '--ansi-cyan': hx(ansi.cyan),\n '--ansi-white': hx(ansi.white),\n '--ansi-bright-black': hx(bright(ansi.black)),\n '--ansi-bright-red': hx(bright(ansi.red)),\n '--ansi-bright-green': hx(bright(ansi.green)),\n '--ansi-bright-yellow': hx(bright(ansi.yellow)),\n '--ansi-bright-blue': hx(bright(ansi.blue)),\n '--ansi-bright-magenta': hx(bright(ansi.magenta)),\n '--ansi-bright-cyan': hx(bright(ansi.cyan)),\n '--ansi-bright-white': hx(fitContrast(baseHue, 6, 97, termStops, 3.1)), // R6: tinted, not #fff\n '--dim-opacity': (0.25 + Math.round(rnd() * 15) / 100).toFixed(2),\n };\n\n return { name, seed, dark, harmony: harmonyName, tokens };\n}\n\n// \u2500\u2500 serializer: theme-file-shaped CSS \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nconst SECTIONS = [\n ['canvas', ['--bg', '--bg-accent', '--fg', '--muted']],\n ['type', ['--font-body', '--font-heading', '--font-mono', '--heading-color', '--heading-weight', '--link']],\n ['accent', ['--accent', '--accent-contrast']],\n ['blocks', ['--block-bg', '--block-border', '--block-radius', '--shadow']],\n ['code', ['--code-bg', '--code-fg', '--hl-keyword', '--hl-string', '--hl-number', '--hl-comment', '--hl-function', '--hl-type', '--hl-punct']],\n ['diagram', ['--d-stroke', '--d-text', '--d-muted', '--d-accent', '--d-fill-1', '--d-fill-2', '--d-fill-3', '--d-fill-4', '--d-fill-5', '--d-fill-6']],\n ['terminal', ['--term-bg', '--term-fg', '--term-prompt', '--term-cursor', '--term-selection',\n '--ansi-black', '--ansi-red', '--ansi-green', '--ansi-yellow', '--ansi-blue', '--ansi-magenta', '--ansi-cyan', '--ansi-white',\n '--ansi-bright-black', '--ansi-bright-red', '--ansi-bright-green', '--ansi-bright-yellow',\n '--ansi-bright-blue', '--ansi-bright-magenta', '--ansi-bright-cyan', '--ansi-bright-white']],\n ['builds', ['--dim-opacity']],\n];\n\nexport function tokensToCss(name, tokens) {\n let out = `/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n Decklight theme \u00B7 ${name}\n generated by Decklight (\u2303T) \u2014 token contract: SPEC.md \u00A75\n All values derived with WCAG luminance math; passes test/contrast.mjs\n \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 */\n\n.decklight {\n`;\n for (const [section, keys] of SECTIONS) {\n const present = keys.filter((k) => tokens[k] !== undefined);\n if (!present.length) continue;\n out += ` /* \u2500\u2500 ${section} ${'\u2500'.repeat(Math.max(1, 26 - section.length))} */\\n`;\n for (const k of present) out += ` ${k}: ${tokens[k]};\\n`;\n out += '\\n';\n }\n // any tokens outside the known sections (future-proofing)\n const known = new Set(SECTIONS.flatMap(([, ks]) => ks));\n for (const [k, v] of Object.entries(tokens)) {\n if (!known.has(k)) out += ` ${k}: ${v};\\n`;\n }\n return out.replace(/\\n$/, '') + '}\\n';\n}\n", "/**\n * Decklight terminal player (SPEC \u00A77.3).\n *\n * <div class=\"terminal\" data-cast=\"casts/demo.cast.json\"\n * data-mode=\"step|play\" data-type-speed=\"5\" data-max-step=\"2.5\"\n * data-title=\"Terminal\" data-rows=\"24\"></div>\n *\n * step mode (default): registers a Build Provider \u2014 each advance types the\n * next command (humanized keystroke cadence, a key-click locked to every\n * glyph) then streams its recorded output with\n * pacing compressed to \u2264 data-max-step seconds. apply(i) is idempotent for\n * any i (deep links, reverse navigation, print).\n *\n * data-type-speed picks the typing speed on a 1 (slow) \u2026 10 (fast) scale;\n * 5 is the default pace, about 55 wpm. The \u2328 titlebar button is a\n * words-per-minute picker that cycles it live, persisted per deck (the\n * presenter's choice wins over the authored attribute).\n *\n * data-type-sound picks the key voicing (creamy, clacky, thocky, or off;\n * default creamy). The \u266A titlebar button cycles it live, persisted per deck.\n *\n * The A titlebar button cycles the terminal's font size (75% \u2026 160% of the\n * inherited size), persisted per page. All three controls are present in\n * step mode; the \u266A and A buttons are present in play mode too.\n *\n * play mode: timeline playback with play/pause, speed cycling, restart.\n * data-speed sets the initial playback multiplier (1, 2, or 4); the \u00D7-button\n * cycles it from there.\n */\n\nimport { AnsiScreen, spansToHtml, escapeHtml } from './ansi.mjs';\n\nconst DEFAULT_VISIBLE_ROWS = 24;\n\n// Authored typing speed is a 1 (slow) \u2026 10 (fast) scale; typeRate maps it to a\n// rate multiplier (1 \u2192 \u2153\u00D7, 5 \u2192 1\u00D7 classic, 10 \u2192 4\u00D7). The default pace (factor\n// 1) reads at ~55 wpm, so the multiplier is effectively \"wpm / 55\".\nconst clampScale = (n) => Math.max(1, Math.min(10, n));\nconst typeRate = (s) => 2 ** ((s - 5) / 2.5);\n\n// The \u2328 titlebar button is a words-per-minute picker: it cycles these presets\n// and drives typing as wpm / BASE_WPM (55 wpm is the tuned default). Persisted\n// per deck; the presenter's pick wins over the authored data-type-speed, which\n// maps to the nearest preset.\nconst BASE_WPM = 55;\nconst WPM_STEPS = [30, 45, 55, 70, 90, 120, 160];\nconst TYPE_WPM_KEY = 'decklight-term-wpm:' + location.pathname;\nconst nearestWpm = (w) => WPM_STEPS.reduce((a, b) => Math.abs(b - w) < Math.abs(a - w) ? b : a);\n\n// The \u266A titlebar button is a key-sound picker cycling these; \"off\" mutes.\nconst SOUND_STEPS = ['creamy', 'clacky', 'thocky', 'off'];\nconst TYPE_SOUND_KEY = 'decklight-term-typesound:' + location.pathname;\n\n// font-size steps for the A titlebar button, in em so they scale whatever\n// base size the page gives the terminal; 1 is \"as authored\"\nconst TERM_FONT_KEY = 'decklight-term-fontsize:' + location.pathname;\nconst FONT_STEPS = [0.75, 0.9, 1, 1.15, 1.35, 1.6];\n\n// Subtle synthesized key sounds while commands type \u2014 no audio asset. The\n// anatomy comes from dissecting a reference recording strike by strike\n// (106 transients): every keystroke is a short bright contact CLICK\n// (bandpass+lowpass noise burst, dead within ~10ms) over a quiet low case\n// THUMP that blooms a few ms later and rings ~40ms at about a quarter of\n// the strike's peak, with a spectral hollow between them (120Hz-1.2kHz).\n// A lighter, brighter click follows 35-80ms later: the key RELEASE, which\n// real typing always has. Amplitude spreads ~4x strike to strike (soft\n// graze vs firm bottom-out); the spacebar is deeper and reliably louder.\n// The shared AudioContext resumes on the first (gesture-driven) advance;\n// data-type-sound=\"off\" opts a terminal out.\n// The three voicings differ in click band and click:thump balance:\n// thocky = dark click over a tightly-damped woody body, tuned strike-by-strike\n// to a dedicated reference board (thocky.mp4): a short, gentle, click-forward\n// pop, not a low boom. thumpF2 gives it the reference's pitch spread \u2014 most\n// strikes land woody (thumpF) with a deep-thock minority (thumpF2), the way a\n// real board mixes bottom-outs with lighter keys;\n// creamy = mid-bright click, felted thump, tight damping (the reference);\n// clacky = high thin snap, minimal thump, fastest decay.\nconst KEY_PROFILES = {\n thocky: { click: 0.17, clickF: [680, 1250], clickQ: 0.9, lp: 1800, clickDecay: [0.012, 0.017], thump: 0.008, thumpF: [130, 185], thumpF2: [58, 85], thumpF2Prob: 0.22, ring: [0.005, 0.009] },\n creamy: { click: 0.30, clickF: [1400, 2850], clickQ: 0.95, lp: 3800, clickDecay: [0.007, 0.011], thump: 0.0056, thumpF: [60, 110], ring: [0.065, 0.095] },\n clacky: { click: 0.34, clickF: [2300, 3900], clickQ: 1.1, lp: 6800, clickDecay: [0.005, 0.008], thump: 0.003, thumpF: [90, 140], ring: [0.035, 0.055] },\n};\n\n// Inter-keystroke gap in ms, before the speed factor is applied. Humans\n// don't type on a metronome: most keys land in a tight core band, word\n// breaks and shell punctuation earn a beat of hesitation, and every so\n// often a longer \"thinking\" pause slips in. Tuned so the default speed\n// (scale 5, the 55 wpm preset) reads at about 218ms mean per key. This\n// jitter is what keeps the typing, and the per-key clicks fired with it,\n// from sounding mechanical. Callers divide the result by their speed factor.\nfunction keyGap(ch) {\n let ms = 90 + Math.random() * 120; // 90-210ms core band\n if (Math.random() < 0.15) ms += Math.random() * 240; // fatter right tail\n if (ch === ' ') ms += 70 + Math.random() * 220; // pause between words\n else if ('.,:;/|&>-_=\"\\'`()'.includes(ch)) ms += 40 + Math.random() * 140;\n if (Math.random() < 0.035) ms += 300 + Math.random() * 440; // rare hesitation\n return ms;\n}\n\nlet keyCtx = null;\nlet keyNoise = null;\nfunction keyClick(ch = '', profile = 'creamy', gapSec = 0.12) {\n try {\n const AC = window.AudioContext || window.webkitAudioContext;\n if (!AC) return;\n keyCtx ??= new AC();\n if (keyCtx.state === 'suspended') keyCtx.resume();\n if (!keyNoise) {\n const len = Math.floor(keyCtx.sampleRate * 0.06);\n keyNoise = keyCtx.createBuffer(1, len, keyCtx.sampleRate);\n const d = keyNoise.getChannelData(0);\n for (let i = 0; i < len; i++) d[i] = Math.random() * 2 - 1;\n }\n const P = KEY_PROFILES[profile] ?? KEY_PROFILES.creamy;\n const rnd = (lo, hi) => lo + Math.random() * (hi - lo);\n const t = keyCtx.currentTime;\n const space = ch === ' ';\n const amp = rnd(0.45, 1.3) * (space ? 1.25 : 1);\n const fc = rnd(...P.clickF) * (space ? 0.7 : 1);\n // The spacebar is the biggest, most damped key on the board. Pull its\n // bright click back a touch and let a deeper, louder, longer-ringing\n // thump carry it, so the bar lands with an audible thock and real bass\n // under the words instead of just a louder tick.\n const ring = rnd(...P.ring) * (space ? 1.5 : 1);\n const click = (at, gain, f, decay) => {\n const src = keyCtx.createBufferSource();\n src.buffer = keyNoise;\n const bp = keyCtx.createBiquadFilter();\n bp.type = 'bandpass'; bp.frequency.value = f; bp.Q.value = P.clickQ;\n const lo = keyCtx.createBiquadFilter();\n lo.type = 'lowpass'; lo.frequency.value = P.lp;\n const g = keyCtx.createGain();\n g.gain.setValueAtTime(0.0001, at);\n g.gain.exponentialRampToValueAtTime(gain, at + 0.0007);\n g.gain.exponentialRampToValueAtTime(0.0001, at + decay);\n src.connect(bp); bp.connect(lo); lo.connect(g); g.connect(keyCtx.destination);\n src.start(at); src.stop(at + decay + 0.01);\n };\n const thump = (at, gain, f0, ring) => {\n const osc = keyCtx.createOscillator();\n osc.type = 'sine';\n osc.frequency.setValueAtTime(f0, at);\n osc.frequency.exponentialRampToValueAtTime(f0 * 0.6, at + ring * 0.6);\n const g = keyCtx.createGain();\n g.gain.setValueAtTime(0.0001, at);\n g.gain.exponentialRampToValueAtTime(gain, at + rnd(0.003, 0.011)); // blooms after the click\n g.gain.exponentialRampToValueAtTime(gain * 0.25, at + ring); // resonant ring\u2026\n g.gain.exponentialRampToValueAtTime(0.0001, at + ring * 2); // \u2026then gone\n osc.connect(g); g.connect(keyCtx.destination);\n osc.start(at); osc.stop(at + ring * 2 + 0.01);\n };\n // Body pitch: a profile may carry a second cluster (thumpF2) so strikes\n // vary in pitch \u2014 mostly the woody thumpF band, a deep-thock minority from\n // thumpF2. Picked once per keystroke so key-down and key-up agree.\n const tf = (P.thumpF2 && Math.random() < (P.thumpF2Prob ?? 0.4)) ? P.thumpF2 : P.thumpF;\n // key-down\u2026\n click(t, P.click * amp * (space ? 0.82 : 1), fc, rnd(...P.clickDecay) * (space ? 1.2 : 1));\n thump(t, P.thump * amp * (space ? 2.4 : 1), rnd(...tf) * (space ? 0.7 : 1), ring);\n // \u2026and key-up: lighter, brighter, no finger mass behind it. Clamp the\n // release into this keystroke's own window so it never lands on top of\n // the next key-down at fast speeds \u2014 clicks stay locked to their glyphs.\n const up = t + Math.max(0.01, Math.min(rnd(0.035, 0.08), gapSec * 0.55));\n click(up, P.click * amp * rnd(0.35, 0.55), fc * 1.15, rnd(...P.clickDecay) * 0.8);\n thump(up, P.thump * amp * (space ? 0.5 : 0.25), rnd(...tf) * (space ? 0.7 : 1), ring * 0.6);\n } catch { /* no audio in this environment */ }\n}\n\n// The WebAudio clock is born suspended and only resumes inside a user gesture.\n// The first keyClick fires from deep inside an async typing loop, after awaits,\n// so the browser no longer credits the original click as the gesture and the\n// context stays muted until the next direct interaction. Fix it by resuming\n// synchronously on the very first pointer/key event anywhere on the page, so\n// audio is already live by the time a character is typed.\nfunction primeKeyAudio() {\n try {\n const AC = window.AudioContext || window.webkitAudioContext;\n if (!AC) return;\n keyCtx ??= new AC();\n if (keyCtx.state === 'suspended') keyCtx.resume();\n } catch { /* no audio in this environment */ }\n}\nlet audioUnlockArmed = false;\nfunction armAudioUnlock() {\n if (audioUnlockArmed || typeof document === 'undefined') return;\n audioUnlockArmed = true;\n const unlock = () => {\n primeKeyAudio();\n document.removeEventListener('pointerdown', unlock, true);\n document.removeEventListener('keydown', unlock, true);\n };\n document.addEventListener('pointerdown', unlock, true);\n document.addEventListener('keydown', unlock, true);\n}\n\n/**\n * Scan `root` for terminal elements, load their casts, build DOM, and (in\n * step mode) register build providers on `Decklight`. Returns a Promise that\n * resolves when every cast is loaded and registered \u2014 the core engine awaits\n * this during init so provider counts are known before the first layout.\n */\nexport function registerTerminals(Decklight, root = document) {\n const els = [...root.querySelectorAll('.terminal[data-cast], .terminal[data-cast-inline]')];\n if (els.length) armAudioUnlock(); // resume audio on the first real gesture\n return Promise.all(els.map(el => setupTerminal(el, Decklight).catch(err => {\n renderError(el, err);\n })));\n}\n\nasync function setupTerminal(el, Decklight) {\n if (el.dataset.decklightTerminal) return; // already initialized (sync() re-scan)\n el.dataset.decklightTerminal = '1';\n // data-cast-inline=\"#id\" reads the cast from an embedded JSON <script> \u2014\n // the only path that works on file://, where fetch() of local files is\n // blocked. data-cast fetches a URL (needs http, or a served deck).\n let text, src;\n const inlineSel = el.dataset.castInline;\n if (inlineSel) {\n src = inlineSel;\n let node = document.querySelector(inlineSel);\n if (!node && document.readyState === 'loading') {\n // Init scripts run mid-parse; a cast block authored below them isn't in\n // the DOM yet. Wait for the parser to finish, then look again.\n await new Promise((r) => document.addEventListener('DOMContentLoaded', r, { once: true }));\n node = document.querySelector(inlineSel);\n }\n if (!node) throw new Error(`inline cast not found: ${inlineSel}`);\n text = node.textContent;\n } else {\n src = el.dataset.cast;\n const res = await fetch(src);\n if (!res.ok) throw new Error(`failed to load cast: ${src} (${res.status})`);\n text = await res.text();\n }\n const cast = parseCast(text, src);\n const controller = new TerminalController(el, cast);\n let mode = el.dataset.mode || 'step';\n // An imported asciicast without markers has no step structure \u2014 only the\n // timeline is playable.\n if (cast.imported && mode === 'step' && !cast.hasMarkers) mode = 'play';\n if (mode === 'play') controller.mountPlayMode();\n else controller.mountStepMode(Decklight);\n}\n\n/** Accepts a decklight cast (one JSON document) or an asciicast v2 file\n * (NDJSON: header line + event lines) \u2014 detected by shape, not extension. */\nfunction parseCast(text, src) {\n let doc = null;\n try { doc = JSON.parse(text); } catch { /* possibly NDJSON */ }\n if (doc) {\n if (doc.decklightCast === 1 && Array.isArray(doc.steps)) return doc;\n throw new Error(`not a decklight cast (v1): ${src}`);\n }\n return importAsciicast(text, src);\n}\n\n/**\n * asciicast v2 \u2192 internal cast. Marker events split the stream into steps\n * (marker label = step label); without markers the whole file is one step.\n * Imported steps are `raw`: the stream already contains prompts and echoed\n * input, so the player must not inject its own prompt or type commands.\n */\nfunction importAsciicast(text, src) {\n const lines = text.split('\\n').filter(l => l.trim());\n let header;\n try { header = JSON.parse(lines[0]); } catch { header = null; }\n if (!header || header.version !== 2) throw new Error(`not a decklight cast or asciicast v2: ${src}`);\n const steps = [];\n let cur = { cmd: '', raw: true, output: [] };\n let curStart = 0;\n let sawMarker = false;\n for (const line of lines.slice(1)) {\n let ev;\n try { ev = JSON.parse(line); } catch { continue; }\n if (!Array.isArray(ev) || ev.length < 3) continue;\n const [t, kind, data] = ev;\n if (kind === 'm') {\n sawMarker = true;\n if (cur.output.length) steps.push(cur);\n cur = { cmd: String(data || ''), raw: true, output: [] };\n curStart = t;\n } else if (kind === 'o') {\n cur.output.push([Math.max(0, round3(t - curStart)), data]);\n }\n }\n if (cur.output.length) steps.push(cur);\n if (!steps.length) throw new Error(`asciicast has no output events: ${src}`);\n return {\n decklightCast: 1,\n imported: true,\n hasMarkers: sawMarker,\n meta: { cols: header.width || 100, rows: header.height || 28, prompt: '' },\n steps,\n };\n}\n\nfunction round3(n) { return Math.round(n * 1000) / 1000; }\n\nfunction renderError(el, err) {\n el.innerHTML =\n `<div class=\"terminal-window terminal-broken\"><div class=\"terminal-titlebar\">` +\n `<span class=\"terminal-dot\"></span><span class=\"terminal-dot\"></span><span class=\"terminal-dot\"></span>` +\n `<span class=\"terminal-title\">terminal</span></div>` +\n `<div class=\"terminal-screen\"><pre class=\"terminal-lines\">\u26A0 ${escapeHtml(String(err.message || err))}</pre></div></div>`;\n}\n\nclass TerminalController {\n constructor(el, cast) {\n this.el = el;\n this.cast = cast;\n this.prompt = cast.meta.prompt ?? '$ ';\n // typing speed in words per minute. The authored data-type-speed is the\n // legacy 1-10 scale; map it to the nearest wpm preset, then let a per-deck\n // presenter pick (the \u2328 button) override.\n const authoredScale = clampScale(parseInt(el.dataset.typeSpeed ?? '5', 10) || 5);\n this.typeWpm = nearestWpm(BASE_WPM * typeRate(authoredScale));\n try {\n const saved = parseInt(localStorage.getItem(TYPE_WPM_KEY) ?? '', 10);\n if (WPM_STEPS.includes(saved)) this.typeWpm = saved;\n } catch { /* private mode */ }\n el.dataset.typeWpm = String(this.typeWpm);\n this.fontIdx = FONT_STEPS.indexOf(1);\n try {\n const saved = parseInt(localStorage.getItem(TERM_FONT_KEY) ?? '', 10);\n if (saved >= 0 && saved < FONT_STEPS.length) this.fontIdx = saved;\n } catch { /* private mode */ }\n this._applyFont();\n // key sound: authored data-type-sound is the default voicing; a presenter\n // pick (the \u266A button) overrides. this.soundName is the picker's selection\n // (a profile name or \"off\"); this.typeSound is the active profile, or null\n // when muted.\n const authoredSnd = (el.dataset.typeSound || 'creamy').toLowerCase();\n this.soundName = SOUND_STEPS.includes(authoredSnd) ? authoredSnd : 'creamy';\n try {\n const saved = localStorage.getItem(TYPE_SOUND_KEY);\n if (saved && SOUND_STEPS.includes(saved)) this.soundName = saved;\n } catch { /* private mode */ }\n this.typeSound = this.soundName === 'off' ? null : this.soundName;\n this.maxStep = (parseFloat(el.dataset.maxStep || '2.5') || 2.5) * 1000;\n this.visibleRows = parseInt(el.dataset.rows || '', 10) || Math.min(cast.meta.rows || DEFAULT_VISIBLE_ROWS, DEFAULT_VISIBLE_ROWS);\n this.epoch = 0; // bumped to cancel in-flight animations\n this.applied = 0; // last fully applied step count\n // hidden steps never play; sleep steps pace play mode but are not builds\n this.playable = cast.steps.filter(s => !s.hidden && s.sleep == null);\n this._mountChrome();\n }\n\n _mountChrome() {\n const title = this.el.dataset.title || 'Terminal';\n this.el.innerHTML =\n `<div class=\"terminal-window\"><div class=\"terminal-titlebar\">` +\n `<span class=\"terminal-dot\"></span><span class=\"terminal-dot\"></span><span class=\"terminal-dot\"></span>` +\n `<span class=\"terminal-title\">${escapeHtml(title)}</span>` +\n `<span class=\"terminal-controls\"></span></div>` +\n `<div class=\"terminal-screen\"><pre class=\"terminal-lines\"></pre></div></div>`;\n this.linesEl = this.el.querySelector('.terminal-lines');\n this.screenEl = this.el.querySelector('.terminal-screen');\n this.controlsEl = this.el.querySelector('.terminal-controls');\n this.screenEl.style.maxHeight = `calc(${this.visibleRows} * var(--term-line-height, 1.45em))`;\n }\n\n // ------------------------------------------------------------- rendering\n\n /** Full instant render of the first `n` playable steps (idempotent ground truth). */\n _renderComplete(n, { withCursor = true } = {}) {\n const parts = [];\n for (let s = 0; s < n; s++) parts.push(this._stepHtml(this.playable[s]));\n if (withCursor && !this.cast.imported) parts.push(this._promptHtml() + `<span class=\"terminal-cursor\"></span>`);\n this.linesEl.innerHTML = parts.join('\\n');\n this._scrollToEnd();\n }\n\n /** Output + interactive-input events of a step, merged on the shared clock. */\n _stepEvents(step) {\n return [\n ...(step.output || []).map(([t, d]) => ({ t, kind: 'o', d })),\n ...(step.input || []).map(([t, d]) => ({ t, kind: 'i', d: d.replace(/\\r?\\n$/, '') })),\n ].sort((a, b) => a.t - b.t);\n }\n\n _stepHtml(step) {\n const screen = new AnsiScreen();\n for (const ev of this._stepEvents(step)) screen.write(ev.d);\n const body = screen.toHtml();\n if (step.raw) return body; // imported stream already contains prompts/echo\n return this._promptHtml() + `<span class=\"terminal-cmd\">${escapeHtml(step.cmd)}</span>` + (body ? '\\n' + body : '');\n }\n\n _promptHtml() {\n return `<span class=\"terminal-prompt\">${escapeHtml(this.prompt)}</span>`;\n }\n\n _scrollToEnd() { this.screenEl.scrollTop = this.screenEl.scrollHeight; }\n\n _applyFont() {\n const scale = FONT_STEPS[this.fontIdx];\n this.el.style.fontSize = scale === 1 ? '' : `${scale}em`;\n }\n\n // A n% \u2014 font-size chooser; click cycles 75% \u2192 160% and wraps. Appended\n // after each mode sets controlsEl.innerHTML, so both modes get it.\n _mountFontButton() {\n const btn = document.createElement('button');\n btn.className = 'terminal-btn terminal-fontsize';\n btn.title = 'font size: click cycles 75% to 160%';\n btn.setAttribute('aria-label', 'font size');\n const label = () => { btn.textContent = `A ${Math.round(FONT_STEPS[this.fontIdx] * 100)}%`; };\n label();\n btn.addEventListener('click', () => {\n this.fontIdx = (this.fontIdx + 1) % FONT_STEPS.length;\n this._applyFont();\n try { localStorage.setItem(TERM_FONT_KEY, String(this.fontIdx)); } catch { /* private mode */ }\n label();\n });\n this.controlsEl.appendChild(btn);\n }\n\n // \u2328 n wpm: words-per-minute picker. Click cycles the presets and wraps,\n // persisted per deck so every terminal (and the next session) follows.\n _mountSpeedButton() {\n const btn = document.createElement('button');\n btn.className = 'terminal-btn terminal-typespeed';\n btn.title = 'typing speed: click cycles words per minute';\n btn.setAttribute('aria-label', 'typing speed');\n const label = () => { btn.textContent = `\u2328 ${this.typeWpm} wpm`; };\n label();\n btn.addEventListener('click', () => {\n const i = (WPM_STEPS.indexOf(this.typeWpm) + 1) % WPM_STEPS.length;\n this.typeWpm = WPM_STEPS[i];\n this.el.dataset.typeWpm = String(this.typeWpm);\n try { localStorage.setItem(TYPE_WPM_KEY, String(this.typeWpm)); } catch { /* private mode */ }\n label();\n });\n this.controlsEl.appendChild(btn);\n }\n\n // \u266A voice: key-sound picker. Click cycles creamy \u2192 clacky \u2192 thocky \u2192 off and\n // wraps, playing one click as feedback (which also unlocks the AudioContext\n // on the gesture). Persisted per deck.\n _mountSoundButton() {\n const btn = document.createElement('button');\n btn.className = 'terminal-btn terminal-typesound';\n btn.title = 'key sound: click cycles creamy, clacky, thocky, off';\n btn.setAttribute('aria-label', 'key sound');\n const label = () => { btn.textContent = `\u266A ${this.soundName}`; };\n label();\n btn.addEventListener('click', () => {\n const i = (SOUND_STEPS.indexOf(this.soundName) + 1) % SOUND_STEPS.length;\n this.soundName = SOUND_STEPS[i];\n this.typeSound = this.soundName === 'off' ? null : this.soundName;\n this.el.dataset.typeSound = this.soundName;\n try { localStorage.setItem(TYPE_SOUND_KEY, this.soundName); } catch { /* private mode */ }\n if (this.typeSound) keyClick('a', this.typeSound, 0.12);\n label();\n });\n this.controlsEl.appendChild(btn);\n }\n\n /** Type `cmd` at the prompt one glyph at a time with humanized cadence.\n * Each keystroke's synth click is fired on the same tick its glyph is\n * painted, and is told how long until the next key so its release tail\n * stays inside this keystroke's window \u2014 sound and typing can't drift.\n * Returns false if a newer epoch cancelled the run mid-command. */\n async _typeCmd(cmd, base, speedFactor, epoch) {\n for (let c = 1; c <= cmd.length; c++) {\n if (this.epoch !== epoch) return false;\n const ch = cmd[c - 1];\n const gap = keyGap(ch) / speedFactor;\n if (this.typeSound) keyClick(ch, this.typeSound, gap / 1000);\n this.linesEl.innerHTML = base + this._promptHtml() +\n `<span class=\"terminal-cmd\">${escapeHtml(cmd.slice(0, c))}</span><span class=\"terminal-cursor\"></span>`;\n this._scrollToEnd();\n await sleep(gap);\n }\n return true;\n }\n\n // ------------------------------------------------------------- step mode\n\n mountStepMode(Decklight) {\n // presenter chrome: typing speed (wpm), key sound, and font size, all\n // persisted per deck so every terminal (and the next session) follows.\n this.controlsEl.innerHTML = '';\n this._mountSpeedButton();\n this._mountSoundButton();\n this._mountFontButton();\n const steps = this.playable;\n // Poster steps arrive pre-rendered and are excluded from the build\n // sequence: provider count = playable - poster, apply(i) shows poster+i.\n const poster = Math.min(Math.max(parseInt(this.el.dataset.poster || '0', 10) || 0, 0), steps.length);\n this.poster = poster;\n this.applied = poster;\n this._renderComplete(poster);\n if (!Decklight || typeof Decklight.registerBuildProvider !== 'function') {\n // Standalone (no engine, e.g. print or docs page): show everything.\n this._renderComplete(steps.length, { withCursor: false });\n return;\n }\n Decklight.registerBuildProvider(this.el, {\n count: steps.length - poster,\n label: i => steps[poster + i] ? `${this.prompt}${steps[poster + i].cmd || '\u25B6 recording'}` : '',\n apply: i => this.applyStep(poster + Math.max(0, Math.min(i, steps.length - poster))),\n });\n }\n\n /** Idempotent: render state for \"first i steps done\". Animates only a\n * single forward advance (i === applied+1); everything else is instant. */\n applyStep(i) {\n this.epoch += 1;\n const animate = i === this.applied + 1;\n this.applied = i;\n if (!animate) { this._renderComplete(i); return; }\n this._animateStep(i - 1, this.epoch);\n }\n\n async _animateStep(stepIdx, epoch) {\n const step = this.playable[stepIdx];\n const speedFactor = (this.typeWpm / BASE_WPM) * (step.typeSpeed || 1);\n // Base: everything before this step, no trailing cursor/prompt.\n const parts = [];\n for (let s = 0; s < stepIdx; s++) parts.push(this._stepHtml(this.playable[s]));\n const base = parts.length ? parts.join('\\n') + '\\n' : '';\n\n // 1) type the command (imported raw streams carry their own echo)\n const cmd = step.cmd || '';\n if (!step.raw) {\n if (!(await this._typeCmd(cmd, base, speedFactor, epoch))) return;\n await sleep(120 / speedFactor);\n }\n\n // 2) stream output + interactive input with recorded pacing, \u2264 maxStep\n const events = this._stepEvents(step);\n const total = events.length ? events[events.length - 1].t * 1000 : 0;\n const scale = total > this.maxStep ? this.maxStep / total : 1;\n const screen = new AnsiScreen();\n const paint = () => {\n const body = screen.toHtml();\n this.linesEl.innerHTML = step.raw\n ? base + body\n : base + this._promptHtml() +\n `<span class=\"terminal-cmd\">${escapeHtml(cmd)}</span>` + (body ? '\\n' + body : '');\n this._scrollToEnd();\n };\n let prevT = 0;\n for (const ev of events) {\n const gap = Math.min((ev.t - prevT) * 1000 * scale, 400);\n prevT = ev.t;\n if (gap > 8) await sleep(gap);\n if (this.epoch !== epoch) return;\n if (ev.kind === 'i') {\n // an interactive answer gets typed, character by character\n for (const ch of ev.d) {\n if (this.epoch !== epoch) return;\n const gap = keyGap(ch) / speedFactor;\n if (this.typeSound) keyClick(ch, this.typeSound, gap / 1000);\n screen.write(ch);\n paint();\n await sleep(gap);\n }\n } else {\n screen.write(ev.d);\n paint();\n }\n }\n if (this.epoch !== epoch) return;\n this._renderComplete(stepIdx + 1); // settle into canonical complete state\n }\n\n // ------------------------------------------------------------- play mode\n\n mountPlayMode() {\n // authored initial playback speed via data-speed; the \u00D7-button cycles 1\u21922\u21924.\n const SPEEDS = [1, 2, 4];\n const authored = parseFloat(this.el.dataset.speed);\n this.speed = SPEEDS.includes(authored) ? authored : 1;\n this.playing = false;\n this.controlsEl.innerHTML =\n `<button class=\"terminal-btn terminal-play\" aria-label=\"play\">\u25B6</button>` +\n `<button class=\"terminal-btn terminal-speed\" aria-label=\"speed\">${this.speed}\u00D7</button>` +\n `<button class=\"terminal-btn terminal-restart\" aria-label=\"restart\">\u21BA</button>`;\n this._mountSoundButton();\n this._mountFontButton();\n const playBtn = this.controlsEl.querySelector('.terminal-play');\n const speedBtn = this.controlsEl.querySelector('.terminal-speed');\n this.controlsEl.querySelector('.terminal-restart').addEventListener('click', () => this._restart(playBtn));\n speedBtn.addEventListener('click', () => {\n this.speed = this.speed >= 4 ? 1 : this.speed * 2;\n speedBtn.textContent = `${this.speed}\u00D7`;\n });\n playBtn.addEventListener('click', () => {\n if (this.playing) { this.playing = false; this.epoch += 1; playBtn.textContent = '\u25B6'; }\n else { playBtn.textContent = '\u23F8'; this._playAll(playBtn); }\n });\n this._renderComplete(0);\n }\n\n _restart(playBtn) {\n this.epoch += 1;\n this.playing = false;\n playBtn.textContent = '\u25B6';\n this._playedUpTo = 0;\n this._renderComplete(0);\n }\n\n async _playAll(playBtn) {\n this.playing = true;\n const epoch = ++this.epoch;\n const from = this._playedUpTo || 0;\n for (let s = from; s < this.cast.steps.length; s++) {\n const step = this.cast.steps[s];\n if (step.hidden) { this._playedUpTo = s + 1; continue; }\n if (step.sleep != null) { // pure pause marker\n await sleep(step.sleep * 1000 / this.speed);\n if (this.epoch !== epoch) { this._playedUpTo = s; return; }\n this._playedUpTo = s + 1;\n continue;\n }\n const shown = this.cast.steps.slice(0, s).filter(x => !x.hidden && x.sleep == null);\n const parts = shown.map(x => this._stepHtml(x));\n const base = parts.length ? parts.join('\\n') + '\\n' : '';\n const speedFactor = this.speed * (step.typeSpeed || 1) * (this.typeWpm / BASE_WPM);\n // type (imported raw streams carry their own echo)\n const cmd = step.cmd || '';\n if (!step.raw) {\n if (!(await this._typeCmd(cmd, base, speedFactor, epoch))) { this._playedUpTo = s; return; }\n }\n // stream at original pacing / speed\n const screen = new AnsiScreen();\n const paint = () => {\n const body = screen.toHtml();\n this.linesEl.innerHTML = step.raw\n ? base + body\n : base + this._promptHtml() +\n `<span class=\"terminal-cmd\">${escapeHtml(cmd)}</span>` + (body ? '\\n' + body : '');\n this._scrollToEnd();\n };\n let prevT = 0;\n for (const ev of this._stepEvents(step)) {\n const gap = (ev.t - prevT) * 1000 / this.speed;\n prevT = ev.t;\n if (gap > 4) await sleep(gap);\n if (this.epoch !== epoch) { this._playedUpTo = s; return; }\n if (ev.kind === 'i') {\n for (const ch of ev.d) {\n if (this.epoch !== epoch) { this._playedUpTo = s; return; }\n const gap = keyGap(ch) / speedFactor;\n if (this.typeSound) keyClick(ch, this.typeSound, gap / 1000);\n screen.write(ch); paint(); await sleep(gap);\n }\n } else { screen.write(ev.d); paint(); }\n }\n await sleep(350 / this.speed);\n this._playedUpTo = s + 1;\n }\n this.playing = false;\n playBtn.textContent = '\u25B6';\n this._playedUpTo = 0;\n this._renderComplete(this.playable.length, { withCursor: true });\n }\n}\n\nfunction sleep(ms) { return new Promise(r => setTimeout(r, ms)); }\n", "/**\n * Decklight ANSI subset renderer (SPEC \u00A77.3).\n *\n * A pure, DOM-free state machine: feed raw PTY chunks (split anywhere, even\n * mid-escape), read back a styled line model or serialized HTML.\n *\n * Supported: SGR 0/1/2/3/4/7/22/23/24/27, 30-37/40-47/90-97/100-107 (16-color,\n * mapped to CSS classes -> theme `--ansi-*` tokens), 38;5/48;5 (256-color) and\n * 38;2/48;2 (truecolor) as inline styles, `\\r` overwrite, `\\b`, `\\t`,\n * EL (`\\x1b[K` variants 0/1/2), cursor forward/back (`\\x1b[nC` / `\\x1b[nD`).\n * Everything else (other CSI, OSC titles, charset selection, keypad modes) is\n * consumed and ignored \u2014 escape bytes never leak into output. Full-screen\n * cursor addressing is out of scope by design.\n */\n\nconst ESC = '\\x1b';\n\nconst BLANK_STYLE = Object.freeze({\n fg: null, bg: null,\n bold: false, dim: false, italic: false, underline: false, inverse: false,\n});\n\n/** Standard xterm 256-color palette entry -> [r,g,b] (only used for n >= 16). */\nexport function xterm256ToRgb(n) {\n if (n < 16) return null; // 0-15 are theme-mapped, not fixed RGB\n if (n >= 16 && n <= 231) {\n const v = n - 16;\n const steps = [0, 95, 135, 175, 215, 255];\n return [steps[Math.floor(v / 36) % 6], steps[Math.floor(v / 6) % 6], steps[v % 6]];\n }\n const gray = 8 + (n - 232) * 10;\n return [gray, gray, gray];\n}\n\nexport function escapeHtml(s) {\n return s.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>');\n}\n\nexport class AnsiScreen {\n constructor() {\n /** @type {{ch: string, style: object}[][]} */\n this.rows = [[]];\n this.row = 0;\n this.col = 0;\n this.style = { ...BLANK_STYLE };\n this._pending = ''; // partial escape sequence carried across chunks\n }\n\n /** Feed a raw chunk. */\n write(chunk) {\n let data = this._pending + chunk;\n this._pending = '';\n let i = 0;\n while (i < data.length) {\n const ch = data[i];\n if (ch === ESC) {\n const consumed = this._consumeEscape(data, i);\n if (consumed === 0) { this._pending = data.slice(i); return; } // incomplete: buffer\n i += consumed;\n continue;\n }\n i += 1;\n if (ch === '\\n') { this._lineFeed(); continue; }\n if (ch === '\\r') { this.col = 0; continue; }\n if (ch === '\\b') { this.col = Math.max(0, this.col - 1); continue; }\n if (ch === '\\t') { this.col = (Math.floor(this.col / 8) + 1) * 8; continue; }\n if (ch === '\\x07') continue; // bell\n if (ch < ' ' && ch !== '\\t') continue; // other C0 controls: ignore\n this._putChar(ch);\n }\n }\n\n _lineFeed() {\n this.row += 1;\n if (!this.rows[this.row]) this.rows[this.row] = [];\n // PTYs run with onlcr so we virtually always see \\r\\n; keep the column for\n // correctness on bare \\n.\n }\n\n _putChar(ch) {\n const line = this.rows[this.row];\n while (line.length < this.col) line.push({ ch: ' ', style: BLANK_STYLE });\n line[this.col] = { ch, style: { ...this.style } };\n this.col += 1;\n }\n\n /**\n * Consume one escape sequence starting at data[i] (an ESC).\n * Returns the number of chars consumed, or 0 if the sequence is incomplete\n * (caller buffers the remainder for the next chunk).\n */\n _consumeEscape(data, i) {\n if (i + 1 >= data.length) return 0;\n const kind = data[i + 1];\n\n if (kind === '[') { // CSI\n let j = i + 2;\n while (j < data.length) {\n const c = data.charCodeAt(j);\n if (c >= 0x40 && c <= 0x7e) { // final byte\n this._handleCsi(data.slice(i + 2, j), data[j]);\n return j - i + 1;\n }\n j += 1;\n }\n return 0; // incomplete\n }\n\n if (kind === ']') { // OSC \u2014 terminated by BEL or ST (ESC \\)\n let j = i + 2;\n while (j < data.length) {\n if (data[j] === '\\x07') return j - i + 1;\n if (data[j] === ESC && data[j + 1] === '\\\\') return j - i + 2;\n if (data[j] === ESC && j + 1 >= data.length) return 0;\n j += 1;\n }\n return 0;\n }\n\n if (kind === '(' || kind === ')') { // charset selection: ESC ( B\n return i + 2 < data.length ? 3 : 0;\n }\n\n // Single-char escapes: ESC =, ESC >, ESC 7, ESC 8, ESC M, ESC c ...\n return 2;\n }\n\n _handleCsi(params, final) {\n // Private-mode sequences like \\x1b[?25l \u2014 consume, ignore.\n if (params.startsWith('?')) return;\n switch (final) {\n case 'm': this._sgr(params); return;\n case 'K': this._eraseLine(params); return;\n case 'C': this.col += Math.max(1, parseInt(params || '1', 10) || 1); return;\n case 'D': this.col = Math.max(0, this.col - (Math.max(1, parseInt(params || '1', 10) || 1))); return;\n default: return; // cursor addressing, ED, scroll regions\u2026 out of scope\n }\n }\n\n _eraseLine(params) {\n const mode = parseInt(params || '0', 10) || 0;\n const line = this.rows[this.row];\n if (mode === 0) { line.length = Math.min(line.length, this.col); return; }\n if (mode === 1) {\n for (let c = 0; c <= Math.min(this.col, line.length - 1); c++) line[c] = { ch: ' ', style: BLANK_STYLE };\n return;\n }\n if (mode === 2) { line.length = 0; return; }\n }\n\n _sgr(params) {\n const p = params === '' ? [0] : params.split(';').map(x => parseInt(x, 10) || 0);\n let i = 0;\n while (i < p.length) {\n const n = p[i];\n if (n === 0) this.style = { ...BLANK_STYLE };\n else if (n === 1) this.style.bold = true;\n else if (n === 2) this.style.dim = true;\n else if (n === 3) this.style.italic = true;\n else if (n === 4) this.style.underline = true;\n else if (n === 7) this.style.inverse = true;\n else if (n === 22) { this.style.bold = false; this.style.dim = false; }\n else if (n === 23) this.style.italic = false;\n else if (n === 24) this.style.underline = false;\n else if (n === 27) this.style.inverse = false;\n else if (n >= 30 && n <= 37) this.style.fg = { type: 'ansi', idx: n - 30 };\n else if (n >= 90 && n <= 97) this.style.fg = { type: 'ansi', idx: n - 90 + 8 };\n else if (n === 39) this.style.fg = null;\n else if (n >= 40 && n <= 47) this.style.bg = { type: 'ansi', idx: n - 40 };\n else if (n >= 100 && n <= 107) this.style.bg = { type: 'ansi', idx: n - 100 + 8 };\n else if (n === 49) this.style.bg = null;\n else if (n === 38 || n === 48) {\n const target = n === 38 ? 'fg' : 'bg';\n if (p[i + 1] === 5 && p.length > i + 2) { this.style[target] = { type: '256', idx: p[i + 2] }; i += 2; }\n else if (p[i + 1] === 2 && p.length > i + 4) {\n this.style[target] = { type: 'rgb', r: p[i + 2], g: p[i + 3], b: p[i + 4] };\n i += 4;\n }\n }\n i += 1;\n }\n }\n\n /** Line model: consecutive same-styled cells merged into spans. */\n get lines() {\n return this.rows.map(row => {\n const spans = [];\n for (const cell of row) {\n const last = spans[spans.length - 1];\n if (last && sameStyle(last.style, cell.style)) last.text += cell.ch;\n else spans.push({ text: cell.ch, style: cell.style });\n }\n return spans;\n });\n }\n\n /** Serialize to HTML. 16-color -> classes (theme tokens); 256/truecolor -> inline. */\n toHtml() {\n return this.lines.map(spans => spansToHtml(spans)).join('\\n');\n }\n}\n\nfunction sameStyle(a, b) {\n return a.bold === b.bold && a.dim === b.dim && a.italic === b.italic &&\n a.underline === b.underline && a.inverse === b.inverse &&\n colorEq(a.fg, b.fg) && colorEq(a.bg, b.bg);\n}\n\nfunction colorEq(a, b) {\n if (a === b) return true;\n if (!a || !b) return false;\n return a.type === b.type && a.idx === b.idx && a.r === b.r && a.g === b.g && a.b === b.b;\n}\n\nfunction colorCss(c) {\n if (c.type === '256') {\n if (c.idx < 16) return null; // handled via class\n const [r, g, b] = xterm256ToRgb(c.idx);\n return `rgb(${r},${g},${b})`;\n }\n if (c.type === 'rgb') return `rgb(${c.r},${c.g},${c.b})`;\n return null;\n}\n\nexport function spansToHtml(spans) {\n return spans.map(({ text, style }) => {\n const classes = [];\n const css = [];\n let { fg, bg } = style;\n if (style.inverse) [fg, bg] = [bg ?? { type: 'inv-default-bg' }, fg ?? { type: 'inv-default-fg' }];\n for (const [color, kind] of [[fg, 'fg'], [bg, 'bg']]) {\n if (!color) continue;\n if (color.type === 'ansi' || (color.type === '256' && color.idx < 16)) {\n classes.push(`ansi-${kind}-${color.idx}`);\n } else if (color.type === 'inv-default-bg') classes.push('ansi-inv-fg'); // fg becomes default bg color\n else if (color.type === 'inv-default-fg') classes.push('ansi-inv-bg');\n else {\n const v = colorCss(color);\n if (v) css.push(`${kind === 'fg' ? 'color' : 'background-color'}:${v}`);\n }\n }\n if (style.bold) classes.push('ansi-bold');\n if (style.dim) classes.push('ansi-dim');\n if (style.italic) classes.push('ansi-italic');\n if (style.underline) classes.push('ansi-underline');\n const esc = escapeHtml(text);\n if (!classes.length && !css.length) return esc;\n const cls = classes.length ? ` class=\"${classes.join(' ')}\"` : '';\n const sty = css.length ? ` style=\"${css.join(';')}\"` : '';\n return `<span${cls}${sty}>${esc}</span>`;\n }).join('');\n}\n"],
|
|
5
|
+
"mappings": "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ACA,QACA,WACA,UACA,OACA,MACA,WACA,OACA,YACA,UACA,UACA,WACF,EAEMC,EAAqB,CACzB,MACA,MACA,YACA,OACA,QACA,QACA,OACA,MACF,EAGMC,EAAiB,CACrB,MACA,OACA,MACA,WACA,QACA,MACA,MACA,MACA,QACA,YACA,wBACA,KACA,aACA,OACA,aACA,KACA,OACA,SACA,gBACA,MACA,QACA,cACA,kBACA,UACA,SACA,SACA,OACA,UACA,OACA,KACA,OACA,SACA,cACA,WACA,OACA,OACA,OACA,UACA,OACA,cACA,YACA,mBACA,QACA,aACA,OACA,QACA,WACA,UACA,UACA,SACA,SACA,YACA,UACA,aACA,WACA,UACA,OACA,OACA,gBACA,MACA,OACA,QACA,YACA,aACA,SACA,QACA,OACA,YACA,UACA,kBACA,eACA,kCACA,eACA,eACA,cACA,iBACA,eACA,oBACA,eACA,eACA,mCACA,eACA,SACA,QACA,OACA,MACA,aACA,MACA,UACA,WACA,UACA,UACA,SACA,SACA,aACA,QACA,WACA,gBACA,aACA,WACA,SACA,OACA,UACA,OACA,UACA,OACA,QACA,MACA,YACA,gBACA,WACA,SACA,SACA,QACA,SACA,OACA,UACA,SACA,MACA,WACA,UACA,QACA,QACA,SACA,cACA,QACA,QACA,MACA,UACA,YACA,OACA,OACA,OACA,WACA,SACA,MACA,SACA,QACA,QACA,WACA,SACA,SACA,OACA,OACA,WACA,KACA,YACA,UACA,QACA,QACA,cACA,SACA,MACA,UACA,YACA,eACA,WACA,OACA,KACA,OACA,aACA,gBACA,cACA,cACA,iBACA,aACA,aACA,uBACA,aACA,MACA,WACA,QACA,aACA,UACA,OACA,UACA,OACA,OACA,aACA,UACA,KACA,QACA,YACA,iBACA,MACA,QACA,QACA,QACA,eACA,kBACA,UACA,MACA,SACA,QACA,SACA,MACA,SACA,MACA,WACA,SACA,QACA,WACA,WACA,UACA,QACA,QACA,MACA,KACA,OACA,YACA,MACA,YACA,QACA,OACA,SACA,UACA,eACA,oBACA,KACA,SACA,MACA,OACA,KACA,MACA,OACA,OACA,KACA,QACA,MACA,QACA,OACA,WACA,UACA,YACA,YACA,UACA,MACA,UACA,eACA,kBACA,kBACA,SACA,UACA,WACA,iBACA,QACA,WACA,YACA,UACA,UACA,YACA,MACA,QACA,OACA,QACA,OACA,YACA,MACA,aACA,cACA,YACA,YACA,aACA,iBACA,UACA,aACA,WACA,WACA,WACA,UACA,SACA,SACA,UACA,SACA,QACA,WACA,SACA,MACA,aACA,OACA,UACA,YACA,QACA,SACA,SACA,SACA,OACA,SACA,YACA,eACA,MACA,OACA,UACA,MACA,OACA,OACA,WACA,OACA,WACA,eACA,MACA,eACA,WACA,aACA,OACA,QACA,SACA,aACA,cACA,cACA,SACA,YACA,kBACA,WACA,MACA,YACA,SACA,cACA,cACA,QACA,cACA,MACA,OACA,OACA,OACA,YACA,gBACA,kBACA,KACA,WACA,YACA,kBACA,cACA,QACA,UACA,OACA,aACA,OACA,WACA,UACA,QACA,SACA,UACA,SACA,SACA,QACA,OACA,QACA,QACA,SACA,WACA,UACA,WACA,YACA,UACA,UACA,aACA,OACA,WACA,QACA,eACA,SACA,OACA,SACA,UACA,MACF,EAKMC,EAAqB,CACzB,MACA,OACA,YACA,OACA,OACA,MACA,OACA,OACA,UACA,WACA,OACA,MACA,OACA,QACA,YACA,aACA,YACA,aACA,QACA,UACA,MACA,UACA,cACA,QACA,aACA,gBACA,cACA,cACA,iBACA,aACA,aACA,uBACA,aACA,MACA,aACA,OACA,UACA,KACA,MACA,QACA,QACA,MACA,MACA,MACA,YACA,QACA,SACA,eACA,kBACA,kBACA,WACA,iBACA,QACA,OACA,YACA,YACA,aACA,iBACA,UACA,aACA,WACA,WACA,WACA,aACA,MACA,OACA,OACA,aACA,cACA,YACA,kBACA,MACA,MACA,OACA,YACA,kBACA,QACA,OACA,aACA,SACA,QACA,WACA,UACA,WACA,cACF,EAGMC,EAA0B,CAC9B,kBACA,eACA,kCACA,eACA,eACA,iBACA,mCACA,eACA,eACA,cACA,cACA,eACA,YACA,oBACA,gBACF,EAIMC,EAAS,CACb,eACA,cACA,cACA,cACA,WACA,cACA,iBACA,gBACA,cACA,gBACA,gBACA,eACA,cACA,aACA,cACA,eACF,EAEMC,EAAYH,EAEZI,EAAW,CACf,GAAGL,EACH,GAAGD,CACL,EAAE,OAAQO,GACD,CAACL,EAAmB,SAASK,CAAO,CAC5C,EAEKC,EAAW,CACf,MAAO,WACP,MAAO,qBACT,EAEMC,EAAW,CACf,MAAO,WACP,MAAO,gDACP,UAAW,CACb,EAEMC,EAAgB,CACpB,MAAOjB,EAAM,OAAO,KAAMA,EAAM,OAAO,GAAGY,CAAS,EAAG,OAAO,EAC7D,UAAW,EACX,SAAU,CAAE,SAAUA,CAAU,CAClC,EAMA,SAASM,EAAaC,EAAM,CAC1B,OAAOnB,EAAM,OACX,KACAA,EAAM,OAAO,GAAGmB,EAAK,IAAKC,GACjBA,EAAG,QAAQ,MAAO,MAAM,CAChC,CAAC,EACF,IACF,CACF,CAEA,IAAMC,EAAsB,CAC1B,MAAO,UACP,MAAOH,EAAaP,CAAM,EAC1B,UAAW,CACb,EAGA,SAASW,EAAgBH,EAAM,CAC7B,WAAAI,EAAY,KAAAC,EACd,EAAI,CAAC,EAAG,CACN,IAAMC,EAAYD,GAClB,OAAAD,EAAaA,GAAc,CAAC,EACrBJ,EAAK,IAAKO,IACXA,GAAK,MAAM,QAAQ,GAAKH,EAAW,SAASG,EAAI,EAC3CA,GACED,EAAUC,EAAI,EAChB,GAAGA,EAAI,KAEPA,EAEV,CACH,CAEA,MAAO,CACL,KAAM,MACN,iBAAkB,GAElB,QAAS,WACT,SAAU,CACR,SAAU,YACV,QACEJ,EAAgBT,EAAU,CAAE,KAAOc,GAAMA,EAAE,OAAS,CAAE,CAAC,EACzD,QAASvB,EACT,KAAME,EACN,SAAUI,CACZ,EACA,SAAU,CACR,CACE,MAAO,OACP,MAAOQ,EAAab,CAAgB,CACtC,EACAgB,EACAJ,EACAF,EACAb,EACAC,EACAJ,EAAK,cACLA,EAAK,qBACLE,EACAe,CACF,CACF,CACF,CClrBAY,IAAAC,IAAA,IAAMC,GAAW,2BACXC,GAAW,CACf,KACA,KACA,KACA,KACA,MACA,QACA,UACA,MACA,MACA,WACA,KACA,SACA,OACA,OACA,QACA,QACA,aACA,OACA,QACA,OACA,UACA,MACA,SACA,WACA,SACA,SACA,MACA,QACA,QACA,QAIA,WACA,QACA,QACA,SACA,SACA,OACA,SACA,UAEA,OACF,EACMC,GAAW,CACf,OACA,QACA,OACA,YACA,MACA,UACF,EAGMC,GAAQ,CAEZ,SACA,WACA,UACA,SAEA,OACA,OACA,SACA,SAEA,SACA,SAEA,QACA,eACA,eACA,YACA,aACA,oBACA,aACA,aACA,cACA,cACA,gBACA,iBAEA,MACA,MACA,UACA,UAEA,cACA,oBACA,UACA,WACA,OAEA,UACA,YACA,oBACA,gBAEA,UACA,QAEA,OAEA,aACF,EAEMC,GAAc,CAClB,QACA,YACA,gBACA,aACA,iBACA,cACA,YACA,UACF,EAEMC,GAAmB,CACvB,cACA,aACA,gBACA,eAEA,UACA,UAEA,OACA,WACA,QACA,aACA,WACA,YACA,qBACA,YACA,qBACA,SACA,UACF,EAEMC,GAAqB,CACzB,YACA,OACA,QACA,UACA,SACA,WACA,eACA,iBACA,SACA,QACF,EAEMC,GAAY,CAAC,EAAE,OACnBF,GACAF,GACAC,EACF,EAWA,SAASI,GAAWC,EAAM,CACxB,IAAMC,EAAQD,EAAK,MAQbE,EAAgB,CAACC,EAAO,CAAE,MAAAC,CAAM,IAAM,CAC1C,IAAMC,EAAM,KAAOF,EAAM,CAAC,EAAE,MAAM,CAAC,EAEnC,OADYA,EAAM,MAAM,QAAQE,EAAKD,CAAK,IAC3B,EACjB,EAEME,EAAaf,GACbgB,EAAW,CACf,MAAO,KACP,IAAK,KACP,EAEMC,EAAmB,4BACnBC,EAAU,CACd,MAAO,sBACP,IAAK,4BAKL,kBAAmB,CAACN,EAAOO,IAAa,CACtC,IAAMC,EAAkBR,EAAM,CAAC,EAAE,OAASA,EA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,UAAW,CACb,EACA,CACE,MAAO,CAAE,wBAAyB,EAClC,UAAW,CAAE,EAAG,gBAAiB,EACjC,SAAU,CAAEuB,CAAO,CACrB,EACAQ,GACAH,GACAJ,GACAS,GACA,CACE,MAAO,QACT,CACF,CACF,CACF,CC9vBAG,IAAAC,IAAA,IAAMC,GAAW,2BACXC,GAAW,CACf,KACA,KACA,KACA,KACA,MACA,QACA,UACA,MACA,MACA,WACA,KACA,SACA,OACA,OACA,QACA,QACA,aACA,OACA,QACA,OACA,UACA,MACA,SACA,WACA,SACA,SACA,MACA,QACA,QACA,QAIA,WACA,QACA,QACA,SACA,SACA,OACA,SACA,UAEA,OACF,EACMC,GAAW,CACf,OACA,QACA,OACA,YACA,MACA,UACF,EAGMC,GAAQ,CAEZ,SACA,WACA,UACA,SAEA,OACA,OACA,SACA,SAEA,SACA,SAEA,QACA,eACA,eACA,YACA,aACA,oBACA,aACA,aACA,cACA,cACA,gBACA,iBAEA,MACA,MACA,UACA,UAEA,cACA,oBACA,UACA,WACA,OAEA,UACA,YACA,oBACA,gBAEA,UACA,QAEA,OAEA,aACF,EAEMC,GAAc,CAClB,QACA,YACA,gBACA,aACA,iBACA,cACA,YACA,UACF,EAEMC,GAAmB,CACvB,cACA,aACA,gBACA,eAEA,UACA,UAEA,OACA,WACA,QACA,aACA,WACA,YACA,qBACA,YACA,qBACA,SACA,UACF,EAEMC,GAAqB,CACzB,YACA,OACA,QACA,UACA,SACA,WACA,eACA,iBACA,SACA,QACF,EAEMC,GAAY,CAAC,EAAE,OACnBF,GACAF,GACAC,EACF,EAWA,SAASI,GAAWC,EAAM,CACxB,IAAMC,EAAQD,EAAK,MAQbE,EAAgB,CAACC,EAAO,CAAE,MAAAC,CAAM,IAAM,CAC1C,IAAMC,EAAM,KAAOF,EAAM,CAAC,EAAE,MAAM,CAAC,EAEnC,OADYA,EAAM,MAAM,QAAQE,EAAKD,CAAK,IAC3B,EACjB,EAEME,EAAaf,GACbgB,EAAW,CACf,MAAO,KACP,IAAK,KACP,EAEMC,EAAmB,4BACnBC,EAAU,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EAGtEC,EAA2B,OAAO,OAAO,CAAC,EAC9CF,EACA,CAAE,MAAOpD,EAAM,OAAOK,EAAYL,EAAM,UAAU,QAAQ,CAAC,CAAE,CAC/D,EACA0C,EAAW,QAAQ,gBAAgB,KAAK,CACtCA,EAAW,QAAQ,gBACnBU,EACAE,CACF,CAAC,EAGDZ,EAAW,SAAWA,EAAW,SAAS,OAAO,CAC/CI,EACAH,EACAC,EACAU,CACF,CAAC,EAGDP,EAASL,EAAY,UAAW3C,EAAK,QAAQ,CAAC,EAE9CgD,EAASL,EAAY,aAAcX,CAAU,EAE7C,IAAMwB,EAAsBb,EAAW,SAAS,KAAK9B,GAAKA,EAAE,QAAU,UAAU,EAChF,OAAA2C,EAAoB,UAAY,EAEhC,OAAO,OAAOb,EAAY,CACxB,KAAM,aACN,QAAS,CACP,KACA,MACA,MACA,KACF,CACF,CAAC,EAEMA,CACT,CC94BAc,IAAAC,IAOA,SAASC,GAAOC,EAAM,CACpB,IAAMC,EAAQD,EAAK,MACbE,EAAW,qCACXC,EAAiB,CACrB,MACA,KACA,SACA,QACA,QACA,QACA,OACA,QACA,WACA,MACA,MACA,OACA,OACA,SACA,UACA,MACA,OACA,SACA,KACA,SACA,KACA,KACA,SACA,QACA,cACA,MACA,KACA,OACA,QACA,SACA,MACA,QACA,OACA,OACF,EAsGMC,EAAW,CACf,SAAU,sBACV,QAASD,EACT,SAvGgB,CAChB,aACA,MACA,MACA,MACA,QACA,MACA,OACA,aACA,YACA,QACA,WACA,MACA,cACA,UACA,UACA,UACA,OACA,MACA,SACA,YACA,OACA,OACA,SACA,QACA,SACA,YACA,UACA,UACA,UACA,OACA,OACA,MACA,KACA,QACA,MACA,aACA,aACA,OACA,MACA,OACA,SACA,MACA,MACA,aACA,MACA,OACA,SACA,MACA,OACA,MACA,MACA,QACA,WACA,QACA,OACA,WACA,QACA,MACA,UACA,QACA,SACA,eACA,MACA,MACA,QACA,QACA,OACA,OACA,KACF,EAkCE,QAhCe,CACf,YACA,WACA,QACA,OACA,iBACA,MACF,EA0BE,KArBY,CACZ,MACA,WACA,YACA,OACA,OACA,UACA,UACA,WACA,WACA,MACA,QACA,OACA,OACF,CAQA,EAEME,EAAS,CACb,UAAW,OACX,MAAO,gBACT,EAEMC,EAAQ,CACZ,UAAW,QACX,MAAO,KACP,IAAK,KACL,SAAUF,EACV,QAAS,GACX,EAEMG,EAAkB,CACtB,MAAO,OACP,UAAW,CACb,EAEMC,EAAS,CACb,UAAW,SACX,SAAU,CAAER,EAAK,gBAAiB,EAClC,SAAU,CACR,CACE,MAAO,yCACP,IAAK,MACL,SAAU,CACRA,EAAK,iBACLK,CACF,EACA,UAAW,EACb,EACA,CACE,MAAO,yCACP,IAAK,MACL,SAAU,CACRL,EAAK,iBACLK,CACF,EACA,UAAW,EACb,EACA,CACE,MAAO,8BACP,IAAK,MACL,SAAU,CACRL,EAAK,iBACLK,EACAE,EACAD,CACF,CACF,EACA,CACE,MAAO,8BACP,IAAK,MACL,SAAU,CACRN,EAAK,iBACLK,EACAE,EACAD,CACF,CACF,EACA,CACE,MAAO,eACP,IAAK,IACL,UAAW,EACb,EACA,CACE,MAAO,eACP,IAAK,IACL,UAAW,EACb,EACA,CACE,MAAO,4BACP,IAAK,GACP,EACA,CACE,MAAO,4BACP,IAAK,GACP,EACA,CACE,MAAO,4BACP,IAAK,IACL,SAAU,CACRN,EAAK,iBACLO,EACAD,CACF,CACF,EACA,CACE,MAAO,4BACP,IAAK,IACL,SAAU,CACRN,EAAK,iBACLO,EACAD,CACF,CACF,EACAN,EAAK,iBACLA,EAAK,iBACP,CACF,EAGMS,EAAY,kBACZC,EAAa,QAAQD,CAAS,UAAUA,CAAS,SAASA,CAAS,OAMnEE,EAAY,OAAOR,EAAe,KAAK,GAAG,CAAC,GAC3CS,EAAS,CACb,UAAW,SACX,UAAW,EACX,SAAU,CAWR,CACE,MAAO,QAAQH,CAAS,MAAMC,CAAU,eAAeD,CAAS,YAAYE,CAAS,GACvF,EACA,CACE,MAAO,IAAID,CAAU,QACvB,EAQA,CACE,MAAO,0CAA0CC,CAAS,GAC5D,EACA,CACE,MAAO,4BAA4BA,CAAS,GAC9C,EACA,CACE,MAAO,6BAA6BA,CAAS,GAC/C,EACA,CACE,MAAO,mCAAmCA,CAAS,GACrD,EAIA,CACE,MAAO,OAAOF,CAAS,WAAWE,CAAS,GAC7C,CACF,CACF,EACME,EAAe,CACnB,UAAW,UACX,MAAOZ,EAAM,UAAU,SAAS,EAChC,IAAK,IACL,SAAUG,EACV,SAAU,CACR,CACE,MAAO,SACT,EAEA,CACE,MAAO,IACP,IAAK,OACL,eAAgB,EAClB,CACF,CACF,EACMU,EAAS,CACb,UAAW,SACX,SAAU,CAER,CACE,UAAW,GACX,MAAO,UACP,KAAM,EACR,EACA,CACE,MAAO,KACP,IAAK,KACL,aAAc,GACd,WAAY,GACZ,SAAUV,EACV,SAAU,CACR,OACAC,EACAO,EACAJ,EACAR,EAAK,iBACP,CACF,CACF,CACF,EACA,OAAAM,EAAM,SAAW,CACfE,EACAI,EACAP,CACF,EAEO,CACL,KAAM,SACN,QAAS,CACP,KACA,MACA,SACF,EACA,aAAc,GACd,SAAUD,EACV,QAAS,cACT,SAAU,CACRC,EACAO,EACA,CAEE,MAAO,oBACP,MAAO,UACT,EACA,CAGE,cAAe,KACf,UAAW,CACb,EACA,CAAE,MAAO,SAAU,MAAO,SAAU,EACpCJ,EACAK,EACAb,EAAK,kBACL,CACE,MAAO,CACL,QAAS,MACTE,CACF,EACA,MAAO,CACL,EAAG,UACH,EAAG,gBACL,EACA,SAAU,CAAEY,CAAO,CACrB,EACA,CACE,SAAU,CACR,CACE,MAAO,CACL,UAAW,MACXZ,EAAU,MACV,QAASA,EAAS,OACpB,CACF,EACA,CACE,MAAO,CACL,UAAW,MACXA,CACF,CACF,CACF,EACA,MAAO,CACL,EAAG,UACH,EAAG,cACH,EAAG,uBACL,CACF,EACA,CACE,UAAW,OACX,MAAO,WACP,IAAK,UACL,SAAU,CACRU,EACAE,EACAN,CACF,CACF,CACF,CACF,CACF,CCjbAO,IAAAC,IASA,SAASC,GAAKC,EAAM,CAClB,IAAMC,EAAQD,EAAK,MACbE,EAAM,CAAC,EACPC,EAAa,CACjB,MAAO,OACP,IAAK,KACL,SAAU,CACR,OACA,CACE,MAAO,KACP,SAAU,CAAED,CAAI,CAClB,CACF,CACF,EACA,OAAO,OAAOA,EAAK,CACjB,UAAW,WACX,SAAU,CACR,CAAE,MAAOD,EAAM,OAAO,qBAGpB,qBAAqB,CAAE,EACzBE,CACF,CACF,CAAC,EAED,IAAMC,EAAQ,CACZ,UAAW,QACX,MAAO,OACP,IAAK,KACL,SAAU,CAAEJ,EAAK,gBAAiB,CACpC,EACMK,EAAUL,EAAK,QACnBA,EAAK,QAAQ,EACb,CACE,MAAO,CACL,SACA,MACF,EACA,MAAO,CACL,EAAG,SACL,CACF,CACF,EACMM,EAAW,CACf,MAAO,iBACP,OAAQ,CAAE,SAAU,CAClBN,EAAK,kBAAkB,CACrB,MAAO,QACP,IAAK,QACL,UAAW,QACb,CAAC,CACH,CAAE,CACJ,EACMO,EAAe,CACnB,UAAW,SACX,MAAO,IACP,IAAK,IACL,SAAU,CACRP,EAAK,iBACLE,EACAE,CACF,CACF,EACAA,EAAM,SAAS,KAAKG,CAAY,EAChC,IAAMC,EAAgB,CACpB,MAAO,KACT,EACMC,EAAc,CAClB,UAAW,SACX,MAAO,IACP,IAAK,GACP,EACMC,EAAe,CACnB,MAAO,KACT,EACMC,EAAa,CACjB,MAAO,UACP,IAAK,OACL,SAAU,CACR,CACE,MAAO,gBACP,UAAW,QACb,EACAX,EAAK,YACLE,CACF,CACF,EACMU,EAAiB,CACrB,OACA,OACA,MACA,KACA,MACA,MACA,OACA,OACA,MACF,EACMC,EAAgBb,EAAK,QAAQ,CACjC,OAAQ,IAAIY,EAAe,KAAK,GAAG,CAAC,IACpC,UAAW,EACb,CAAC,EACKE,EAAW,CACf,UAAW,WACX,MAAO,4BACP,YAAa,GACb,SAAU,CAAEd,EAAK,QAAQA,EAAK,WAAY,CAAE,MAAO,YAAa,CAAC,CAAE,EACnE,UAAW,CACb,EAEMe,EAAW,CACf,KACA,OACA,OACA,OACA,KACA,OACA,MACA,QACA,QACA,KACA,KACA,OACA,OACA,OACA,SACA,WACA,QACF,EAEMC,EAAW,CACf,OACA,OACF,EAGMC,EAAY,CAAE,MAAO,gBAAiB,EAGtCC,EAAkB,CACtB,QACA,KACA,WACA,OACA,OACA,OACA,SACA,UACA,OACA,MACA,WACA,SACA,QACA,OACA,QACA,OACA,QACA,OACF,EAEMC,EAAiB,CACrB,QACA,OACA,UACA,SACA,UACA,UACA,OACA,SACA,OACA,MACA,QACA,SACA,UACA,SACA,OACA,YACA,SACA,OACA,OACA,UACA,SACA,SACF,EAEMC,EAAgB,CACpB,WACA,KACA,UACA,MACA,MACA,QACA,QACA,gBACA,WACA,UACA,eACA,YACA,aACA,YACA,WACA,UACA,aACA,OACA,UACA,SACA,SACA,SACA,UACA,KACA,KACA,QACA,YACA,SACA,QACA,UACA,UACA,OACA,OACA,QACA,MACA,SACA,OACA,QACA,QACA,SACA,SACA,QACA,SACA,SACA,OACA,UACA,SACA,aACA,SACA,UACA,WACA,QACA,OACA,SACA,QACA,QACA,WACA,UACA,OACA,MACA,WACA,aACA,QACA,OACA,cACA,UACA,SACA,MACF,EAEMC,EAAiB,CACrB,QACA,QACA,QACA,QACA,KACA,KACA,KACA,MACA,YACA,KACA,KACA,QACA,SACA,QACA,SACA,KACA,WACA,KACA,QACA,QACA,OACA,QACA,WACA,OACA,QACA,SACA,SACA,MACA,QACA,OACA,SACA,MACA,SACA,MACA,OACA,OACA,OACA,SACA,KACA,SACA,KACA,QACA,MACA,KACA,UACA,YACA,YACA,YACA,YACA,OACA,OACA,QACA,MACA,MACA,OACA,KACA,QACA,WACA,OACA,KACA,OACA,WACA,SACA,OACA,UACA,KACA,OACA,MACA,OACA,SAEA,SACA,SACA,KACA,OACA,UACA,OACA,QACA,QACA,UACA,QACA,WACA,SACA,MACA,WACA,SACA,MACA,QACA,OACA,SACA,OACA,MACA,OACA,UAEA,MACA,QACA,SACA,SACA,QACA,MACA,SACA,KACF,EAEA,MAAO,CACL,KAAM,OACN,QAAS,CACP,KACA,KACF,EACA,SAAU,CACR,SAAU,wBACV,QAASN,EACT,QAASC,EACT,SAAU,CACR,GAAGE,EACH,GAAGC,EAEH,MACA,QACA,GAAGC,EACH,GAAGC,CACL,CACF,EACA,SAAU,CACRR,EACAb,EAAK,QAAQ,EACbc,EACAH,EACAN,EACAC,EACAW,EACAV,EACAC,EACAC,EACAC,EACAR,CACF,CACF,CACF,CCtZAoB,IAAAC,IASA,SAASC,GAAKC,EAAM,CAClB,IAAMC,EAAW,yBAGXC,EAAiB,8BAMjBC,EAAM,CACV,UAAW,OACX,SAAU,CAER,CAAE,MAAO,mCAAoC,EAC7C,CACE,MAAO,qCAAsC,EAC/C,CACE,MAAO,qCAAsC,CACjD,CACF,EAEMC,EAAqB,CACzB,UAAW,oBACX,SAAU,CACR,CACE,MAAO,OACP,IAAK,MACP,EACA,CACE,MAAO,MACP,IAAK,IACP,CACF,CACF,EAEMC,EAAsB,CAC1B,UAAW,SACX,UAAW,EACX,MAAO,IACP,IAAK,IACL,SAAU,CACR,CACE,MAAO,KACP,MAAO,cACP,UAAW,CACb,CACF,CACF,EAEMC,EAAS,CACb,UAAW,SACX,UAAW,EACX,SAAU,CACR,CACE,MAAO,IACP,IAAK,GACP,EACA,CAAE,MAAO,KAAM,CACjB,EACA,SAAU,CACRN,EAAK,iBACLI,CACF,CACF,EAIMG,EAAmBP,EAAK,QAAQM,EAAQ,CAAE,SAAU,CACxD,CACE,MAAO,IACP,IAAK,IACL,SAAU,CACR,CACE,MAAO,KACP,UAAW,CACb,CACF,CACF,EACA,CACE,MAAO,IACP,IAAK,GACP,EACA,CAAE,MAAO,cAAe,CAC1B,CAAE,CAAC,EAMGE,EAAY,CAChB,UAAW,SACX,MAAO,MANO,6BACA,yCACI,eACJ,8CAG6C,KAC7D,EAEMC,EAAkB,CACtB,IAAK,IACL,eAAgB,GAChB,WAAY,GACZ,SAAUR,EACV,UAAW,CACb,EACMS,EAAS,CACb,MAAO,KACP,IAAK,KACL,SAAU,CAAED,CAAgB,EAC5B,QAAS,MACT,UAAW,CACb,EACME,EAAQ,CACZ,MAAO,MACP,IAAK,MACL,SAAU,CAAEF,CAAgB,EAC5B,QAAS,MACT,UAAW,CACb,EAEMG,EAAQ,CACZT,EACA,CACE,UAAW,OACX,MAAO,YACP,UAAW,EACb,EACA,CAKE,UAAW,SACX,MAAO,+DACT,EACA,CACE,MAAO,WACP,IAAK,UACL,YAAa,OACb,aAAc,GACd,WAAY,GACZ,UAAW,CACb,EACA,CACE,UAAW,OACX,MAAO,SAAWD,CACpB,EAEA,CACE,UAAW,OACX,MAAO,KAAOA,EAAiB,GACjC,EACA,CACE,UAAW,OACX,MAAO,IAAMA,CACf,EACA,CACE,UAAW,OACX,MAAO,KAAOA,CAChB,EACA,CACE,UAAW,OACX,MAAO,IAAMF,EAAK,oBAAsB,GAC1C,EACA,CACE,UAAW,OACX,MAAO,MAAQA,EAAK,oBAAsB,GAC5C,EACA,CACE,UAAW,SAEX,MAAO,aACP,UAAW,CACb,EACAA,EAAK,kBACL,CACE,cAAeC,EACf,SAAU,CAAE,QAASA,CAAS,CAChC,EACAO,EAGA,CACE,UAAW,SACX,MAAOR,EAAK,YAAc,MAC1B,UAAW,CACb,EACAU,EACAC,EACAN,EACAC,CACF,EAEMO,EAAc,CAAE,GAAGD,CAAM,EAC/B,OAAAC,EAAY,IAAI,EAChBA,EAAY,KAAKN,CAAgB,EACjCE,EAAgB,SAAWI,EAEpB,CACL,KAAM,OACN,iBAAkB,GAClB,QAAS,CAAE,KAAM,EACjB,SAAUD,CACZ,CACF,CClNAE,IAAAC,IAQA,SAASC,GAAKC,EAAM,CAClB,IAAMC,EAAY,CAChB,UAAW,OACX,MAAO,8BACP,UAAW,IACb,EACMC,EAAc,CAClB,MAAO,YACP,UAAW,cACX,UAAW,CACb,EACMC,EAAW,CACf,OACA,QACA,MACF,EAMMC,EAAgB,CACpB,MAAO,UACP,cAAeD,EAAS,KAAK,GAAG,CAClC,EAEA,MAAO,CACL,KAAM,OACN,QAAS,CAAC,OAAO,EACjB,SAAS,CACP,QAASA,CACX,EACA,SAAU,CACRF,EACAC,EACAF,EAAK,kBACLI,EACAJ,EAAK,cACLA,EAAK,oBACLA,EAAK,oBACP,EACA,QAAS,KACX,CACF,CCnDAK,IAAAC,IACA,IAAIC,GAAgB,kBAChBC,GAAO,OAAOD,EAAa,IAC3BE,GAAY,8BACZC,GAAU,CACZ,UAAW,SACX,SAAU,CAGR,CAAE,MAAO,QAAQH,EAAa,MAAMC,EAAI,YAAYA,EAAI,eACzCD,EAAa,aAAc,EAE1C,CAAE,MAAO,OAAOA,EAAa,MAAMC,EAAI,8BAA+B,EACtE,CAAE,MAAO,IAAIA,EAAI,aAAc,EAC/B,CAAE,MAAO,OAAOD,EAAa,YAAa,EAG1C,CAAE,MAAO,aAAaE,EAAS,UAAUA,EAAS,SAASA,EAAS,eACrDF,EAAa,aAAc,EAG1C,CAAE,MAAO,gCAAiC,EAG1C,CAAE,MAAO,YAAYE,EAAS,WAAY,EAG1C,CAAE,MAAO,wBAAyB,EAGlC,CAAE,MAAO,+BAAgC,CAC3C,EACA,UAAW,CACb,EAqBA,SAASE,GAAWC,EAAIC,EAAcC,EAAO,CAC3C,OAAIA,IAAU,GAAW,GAElBF,EAAG,QAAQC,EAAcE,GACvBJ,GAAWC,EAAIC,EAAcC,EAAQ,CAAC,CAC9C,CACH,CAGA,SAASE,GAAKC,EAAM,CAClB,IAAMC,EAAQD,EAAK,MACbE,EAAgB,iDAChBC,EAAmBD,EACrBR,GAAW,OAASQ,EAAgB,kBAAoBA,EAAgB,WAAY,OAAQ,CAAC,EAsE3FE,EAAW,CACf,QAtEoB,CACpB,eACA,WACA,UACA,MACA,SACA,KACA,SACA,MACA,QACA,WACA,UACA,YACA,SACA,SACA,QACA,OACA,OACA,OACA,QACA,YACA,QACA,aACA,WACA,OACA,SACA,UACA,UACA,SACA,MACA,SACA,WACA,SACA,YACA,SACA,UACA,SACA,WACA,UACA,KACA,SACA,QACA,UACA,OACA,MACF,EA0BE,QAnBe,CACf,QACA,OACA,MACF,EAgBE,KAdY,CACZ,OACA,UACA,OACA,QACA,MACA,OACA,QACA,QACF,EAME,SA1BgB,CAChB,QACA,MACF,CAwBA,EAEMC,EAAa,CACjB,UAAW,OACX,MAAO,IAAMH,EACb,SAAU,CACR,CACE,MAAO,KACP,IAAK,KACL,SAAU,CAAE,MAAO,CACrB,CACF,CACF,EACMI,EAAS,CACb,UAAW,SACX,MAAO,KACP,IAAK,KACL,SAAUF,EACV,UAAW,EACX,SAAU,CAAEJ,EAAK,oBAAqB,EACtC,WAAY,EACd,EAEA,MAAO,CACL,KAAM,OACN,QAAS,CAAE,KAAM,EACjB,SAAUI,EACV,QAAS,QACT,SAAU,CACRJ,EAAK,QACH,UACA,OACA,CACE,UAAW,EACX,SAAU,CACR,CAEE,MAAO,OACP,UAAW,CACb,EACA,CACE,UAAW,SACX,MAAO,YACT,CACF,CACF,CACF,EAEA,CACE,MAAO,wBACP,SAAU,SACV,UAAW,CACb,EACAA,EAAK,oBACLA,EAAK,qBACL,CACE,MAAO,MACP,IAAK,MACL,UAAW,SACX,SAAU,CAAEA,EAAK,gBAAiB,CACpC,EACAA,EAAK,iBACLA,EAAK,kBACL,CACE,MAAO,CACL,oDACA,MACAE,CACF,EACA,UAAW,CACT,EAAG,UACH,EAAG,aACL,CACF,EACA,CAEE,MAAO,aACP,MAAO,SACT,EACA,CACE,MAAO,CACLD,EAAM,OAAO,WAAYC,CAAa,EACtC,MACAA,EACA,MACA,QACF,EACA,UAAW,CACT,EAAG,OACH,EAAG,WACH,EAAG,UACL,CACF,EACA,CACE,MAAO,CACL,SACA,MACAA,CACF,EACA,UAAW,CACT,EAAG,UACH,EAAG,aACL,EACA,SAAU,CACRI,EACAN,EAAK,oBACLA,EAAK,oBACP,CACF,EACA,CAGE,cAAe,wBACf,UAAW,CACb,EACA,CACE,MAAO,CACL,MAAQG,EAAmB,QAC3BH,EAAK,oBACL,WACF,EACA,UAAW,CAAE,EAAG,gBAAiB,EACjC,SAAUI,EACV,SAAU,CACR,CACE,UAAW,SACX,MAAO,KACP,IAAK,KACL,SAAUA,EACV,UAAW,EACX,SAAU,CACRC,EACAL,EAAK,iBACLA,EAAK,kBACLP,GACAO,EAAK,oBACP,CACF,EACAA,EAAK,oBACLA,EAAK,oBACP,CACF,EACAP,GACAY,CACF,CACF,CACF,CChSAE,IAAAC,IASA,SAASC,GAAGC,EAAM,CAyEhB,IAAMC,EAAW,CACf,QA5BU,CACV,QACA,OACA,OACA,QACA,WACA,UACA,QACA,OACA,cACA,MACA,OACA,KACA,OACA,KACA,SACA,YACA,MACA,UACA,QACA,SACA,SACA,SACA,SACA,OACA,KACF,EAGE,KAnDY,CACZ,OACA,OACA,YACA,aACA,QACA,UACA,UACA,OACA,QACA,QACA,QACA,SACA,QACA,SACA,SACA,SACA,MACA,OACA,UACA,MACF,EA+BE,QA3Ee,CACf,OACA,QACA,OACA,KACF,EAuEE,SAtEgB,CAChB,SACA,MACA,QACA,UACA,OACA,OACA,MACA,OACA,MACA,QACA,QACA,UACA,OACA,UACA,QACF,CAuDA,EACA,MAAO,CACL,KAAM,KACN,QAAS,CAAE,QAAS,EACpB,SAAUA,EACV,QAAS,KACT,SAAU,CACRD,EAAK,oBACLA,EAAK,qBACL,CACE,UAAW,SACX,SAAU,CACRA,EAAK,kBACLA,EAAK,iBACL,CACE,MAAO,IACP,IAAK,GACP,CACF,CACF,EACA,CACE,UAAW,SACX,SAAU,CACR,CACE,MAAO,6DACP,UAAW,CACb,EACA,CACE,MAAO,sFACP,UAAW,CACb,EACA,CACE,MAAO,wBACP,UAAW,CACb,EACA,CACE,MAAO,uCACP,UAAW,CACb,EACA,CACE,MAAO,wDACP,UAAW,CACb,CACF,CACF,EACA,CAAE,MAAO,IACT,EACA,CACE,UAAW,WACX,cAAe,OACf,IAAK,cACL,WAAY,GACZ,SAAU,CACRA,EAAK,WACL,CACE,UAAW,SACX,MAAO,KACP,IAAK,KACL,WAAY,GACZ,SAAUC,EACV,QAAS,MACX,CACF,CACF,CACF,CACF,CACF,CCzJAC,IAAAC,IAUA,SAASC,GAAKC,EAAM,CAClB,IAAMC,EAAQD,EAAK,MAGbE,EAAiB,QACjBC,EAAsBF,EAAM,OAAOC,EAAgBF,EAAK,mBAAmB,EAC3EI,EAAWH,EAAM,OAAOC,EAAgBF,EAAK,QAAQ,EAErDK,EAAkB,CACtB,UAAW,wBACX,UAAW,EACX,MAAOJ,EAAM,OACX,KACA,oCACAG,EACAH,EAAM,UAAU,OAAO,CAAC,CAC5B,EACMK,EAAgB,wCAChBC,EAAW,CACf,WACA,KACA,QACA,QACA,SACA,MACA,QACA,QACA,WACA,QACA,KACA,MACA,OACA,OACA,SACA,QACA,QACA,KACA,MACA,KACA,OACA,KACA,MACA,OACA,QACA,QACA,MACA,OACA,MACA,WACA,OACA,MACA,MACA,SACA,OACA,OACA,SACA,SACA,QACA,QACA,OACA,MACA,OACA,SACA,QACA,SACA,UACA,MACA,UACA,QACA,QACA,OACF,EACMC,EAAW,CACf,OACA,QACA,OACA,OACA,KACA,KACF,EACMC,EAAW,CAEf,QAEA,OACA,OACA,QACA,OACA,OACA,KACA,QACA,SACA,UACA,QACA,QACA,YACA,aACA,KACA,MACA,QACA,QACA,OACA,OACA,UACA,WACA,SACA,eACA,sBACA,oBACA,iBACA,WAEA,UACA,aACA,YACA,SACA,OACA,OACA,UACA,iBACA,gBACA,mBACA,OACA,YACA,SACA,QACA,UACA,eACA,iBACA,eACA,QACA,kBACA,eACA,cACA,SACA,WACA,UACA,aACA,OACA,iBACA,eACA,OACA,SACA,WACA,eACA,aACA,kBACF,EACMC,EAAQ,CACZ,KACA,MACA,MACA,MACA,OACA,QACA,KACA,MACA,MACA,MACA,OACA,QACA,MACA,MACA,MACA,OACA,OACA,MACA,SACA,SACA,SACA,KACF,EACA,MAAO,CACL,KAAM,OACN,QAAS,CAAE,IAAK,EAChB,SAAU,CACR,SAAUV,EAAK,SAAW,KAC1B,KAAMU,EACN,QAASH,EACT,QAASC,EACT,SAAUC,CACZ,EACA,QAAS,KACT,SAAU,CACRT,EAAK,oBACLA,EAAK,QAAQ,OAAQ,OAAQ,CAAE,SAAU,CAAE,MAAO,CAAE,CAAC,EACrDA,EAAK,QAAQA,EAAK,kBAAmB,CACnC,MAAO,MACP,QAAS,IACX,CAAC,EACD,CACE,UAAW,SAEX,MAAO,8BACT,EACA,CACE,MAAO,SACP,SAAU,CACR,CAAE,MAAO,0BAA2B,EACpC,CACE,MAAO,MACP,IAAK,IACL,SAAU,CACR,CACE,MAAO,cACP,MAAO,+BACT,CACF,CACF,CACF,CACF,EACA,CACE,UAAW,SACX,SAAU,CACR,CAAE,MAAO,gBAAkBM,CAAc,EACzC,CAAE,MAAO,iBAAmBA,CAAc,EAC1C,CAAE,MAAO,uBAAyBA,CAAc,EAChD,CAAE,MAAO,kDACEA,CAAc,CAC3B,EACA,UAAW,CACb,EACA,CACE,MAAO,CACL,KACA,MACAH,CACF,EACA,UAAW,CACT,EAAG,UACH,EAAG,gBACL,CACF,EACA,CACE,UAAW,OACX,MAAO,SACP,IAAK,MACL,SAAU,CACR,CACE,UAAW,SACX,MAAO,IACP,IAAK,IACL,SAAU,CACRH,EAAK,gBACP,CACF,CACF,CACF,EACA,CACE,MAAO,CACL,MACA,MACA,cACAG,CACF,EACA,UAAW,CACT,EAAG,UACH,EAAG,UACH,EAAG,UACL,CACF,EAEA,CACE,MAAO,CACL,MACA,MACAA,EACA,MACA,IACF,EACA,UAAW,CACT,EAAG,UACH,EAAG,WACH,EAAG,SACL,CACF,EACA,CACE,MAAO,CACL,OACA,MACAA,CACF,EACA,UAAW,CACT,EAAG,UACH,EAAG,aACL,CACF,EACA,CACE,MAAO,CACL,uCACA,MACAA,CACF,EACA,UAAW,CACT,EAAG,UACH,EAAG,aACL,CACF,EACA,CACE,MAAOH,EAAK,SAAW,KACvB,SAAU,CACR,QAAS,OACT,SAAUS,EACV,KAAMC,CACR,CACF,EACA,CACE,UAAW,cACX,MAAO,IACT,EACAL,CACF,CACF,CACF,CCnUAM,IAAAC,IAQA,SAASC,GAAIC,EAAM,CACjB,IAAMC,EAAQD,EAAK,MAQbE,EAAcD,EAAM,OAAO,YAAaA,EAAM,SAAS,kBAAkB,EAAG,iBAAiB,EAC7FE,EAAe,mBACfC,EAAe,CACnB,UAAW,SACX,MAAO,kCACT,EACMC,EAAoB,CACxB,MAAO,KACP,SAAU,CACR,CACE,UAAW,UACX,MAAO,sBACP,QAAS,IACX,CACF,CACF,EACMC,EAAwBN,EAAK,QAAQK,EAAmB,CAC5D,MAAO,KACP,IAAK,IACP,CAAC,EACKE,EAAwBP,EAAK,QAAQA,EAAK,iBAAkB,CAAE,UAAW,QAAS,CAAC,EACnFQ,EAAyBR,EAAK,QAAQA,EAAK,kBAAmB,CAAE,UAAW,QAAS,CAAC,EACrFS,EAAgB,CACpB,eAAgB,GAChB,QAAS,IACT,UAAW,EACX,SAAU,CACR,CACE,UAAW,OACX,MAAON,EACP,UAAW,CACb,EACA,CACE,MAAO,OACP,UAAW,EACX,SAAU,CACR,CACE,UAAW,SACX,WAAY,GACZ,SAAU,CACR,CACE,MAAO,IACP,IAAK,IACL,SAAU,CAAEC,CAAa,CAC3B,EACA,CACE,MAAO,IACP,IAAK,IACL,SAAU,CAAEA,CAAa,CAC3B,EACA,CAAE,MAAO,cAAe,CAC1B,CACF,CACF,CACF,CACF,CACF,EACA,MAAO,CACL,KAAM,YACN,QAAS,CACP,OACA,QACA,MACA,OACA,MACA,MACA,MACA,QACA,MACA,KACF,EACA,iBAAkB,GAClB,aAAc,GACd,SAAU,CACR,CACE,UAAW,OACX,MAAO,UACP,IAAK,IACL,UAAW,GACX,SAAU,CACRC,EACAG,EACAD,EACAD,EACA,CACE,MAAO,KACP,IAAK,KACL,SAAU,CACR,CACE,UAAW,OACX,MAAO,UACP,IAAK,IACL,SAAU,CACRD,EACAC,EACAE,EACAD,CACF,CACF,CACF,CACF,CACF,CACF,EACAP,EAAK,QACH,OACA,MACA,CAAE,UAAW,EAAG,CAClB,EACA,CACE,MAAO,cACP,IAAK,QACL,UAAW,EACb,EACAI,EAEA,CACE,UAAW,OACX,IAAK,MACL,SAAU,CACR,CACE,MAAO,SACP,UAAW,GACX,SAAU,CACRI,CACF,CACF,EACA,CACE,MAAO,mBACT,CACF,CAEF,EACA,CACE,UAAW,MAMX,MAAO,iBACP,IAAK,IACL,SAAU,CAAE,KAAM,OAAQ,EAC1B,SAAU,CAAEC,CAAc,EAC1B,OAAQ,CACN,IAAK,YACL,UAAW,GACX,YAAa,CACX,MACA,KACF,CACF,CACF,EACA,CACE,UAAW,MAEX,MAAO,kBACP,IAAK,IACL,SAAU,CAAE,KAAM,QAAS,EAC3B,SAAU,CAAEA,CAAc,EAC1B,OAAQ,CACN,IAAK,aACL,UAAW,GACX,YAAa,CACX,aACA,aACA,KACF,CACF,CACF,EAEA,CACE,UAAW,MACX,MAAO,SACT,EAEA,CACE,UAAW,MACX,MAAOR,EAAM,OACX,IACAA,EAAM,UAAUA,EAAM,OACpBC,EAIAD,EAAM,OAAO,MAAO,IAAK,IAAI,CAC/B,CAAC,CACH,EACA,IAAK,OACL,SAAU,CACR,CACE,UAAW,OACX,MAAOC,EACP,UAAW,EACX,OAAQO,CACV,CACF,CACF,EAEA,CACE,UAAW,MACX,MAAOR,EAAM,OACX,MACAA,EAAM,UAAUA,EAAM,OACpBC,EAAa,GACf,CAAC,CACH,EACA,SAAU,CACR,CACE,UAAW,OACX,MAAOA,EACP,UAAW,CACb,EACA,CACE,MAAO,IACP,UAAW,EACX,WAAY,EACd,CACF,CACF,CACF,CACF,CACF,CC9OAQ,IAAAC,IAAA,IAAMC,GAASC,IACN,CACL,UAAW,CACT,MAAO,OACP,MAAO,YACT,EACA,cAAeA,EAAK,qBACpB,SAAU,CACR,MAAO,SACP,MAAO,iDACT,EACA,kBAAmB,CACjB,UAAW,WACX,MAAO,cACT,EACA,wBAAyB,CACvB,MAAO,gBACP,MAAO,KACP,IAAK,KACL,QAAS,IACT,SAAU,CACRA,EAAK,iBACLA,EAAK,iBACP,CACF,EACA,gBAAiB,CACf,MAAO,SACP,MAAOA,EAAK,UAAY,kGASxB,UAAW,CACb,EACA,aAAc,CACZ,UAAW,OACX,MAAO,2BACT,CACF,GAGIC,GAAY,CAChB,IACA,OACA,UACA,UACA,QACA,QACA,IACA,aACA,OACA,SACA,SACA,UACA,OACA,OACA,KACA,MACA,UACA,MACA,MACA,KACA,KACA,KACA,WACA,aACA,SACA,SACA,OACA,KACA,KACA,KACA,KACA,KACA,KACA,SACA,SACA,OACA,IACA,SACA,MACA,QACA,MACA,MACA,QACA,SACA,KACA,OACA,OACA,OACA,MACA,SACA,KACA,WACA,SACA,IACA,UACA,IACA,QACA,OACA,UACA,SACA,SACA,OACA,SACA,UACA,MACA,QACA,QACA,KACA,WACA,QACA,KACA,QACA,OACA,KACA,KACA,MACA,OACF,EAEMC,GAAW,CACf,OACA,IACA,SACA,OACA,UACA,MACA,SACA,SACA,UACA,gBACA,sBACA,cACA,mBACA,oBACA,oBACA,UACA,iBACA,UACA,UACA,eACA,WACA,qBACA,SACA,eACA,iBACA,iBACA,OACA,SACA,UACA,QACA,OACA,OACA,UACA,WACA,OACA,OACA,MACA,WACA,QACA,gBACA,UACF,EAEMC,GAAO,CACX,GAAGF,GACH,GAAGC,EACL,EAKME,GAAiB,CACrB,YACA,cACA,eACA,QACA,cACA,cACA,sBACA,gBACA,eACA,eACA,gBACA,OACA,SACA,QACA,kBACA,aACA,cACA,iBACA,kBACA,UACA,uBACA,mBACA,yBACA,+BACA,aACA,OACA,YACA,SACA,QAEA,YACA,YACA,aACA,YACF,EAAE,KAAK,EAAE,QAAQ,EAGXC,GAAiB,CACrB,SACA,WACA,QACA,UACA,UACA,UACA,UACA,MACA,WACA,OACA,QACA,UACA,QACA,cACA,gBACA,aACA,SACA,QACA,gBACA,eACA,MACA,OACA,eACA,QACA,gBACA,WACA,UACA,KACA,OACA,aACA,eACA,OACA,OACA,aACA,MACA,YACA,UACA,iBACA,eACA,mBACA,cACA,aACA,eACA,WACA,eACA,OACA,oBACA,YACA,aACA,WACA,QACA,OACA,QACA,SACA,gBACA,eACA,QACA,UACA,OACF,EAAE,KAAK,EAAE,QAAQ,EAGXC,GAAkB,CACtB,QACA,WACA,SACA,MACA,aACA,eACA,aACA,gBACA,SACA,OACA,cACA,YACA,UACA,gBACF,EAAE,KAAK,EAAE,QAAQ,EAEXC,GAAa,CACjB,eACA,gBACA,cACA,aACA,qBACA,MACA,cACA,YACA,wBACA,kBACA,sBACA,qBACA,sBACA,4BACA,iBACA,uBACA,kBACA,sBACA,wBACA,qBACA,4BACA,aACA,eACA,kBACA,sBACA,aACA,wBACA,wBACA,kBACA,mBACA,mBACA,oBACA,sBACA,wBACA,wBACA,oBACA,kBACA,iBACA,aACA,SACA,eACA,qBACA,mBACA,yBACA,yBACA,yBACA,qBACA,2BACA,2BACA,2BACA,qBACA,qBACA,gBACA,sBACA,4BACA,6BACA,sBACA,sBACA,kBACA,eACA,wBACA,0BACA,eACA,sBACA,sBACA,qBACA,sBACA,qBACA,gBACA,sBACA,oBACA,0BACA,0BACA,0BACA,sBACA,4BACA,4BACA,4BACA,sBACA,sBACA,cACA,oBACA,oBACA,oBACA,gBACA,eACA,qBACA,qBACA,qBACA,iBACA,0BACA,4BACA,eACA,aACA,mBACA,yBACA,0BACA,mBACA,mBACA,eACA,SACA,YACA,uBACA,gBACA,WACA,iBACA,YACA,oBACA,aACA,WACA,aACA,aACA,cACA,eACA,eACA,eACA,cACA,QACA,OACA,YACA,YACA,QACA,sBACA,8BACA,gBACA,kBACA,eACA,eACA,cACA,aACA,cACA,oBACA,oBACA,oBACA,cACA,eACA,UACA,UACA,+BACA,2BACA,gCACA,yBACA,0BACA,YACA,iBACA,iBACA,UACA,qBACA,oBACA,gBACA,cACA,MACA,YACA,aACA,SACA,KACA,KACA,YACA,UACA,oBACA,cACA,oBACA,eACA,OACA,eACA,YACA,SACA,OACA,aACA,iBACA,YACA,YACA,cACA,YACA,QACA,cACA,gBACA,OACA,OACA,eACA,cACA,wBACA,eACA,yBACA,sBACA,eACA,YACA,mBACA,cACA,iBACA,eACA,aACA,iBACA,0BACA,4BACA,uBACA,wBACA,eACA,0BACA,oBACA,0BACA,qBACA,yBACA,uBACA,wBACA,0BACA,cACA,sBACA,MACA,+BACA,6BACA,OACA,YACA,oBACA,iBACA,iBACA,cACA,kBACA,oBACA,WACA,WACA,eACA,iBACA,gBACA,sBACA,wBACA,qBACA,sBACA,SACA,sBACA,wBACA,UACA,OACA,oBACA,kBACA,mBACA,WACA,iBACA,uBACA,cACA,QACA,aACA,cACA,kBACA,oBACA,eACA,mBACA,qBACA,YACA,kBACA,gBACA,eACA,UACA,OACA,iBACA,iBACA,aACA,cACA,mBACA,aACA,mBACA,sBACA,kBACA,SACA,eACA,mBACA,qBACA,gBACA,gBACA,oBACA,sBACA,cACA,eACA,aACA,cACA,SACA,aACA,aACA,eACA,QACA,OACA,cACA,mBACA,qBACA,qBACA,oBACA,qBACA,oBACA,YACA,iBACA,aACA,YACA,cACA,gBACA,cACA,YACA,YACA,oBACA,aACA,aACA,aACA,iBACA,aACA,kBACA,YACA,iBACA,aACA,kBACA,YACA,iBACA,WACA,YACA,WACA,YACA,SACA,OACA,SACA,aACA,kBACA,SACA,gBACA,kBACA,cACA,kBACA,gBACA,UACA,QACA,UACA,UACA,gBACA,iBACA,gBACA,gBACA,WACA,kBACA,iBACA,uBACA,kBACA,gBACA,aACA,aACA,UACA,sBACA,4BACA,6BACA,wBACA,wBACA,UACA,gBACA,oBACA,sBACA,iBACA,iBACA,qBACA,uBACA,eACA,gBACA,cACA,OACA,mBACA,oBACA,oBACA,cACA,QACA,cACA,eACA,cACA,qBACA,gBACA,cACA,aACA,iBACA,WACA,kBACA,sBACA,qBACA,SACA,IACA,SACA,OACA,aACA,cACA,QACA,SACA,UACA,aACA,gBACA,QACA,kBACA,gBACA,sBACA,0BACA,4BACA,uBACA,uBACA,2BACA,6BACA,qBACA,sBACA,oBACA,iBACA,uBACA,2BACA,6BACA,wBACA,wBACA,4BACA,8BACA,sBACA,uBACA,qBACA,oBACA,mBACA,mBACA,kBACA,uBACA,uBACA,kBACA,mBACA,kBACA,wBACA,eACA,gBACA,kBACA,QACA,WACA,MACA,aACA,eACA,SACA,mBACA,oBACA,iBACA,kBACA,oBACA,iBACA,eACA,WACA,eACA,aACA,iBACA,kBACA,cACA,uBACA,kBACA,wBACA,uBACA,uBACA,2BACA,wBACA,4BACA,gBACA,sBACA,yBACA,sBACA,cACA,eACA,mBACA,gBACA,iBACA,cACA,mBACA,iBACA,wBACA,0BACA,YACA,iBACA,kBACA,iBACA,MACA,eACA,YACA,gBACA,mBACA,kBACA,aACA,sBACA,mBACA,sBACA,sBACA,6BACA,YAC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",
|
|
6
|
+
"names": ["define_DECKLIGHT_PACKS_default", "init_define_DECKLIGHT_PACKS", "__esmMin", "define_DECKLIGHT_THEMES_default", "init_define_DECKLIGHT_THEMES", "__esmMin", "require_core", "__commonJSMin", "exports", "module", "init_define_DECKLIGHT_PACKS", "init_define_DECKLIGHT_THEMES", "deepFreeze", "obj", "name", "prop", "type", "Response", "mode", "escapeHTML", "value", "inherit$1", "original", "objects", "result", "key", "SPAN_CLOSE", "emitsWrappingTags", "node", "scopeToCSSClass", "prefix", "pieces", "x", "i", "HTMLRenderer", "parseTree", "options", "text", "className", "newNode", "opts", "TokenTree", "_TokenTree", "scope", "builder", "child", "el", "TokenTreeEmitter", "emitter", "source", "re", "lookahead", "concat", "anyNumberOfTimes", "optional", "args", "stripOptionsFromArgs", "either", "countMatchGroups", "startsWith", "lexeme", "match", "BACKREF_RE", "_rewriteBackreferences", "regexps", "joinWith", "numCaptures", "regex", "offset", "out", "MATCH_NOTHING_RE", "IDENT_RE", "UNDERSCORE_IDENT_RE", "NUMBER_RE", "C_NUMBER_RE", "BINARY_NUMBER_RE", "RE_STARTERS_RE", "SHEBANG", "beginShebang", "m", "resp", "BACKSLASH_ESCAPE", "APOS_STRING_MODE", "QUOTE_STRING_MODE", "PHRASAL_WORDS_MODE", "COMMENT", "begin", "end", "modeOptions", "ENGLISH_WORD", "C_LINE_COMMENT_MODE", "C_BLOCK_COMMENT_MODE", "HASH_COMMENT_MODE", "NUMBER_MODE", "C_NUMBER_MODE", "BINARY_NUMBER_MODE", "REGEXP_MODE", "TITLE_MODE", "UNDERSCORE_TITLE_MODE", "METHOD_GUARD", "END_SAME_AS_BEGIN", "MODES", "skipIfHasPrecedingDot", "response", "scopeClassName", "_parent", "beginKeywords", "parent", "compileIllegal", "compileMatch", "compileRelevance", "beforeMatchExt", "originalMode", "COMMON_KEYWORDS", "DEFAULT_KEYWORD_SCOPE", "compileKeywords", "rawKeywords", "caseInsensitive", "scopeName", "compiledKeywords", "compileList", "keywordList", "keyword", "pair", "scoreForKeyword", "providedScore", "commonKeyword", "seenDeprecations", "error", "message", "warn", "deprecated", "version", "MultiClassError", "remapScopeNames", "regexes", "scopeNames", "emit", "positions", "beginMultiClass", "endMultiClass", "scopeSugar", "MultiClass", "compileLanguage", "language", "langRe", "global", "MultiRegex", "terminators", "s", "matchData", "ResumableMultiRegex", "index", "matcher", "m2", "buildModeRegex", "mm", "term", "compileMode", "cmode", "ext", "keywordPattern", "c", "expandOrCloneMode", "dependencyOnParent", "variant", "HTMLInjectionError", "reason", "html", "escape", "inherit", "NO_MATCH", "MAX_KEYWORD_HITS", "HLJS", "hljs", "languages", "aliases", "plugins", "SAFE_MODE", "LANGUAGE_NOT_FOUND", "PLAINTEXT_LANGUAGE", "shouldNotHighlight", "languageName", "blockLanguage", "block", "classes", "getLanguage", "_class", "highlight", "codeOrLanguageName", "optionsOrCode", "ignoreIllegals", "code", "context", "fire", "_highlight", "codeToHighlight", "continuation", "keywordHits", "keywordData", "matchText", "processKeywords", "top", "modeBuffer", "lastIndex", "buf", "word", "data", "kind", "keywordRelevance", "relevance", "cssClass", "emitKeyword", "processSubLanguage", "continuations", "highlightAuto", "processBuffer", "emitMultiClass", "max", "klass", "startNewMode", "endOfMode", "matchPlusRemainder", "matched", "doIgnore", "resumeScanAtSamePosition", "doBeginMatch", "newMode", "beforeCallbacks", "cb", "doEndMatch", "endMode", "origin", "processContinuations", "list", "current", "item", "lastMatch", "processLexeme", "textBeforeMatch", "err", "processed", "iterations", "md", "beforeMatch", "processedCount", "justTextHighlightResult", "languageSubset", "plaintext", "results", "autoDetection", "sorted", "a", "b", "best", "secondBest", "updateClassName", "element", "currentLang", "resultLang", "highlightElement", "configure", "userOptions", "initHighlighting", "highlightAll", "initHighlightingOnLoad", "wantsHighlight", "boot", "registerLanguage", "languageDefinition", "lang", "error$1", "registerAliases", "unregisterLanguage", "alias", "listLanguages", "aliasList", "upgradePluginAPI", "plugin", "addPlugin", "removePlugin", "event", "deprecateHighlightBlock", "index_exports", "__export", "init", "initTerminals", "registerBuildProvider", "version", "init_define_DECKLIGHT_PACKS", "init_define_DECKLIGHT_THEMES", "init_define_DECKLIGHT_PACKS", "init_define_DECKLIGHT_THEMES", "init_define_DECKLIGHT_PACKS", "init_define_DECKLIGHT_THEMES", "CONTAINER_TAGS", "SVG_SKIP", "providerRegistry", "registerProvider", "el", "provider", "eligibleChildren", "c", "tag", "isContainer", "stepSource", "tbody", "computeGroups", "items", "indexed", "it", "i", "a", "b", "groups", "cur", "curKey", "curExplicit", "markStep", "style", "prepareDraw", "STROKED", "shapes", "anyStroke", "s", "stroke", "len", "orig", "attr", "key", "MARKER_ATTRS", "v", "o", "setMarkers", "on", "syncDrawRestore", "state", "hasMarkers", "restore", "dur", "scanSlide", "section", "steps", "claimed", "auto", "push", "step", "orderAttr", "explicit", "walker", "sub", "d", "child", "childStyle", "providers", "seen", "rec", "applyBuildState", "record", "revealedSteps", "group", "g", "idx", "currentGroup", "currentSet", "touchedContainers", "hasCurrentHl", "p", "k", "stepLabels", "init_define_DECKLIGHT_PACKS", "init_define_DECKLIGHT_THEMES", "SHAPES", "conceptSlot", "name", "h", "c", "conceptFill", "concepts", "conf", "applyConcepts", "root", "seen", "el", "fill", "m", "owner", "targets", "t", "REF_ATTRS", "namespaceSvgIds", "svg", "prefix", "map", "old", "rewriteUrl", "value", "id", "attr", "v", "init_define_DECKLIGHT_PACKS", "init_define_DECKLIGHT_THEMES", "VISUAL_PROPS", "snapshot", "el", "cs", "snap", "p", "localFactor", "stageScale", "ctm", "runAutoAnimate", "fromSection", "toSection", "raw", "duration", "olds", "matched", "o", "n", "f", "dx", "dy", "textOnly", "sx", "sy", "authoredCss", "cleanup", "matchedEls", "m", "child", "init_define_DECKLIGHT_PACKS", "init_define_DECKLIGHT_THEMES", "_getDefaults", "_defaults", "changeDefaults", "newDefaults", "noopTest", "edit", "regex", "opt", "source", "obj", "name", "val", "valSource", "other", "bull", "indent", "newline", "blockCode", "fences", "hr", "heading", "bullet", "lheadingCore", "lheading", "lheadingGfm", "_paragraph", "blockText", "_blockLabel", "def", "list", "_tag", "_comment", "html", "paragraph", "blockquote", "blockNormal", "gfmTable", "blockGfm", "blockPedantic", "escape", "inlineCode", "br", "inlineText", "_punctuation", "_punctuationOrSpace", "_notPunctuationOrSpace", "punctuation", "_punctuationGfmStrongEm", "_punctuationOrSpaceGfmStrongEm", "_notPunctuationOrSpaceGfmStrongEm", "blockSkip", "emStrongLDelimCore", "emStrongLDelim", "emStrongLDelimGfm", "emStrongRDelimAstCore", "emStrongRDelimAst", "emStrongRDelimAstGfm", "emStrongRDelimUnd", "anyPunctuation", "autolink", "_inlineComment", "tag", "_inlineLabel", "link", "reflink", "nolink", "reflinkSearch", "inlineNormal", "inlinePedantic", "inlineGfm", "inlineBreaks", "block", "inline", "escapeReplacements", "getEscapeReplacement", "ch", "encode", "cleanUrl", "href", "splitCells", "tableRow", "count", "row", "match", "offset", "str", "escaped", "curr", "cells", "i", "rtrim", "c", "invert", "l", "suffLen", "currChar", "findClosingBracket", "b", "level", "outputLink", "cap", "raw", "lexer", "rules", "title", "text", "token", "indentCodeCompensation", "matchIndentToCode", "indentToCode", "node", "matchIndentInNode", "indentInNode", "_Tokenizer", "options", "src", "trimmed", "lines", "tokens", "inBlockquote", "currentLines", "currentRaw", "currentText", "top", "lastToken", "oldToken", "newText", "newToken", "isordered", "itemRegex", "endsWithBlankLine", "endEarly", "itemContents", "line", "t", "nextLine", "blankLine", "nextBulletRegex", "hrRegex", "fencesBeginRegex", "headingBeginRegex", "htmlBeginRegex", "rawLine", "nextLineWithoutTabs", "istask", "ischecked", "lastItem", "spacers", "hasMultipleLineBreaks", "headers", "aligns", "rows", "item", "align", "cell", "trimmedUrl", "rtrimSlash", "lastParenIndex", "linkLen", "links", "linkString", "maskedSrc", "prevChar", "lLength", "rDelim", "rLength", "delimTotal", "midDelimTotal", "endReg", "lastCharLength", "hasNonSpaceChars", "hasSpaceCharsOnBothEnds", "prevCapZero", "_Lexer", "__Lexer", "next", "lastParagraphClipped", "extTokenizer", "cutSrc", "startIndex", "tempSrc", "tempStart", "getStartIndex", "errMsg", "keepPrevChar", "_Renderer", "lang", "langString", "code", "depth", "ordered", "start", "body", "j", "type", "startAttr", "itemBody", "checkbox", "checked", "header", "k", "content", "cleanHref", "out", "_TextRenderer", "_Parser", "__Parser", "anyToken", "genericToken", "ret", "textToken", "renderer", "_Hooks", "markdown", "Marked", "args", "callback", "values", "tableToken", "listToken", "childTokens", "extensions", "pack", "opts", "ext", "prevRenderer", "extLevel", "prop", "rendererProp", "rendererFunc", "tokenizer", "tokenizerProp", "tokenizerFunc", "prevTokenizer", "hooks", "hooksProp", "hooksFunc", "prevHook", "arg", "walkTokens", "packWalktokens", "blockType", "origOpt", "throwError", "parser", "e", "silent", "async", "msg", "markedInstance", "marked", "setOptions", "use", "parseInline", "parser", "_Parser", "lexer", "_Lexer", "marked", "dedent", "text", "lines", "indent", "l", "splitNotes", "md", "m", "body", "notes", "rehearse", "r", "applyBuildDirective", "style", "hoistBuildWrappers", "rootEl", "div", "kids", "child", "renderMarkdownSlide", "template", "html", "notesHtml", "rehearseHtml", "initMarkdown", "root", "section", "tpl", "source", "cls", "content", "aside", "init_define_DECKLIGHT_PACKS", "init_define_DECKLIGHT_THEMES", "init_define_DECKLIGHT_PACKS", "init_define_DECKLIGHT_THEMES", "import_core", "core_default", "HighlightJS", "init_define_DECKLIGHT_PACKS", "init_define_DECKLIGHT_THEMES", "sql", "hljs", "regex", "COMMENT_MODE", "STRING", "QUOTED_IDENTIFIER", "LITERALS", "MULTI_WORD_TYPES", "TYPES", "NON_RESERVED_WORDS", "RESERVED_WORDS", "RESERVED_FUNCTIONS", "POSSIBLE_WITHOUT_PARENS", "COMBOS", "FUNCTIONS", "KEYWORDS", "keyword", "VARIABLE", "OPERATOR", "FUNCTION_CALL", "kws_to_regex", "list", "kw", "MULTI_WORD_KEYWORDS", "reduceRelevancy", "exceptions", "when", "qualifyFn", "item", "x", "init_define_DECKLIGHT_PACKS", "init_define_DECKLIGHT_THEMES", "IDENT_RE", "KEYWORDS", "LITERALS", "TYPES", "ERROR_TYPES", "BUILT_IN_GLOBALS", "BUILT_IN_VARIABLES", "BUILT_INS", "javascript", "hljs", "regex", "hasClosingTag", "match", "after", "tag", "IDENT_RE$1", "FRAGMENT", "XML_SELF_CLOSING", "XML_TAG", "response", "afterMatchIndex", "nextChar", "m", "afterMatch", "KEYWORDS$1", "decimalDigits", "frac", "decimalInteger", "NUMBER", "SUBST", "HTML_TEMPLATE", "CSS_TEMPLATE", "GRAPHQL_TEMPLATE", "TEMPLATE_STRING", "COMMENT", "SUBST_INTERNALS", "SUBST_AND_COMMENTS", "PARAMS_CONTAINS", "PARAMS", "CLASS_OR_EXTENDS", "CLASS_REFERENCE", "USE_STRICT", "FUNCTION_DEFINITION", "UPPER_CASE_CONSTANT", "noneOf", "list", "FUNCTION_CALL", "PROPERTY_ACCESS", "GETTER_OR_SETTER", "FUNC_LEAD_IN_RE", "FUNCTION_VARIABLE", "init_define_DECKLIGHT_PACKS", "init_define_DECKLIGHT_THEMES", "IDENT_RE", "KEYWORDS", "LITERALS", "TYPES", "ERROR_TYPES", "BUILT_IN_GLOBALS", "BUILT_IN_VARIABLES", "BUILT_INS", "javascript", "hljs", "regex", "hasClosingTag", "match", "after", "tag", "IDENT_RE$1", "FRAGMENT", "XML_SELF_CLOSING", "XML_TAG", "response", "afterMatchIndex", "nextChar", "m", "afterMatch", "KEYWORDS$1", "decimalDigits", "frac", "decimalInteger", "NUMBER", "SUBST", "HTML_TEMPLATE", "CSS_TEMPLATE", "GRAPHQL_TEMPLATE", "TEMPLATE_STRING", "COMMENT", "SUBST_INTERNALS", "SUBST_AND_COMMENTS", "PARAMS_CONTAINS", "PARAMS", "CLASS_OR_EXTENDS", "CLASS_REFERENCE", "USE_STRICT", "FUNCTION_DEFINITION", "UPPER_CASE_CONSTANT", "noneOf", "list", "FUNCTION_CALL", "PROPERTY_ACCESS", "GETTER_OR_SETTER", "FUNC_LEAD_IN_RE", "FUNCTION_VARIABLE", "typescript", "tsLanguage", "NAMESPACE", "INTERFACE", "TS_SPECIFIC_KEYWORDS", "DECORATOR", "swapMode", "mode", "label", "replacement", "indx", "ATTRIBUTE_HIGHLIGHT", "c", "OPTIONAL_KEY_OR_ARGUMENT", "functionDeclaration", "init_define_DECKLIGHT_PACKS", "init_define_DECKLIGHT_THEMES", "python", "hljs", "regex", "IDENT_RE", "RESERVED_WORDS", "KEYWORDS", "PROMPT", "SUBST", "LITERAL_BRACKET", "STRING", "digitpart", "pointfloat", "lookahead", "NUMBER", "COMMENT_TYPE", "PARAMS", "init_define_DECKLIGHT_PACKS", "init_define_DECKLIGHT_THEMES", "bash", "hljs", "regex", "VAR", "BRACED_VAR", "SUBST", "COMMENT", "HERE_DOC", "QUOTE_STRING", "ESCAPED_QUOTE", "APOS_STRING", "ESCAPED_APOS", "ARITHMETIC", "SH_LIKE_SHELLS", "KNOWN_SHEBANG", "FUNCTION", "KEYWORDS", "LITERALS", "PATH_MODE", "SHELL_BUILT_INS", "BASH_BUILT_INS", "ZSH_BUILT_INS", "GNU_CORE_UTILS", "init_define_DECKLIGHT_PACKS", "init_define_DECKLIGHT_THEMES", "yaml", "hljs", "LITERALS", "URI_CHARACTERS", "KEY", "TEMPLATE_VARIABLES", "SINGLE_QUOTE_STRING", "STRING", "CONTAINER_STRING", "TIMESTAMP", "VALUE_CONTAINER", "OBJECT", "ARRAY", "MODES", "VALUE_MODES", "init_define_DECKLIGHT_PACKS", "init_define_DECKLIGHT_THEMES", "json", "hljs", "ATTRIBUTE", "PUNCTUATION", "LITERALS", "LITERALS_MODE", "init_define_DECKLIGHT_PACKS", "init_define_DECKLIGHT_THEMES", "decimalDigits", "frac", "hexDigits", "NUMERIC", "recurRegex", "re", "substitution", "depth", "_", "java", "hljs", "regex", "JAVA_IDENT_RE", "GENERIC_IDENT_RE", "KEYWORDS", "ANNOTATION", "PARAMS", "init_define_DECKLIGHT_PACKS", "init_define_DECKLIGHT_THEMES", "go", "hljs", "KEYWORDS", "init_define_DECKLIGHT_PACKS", "init_define_DECKLIGHT_THEMES", "rust", "hljs", "regex", "RAW_IDENTIFIER", "UNDERSCORE_IDENT_RE", "IDENT_RE", "FUNCTION_INVOKE", "NUMBER_SUFFIX", "KEYWORDS", "LITERALS", "BUILTINS", "TYPES", "init_define_DECKLIGHT_PACKS", "init_define_DECKLIGHT_THEMES", "xml", "hljs", "regex", "TAG_NAME_RE", "XML_IDENT_RE", "XML_ENTITIES", "XML_META_KEYWORDS", "XML_META_PAR_KEYWORDS", "APOS_META_STRING_MODE", "QUOTE_META_STRING_MODE", "TAG_INTERNALS", "init_define_DECKLIGHT_PACKS", "init_define_DECKLIGHT_THEMES", "MODES", "hljs", "HTML_TAGS", "SVG_TAGS", "TAGS", "MEDIA_FEATURES", "PSEUDO_CLASSES", "PSEUDO_ELEMENTS", "ATTRIBUTES", "css", "regex", "modes", "VENDOR_PREFIX", "AT_MODIFIERS", "AT_PROPERTY_RE", "IDENT_RE", "STRINGS", "init_define_DECKLIGHT_PACKS", "init_define_DECKLIGHT_THEMES", "plaintext", "hljs", "core_default", "sql", "javascript", "typescript", "python", "bash", "yaml", "json", "java", "go", "rust", "xml", "css", "plaintext", "parseLineRanges", "spec", "totalLines", "seg", "_", "i", "out", "part", "m", "a", "b", "n", "wrapLines", "codeEl", "lines", "visit", "node", "path", "child", "t", "parts", "lineEl", "text", "parent", "orig", "tail", "segmentLabel", "sorted", "ranges", "start", "prev", "initCode", "root", "registerBuildProvider", "langClass", "c", "lang", "source", "pre", "lineEls", "segments", "l", "highlightAll", "idx", "init_define_DECKLIGHT_PACKS", "init_define_DECKLIGHT_THEMES", "CLICK_MARK", "notesSegments", "notesHtml", "openSpeakerView", "instance", "FEATURES", "win", "orphaned", "deckUrl", "u", "cb", "speakerState", "ar", "url", "slide", "step", "totalSlides", "rec", "totalSteps", "nextHash", "notesEl", "rehearseEl", "init_define_DECKLIGHT_PACKS", "init_define_DECKLIGHT_THEMES", "mulberry32", "a", "t", "hslToRgb", "h", "s", "l", "c", "x", "m", "seg", "v", "rgbToHex", "r", "g", "b", "luminance", "lin", "contrast", "c1", "c2", "l1", "l2", "minContrastVs", "rgb", "stops", "fitContrast", "startL", "min", "preferred", "sats", "sat", "dir", "white", "black", "ADJECTIVES", "SANS", "SANS_ROUNDED", "SERIF", "MONO", "HEADING_FONTS", "HEADING_WEIGHTS", "RADII", "HARMONIES", "RULES", "generateTheme", "seed", "rnd", "pick", "arr", "range", "lo", "hi", "dark", "baseHue", "harmonyName", "H", "accentHue", "vivid", "chroma", "bgSat", "bgL", "bg1", "bgValue", "bgStops", "bg2", "surface", "fg", "muted", "heading", "accentSat", "accentL", "accent", "accentContrast", "link", "blockBg", "blockBorder", "radius", "shadow", "codeBgRgb", "codeStops", "codeFg", "hlHueOffsets", "hlSat", "hlL", "hl", "tok", "off", "dFillsRgb", "i", "dInkStops", "dStroke", "dText", "dMuted", "dAccent", "dFills", "termBgRgb", "termStops", "termFg", "termPrompt", "ansiAnchor", "ansi", "nameA", "hue", "bright", "name", "hx", "tokens", "SECTIONS", "tokensToCss", "out", "section", "keys", "present", "k", "known", "ks", "DEFAULTS", "PIN_DEFAULT_Y", "PIN_GAP", "PIN_SUB_GAP", "PINNABLE_CONTENT", "activeInstance", "registerBuildProvider", "el", "provider", "registerProvider", "leadingHeading", "section", "detectSubtitle", "heading", "next", "setupPinnedTitles", "sections", "config", "deckY", "sec", "attr", "y", "n", "subtitle", "h", "headerBottom", "checkOverflow", "slideNo", "clipped", "init", "userConfig", "params", "printMode", "debugT0", "debugBuf", "debugEl", "ttsSpend", "debugLog", "kind", "msg", "appendDebugRow", "updateDebugState", "log", "root", "playlist", "playlistIndex", "gotoModule", "delta", "mod", "navigateToModule", "hasMarkersDOM", "inFileMarkers", "out", "instance", "s", "i", "currentMarkerIndex", "markers", "idx", "m", "themeStyles", "inlineThemes", "themeLink", "active", "hasThemes", "themeOf", "href", "themeKey", "CUSTOM_KEY", "customThemes", "genStyle", "genTheme", "customStyles", "ensureTokenStyle", "name", "tokens", "tokensToCss", "deactivateTokenStyles", "exceptEl", "activeTokenStyle", "currentTheme", "tokenStyle", "toastEl", "toastTimer", "toast", "ms", "applyTheme", "silent", "unsavedGen", "target", "updateCanvas", "PACKS", "define_DECKLIGHT_PACKS_default", "packLabel", "p", "packOf", "names", "themeList", "list", "available", "define_DECKLIGHT_THEMES_default", "extras", "rank", "r", "a", "b", "packEntries", "extra", "b64uEncode", "obj", "b64uDecode", "adoptGenerated", "cand", "rollTheme", "generateTheme", "saveGeneratedTheme", "inputName", "blob", "cyclePending", "cancelCyclePending", "cycleTheme", "dir", "cur", "key", "opp", "e", "GEN_ROW", "PACK_ROW", "BACK_ROW", "ALL_ROW", "pickerEl", "pickerSel", "pickerDebounce", "pickerEntries", "pickerCandidate", "pickerFilter", "pickerView", "previewSrc", "st", "hash", "genRowLabel", "row", "rollPickerCandidate", "gi", "selectPickerRow", "renderPickerList", "listBox", "q", "tag", "text", "t", "commitPicker", "none", "bar", "pickerHomeIndex", "curIdx", "packIdx", "setPickerView", "view", "immediate", "setPickerFilter", "openThemePicker", "closeThemePicker", "previewSwap", "rows", "j", "caption", "frame", "pickerFrameReady", "pickerPendingName", "previewMessage", "pending", "finderEl", "finderSel", "finderQuery", "finderMatches", "finderDebounce", "finderFrameReady", "finderPending", "finderIndex", "contentEls", "body", "title", "renderFinderList", "words", "titleHits", "bodyHits", "entry", "tl", "w", "selectFinderRow", "commitFinder", "finderPreviewSwap", "slide", "setFinderQuery", "closeSlideFinder", "openSlideFinder", "palEl", "palSel", "palQuery", "palRows", "paletteCommands", "has", "fn", "renderPalette", "openFontPicker", "narrating", "toggleNarration", "openNarrPicker", "openRecordDialog", "changeNarrRate", "openSpeakerView", "toggleOverview", "toggleModuleMenu", "toggleBlackout", "toggleDebug", "captionsOn", "toggleCaptions", "toggleTranscript", "narrPaused", "toggleNarrPause", "toggleEditor", "toggleFullscreen", "toggleHelp", "c", "card", "g", "label", "kbd", "selectPalRow", "commitPalRow", "cmd", "closePalette", "openPalette", "fontPickEl", "fontPickSel", "closeFontPicker", "FONTS", "fontIdx", "selectFontRow", "applyFont", "genParam", "adopted", "saved", "requested", "fontKey", "remeasure", "stack", "cycleFont", "savedFont", "logoNode", "ref", "src", "clone", "tpl", "img", "logoEl", "cs", "rgb", "dark", "luminance", "stage", "cls", "node", "wrap", "setupHeroLogos", "hero", "initMarkdown", "namespaceSvgIds", "initCode", "type", "detail", "applyConcepts", "scanSlide", "rec", "applyBuildState", "withoutAnim", "stepLabels", "prevRec", "step", "opts", "sameSlide", "direction", "from", "to", "initial", "autoAnim", "runAutoAnimate", "progressBar", "stepsTotal", "frac", "slideNumEl", "num", "pushSlide", "hashOf", "suppressHashChange", "parseHash", "controls", "progress", "TC_ICON", "fsBtn", "soundBtn", "syncSoundBtn", "overviewEl", "ovSel", "ovColumns", "ovSelect", "cells", "ovCommit", "layoutOverview", "cell", "scale", "f", "inp", "moduleMenuEl", "mmSel", "mmMode", "mmSelect", "mmCommit", "useMarkers", "entries", "blackoutEl", "helpEl", "debugStateLine", "narrWhat", "narrSet", "liveCfg", "narrRate", "span", "onKey", "transcriptEl", "editEl", "recEl", "closeRecordDialog", "recView", "startRecording", "narrEl", "narrView", "commitCustomTone", "narrBack", "selectNarrRow", "narrSel", "commitNarrRow", "closeNarrPicker", "touchX", "dx", "rescale", "box", "narrKey", "LIVE_URL", "GEMINI_VOICES", "TONES", "narrSets", "LIVE_TRACK", "hit", "narrAudio", "liveWarned", "narrRateKey", "v", "liveCache", "notesText", "sl", "notesSegs", "synthLive", "t0", "res", "cost", "splitSentences", "sentenceKey", "fetchLiveSentence", "sentence", "narrationHolds", "LIVE_LOOKAHEAD", "BUFFER_WORKERS", "bufferGen", "upcomingSentences", "count", "segs", "max", "fillLiveBuffer", "gen", "worker", "hole", "liveSegGen", "liveChainActive", "liveChainGen", "playLive", "advanceFrom", "sentences", "stale", "clip", "setCaption", "blocked", "done", "playSlideFile", "what", "captionsKey", "captionEl", "updateCaption", "showCaptions", "transcriptData", "transcriptString", "md", "seg", "downloadTranscript", "url", "base", "downloadFromUrl", "head", "actions", "editAvailable", "editBase", "bases", "here", "es", "ta", "save", "btn", "arm", "tc", "narrRows", "liveDraft", "persistNarr", "applyLive", "toneLabel", "styleText", "renderNarr", "PREVIEW_DEFAULT", "previewText", "previewAudio", "previewDefaultCache", "previewCustomCache", "previewCustomText", "previewPrefetching", "previewCacheFor", "previewKey", "voice", "style", "ensurePreviewIn", "cache", "prefetchPreviews", "runKey", "isDefault", "previewClip", "prefetch", "test", "reset", "flavor", "input", "prev", "recRun", "slidesWithNotes", "fmtTime", "filename", "renderRecordCard", "data", "total", "elapsedMs", "pct", "eta", "cancelled", "SENT_GAP_S", "SEG_GAP_S", "stitchWav", "chunks", "rate", "dataLen", "o", "silencePcm", "seconds", "stitchSlideWav", "run", "buf", "wav", "init_define_DECKLIGHT_PACKS", "init_define_DECKLIGHT_THEMES", "init_define_DECKLIGHT_PACKS", "init_define_DECKLIGHT_THEMES", "ESC", "BLANK_STYLE", "xterm256ToRgb", "n", "v", "steps", "gray", "escapeHtml", "s", "AnsiScreen", "chunk", "data", "i", "ch", "consumed", "line", "kind", "j", "c", "params", "final", "mode", "p", "x", "target", "row", "spans", "cell", "last", "sameStyle", "spansToHtml", "a", "b", "colorEq", "colorCss", "r", "g", "text", "style", "classes", "css", "fg", "bg", "color", "esc", "cls", "sty", "DEFAULT_VISIBLE_ROWS", "clampScale", "n", "typeRate", "s", "BASE_WPM", "WPM_STEPS", "TYPE_WPM_KEY", "nearestWpm", "w", "a", "b", "SOUND_STEPS", "TYPE_SOUND_KEY", "TERM_FONT_KEY", "FONT_STEPS", "KEY_PROFILES", "keyGap", "ch", "ms", "keyCtx", "keyNoise", "keyClick", "profile", "gapSec", "AC", "len", "d", "i", "P", "rnd", "lo", "hi", "t", "space", "amp", "fc", "ring", "click", "at", "gain", "f", "decay", "src", "bp", "g", "thump", "f0", "osc", "tf", "up", "primeKeyAudio", "audioUnlockArmed", "armAudioUnlock", "unlock", "registerTerminals", "Decklight", "root", "els", "el", "setupTerminal", "err", "renderError", "text", "inlineSel", "node", "r", "res", "cast", "parseCast", "controller", "TerminalController", "mode", "doc", "importAsciicast", "lines", "l", "header", "steps", "cur", "curStart", "sawMarker", "line", "ev", "kind", "data", "round3", "escapeHtml", "authoredScale", "saved", "authoredSnd", "title", "withCursor", "parts", "step", "screen", "AnsiScreen", "body", "scale", "btn", "label", "cmd", "base", "speedFactor", "epoch", "c", "gap", "sleep", "poster", "animate", "stepIdx", "events", "total", "paint", "prevT", "SPEEDS", "authored", "playBtn", "speedBtn", "from", "x", "version", "init", "config", "instance", "register", "registerTerminals", "registerBuildProvider", "err", "initTerminals", "root"]
|
|
7
|
+
}
|