UNPKG

docsify

Version:

A magical documentation generator.

7,959 lines • 370 kB
/*!
 * Docsify v5.1.0
 * https://docsify.js.org
 * (c) 2017-2026
 * MIT license
 */
(function() {
    "use strict";
    function _mergeNamespaces(n, m) {
        m.forEach((function(e) {
            e && typeof e !== "string" && !Array.isArray(e) && Object.keys(e).forEach((function(k) {
                if (k !== "default" && !(k in n)) {
                    var d = Object.getOwnPropertyDescriptor(e, k);
                    Object.defineProperty(n, k, d.get ? d : {
                        enumerable: true,
                        get: function() {
                            return e[k];
                        }
                    });
                }
            }));
        }));
        return Object.freeze(n);
    }
    function cached$1(fn) {
        const cache = Object.create(null);
        return function(str) {
            const key = isPrimitive(str) ? str : JSON.stringify(str);
            if (key in cache) {
                return cache[key];
            }
            return cache[key] = fn(str);
        };
    }
    const hyphenate = cached$1((str => str.replace(/([A-Z])/g, (m => "-" + m.toLowerCase()))));
    function isPrimitive(value) {
        return typeof value === "string" || typeof value === "number";
    }
    function noop() {}
    function isFn(obj) {
        return typeof obj === "function";
    }
    function isExternal(url) {
        const match = url.match(/^([^:/?#]+:)?(?:\/{2,}([^/?#]*))?([^?#]+)?(\?[^#]*)?(#.*)?/);
        if (typeof match[1] === "string" && match[1].length > 0 && match[1].toLowerCase() !== location.protocol) {
            return true;
        }
        if (typeof match[2] === "string" && match[2].length > 0 && match[2].replace(new RegExp(":(" + {
            "http:": 80,
            "https:": 443
        }[location.protocol] + ")?$"), "") !== location.host) {
            return true;
        }
        if (/^\/\\/.test(url)) {
            return true;
        }
        return false;
    }
    const cacheNode = {};
    function getNode(el, noCache = false) {
        if (typeof el === "string") {
            if (typeof window.Vue !== "undefined") {
                return find(el);
            }
            el = noCache ? find(el) : cacheNode[el] || (cacheNode[el] = find(el));
        }
        return el;
    }
    function setHTML(el, content, replace) {
        const node = getNode(el);
        if (node) {
            node[replace ? "outerHTML" : "innerHTML"] = content;
        }
    }
    const $$1 = document;
    const body = $$1.body;
    const head = $$1.head;
    function find(el, query = ":is()") {
        return typeof el !== "string" ? el.querySelector(query) : $$1.querySelector(el);
    }
    function findAll(el, query = ":is()") {
        return Array.from(typeof el !== "string" ? el.querySelectorAll(query) : $$1.querySelectorAll(el));
    }
    function create(node, tpl) {
        const element = $$1.createElement(node);
        if (tpl) {
            element.innerHTML = tpl;
        }
        return element;
    }
    function appendTo(target, el) {
        return target.appendChild(el);
    }
    function before(target, el) {
        return target.insertBefore(el, target.children[0]);
    }
    function on(el, type, handler) {
        isFn(type) ? window.addEventListener(el, type) : el.addEventListener(type, handler);
    }
    function off(el, type, handler) {
        isFn(type) ? window.removeEventListener(el, type) : el.removeEventListener(type, handler);
    }
    function style(content) {
        appendTo(head, create("style", content));
    }
    function documentReady(callback, doc = document) {
        const state = doc.readyState;
        if (state === "complete" || state === "interactive") {
            return setTimeout(callback, 0);
        }
        doc.addEventListener("DOMContentLoaded", callback);
    }
    var dom = Object.freeze({
        __proto__: null,
        $: $$1,
        appendTo: appendTo,
        before: before,
        body: body,
        create: create,
        documentReady: documentReady,
        find: find,
        findAll: findAll,
        getNode: getNode,
        head: head,
        off: off,
        on: on,
        setHTML: setHTML,
        style: style
    });
    var commonjsGlobal = typeof globalThis !== "undefined" ? globalThis : typeof window !== "undefined" ? window : typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : {};
    function getDefaultExportFromCjs(x) {
        return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, "default") ? x["default"] : x;
    }
    var prism$2 = {
        exports: {}
    };
    var hasRequiredPrism;
    function requirePrism() {
        if (hasRequiredPrism) return prism$2.exports;
        hasRequiredPrism = 1;
        (function(module) {
            var _self = typeof window !== "undefined" ? window : typeof WorkerGlobalScope !== "undefined" && self instanceof WorkerGlobalScope ? self : {};
            var Prism = function(_self) {
                var lang = /(?:^|\s)lang(?:uage)?-([\w-]+)(?=\s|$)/i;
                var uniqueId = 0;
                var plainTextGrammar = {};
                var _ = {
                    manual: _self.Prism && _self.Prism.manual,
                    disableWorkerMessageHandler: _self.Prism && _self.Prism.disableWorkerMessageHandler,
                    util: {
                        encode: function encode(tokens) {
                            if (tokens instanceof Token) {
                                return new Token(tokens.type, encode(tokens.content), tokens.alias);
                            } else if (Array.isArray(tokens)) {
                                return tokens.map(encode);
                            } else {
                                return tokens.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/\u00a0/g, " ");
                            }
                        },
                        type: function(o) {
                            return Object.prototype.toString.call(o).slice(8, -1);
                        },
                        objId: function(obj) {
                            if (!obj["__id"]) {
                                Object.defineProperty(obj, "__id", {
                                    value: ++uniqueId
                                });
                            }
                            return obj["__id"];
                        },
                        clone: function deepClone(o, visited) {
                            visited = visited || {};
                            var clone;
                            var id;
                            switch (_.util.type(o)) {
                              case "Object":
                                id = _.util.objId(o);
                                if (visited[id]) {
                                    return visited[id];
                                }
                                clone = {};
                                visited[id] = clone;
                                for (var key in o) {
                                    if (o.hasOwnProperty(key)) {
                                        clone[key] = deepClone(o[key], visited);
                                    }
                                }
                                return clone;

                              case "Array":
                                id = _.util.objId(o);
                                if (visited[id]) {
                                    return visited[id];
                                }
                                clone = [];
                                visited[id] = clone;
                                o.forEach((function(v, i) {
                                    clone[i] = deepClone(v, visited);
                                }));
                                return clone;

                              default:
                                return o;
                            }
                        },
                        getLanguage: function(element) {
                            while (element) {
                                var m = lang.exec(element.className);
                                if (m) {
                                    return m[1].toLowerCase();
                                }
                                element = element.parentElement;
                            }
                            return "none";
                        },
                        setLanguage: function(element, language) {
                            element.className = element.className.replace(RegExp(lang, "gi"), "");
                            element.classList.add("language-" + language);
                        },
                        currentScript: function() {
                            if (typeof document === "undefined") {
                                return null;
                            }
                            if (document.currentScript && document.currentScript.tagName === "SCRIPT" && 1 < 2) {
                                return document.currentScript;
                            }
                            try {
                                throw new Error;
                            } catch (err) {
                                var src = (/at [^(\r\n]*\((.*):[^:]+:[^:]+\)$/i.exec(err.stack) || [])[1];
                                if (src) {
                                    var scripts = document.getElementsByTagName("script");
                                    for (var i in scripts) {
                                        if (scripts[i].src == src) {
                                            return scripts[i];
                                        }
                                    }
                                }
                                return null;
                            }
                        },
                        isActive: function(element, className, defaultActivation) {
                            var no = "no-" + className;
                            while (element) {
                                var classList = element.classList;
                                if (classList.contains(className)) {
                                    return true;
                                }
                                if (classList.contains(no)) {
                                    return false;
                                }
                                element = element.parentElement;
                            }
                            return !!defaultActivation;
                        }
                    },
                    languages: {
                        plain: plainTextGrammar,
                        plaintext: plainTextGrammar,
                        text: plainTextGrammar,
                        txt: plainTextGrammar,
                        extend: function(id, redef) {
                            var lang = _.util.clone(_.languages[id]);
                            for (var key in redef) {
                                lang[key] = redef[key];
                            }
                            return lang;
                        },
                        insertBefore: function(inside, before, insert, root) {
                            root = root || _.languages;
                            var grammar = root[inside];
                            var ret = {};
                            for (var token in grammar) {
                                if (grammar.hasOwnProperty(token)) {
                                    if (token == before) {
                                        for (var newToken in insert) {
                                            if (insert.hasOwnProperty(newToken)) {
                                                ret[newToken] = insert[newToken];
                                            }
                                        }
                                    }
                                    if (!insert.hasOwnProperty(token)) {
                                        ret[token] = grammar[token];
                                    }
                                }
                            }
                            var old = root[inside];
                            root[inside] = ret;
                            _.languages.DFS(_.languages, (function(key, value) {
                                if (value === old && key != inside) {
                                    this[key] = ret;
                                }
                            }));
                            return ret;
                        },
                        DFS: function DFS(o, callback, type, visited) {
                            visited = visited || {};
                            var objId = _.util.objId;
                            for (var i in o) {
                                if (o.hasOwnProperty(i)) {
                                    callback.call(o, i, o[i], type || i);
                                    var property = o[i];
                                    var propertyType = _.util.type(property);
                                    if (propertyType === "Object" && !visited[objId(property)]) {
                                        visited[objId(property)] = true;
                                        DFS(property, callback, null, visited);
                                    } else if (propertyType === "Array" && !visited[objId(property)]) {
                                        visited[objId(property)] = true;
                                        DFS(property, callback, i, visited);
                                    }
                                }
                            }
                        }
                    },
                    plugins: {},
                    highlightAll: function(async, callback) {
                        _.highlightAllUnder(document, async, callback);
                    },
                    highlightAllUnder: function(container, async, callback) {
                        var env = {
                            callback: callback,
                            container: container,
                            selector: 'code[class*="language-"], [class*="language-"] code, code[class*="lang-"], [class*="lang-"] code'
                        };
                        _.hooks.run("before-highlightall", env);
                        env.elements = Array.prototype.slice.apply(env.container.querySelectorAll(env.selector));
                        _.hooks.run("before-all-elements-highlight", env);
                        for (var i = 0, element; element = env.elements[i++]; ) {
                            _.highlightElement(element, async === true, env.callback);
                        }
                    },
                    highlightElement: function(element, async, callback) {
                        var language = _.util.getLanguage(element);
                        var grammar = _.languages[language];
                        _.util.setLanguage(element, language);
                        var parent = element.parentElement;
                        if (parent && parent.nodeName.toLowerCase() === "pre") {
                            _.util.setLanguage(parent, language);
                        }
                        var code = element.textContent;
                        var env = {
                            element: element,
                            language: language,
                            grammar: grammar,
                            code: code
                        };
                        function insertHighlightedCode(highlightedCode) {
                            env.highlightedCode = highlightedCode;
                            _.hooks.run("before-insert", env);
                            env.element.innerHTML = env.highlightedCode;
                            _.hooks.run("after-highlight", env);
                            _.hooks.run("complete", env);
                            callback && callback.call(env.element);
                        }
                        _.hooks.run("before-sanity-check", env);
                        parent = env.element.parentElement;
                        if (parent && parent.nodeName.toLowerCase() === "pre" && !parent.hasAttribute("tabindex")) {
                            parent.setAttribute("tabindex", "0");
                        }
                        if (!env.code) {
                            _.hooks.run("complete", env);
                            callback && callback.call(env.element);
                            return;
                        }
                        _.hooks.run("before-highlight", env);
                        if (!env.grammar) {
                            insertHighlightedCode(_.util.encode(env.code));
                            return;
                        }
                        if (async && _self.Worker) {
                            var worker = new Worker(_.filename);
                            worker.onmessage = function(evt) {
                                insertHighlightedCode(evt.data);
                            };
                            worker.postMessage(JSON.stringify({
                                language: env.language,
                                code: env.code,
                                immediateClose: true
                            }));
                        } else {
                            insertHighlightedCode(_.highlight(env.code, env.grammar, env.language));
                        }
                    },
                    highlight: function(text, grammar, language) {
                        var env = {
                            code: text,
                            grammar: grammar,
                            language: language
                        };
                        _.hooks.run("before-tokenize", env);
                        if (!env.grammar) {
                            throw new Error('The language "' + env.language + '" has no grammar.');
                        }
                        env.tokens = _.tokenize(env.code, env.grammar);
                        _.hooks.run("after-tokenize", env);
                        return Token.stringify(_.util.encode(env.tokens), env.language);
                    },
                    tokenize: function(text, grammar) {
                        var rest = grammar.rest;
                        if (rest) {
                            for (var token in rest) {
                                grammar[token] = rest[token];
                            }
                            delete grammar.rest;
                        }
                        var tokenList = new LinkedList;
                        addAfter(tokenList, tokenList.head, text);
                        matchGrammar(text, tokenList, grammar, tokenList.head, 0);
                        return toArray(tokenList);
                    },
                    hooks: {
                        all: {},
                        add: function(name, callback) {
                            var hooks = _.hooks.all;
                            hooks[name] = hooks[name] || [];
                            hooks[name].push(callback);
                        },
                        run: function(name, env) {
                            var callbacks = _.hooks.all[name];
                            if (!callbacks || !callbacks.length) {
                                return;
                            }
                            for (var i = 0, callback; callback = callbacks[i++]; ) {
                                callback(env);
                            }
                        }
                    },
                    Token: Token
                };
                _self.Prism = _;
                function Token(type, content, alias, matchedStr) {
                    this.type = type;
                    this.content = content;
                    this.alias = alias;
                    this.length = (matchedStr || "").length | 0;
                }
                Token.stringify = function stringify(o, language) {
                    if (typeof o == "string") {
                        return o;
                    }
                    if (Array.isArray(o)) {
                        var s = "";
                        o.forEach((function(e) {
                            s += stringify(e, language);
                        }));
                        return s;
                    }
                    var env = {
                        type: o.type,
                        content: stringify(o.content, language),
                        tag: "span",
                        classes: [ "token", o.type ],
                        attributes: {},
                        language: language
                    };
                    var aliases = o.alias;
                    if (aliases) {
                        if (Array.isArray(aliases)) {
                            Array.prototype.push.apply(env.classes, aliases);
                        } else {
                            env.classes.push(aliases);
                        }
                    }
                    _.hooks.run("wrap", env);
                    var attributes = "";
                    for (var name in env.attributes) {
                        attributes += " " + name + '="' + (env.attributes[name] || "").replace(/"/g, "&quot;") + '"';
                    }
                    return "<" + env.tag + ' class="' + env.classes.join(" ") + '"' + attributes + ">" + env.content + "</" + env.tag + ">";
                };
                function matchPattern(pattern, pos, text, lookbehind) {
                    pattern.lastIndex = pos;
                    var match = pattern.exec(text);
                    if (match && lookbehind && match[1]) {
                        var lookbehindLength = match[1].length;
                        match.index += lookbehindLength;
                        match[0] = match[0].slice(lookbehindLength);
                    }
                    return match;
                }
                function matchGrammar(text, tokenList, grammar, startNode, startPos, rematch) {
                    for (var token in grammar) {
                        if (!grammar.hasOwnProperty(token) || !grammar[token]) {
                            continue;
                        }
                        var patterns = grammar[token];
                        patterns = Array.isArray(patterns) ? patterns : [ patterns ];
                        for (var j = 0; j < patterns.length; ++j) {
                            if (rematch && rematch.cause == token + "," + j) {
                                return;
                            }
                            var patternObj = patterns[j];
                            var inside = patternObj.inside;
                            var lookbehind = !!patternObj.lookbehind;
                            var greedy = !!patternObj.greedy;
                            var alias = patternObj.alias;
                            if (greedy && !patternObj.pattern.global) {
                                var flags = patternObj.pattern.toString().match(/[imsuy]*$/)[0];
                                patternObj.pattern = RegExp(patternObj.pattern.source, flags + "g");
                            }
                            var pattern = patternObj.pattern || patternObj;
                            for (var currentNode = startNode.next, pos = startPos; currentNode !== tokenList.tail; pos += currentNode.value.length, 
                            currentNode = currentNode.next) {
                                if (rematch && pos >= rematch.reach) {
                                    break;
                                }
                                var str = currentNode.value;
                                if (tokenList.length > text.length) {
                                    return;
                                }
                                if (str instanceof Token) {
                                    continue;
                                }
                                var removeCount = 1;
                                var match;
                                if (greedy) {
                                    match = matchPattern(pattern, pos, text, lookbehind);
                                    if (!match || match.index >= text.length) {
                                        break;
                                    }
                                    var from = match.index;
                                    var to = match.index + match[0].length;
                                    var p = pos;
                                    p += currentNode.value.length;
                                    while (from >= p) {
                                        currentNode = currentNode.next;
                                        p += currentNode.value.length;
                                    }
                                    p -= currentNode.value.length;
                                    pos = p;
                                    if (currentNode.value instanceof Token) {
                                        continue;
                                    }
                                    for (var k = currentNode; k !== tokenList.tail && (p < to || typeof k.value === "string"); k = k.next) {
                                        removeCount++;
                                        p += k.value.length;
                                    }
                                    removeCount--;
                                    str = text.slice(pos, p);
                                    match.index -= pos;
                                } else {
                                    match = matchPattern(pattern, 0, str, lookbehind);
                                    if (!match) {
                                        continue;
                                    }
                                }
                                var from = match.index;
                                var matchStr = match[0];
                                var before = str.slice(0, from);
                                var after = str.slice(from + matchStr.length);
                                var reach = pos + str.length;
                                if (rematch && reach > rematch.reach) {
                                    rematch.reach = reach;
                                }
                                var removeFrom = currentNode.prev;
                                if (before) {
                                    removeFrom = addAfter(tokenList, removeFrom, before);
                                    pos += before.length;
                                }
                                removeRange(tokenList, removeFrom, removeCount);
                                var wrapped = new Token(token, inside ? _.tokenize(matchStr, inside) : matchStr, alias, matchStr);
                                currentNode = addAfter(tokenList, removeFrom, wrapped);
                                if (after) {
                                    addAfter(tokenList, currentNode, after);
                                }
                                if (removeCount > 1) {
                                    var nestedRematch = {
                                        cause: token + "," + j,
                                        reach: reach
                                    };
                                    matchGrammar(text, tokenList, grammar, currentNode.prev, pos, nestedRematch);
                                    if (rematch && nestedRematch.reach > rematch.reach) {
                                        rematch.reach = nestedRematch.reach;
                                    }
                                }
                            }
                        }
                    }
                }
                function LinkedList() {
                    var head = {
                        value: null,
                        prev: null,
                        next: null
                    };
                    var tail = {
                        value: null,
                        prev: head,
                        next: null
                    };
                    head.next = tail;
                    this.head = head;
                    this.tail = tail;
                    this.length = 0;
                }
                function addAfter(list, node, value) {
                    var next = node.next;
                    var newNode = {
                        value: value,
                        prev: node,
                        next: next
                    };
                    node.next = newNode;
                    next.prev = newNode;
                    list.length++;
                    return newNode;
                }
                function removeRange(list, node, count) {
                    var next = node.next;
                    for (var i = 0; i < count && next !== list.tail; i++) {
                        next = next.next;
                    }
                    node.next = next;
                    next.prev = node;
                    list.length -= i;
                }
                function toArray(list) {
                    var array = [];
                    var node = list.head.next;
                    while (node !== list.tail) {
                        array.push(node.value);
                        node = node.next;
                    }
                    return array;
                }
                if (!_self.document) {
                    if (!_self.addEventListener) {
                        return _;
                    }
                    if (!_.disableWorkerMessageHandler) {
                        _self.addEventListener("message", (function(evt) {
                            var message = JSON.parse(evt.data);
                            var lang = message.language;
                            var code = message.code;
                            var immediateClose = message.immediateClose;
                            _self.postMessage(_.highlight(code, _.languages[lang], lang));
                            if (immediateClose) {
                                _self.close();
                            }
                        }), false);
                    }
                    return _;
                }
                var script = _.util.currentScript();
                if (script) {
                    _.filename = script.src;
                    if (script.hasAttribute("data-manual")) {
                        _.manual = true;
                    }
                }
                function highlightAutomaticallyCallback() {
                    if (!_.manual) {
                        _.highlightAll();
                    }
                }
                if (!_.manual) {
                    var readyState = document.readyState;
                    if (readyState === "loading" || readyState === "interactive" && script && script.defer) {
                        document.addEventListener("DOMContentLoaded", highlightAutomaticallyCallback);
                    } else {
                        if (window.requestAnimationFrame) {
                            window.requestAnimationFrame(highlightAutomaticallyCallback);
                        } else {
                            window.setTimeout(highlightAutomaticallyCallback, 16);
                        }
                    }
                }
                return _;
            }(_self);
            if (module.exports) {
                module.exports = Prism;
            }
            if (typeof commonjsGlobal !== "undefined") {
                commonjsGlobal.Prism = Prism;
            }
            Prism.languages.markup = {
                comment: {
                    pattern: /<!--(?:(?!<!--)[\s\S])*?-->/,
                    greedy: true
                },
                prolog: {
                    pattern: /<\?[\s\S]+?\?>/,
                    greedy: true
                },
                doctype: {
                    pattern: /<!DOCTYPE(?:[^>"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:[^<"'\]]|"[^"]*"|'[^']*'|<(?!!--)|<!--(?:[^-]|-(?!->))*-->)*\]\s*)?>/i,
                    greedy: true,
                    inside: {
                        "internal-subset": {
                            pattern: /(^[^\[]*\[)[\s\S]+(?=\]>$)/,
                            lookbehind: true,
                            greedy: true,
                            inside: null
                        },
                        string: {
                            pattern: /"[^"]*"|'[^']*'/,
                            greedy: true
                        },
                        punctuation: /^<!|>$|[[\]]/,
                        "doctype-tag": /^DOCTYPE/i,
                        name: /[^\s<>'"]+/
                    }
                },
                cdata: {
                    pattern: /<!\[CDATA\[[\s\S]*?\]\]>/i,
                    greedy: true
                },
                tag: {
                    pattern: /<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/,
                    greedy: true,
                    inside: {
                        tag: {
                            pattern: /^<\/?[^\s>\/]+/,
                            inside: {
                                punctuation: /^<\/?/,
                                namespace: /^[^\s>\/:]+:/
                            }
                        },
                        "special-attr": [],
                        "attr-value": {
                            pattern: /=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/,
                            inside: {
                                punctuation: [ {
                                    pattern: /^=/,
                                    alias: "attr-equals"
                                }, {
                                    pattern: /^(\s*)["']|["']$/,
                                    lookbehind: true
                                } ]
                            }
                        },
                        punctuation: /\/?>/,
                        "attr-name": {
                            pattern: /[^\s>\/]+/,
                            inside: {
                                namespace: /^[^\s>\/:]+:/
                            }
                        }
                    }
                },
                entity: [ {
                    pattern: /&[\da-z]{1,8};/i,
                    alias: "named-entity"
                }, /&#x?[\da-f]{1,8};/i ]
            };
            Prism.languages.markup["tag"].inside["attr-value"].inside["entity"] = Prism.languages.markup["entity"];
            Prism.languages.markup["doctype"].inside["internal-subset"].inside = Prism.languages.markup;
            Prism.hooks.add("wrap", (function(env) {
                if (env.type === "entity") {
                    env.attributes["title"] = env.content.replace(/&amp;/, "&");
                }
            }));
            Object.defineProperty(Prism.languages.markup.tag, "addInlined", {
                value: function addInlined(tagName, lang) {
                    var includedCdataInside = {};
                    includedCdataInside["language-" + lang] = {
                        pattern: /(^<!\[CDATA\[)[\s\S]+?(?=\]\]>$)/i,
                        lookbehind: true,
                        inside: Prism.languages[lang]
                    };
                    includedCdataInside["cdata"] = /^<!\[CDATA\[|\]\]>$/i;
                    var inside = {
                        "included-cdata": {
                            pattern: /<!\[CDATA\[[\s\S]*?\]\]>/i,
                            inside: includedCdataInside
                        }
                    };
                    inside["language-" + lang] = {
                        pattern: /[\s\S]+/,
                        inside: Prism.languages[lang]
                    };
                    var def = {};
                    def[tagName] = {
                        pattern: RegExp(/(<__[^>]*>)(?:<!\[CDATA\[(?:[^\]]|\](?!\]>))*\]\]>|(?!<!\[CDATA\[)[\s\S])*?(?=<\/__>)/.source.replace(/__/g, (function() {
                            return tagName;
                        })), "i"),
                        lookbehind: true,
                        greedy: true,
                        inside: inside
                    };
                    Prism.languages.insertBefore("markup", "cdata", def);
                }
            });
            Object.defineProperty(Prism.languages.markup.tag, "addAttribute", {
                value: function(attrName, lang) {
                    Prism.languages.markup.tag.inside["special-attr"].push({
                        pattern: RegExp(/(^|["'\s])/.source + "(?:" + attrName + ")" + /\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))/.source, "i"),
                        lookbehind: true,
                        inside: {
                            "attr-name": /^[^\s=]+/,
                            "attr-value": {
                                pattern: /=[\s\S]+/,
                                inside: {
                                    value: {
                                        pattern: /(^=\s*(["']|(?!["'])))\S[\s\S]*(?=\2$)/,
                                        lookbehind: true,
                                        alias: [ lang, "language-" + lang ],
                                        inside: Prism.languages[lang]
                                    },
                                    punctuation: [ {
                                        pattern: /^=/,
                                        alias: "attr-equals"
                                    }, /"|'/ ]
                                }
                            }
                        }
                    });
                }
            });
            Prism.languages.html = Prism.languages.markup;
            Prism.languages.mathml = Prism.languages.markup;
            Prism.languages.svg = Prism.languages.markup;
            Prism.languages.xml = Prism.languages.extend("markup", {});
            Prism.languages.ssml = Prism.languages.xml;
            Prism.languages.atom = Prism.languages.xml;
            Prism.languages.rss = Prism.languages.xml;
            (function(Prism) {
                var string = /(?:"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n])*')/;
                Prism.languages.css = {
                    comment: /\/\*[\s\S]*?\*\//,
                    atrule: {
                        pattern: RegExp("@[\\w-](?:" + /[^;{\s"']|\s+(?!\s)/.source + "|" + string.source + ")*?" + /(?:;|(?=\s*\{))/.source),
                        inside: {
                            rule: /^@[\w-]+/,
                            "selector-function-argument": {
                                pattern: /(\bselector\s*\(\s*(?![\s)]))(?:[^()\s]|\s+(?![\s)])|\((?:[^()]|\([^()]*\))*\))+(?=\s*\))/,
                                lookbehind: true,
                                alias: "selector"
                            },
                            keyword: {
                                pattern: /(^|[^\w-])(?:and|not|only|or)(?![\w-])/,
                                lookbehind: true
                            }
                        }
                    },
                    url: {
                        pattern: RegExp("\\burl\\((?:" + string.source + "|" + /(?:[^\\\r\n()"']|\\[\s\S])*/.source + ")\\)", "i"),
                        greedy: true,
                        inside: {
                            function: /^url/i,
                            punctuation: /^\(|\)$/,
                            string: {
                                pattern: RegExp("^" + string.source + "$"),
                                alias: "url"
                            }
                        }
                    },
                    selector: {
                        pattern: RegExp("(^|[{}\\s])[^{}\\s](?:[^{};\"'\\s]|\\s+(?![\\s{])|" + string.source + ")*(?=\\s*\\{)"),
                        lookbehind: true
                    },
                    string: {
                        pattern: string,
                        greedy: true
                    },
                    property: {
                        pattern: /(^|[^-\w\xA0-\uFFFF])(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*(?=\s*:)/i,
                        lookbehind: true
                    },
                    important: /!important\b/i,
                    function: {
                        pattern: /(^|[^-a-z0-9])[-a-z0-9]+(?=\()/i,
                        lookbehind: true
                    },
                    punctuation: /[(){};:,]/
                };
                Prism.languages.css["atrule"].inside.rest = Prism.languages.css;
                var markup = Prism.languages.markup;
                if (markup) {
                    markup.tag.addInlined("style", "css");
                    markup.tag.addAttribute("style", "css");
                }
            })(Prism);
            Prism.languages.clike = {
                comment: [ {
                    pattern: /(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,
                    lookbehind: true,
                    greedy: true
                }, {
                    pattern: /(^|[^\\:])\/\/.*/,
                    lookbehind: true,
                    greedy: true
                } ],
                string: {
                    pattern: /(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,
                    greedy: true
                },
                "class-name": {
                    pattern: /(\b(?:class|extends|implements|instanceof|interface|new|trait)\s+|\bcatch\s+\()[\w.\\]+/i,
                    lookbehind: true,
                    inside: {
                        punctuation: /[.\\]/
                    }
                },
                keyword: /\b(?:break|catch|continue|do|else|finally|for|function|if|in|instanceof|new|null|return|throw|try|while)\b/,
                boolean: /\b(?:false|true)\b/,
                function: /\b\w+(?=\()/,
                number: /\b0x[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?/i,
                operator: /[<>]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/,
                punctuation: /[{}[\];(),.:]/
            };
            Prism.languages.javascript = Prism.languages.extend("clike", {
                "class-name": [ Prism.languages.clike["class-name"], {
                    pattern: /(^|[^$\w\xA0-\uFFFF])(?!\s)[_$A-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\.(?:constructor|prototype))/,
                    lookbehind: true
                } ],
                keyword: [ {
                    pattern: /((?:^|\})\s*)catch\b/,
                    lookbehind: true
                }, {
                    pattern: /(^|[^.]|\.\.\.\s*)\b(?:as|assert(?=\s*\{)|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally(?=\s*(?:\{|$))|for|from(?=\s*(?:['"]|$))|function|(?:get|set)(?=\s*(?:[#\[$\w\xA0-\uFFFF]|$))|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/,
                    lookbehind: true
                } ],
                function: /#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/,
                number: {
                    pattern: RegExp(/(^|[^\w$])/.source + "(?:" + (/NaN|Infinity/.source + "|" + /0[bB][01]+(?:_[01]+)*n?/.source + "|" + /0[oO][0-7]+(?:_[0-7]+)*n?/.source + "|" + /0[xX][\dA-Fa-f]+(?:_[\dA-Fa-f]+)*n?/.source + "|" + /\d+(?:_\d+)*n/.source + "|" + /(?:\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\.\d+(?:_\d+)*)(?:[Ee][+-]?\d+(?:_\d+)*)?/.source) + ")" + /(?![\w$])/.source),
                    lookbehind: true
                },
                operator: /--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/
            });
            Prism.languages.javascript["class-name"][0].pattern = /(\b(?:class|extends|implements|instanceof|interface|new)\s+)[\w.\\]+/;
            Prism.languages.insertBefore("javascript", "keyword", {
                regex: {
                    pattern: RegExp(/((?:^|[^$\w\xA0-\uFFFF."'\])\s]|\b(?:return|yield))\s*)/.source + /\//.source + "(?:" + /(?:\[(?:[^\]\\\r\n]|\\.)*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}/.source + "|" + /(?:\[(?:[^[\]\\\r\n]|\\.|\[(?:[^[\]\\\r\n]|\\.|\[(?:[^[\]\\\r\n]|\\.)*\])*\])*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}v[dgimyus]{0,7}/.source + ")" + /(?=(?:\s|\/\*(?:[^*]|\*(?!\/))*\*\/)*(?:$|[\r\n,.;:})\]]|\/\/))/.source),
                    lookbehind: true,
                    greedy: true,
                    inside: {
                        "regex-source": {
                            pattern: /^(\/)[\s\S]+(?=\/[a-z]*$)/,
                            lookbehind: true,
                            alias: "language-regex",
                            inside: Prism.languages.regex
                        },
                        "regex-delimiter": /^\/|\/$/,
                        "regex-flags": /^[a-z]+$/
                    }
                },
                "function-variable": {
                    pattern: /#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/,
                    alias: "function"
                },
                parameter: [ {
                    pattern: /(function(?:\s+(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)?\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\))/,
                    lookbehind: true,
                    inside: Prism.languages.javascript
                }, {
                    pattern: /(^|[^$\w\xA0-\uFFFF])(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=>)/i,
                    lookbehind: true,
                    inside: Prism.languages.javascript
                }, {
                    pattern: /(\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*=>)/,
                    lookbehind: true,
                    inside: Prism.languages.javascript
                }, {
                    pattern: /((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*)\(\s*|\]\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*\{)/,
                    lookbehind: true,
                    inside: Prism.languages.javascript
                } ],
                constant: /\b[A-Z](?:[A-Z_]|\dx?)*\b/
            });
            Prism.languages.insertBefore("javascript", "string", {
                hashbang: {
                    pattern: /^#!.*/,
                    greedy: true,
                    alias: "comment"
                },
                "template-string": {
                    pattern: /`(?:\\[\s\S]|\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}|(?!\$\{)[^\\`])*`/,
                    greedy: true,
                    inside: {
                        "template-punctuation": {
                            pattern: /^`|`$/,
                            alias: "string"
                        },
                        interpolation: {
                            pattern: /((?:^|[^\\])(?:\\{2})*)\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/,
                            lookbehind: true,
                            inside: {
                                "interpolation-punctuation": {
                                    pattern: /^\$\{|\}$/,
                                    alias: "punctuation"
                                },
                                rest: Prism.languages.javascript
                            }
                        },
                        string: /[\s\S]+/
                    }
                },
                "string-property": {
                    pattern: /((?:^|[,{])[ \t]*)(["'])(?:\\(?:\r\n|[\s\S])|(?!\2)[^\\\r\n])*\2(?=\s*:)/m,
                    lookbehind: true,
                    greedy: true,
                    alias: "property"
                }
            });
            Prism.languages.insertBefore("javascript", "operator", {
                "literal-property": {
                    pattern: /((?:^|[,{])[ \t]*)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*:)/m,
                    lookbehind: true,
                    alias: "property"
                }
            });
            if (Prism.languages.markup) {
                Prism.languages.markup.tag.addInlined("script", "javascript");
                Prism.languages.markup.tag.addAttribute(/on(?:abort|blur|change|click|composition(?:end|start|update)|dblclick|error|focus(?:in|out)?|key(?:down|up)|load|mouse(?:down|enter|leave|move|out|over|up)|reset|resize|scroll|select|slotchange|submit|unload|wheel)/.source, "javascript");
            }
            Prism.languages.js = Prism.languages.javascript;
            (function() {
                if (typeof Prism === "undefined" || typeof document === "undefined") {
                    return;
                }
                if (!Element.prototype.matches) {
                    Element.prototype.matches = Element.prototype.msMatchesSelector || Element.prototype.webkitMatchesSelector;
                }
                var LOADING_MESSAGE = "Loading…";
                var FAILURE_MESSAGE = function(status, message) {
                    return "✖ Error " + status + " while fetching file: " + message;
                };
                var FAILURE_EMPTY_MESSAGE = "✖ Error: File does not exist or is empty";
                var EXTENSIONS = {
                    js: "javascript",
                    py: "python",
                    rb: "ruby",
                    ps1: "powershell",
                    psm1: "powershell",
                    sh: "bash",
                    bat: "batch",
                    h: "c",
                    tex: "latex"
                };
                var STATUS_ATTR = "data-src-status";
                var STATUS_LOADING = "loading";
                var STATUS_LOADED = "loaded";
                var STATUS_FAILED = "failed";
                var SELECTOR = "pre[data-src]:not([" + STATUS_ATTR + '="' + STATUS_LOADED + '"])' + ":not([" + STATUS_ATTR + '="' + STATUS_LOADING + '"])';
                function loadFile(src, success, error) {
                    var xhr = new XMLHttpRequest;
                    xhr.open("GET", src, true);
                    xhr.onreadystatechange = function() {
                        if (xhr.readyState == 4) {
                            if (xhr.status < 400 && xhr.responseText) {
                                success(xhr.responseText);
                            } else {
                                if (xhr.status >= 400) {
                                    error(FAILURE_MESSAGE(xhr.status, xhr.statusText));
                                } else {
                                    error(FAILURE_EMPTY_MESSAGE);
                                }
                            }
                        }
                    };
                    xhr.send(null);
                }
                function parseRange(range) {
                    var m = /^\s*(\d+)\s*(?:(,)\s*(?:(\d+)\s*)?)?$/.exec(range || "");
                    if (m) {
                        var start = Number(m[1]);
                        var comma = m[2];
                        var end = m[3];
                        if (!comma) {
                            return [ start, start ];
                        }
                        if (!end) {
                            return [ start, undefined ];
                        }
                        return [ start, Number(end) ];
                    }
                    return undefined;
                }
                Prism.hooks.add("before-highlightall", (function(env) {
                    env.selector += ", " + SELECTOR;
                }));
                Prism.hooks.add("before-sanity-check", (function(env) {
                    var pre = env.element;
                    if (pre.matches(SELECTOR)) {
                        env.code = "";
                        pre.setAttribute(STATUS_ATTR, STATUS_LOADING);
                        var code = pre.appendChild(document.createElement("CODE"));
                        code.textContent = LOADING_MESSAGE;
                        var src = pre.getAttribute("data-src");
                        var language = env.language;
                        if (language === "none") {
                            var extension = (/\.(\w+)$/.exec(src) || [ , "none" ])[1];
                            language = EXTENSIONS[extension] || extension;
                        }
                        Prism.util.setLanguage(code, language);
                        Prism.util.setLanguage(pre, language);
                        var autoloader = Prism.plugins.autoloader;
                        if (autoloader) {
                            autoloader.loadLanguages(language);
                        }
                        loadFile(src, (function(text) {
                            pre.setAttribute(STATUS_ATTR, STATUS_LOADED);
                            var range = parseRange(pre.getAttribute("data-range"));
                            if (range) {
                                var lines = text.split(/\r\n?|\n/g);
                                var start = range[0];
                                var end = range[1] == null ? lines.length : range[1];
                                if (start < 0) {
                                    start += lines.length;
                                }
                                start = Math.max(0, Math.min(start - 1, lines.length));
                                if (end < 0) {
                                    end += lines.length;
                                }
                                end = Math.max(0, Math.min(end, lines.length));
                                text = lines.slice(start, end).join("\n");
                                if (!pre.hasAttribute("data-start")) {
                                    pre.setAttribute("data-start", String(start + 1));
                                }
                            }
                            code.textContent = text;
                            Prism.highlightElement(code);
                        }), (function(error) {
                            pre.setAttribute(STATUS_ATTR, STATUS_FAILED);
                            code.textContent = error;
                        }));
                    }
                }));
                Prism.plugins.fileHighlight = {
                    highlight: function highlight(container) {
                        var elements = (container || document).querySelectorAll(SELECTOR);
                        for (var i = 0, element; element = elements[i++]; ) {
                            Prism.highlightElement(element);
                        }
                    }
                };
                var logged = false;
                Prism.fileHighlight = function() {
                    if (!logged) {
                        console.warn("Prism.fileHighlight is deprecated. Use `Prism.plugins.fileHighlight.highlight` instead.");
                        logged = true;
                    }
                    Prism.plugins.fileHighlight.highlight.apply(this, arguments);
                };
            })();
        })(prism$2);
        return prism$2.exports;
    }
    var prismExports = requirePrism();
    var prism = getDefaultExportFromCjs(prismExports);
    var prism$1 = _mergeNamespaces({
        __proto__: null,
        default: prism
    }, [ prismExports ]);
    const decode = decodeURIComponent;
    const encode = encodeURIComponent;
    const sidebarNavigationClassNames = [ "app-name-link", "page-link", "section-link" ];
    function resolveHref(href) {
        try {
            return new URL(href, location.href).href;
        } catch {
            return href;
        }
    }
    function findLinkByHref(rootElm, href, selector = "a") {
        const resolvedHref = resolveHref(href);
        return Array.from(rootElm.querySelectorAll(selector)).find((linkElm => linkElm.href === resolvedHref)) || null;
    }
    function getClickedLink(event) {
        const target = event.target;
        return target instanceof Element ? target.closest("a") : null;
    }
    function isCurrentContextNavigation(event, linkElm) {
        return !(event.defaultPrevented || event.button !== 0 || event.metaKey || event.ctrlKey || event.shiftKey || event.altKey || linkElm.hasAttribute("download") || linkElm.target && linkElm.target !== "_self");
    }
    function getSidebarNavigationTarget(linkElm) {
        const sidebarElm = linkElm.closest(".sidebar");
        const className = sidebarNavigationClassNames.find((className => linkElm.classList.contains(className)));
        if (!sidebarElm || !className) {
            return;
        }
        return {
            className: className,
            href: linkElm.href
        };
    }
    function parseQuery(query) {
        const res = {};
        query = query.trim().replace(/^(\?|#|&)/, "");
        if (!query) {
            return res;
        }
        query.split("&").forEach((param => {
            const parts = param.replace(/\+/g, " ").split("=");
            res[parts[0]] = parts[1] && decode(parts[1]);
        }));
        return res;
    }
    function stringifyQuery(obj, ignores = []) {
        const qs = [];
        for (const key in obj) {
            if (ignores.indexOf(key) > -1) {
                continue;
            }
            qs.push(obj[key] ? `${encode(key)}=${encode(obj[key])}`.toLowerCase() : encode(key));
        }
        return qs.length ? `?${qs.join("&")}` : "";
    }
    function stripUrlExceptId(str) {
        const [path, queryString] = str.split("?");
        if (!queryString) {
            return str;
        }
        const params = new URLSearchParams(queryString);
        const id = params.get("id");
        if (id !== null) {
            return `${path}?id=${id}`;
        }
        return path;
    }
    const isAbsolutePath = cached$1((path => /(:|(\/{2}))/g.test(path)));
    const removeParams = cached$1((path => path.split(/[?#]/)[0]));
    const getParentPath = cached$1((path => {
        if (/\/$/g.test(path)) {
            return path;
        }
        const matchingParts = path.match(/(\S*\/)[^/]+$/);
        return matchingParts ? matchingParts[1] : "";
    }));
    const cleanPath = cached$1((path => path.replace(/^\/+/, "/").replace(/([^:])\/{2,}/g, "$1/")));
    const resolvePath = cached$1((path => {
        const segments = path.replace(/^\//, "").split("/");
        const resolved = [];
        for (const segment of segments) {
            if (segment === "..") {
                resolved.pop();
            } else if (segment !== ".") {
                resolved.push(segment);
            }
        }
        return "/" + resolved.join("/");
    }));
    function normaliseFragment(path) {
        return path.split("/").filter((p => p.indexOf("#") === -1)).join("/");
    }
    function getPath(...args) {
        return cleanPath(args.map(normaliseFragment).join("/"));
    }
    const replaceSlug = cached$1((path => path.replace("#", "?id=")));
    class History {
        #cached={};
        constructor(config) {
            this.config = config;
        }
        #getAlias(path, alias, last) {
            const match = Object.keys(alias).filter((key => {
                const re = this.#cached[key] || (this.#cached[key] = new RegExp(`^${key}$`));
                return re.test(path) && path !== last;
            }))[0];
            return match ? this.#getAlias(path.replace(this.#cached[match], alias[match]), alias, path) : path;
        }
        #getFileName(path, ext) {
            const [basePath, query] = path.split("?");
            const hasValidExt = new RegExp(`\\.(${ext.replace(/^\./, "")}|html)$`).test(basePath);
            const updatedPath = hasValidExt ? basePath : /\/$/g.test(basePath) ? `${basePath}README${ext}` : `${basePath}${ext}`;
            return query ? `${updatedPath}?${query}` : updatedPath;
        }
        getBasePath() {
            return this.config.basePath;
        }
        getFile(path = this.getCurrentPath(), isRelative = false) {
            const {config: config} = this;
            const base = this.getBasePath();
            const ext = typeof config.ext === "string" ? config.ext : ".md";
            path = config.alias ? this.#getAlias(path, config.alias) : path;
            path = this.#getFileName(path, ext);
            path = path === `/README${ext}` ? config.homepage || path : path;
            path = isAbsolutePath(path) ? path : getPath(base, path);
            if (isRelative) {
                path = path.replace(new RegExp(`^${base}`), "");
            }
            return path;
        }
        onchange(cb = noop) {
            cb();
        }
        getCurrentPath() {
            throw new Error("Subclass should implement");
        }
        normalize() {
            throw new Error("Subclass should implement");
        }
        parse(path) {
            throw new Error("Subclass should implement");
        }
        toURL(path, params, currentRoute) {
            const local = currentRoute && path[0] === "#";
            const route = this.parse(replaceSlug(path));
            route.query = {
                ...route.query,
                ...params
            };
            path = route.path + stringifyQuery(route.query);
            path = path.replace(/\.md(\?)|\.md$/, "$1");
            if (local) {
                const idIndex = currentRoute.indexOf("?");
                path = (idIndex > 0 ? currentRoute.substring(0, idIndex) : currentRoute) + path;
            }
            if (this.config.relativePath && path.indexOf("/") !== 0) {
                const currentDir = currentRoute.substring(0, currentRoute.lastIndexOf("/") + 1);
                return cleanPath(resolvePath(currentDir + path));
            }
            return cleanPath("/" + path);
        }
    }
    function replaceHash(path) {
        const i = location.href.indexOf("#");
        location.replace(location.href.slice(0, i >= 0 ? i : 0) + "#" + path);
    }
    class HashHistory extends History {
        mode="hash";
        getBasePath() {
            const path = window.location.pathname || "";
            const base = this.config.basePath;
            const basePath = path.endsWith(".html") ? path + "#/" + base : path + "/" + base;
            return /^(\/|https?:)/g.test(base) ? base : cleanPath(basePath);
        }
        getCurrentPath() {
            const href = location.href;
            const index = href.indexOf("#");
            return index === -1 ? "" : href.slice(index + 1);
        }
        onchange(cb = noop) {
            let navigating = false;
            let navigatingFocusTarget;
            on("click", (e => {
                const el = getClickedLink(e);
                if (el && isCurrentContextNavigation(e, el) && !isExternal(el.href)) {
                    navigating = true;
                    navigatingFocusTarget = getSidebarNavigationTarget(el);
                    if (el.matches(".app-name-link, .page-link")) {
                        if (el.hash === location.hash) {
                            navigating = false;
                            navigatingFocusTarget = undefined;
                        }
                        return;
                    }
                    if (el.hash === location.hash) {
                        cb({
                            focusTarget: navigatingFocusTarget,
                            source: "navigate"
                        });
                        navigating = false;
                        navigatingFocusTarget = undefined;
                    }
                }
            }));
            on("hashchange", (() => {
                const source = navigating ? "navigate" : "history";
                const focusTarget = navigating ? navigatingFocusTarget : undefined;
                navigating = false;
                navigatingFocusTarget = undefined;
                cb({
                    focusTarget: focusTarget,
                    source: source
                });
            }));
        }
        normalize() {
            let path = this.getCurrentPath();
            path = replaceSlug(path);
            if (path.charAt(0) === "/") {
                return replaceHash(path);
            }
            replaceHash("/" + path);
        }
        parse(path = location.href) {
            let query = "";
            const hashIndex = path.indexOf("#");
            if (hashIndex >= 0) {
                path = path.slice(hashIndex + 1);
            }
            const queryIndex = path.indexOf("?");
            if (queryIndex >= 0) {
                query = path.slice(queryIndex + 1);
                path = path.slice(0, queryIndex);
            }
            return {
                path: path,
                file: this.getFile(path, true),
                query: parseQuery(query),
                response: {}
            };
        }
        toURL(path, params, currentRoute) {
            return "#" + super.toURL(path, params, currentRoute);
        }
    }
    class HTML5History extends History {
        mode="history";
        getCurrentPath() {
            const base = this.getBasePath();
            let path = window.location.pathname;
            if (base && path.indexOf(base) === 0) {
                path = path.slice(base.length);
            }
            return (path || "/") + window.location.search + window.location.hash;
        }
        onchange(cb = noop) {
            on("click", (e => {
                const el = getClickedLink(e);
                if (el && isCurrentContextNavigation(e, el) && !isExternal(el.href)) {
                    e.preventDefault();
                    const url = el.href;
                    window.history.pushState({
                        key: url
                    }, "", url);
                    cb({
                        focusTarget: getSidebarNavigationTarget(el),
                        source: "navigate"
                    });
                }
            }));
            on("popstate", (() => {
                cb({
                    source: "history"
                });
            }));
        }
        parse(path = location.href) {
            let query = "";
            const queryIndex = path.indexOf("?");
            if (queryIndex >= 0) {
                query = path.slice(queryIndex + 1);
                path = path.slice(0, queryIndex);
            }
            const base = getPath(location.origin);
            const baseIndex = path.indexOf(base);
            if (baseIndex > -1) {
                path = path.slice(baseIndex + base.length);
            }
            return {
                path: path,
                file: this.getFile(path),
                query: parseQuery(query),
                response: {}
            };
        }
        normalize() {}
    }
    let lastRoute = {};
    function Router(Base) {
        return class Router extends Base {
            route={};
            updateRender() {
                this.router?.normalize();
                this.route = this.router?.parse() ?? {};
                body.setAttribute("data-page", this.route.file ?? "");
            }
            initRouter() {
                const config = this.config;
                const mode = config.routerMode || "hash";
                let router;
                if (mode === "history") {
                    router = new HTML5History(config);
                } else {
                    router = new HashHistory(config);
                }
                this.router = router;
                this.updateRender();
                lastRoute = this.route;
                router.onchange((params => {
                    this.updateRender();
                    this._updateRender();
                    if (lastRoute.path === this.route.path) {
                        this.onNavigate(params.source, params.focusTarget);
                        return;
                    }
                    this.$fetch(noop, this.onNavigate.bind(this, params.source, params.focusTarget));
                    lastRoute = this.route;
                }));
            }
        };
    }
    var RGX = /([^{]*?)\w(?=\})/g;
    var MAP = {
        YYYY: "getFullYear",
        YY: "getYear",
        MM: function(d) {
            return d.getMonth() + 1;
        },
        DD: "getDate",
        HH: "getHours",
        mm: "getMinutes",
        ss: "getSeconds",
        fff: "getMilliseconds"
    };
    function tinydate(str, custom) {
        var parts = [], offset = 0;
        str.replace(RGX, (function(key, _, idx) {
            parts.push(str.substring(offset, idx - 1));
            offset = idx += key.length + 1;
            parts.push((function(d) {
                return ("00" + (typeof MAP[key] === "string" ? d[MAP[key]]() : MAP[key](d))).slice(-key.length);
            }));
        }));
        if (offset !== str.length) {
            parts.push(str.substring(offset));
        }
        return function(arg) {
            var out = "", i = 0, d = arg || new Date;
            for (;i < parts.length; i++) {
                out += typeof parts[i] === "string" ? parts[i] : parts[i](d);
            }
            return out;
        };
    }
    const computedStyle = getComputedStyle(document.documentElement, null);
    const mobileBreakpoint = computedStyle.getPropertyValue("--_mobile-breakpoint");
    function isMobile() {
        return window?.matchMedia?.(`(max-width: ${mobileBreakpoint})`)?.matches;
    }
    function z() {
        return {
            async: false,
            breaks: false,
            extensions: null,
            gfm: true,
            hooks: null,
            pedantic: false,
            renderer: null,
            silent: false,
            tokenizer: null,
            walkTokens: null
        };
    }
    var T = z();
    function G(l) {
        T = l;
    }
    var _ = {
        exec: () => null
    };
    function d(l, e = "") {
        let t = typeof l == "string" ? l : l.source, n = {
            replace: (s, r) => {
                let i = typeof r == "string" ? r : r.source;
                return i = i.replace(m.caret, "$1"), t = t.replace(s, i), n;
            },
            getRegex: () => new RegExp(t, e)
        };
        return n;
    }
    var Re = ((l = "") => {
        try {
            return !!new RegExp("(?<=1)(?<!1)" + l);
        } catch {
            return false;
        }
    })(), m = {
        codeRemoveIndent: /^(?: {1,4}| {0,3}\t)/gm,
        outputLinkReplace: /\\([\[\]])/g,
        indentCodeCompensation: /^(\s+)(?:```)/,
        beginningSpace: /^\s+/,
        endingHash: /#$/,
        startingSpaceChar: /^ /,
        endingSpaceChar: / $/,
        nonSpaceChar: /[^ ]/,
        newLineCharGlobal: /\n/g,
        tabCharGlobal: /\t/g,
        multipleSpaceGlobal: /\s+/g,
        blankLine: /^[ \t]*$/,
        doubleBlankLine: /\n[ \t]*\n[ \t]*$/,
        blockquoteStart: /^ {0,3}>/,
        blockquoteSetextReplace: /\n {0,3}((?:=+|-+) *)(?=\n|$)/g,
        blockquoteSetextReplace2: /^ {0,3}>[ \t]?/gm,
        listReplaceNesting: /^ {1,4}(?=( {4})*[^ ])/g,
        listIsTask: /^\[[ xX]\] +\S/,
        listReplaceTask: /^\[[ xX]\] +/,
        listTaskCheckbox: /\[[ xX]\]/,
        anyLine: /\n.*\n/,
        hrefBrackets: /^<(.*)>$/,
        tableDelimiter: /[:|]/,
        tableAlignChars: /^\||\| *$/g,
        tableRowBlankLine: /\n[ \t]*$/,
        tableAlignRight: /^ *-+: *$/,
        tableAlignCenter: /^ *:-+: *$/,
        tableAlignLeft: /^ *:-+ *$/,
        startATag: /^<a /i,
        endATag: /^<\/a>/i,
        startPreScriptTag: /^<(pre|code|kbd|script)(\s|>)/i,
        endPreScriptTag: /^<\/(pre|code|kbd|script)(\s|>)/i,
        startAngleBracket: /^</,
        endAngleBracket: />$/,
        pedanticHrefTitle: /^([^'"]*[^\s])\s+(['"])(.*)\2/,
        unicodeAlphaNumeric: /[\p{L}\p{N}]/u,
        escapeTest: /[&<>"']/,
        escapeReplace: /[&<>"']/g,
        escapeTestNoEncode: /[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/,
        escapeReplaceNoEncode: /[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/g,
        caret: /(^|[^\[])\^/g,
        percentDecode: /%25/g,
        findPipe: /\|/g,
        splitPipe: / \|/,
        slashPipe: /\\\|/g,
        carriageReturn: /\r\n|\r/g,
        spaceLine: /^ +$/gm,
        notSpaceStart: /^\S*/,
        endingNewline: /\n$/,
        listItemRegex: l => new RegExp(`^( {0,3}${l})((?:[\t ][^\\n]*)?(?:\\n|$))`),
        nextBulletRegex: l => new RegExp(`^ {0,${Math.min(3, l - 1)}}(?:[*+-]|\\d{1,9}[.)])((?:[ \t][^\\n]*)?(?:\\n|$))`),
        hrRegex: l => new RegExp(`^ {0,${Math.min(3, l - 1)}}((?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$)`),
        fencesBeginRegex: l => new RegExp(`^ {0,${Math.min(3, l - 1)}}(?:\`\`\`|~~~)`),
        headingBeginRegex: l => new RegExp(`^ {0,${Math.min(3, l - 1)}}#`),
        htmlBeginRegex: l => new RegExp(`^ {0,${Math.min(3, l - 1)}}<(?:[a-z].*>|!--)`, "i"),
        blockquoteBeginRegex: l => new RegExp(`^ {0,${Math.min(3, l - 1)}}>`)
    }, Te = /^(?:[ \t]*(?:\n|$))+/, Oe = /^((?: {4}| {0,3}\t)[^\n]+(?:\n(?:[ \t]*(?:\n|$))*)?)+/, we = /^ {0,3}(`{3,}(?=[^`\n]*(?:\n|$))|~{3,})([^\n]*)(?:\n|$)(?:|([\s\S]*?)(?:\n|$))(?: {0,3}\1[~`]* *(?=\n|$)|$)/, I = /^ {0,3}((?:-[\t ]*){3,}|(?:_[ \t]*){3,}|(?:\*[ \t]*){3,})(?:\n+|$)/, ye = /^ {0,3}(#{1,6})(?=\s|$)(.*)(?:\n+|$)/, Q = / {0,3}(?:[*+-]|\d{1,9}[.)])/, ie = /^(?!bull |blockCode|fences|blockquote|heading|html|table)((?:.|\n(?!\s*?\n|bull |blockCode|fences|blockquote|heading|html|table))+?)\n {0,3}(=+|-+) *(?:\n+|$)/, oe = d(ie).replace(/bull/g, Q).replace(/blockCode/g, /(?: {4}| {0,3}\t)/).replace(/fences/g, / {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g, / {0,3}>/).replace(/heading/g, / {0,3}#{1,6}/).replace(/html/g, / {0,3}<[^\n>]+>\n/).replace(/\|table/g, "").getRegex(), Pe = d(ie).replace(/bull/g, Q).replace(/blockCode/g, /(?: {4}| {0,3}\t)/).replace(/fences/g, / {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g, / {0,3}>/).replace(/heading/g, / {0,3}#{1,6}/).replace(/html/g, / {0,3}<[^\n>]+>\n/).replace(/table/g, / {0,3}\|?(?:[:\- ]*\|)+[\:\- ]*\n/).getRegex(), j = /^([^\n]+(?:\n(?!hr|heading|lheading|blockquote|fences|list|html|table| +\n)[^\n]+)*)/, Se = /^[^\n]+/, F = /(?!\s*\])(?:\\[\s\S]|[^\[\]\\])+/, $e = d(/^ {0,3}\[(label)\]: *(?:\n[ \t]*)?([^<\s][^\s]*|<.*?>)(?:(?: +(?:\n[ \t]*)?| *\n[ \t]*)(title))? *(?:\n+|$)/).replace("label", F).replace("title", /(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/).getRegex(), Le = d(/^(bull)([ \t][^\n]+?)?(?:\n|$)/).replace(/bull/g, Q).getRegex(), v = "address|article|aside|base|basefont|blockquote|body|caption|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option|p|param|search|section|summary|table|tbody|td|tfoot|th|thead|title|tr|track|ul", U = /<!--(?:-?>|[\s\S]*?(?:-->|$))/, _e = d("^ {0,3}(?:<(script|pre|style|textarea)[\\s>][\\s\\S]*?(?:</\\1>[^\\n]*\\n+|$)|comment[^\\n]*(\\n+|$)|<\\?[\\s\\S]*?(?:\\?>\\n*|$)|<![A-Z][\\s\\S]*?(?:>\\n*|$)|<!\\[CDATA\\[[\\s\\S]*?(?:\\]\\]>\\n*|$)|</?(tag)(?: +|\\n|/?>)[\\s\\S]*?(?:(?:\\n[ \t]*)+\\n|$)|<(?!script|pre|style|textarea)([a-z][\\w-]*)(?:attribute)*? */?>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n[ \t]*)+\\n|$)|</(?!script|pre|style|textarea)[a-z][\\w-]*\\s*>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n[ \t]*)+\\n|$))", "i").replace("comment", U).replace("tag", v).replace("attribute", / +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/).getRegex(), ae = d(j).replace("hr", I).replace("heading", " {0,3}#{1,6}(?:\\s|$)").replace("|lheading", "").replace("|table", "").replace("blockquote", " {0,3}>").replace("fences", " {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list", " {0,3}(?:[*+-]|1[.)])[ \\t]").replace("html", "</?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|textarea|!--)").replace("tag", v).getRegex(), Me = d(/^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/).replace("paragraph", ae).getRegex(), K = {
        blockquote: Me,
        code: Oe,
        def: $e,
        fences: we,
        heading: ye,
        hr: I,
        html: _e,
        lheading: oe,
        list: Le,
        newline: Te,
        paragraph: ae,
        table: _,
        text: Se
    }, re$1 = d("^ *([^\\n ].*)\\n {0,3}((?:\\| *)?:?-+:? *(?:\\| *:?-+:? *)*(?:\\| *)?)(?:\\n((?:(?! *\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)").replace("hr", I).replace("heading", " {0,3}#{1,6}(?:\\s|$)").replace("blockquote", " {0,3}>").replace("code", "(?: {4}| {0,3}\t)[^\\n]").replace("fences", " {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list", " {0,3}(?:[*+-]|1[.)])[ \\t]").replace("html", "</?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|textarea|!--)").replace("tag", v).getRegex(), ze = {
        ...K,
        lheading: Pe,
        table: re$1,
        paragraph: d(j).replace("hr", I).replace("heading", " {0,3}#{1,6}(?:\\s|$)").replace("|lheading", "").replace("table", re$1).replace("blockquote", " {0,3}>").replace("fences", " {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list", " {0,3}(?:[*+-]|1[.)])[ \\t]").replace("html", "</?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|textarea|!--)").replace("tag", v).getRegex()
    }, Ee = {
        ...K,
        html: d(`^ *(?:comment *(?:\\n|\\s*$)|<(tag)[\\s\\S]+?</\\1> *(?:\\n{2,}|\\s*$)|<tag(?:"[^"]*"|'[^']*'|\\s[^'"/>\\s]*)*?/?> *(?:\\n{2,}|\\s*$))`).replace("comment", U).replace(/tag/g, "(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\b)\\w+(?!:|[^\\w\\s@]*@)\\b").getRegex(),
        def: /^ *\[([^\]]+)\]: *<?([^\s>]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/,
        heading: /^(#{1,6})(.*)(?:\n+|$)/,
        fences: _,
        lheading: /^(.+?)\n {0,3}(=+|-+) *(?:\n+|$)/,
        paragraph: d(j).replace("hr", I).replace("heading", ` *#{1,6} *[^\n]`).replace("lheading", oe).replace("|table", "").replace("blockquote", " {0,3}>").replace("|fences", "").replace("|list", "").replace("|html", "").replace("|tag", "").getRegex()
    }, Ae = /^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/, Ce = /^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/, le = /^( {2,}|\\)\n(?!\s*$)/, Ie = /^(`+|[^`])(?:(?= {2,}\n)|[\s\S]*?(?:(?=[\\<!\[`*_]|\b_|$)|[^ ](?= {2,}\n)))/, E = /[\p{P}\p{S}]/u, H = /[\s\p{P}\p{S}]/u, W = /[^\s\p{P}\p{S}]/u, Be = d(/^((?![*_])punctSpace)/, "u").replace(/punctSpace/g, H).getRegex(), ue = /(?!~)[\p{P}\p{S}]/u, De = /(?!~)[\s\p{P}\p{S}]/u, qe = /(?:[^\s\p{P}\p{S}]|~)/u, ve = d(/link|precode-code|html/, "g").replace("link", /\[(?:[^\[\]`]|(?<a>`+)[^`]+\k<a>(?!`))*?\]\((?:\\[\s\S]|[^\\\(\)]|\((?:\\[\s\S]|[^\\\(\)])*\))*\)/).replace("precode-", Re ? "(?<!`)()" : "(^^|[^`])").replace("code", /(?<b>`+)[^`]+\k<b>(?!`)/).replace("html", /<(?! )[^<>]*?>/).getRegex(), pe = /^(?:\*+(?:((?!\*)punct)|([^\s*]))?)|^_+(?:((?!_)punct)|([^\s_]))?/, He = d(pe, "u").replace(/punct/g, E).getRegex(), Ze = d(pe, "u").replace(/punct/g, ue).getRegex(), ce = "^[^_*]*?__[^_*]*?\\*[^_*]*?(?=__)|[^*]+(?=[^*])|(?!\\*)punct(\\*+)(?=[\\s]|$)|notPunctSpace(\\*+)(?!\\*)(?=punctSpace|$)|(?!\\*)punctSpace(\\*+)(?=notPunctSpace)|[\\s](\\*+)(?!\\*)(?=punct)|(?!\\*)punct(\\*+)(?!\\*)(?=punct)|notPunctSpace(\\*+)(?=notPunctSpace)", Ge = d(ce, "gu").replace(/notPunctSpace/g, W).replace(/punctSpace/g, H).replace(/punct/g, E).getRegex(), Ne = d(ce, "gu").replace(/notPunctSpace/g, qe).replace(/punctSpace/g, De).replace(/punct/g, ue).getRegex(), Qe = d("^[^_*]*?\\*\\*[^_*]*?_[^_*]*?(?=\\*\\*)|[^_]+(?=[^_])|(?!_)punct(_+)(?=[\\s]|$)|notPunctSpace(_+)(?!_)(?=punctSpace|$)|(?!_)punctSpace(_+)(?=notPunctSpace)|[\\s](_+)(?!_)(?=punct)|(?!_)punct(_+)(?!_)(?=punct)", "gu").replace(/notPunctSpace/g, W).replace(/punctSpace/g, H).replace(/punct/g, E).getRegex(), je = d(/^~~?(?:((?!~)punct)|[^\s~])/, "u").replace(/punct/g, E).getRegex(), Fe = "^[^~]+(?=[^~])|(?!~)punct(~~?)(?=[\\s]|$)|notPunctSpace(~~?)(?!~)(?=punctSpace|$)|(?!~)punctSpace(~~?)(?=notPunctSpace)|[\\s](~~?)(?!~)(?=punct)|(?!~)punct(~~?)(?!~)(?=punct)|notPunctSpace(~~?)(?=notPunctSpace)", Ue = d(Fe, "gu").replace(/notPunctSpace/g, W).replace(/punctSpace/g, H).replace(/punct/g, E).getRegex(), Ke = d(/\\(punct)/, "gu").replace(/punct/g, E).getRegex(), We = d(/^<(scheme:[^\s\x00-\x1f<>]*|email)>/).replace("scheme", /[a-zA-Z][a-zA-Z0-9+.-]{1,31}/).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])?)+(?![-_])/).getRegex(), Xe = d(U).replace("(?:--\x3e|$)", "--\x3e").getRegex(), Je = d("^comment|^</[a-zA-Z][\\w:-]*\\s*>|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>|^<\\?[\\s\\S]*?\\?>|^<![a-zA-Z]+\\s[\\s\\S]*?>|^<!\\[CDATA\\[[\\s\\S]*?\\]\\]>").replace("comment", Xe).replace("attribute", /\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/).getRegex(), q = /(?:\[(?:\\[\s\S]|[^\[\]\\])*\]|\\[\s\S]|`+(?!`)[^`]*?`+(?!`)|``+(?=\])|[^\[\]\\`])*?/, Ve = d(/^!?\[(label)\]\(\s*(href)(?:(?:[ \t]+(?:\n[ \t]*)?|\n[ \t]*)(title))?\s*\)/).replace("label", q).replace("href", /<(?:\\.|[^\n<>\\])+>|[^ \t\n\x00-\x1f]*/).replace("title", /"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/).getRegex(), he = d(/^!?\[(label)\]\[(ref)\]/).replace("label", q).replace("ref", F).getRegex(), ke = d(/^!?\[(ref)\](?:\[\])?/).replace("ref", F).getRegex(), Ye = d("reflink|nolink(?!\\()", "g").replace("reflink", he).replace("nolink", ke).getRegex(), se = /[hH][tT][tT][pP][sS]?|[fF][tT][pP]/, X = {
        _backpedal: _,
        anyPunctuation: Ke,
        autolink: We,
        blockSkip: ve,
        br: le,
        code: Ce,
        del: _,
        delLDelim: _,
        delRDelim: _,
        emStrongLDelim: He,
        emStrongRDelimAst: Ge,
        emStrongRDelimUnd: Qe,
        escape: Ae,
        link: Ve,
        nolink: ke,
        punctuation: Be,
        reflink: he,
        reflinkSearch: Ye,
        tag: Je,
        text: Ie,
        url: _
    }, et = {
        ...X,
        link: d(/^!?\[(label)\]\((.*?)\)/).replace("label", q).getRegex(),
        reflink: d(/^!?\[(label)\]\s*\[([^\]]*)\]/).replace("label", q).getRegex()
    }, N = {
        ...X,
        emStrongRDelimAst: Ne,
        emStrongLDelim: Ze,
        delLDelim: je,
        delRDelim: Ue,
        url: d(/^((?:protocol):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/).replace("protocol", se).replace("email", /[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/).getRegex(),
        _backpedal: /(?:[^?!.,:;*_'"~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_'"~)]+(?!$))+/,
        del: /^(~~?)(?=[^\s~])((?:\\[\s\S]|[^\\])*?(?:\\[\s\S]|[^\s~\\]))\1(?=[^~]|$)/,
        text: d(/^([`~]+|[^`~])(?:(?= {2,}\n)|(?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)|[\s\S]*?(?:(?=[\\<!\[`*~_]|\b_|protocol:\/\/|www\.|$)|[^ ](?= {2,}\n)|[^a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-](?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)))/).replace("protocol", se).getRegex()
    }, tt = {
        ...N,
        br: d(le).replace("{2,}", "*").getRegex(),
        text: d(N.text).replace("\\b_", "\\b_| {2,}\\n").replace(/\{2,\}/g, "*").getRegex()
    }, B = {
        normal: K,
        gfm: ze,
        pedantic: Ee
    }, A = {
        normal: X,
        gfm: N,
        breaks: tt,
        pedantic: et
    };
    var nt = {
        "&": "&amp;",
        "<": "&lt;",
        ">": "&gt;",
        '"': "&quot;",
        "'": "&#39;"
    }, de = l => nt[l];
    function O(l, e) {
        if (e) {
            if (m.escapeTest.test(l)) return l.replace(m.escapeReplace, de);
        } else if (m.escapeTestNoEncode.test(l)) return l.replace(m.escapeReplaceNoEncode, de);
        return l;
    }
    function J(l) {
        try {
            l = encodeURI(l).replace(m.percentDecode, "%");
        } catch {
            return null;
        }
        return l;
    }
    function V(l, e) {
        let t = l.replace(m.findPipe, ((r, i, o) => {
            let u = false, a = i;
            for (;--a >= 0 && o[a] === "\\"; ) u = !u;
            return u ? "|" : " |";
        })), n = t.split(m.splitPipe), s = 0;
        if (n[0].trim() || n.shift(), n.length > 0 && !n.at(-1)?.trim() && n.pop(), e) if (n.length > e) n.splice(e); else for (;n.length < e; ) n.push("");
        for (;s < n.length; s++) n[s] = n[s].trim().replace(m.slashPipe, "|");
        return n;
    }
    function $(l, e, t) {
        let n = l.length;
        if (n === 0) return "";
        let s = 0;
        for (;s < n; ) {
            let r = l.charAt(n - s - 1);
            if (r === e && true) s++; else break;
        }
        return l.slice(0, n - s);
    }
    function Y(l) {
        let e = l.split(`\n`), t = e.length - 1;
        for (;t >= 0 && m.blankLine.test(e[t]); ) t--;
        return e.length - t <= 2 ? l : e.slice(0, t + 1).join(`\n`);
    }
    function ge(l, e) {
        if (l.indexOf(e[1]) === -1) return -1;
        let t = 0;
        for (let n = 0; n < l.length; n++) if (l[n] === "\\") n++; else if (l[n] === e[0]) t++; else if (l[n] === e[1] && (t--, 
        t < 0)) return n;
        return t > 0 ? -2 : -1;
    }
    function fe(l, e = 0) {
        let t = e, n = "";
        for (let s of l) if (s === "\t") {
            let r = 4 - t % 4;
            n += " ".repeat(r), t += r;
        } else n += s, t++;
        return n;
    }
    function me(l, e, t, n, s) {
        let r = e.href, i = e.title || null, o = l[1].replace(s.other.outputLinkReplace, "$1");
        n.state.inLink = true;
        let u = {
            type: l[0].charAt(0) === "!" ? "image" : "link",
            raw: t,
            href: r,
            title: i,
            text: o,
            tokens: n.inlineTokens(o)
        };
        return n.state.inLink = false, u;
    }
    function rt(l, e, t) {
        let n = l.match(t.other.indentCodeCompensation);
        if (n === null) return e;
        let s = n[1];
        return e.split(`\n`).map((r => {
            let i = r.match(t.other.beginningSpace);
            if (i === null) return r;
            let [o] = i;
            return o.length >= s.length ? r.slice(s.length) : r;
        })).join(`\n`);
    }
    var w = class {
        options;
        rules;
        lexer;
        constructor(e) {
            this.options = e || T;
        }
        space(e) {
            let t = this.rules.block.newline.exec(e);
            if (t && t[0].length > 0) return {
                type: "space",
                raw: t[0]
            };
        }
        code(e) {
            let t = this.rules.block.code.exec(e);
            if (t) {
                let n = this.options.pedantic ? t[0] : Y(t[0]), s = n.replace(this.rules.other.codeRemoveIndent, "");
                return {
                    type: "code",
                    raw: n,
                    codeBlockStyle: "indented",
                    text: s
                };
            }
        }
        fences(e) {
            let t = this.rules.block.fences.exec(e);
            if (t) {
                let n = t[0], s = rt(n, t[3] || "", this.rules);
                return {
                    type: "code",
                    raw: n,
                    lang: t[2] ? t[2].trim().replace(this.rules.inline.anyPunctuation, "$1") : t[2],
                    text: s
                };
            }
        }
        heading(e) {
            let t = this.rules.block.heading.exec(e);
            if (t) {
                let n = t[2].trim();
                if (this.rules.other.endingHash.test(n)) {
                    let s = $(n, "#");
                    (this.options.pedantic || !s || this.rules.other.endingSpaceChar.test(s)) && (n = s.trim());
                }
                return {
                    type: "heading",
                    raw: $(t[0], `\n`),
                    depth: t[1].length,
                    text: n,
                    tokens: this.lexer.inline(n)
                };
            }
        }
        hr(e) {
            let t = this.rules.block.hr.exec(e);
            if (t) return {
                type: "hr",
                raw: $(t[0], `\n`)
            };
        }
        blockquote(e) {
            let t = this.rules.block.blockquote.exec(e);
            if (t) {
                let n = $(t[0], `\n`).split(`\n`), s = "", r = "", i = [];
                for (;n.length > 0; ) {
                    let o = false, u = [], a;
                    for (a = 0; a < n.length; a++) if (this.rules.other.blockquoteStart.test(n[a])) u.push(n[a]), 
                    o = true; else if (!o) u.push(n[a]); else break;
                    n = n.slice(a);
                    let c = u.join(`\n`), p = c.replace(this.rules.other.blockquoteSetextReplace, `\n    $1`).replace(this.rules.other.blockquoteSetextReplace2, "");
                    s = s ? `${s}\n${c}` : c, r = r ? `${r}\n${p}` : p;
                    let k = this.lexer.state.top;
                    if (this.lexer.state.top = true, this.lexer.blockTokens(p, i, true), this.lexer.state.top = k, 
                    n.length === 0) break;
                    let h = i.at(-1);
                    if (h?.type === "code") break;
                    if (h?.type === "blockquote") {
                        let R = h, f = R.raw + `\n` + n.join(`\n`), S = this.blockquote(f);
                        i[i.length - 1] = S, s = s.substring(0, s.length - R.raw.length) + S.raw, r = r.substring(0, r.length - R.text.length) + S.text;
                        break;
                    } else if (h?.type === "list") {
                        let R = h, f = R.raw + `\n` + n.join(`\n`), S = this.list(f);
                        i[i.length - 1] = S, s = s.substring(0, s.length - h.raw.length) + S.raw, r = r.substring(0, r.length - R.raw.length) + S.raw, 
                        n = f.substring(i.at(-1).raw.length).split(`\n`);
                        continue;
                    }
                }
                return {
                    type: "blockquote",
                    raw: s,
                    tokens: i,
                    text: r
                };
            }
        }
        list(e) {
            let t = this.rules.block.list.exec(e);
            if (t) {
                let n = t[1].trim(), s = n.length > 1, r = {
                    type: "list",
                    raw: "",
                    ordered: s,
                    start: s ? +n.slice(0, -1) : "",
                    loose: false,
                    items: []
                };
                n = s ? `\\d{1,9}\\${n.slice(-1)}` : `\\${n}`, this.options.pedantic && (n = s ? n : "[*+-]");
                let i = this.rules.other.listItemRegex(n), o = false;
                for (;e; ) {
                    let a = false, c = "", p = "";
                    if (!(t = i.exec(e)) || this.rules.block.hr.test(e)) break;
                    c = t[0], e = e.substring(c.length);
                    let k = fe(t[2].split(`\n`, 1)[0], t[1].length), h = e.split(`\n`, 1)[0], R = !k.trim(), f = 0;
                    if (this.options.pedantic ? (f = 2, p = k.trimStart()) : R ? f = t[1].length + 1 : (f = k.search(this.rules.other.nonSpaceChar), 
                    f = f > 4 ? 1 : f, p = k.slice(f), f += t[1].length), R && this.rules.other.blankLine.test(h) && (c += h + `\n`, 
                    e = e.substring(h.length + 1), a = true), !a) {
                        let S = this.rules.other.nextBulletRegex(f), ee = this.rules.other.hrRegex(f), te = this.rules.other.fencesBeginRegex(f), ne = this.rules.other.headingBeginRegex(f), xe = this.rules.other.htmlBeginRegex(f), be = this.rules.other.blockquoteBeginRegex(f);
                        for (;e; ) {
                            let Z = e.split(`\n`, 1)[0], C;
                            if (h = Z, this.options.pedantic ? (h = h.replace(this.rules.other.listReplaceNesting, "  "), 
                            C = h) : C = h.replace(this.rules.other.tabCharGlobal, "    "), te.test(h) || ne.test(h) || xe.test(h) || be.test(h) || S.test(h) || ee.test(h)) break;
                            if (C.search(this.rules.other.nonSpaceChar) >= f || !h.trim()) p += `\n` + C.slice(f); else {
                                if (R || k.replace(this.rules.other.tabCharGlobal, "    ").search(this.rules.other.nonSpaceChar) >= 4 || te.test(k) || ne.test(k) || ee.test(k)) break;
                                p += `\n` + h;
                            }
                            R = !h.trim(), c += Z + `\n`, e = e.substring(Z.length + 1), k = C.slice(f);
                        }
                    }
                    r.loose || (o ? r.loose = true : this.rules.other.doubleBlankLine.test(c) && (o = true)), 
                    r.items.push({
                        type: "list_item",
                        raw: c,
                        task: !!this.options.gfm && this.rules.other.listIsTask.test(p),
                        loose: false,
                        text: p,
                        tokens: []
                    }), r.raw += c;
                }
                let u = r.items.at(-1);
                if (u) u.raw = u.raw.trimEnd(), u.text = u.text.trimEnd(); else return;
                r.raw = r.raw.trimEnd();
                for (let a of r.items) {
                    this.lexer.state.top = false, a.tokens = this.lexer.blockTokens(a.text, []);
                    let c = a.tokens[0];
                    if (a.task && (c?.type === "text" || c?.type === "paragraph")) {
                        a.text = a.text.replace(this.rules.other.listReplaceTask, ""), c.raw = c.raw.replace(this.rules.other.listReplaceTask, ""), 
                        c.text = c.text.replace(this.rules.other.listReplaceTask, "");
                        for (let k = this.lexer.inlineQueue.length - 1; k >= 0; k--) if (this.rules.other.listIsTask.test(this.lexer.inlineQueue[k].src)) {
                            this.lexer.inlineQueue[k].src = this.lexer.inlineQueue[k].src.replace(this.rules.other.listReplaceTask, "");
                            break;
                        }
                        let p = this.rules.other.listTaskCheckbox.exec(a.raw);
                        if (p) {
                            let k = {
                                type: "checkbox",
                                raw: p[0] + " ",
                                checked: p[0] !== "[ ]"
                            };
                            a.checked = k.checked, r.loose ? a.tokens[0] && [ "paragraph", "text" ].includes(a.tokens[0].type) && "tokens" in a.tokens[0] && a.tokens[0].tokens ? (a.tokens[0].raw = k.raw + a.tokens[0].raw, 
                            a.tokens[0].text = k.raw + a.tokens[0].text, a.tokens[0].tokens.unshift(k)) : a.tokens.unshift({
                                type: "paragraph",
                                raw: k.raw,
                                text: k.raw,
                                tokens: [ k ]
                            }) : a.tokens.unshift(k);
                        }
                    } else a.task && (a.task = false);
                    if (!r.loose) {
                        let p = a.tokens.filter((h => h.type === "space")), k = p.length > 0 && p.some((h => this.rules.other.anyLine.test(h.raw)));
                        r.loose = k;
                    }
                }
                if (r.loose) for (let a of r.items) {
                    a.loose = true;
                    for (let c of a.tokens) c.type === "text" && (c.type = "paragraph");
                }
                return r;
            }
        }
        html(e) {
            let t = this.rules.block.html.exec(e);
            if (t) {
                let n = Y(t[0]);
                return {
                    type: "html",
                    block: true,
                    raw: n,
                    pre: t[1] === "pre" || t[1] === "script" || t[1] === "style",
                    text: n
                };
            }
        }
        def(e) {
            let t = this.rules.block.def.exec(e);
            if (t) {
                let n = t[1].toLowerCase().replace(this.rules.other.multipleSpaceGlobal, " "), s = t[2] ? t[2].replace(this.rules.other.hrefBrackets, "$1").replace(this.rules.inline.anyPunctuation, "$1") : "", r = t[3] ? t[3].substring(1, t[3].length - 1).replace(this.rules.inline.anyPunctuation, "$1") : t[3];
                return {
                    type: "def",
                    tag: n,
                    raw: $(t[0], `\n`),
                    href: s,
                    title: r
                };
            }
        }
        table(e) {
            let t = this.rules.block.table.exec(e);
            if (!t || !this.rules.other.tableDelimiter.test(t[2])) return;
            let n = V(t[1]), s = t[2].replace(this.rules.other.tableAlignChars, "").split("|"), r = t[3]?.trim() ? t[3].replace(this.rules.other.tableRowBlankLine, "").split(`\n`) : [], i = {
                type: "table",
                raw: $(t[0], `\n`),
                header: [],
                align: [],
                rows: []
            };
            if (n.length === s.length) {
                for (let o of s) this.rules.other.tableAlignRight.test(o) ? i.align.push("right") : this.rules.other.tableAlignCenter.test(o) ? i.align.push("center") : this.rules.other.tableAlignLeft.test(o) ? i.align.push("left") : i.align.push(null);
                for (let o = 0; o < n.length; o++) i.header.push({
                    text: n[o],
                    tokens: this.lexer.inline(n[o]),
                    header: true,
                    align: i.align[o]
                });
                for (let o of r) i.rows.push(V(o, i.header.length).map(((u, a) => ({
                    text: u,
                    tokens: this.lexer.inline(u),
                    header: false,
                    align: i.align[a]
                }))));
                return i;
            }
        }
        lheading(e) {
            let t = this.rules.block.lheading.exec(e);
            if (t) {
                let n = t[1].trim();
                return {
                    type: "heading",
                    raw: $(t[0], `\n`),
                    depth: t[2].charAt(0) === "=" ? 1 : 2,
                    text: n,
                    tokens: this.lexer.inline(n)
                };
            }
        }
        paragraph(e) {
            let t = this.rules.block.paragraph.exec(e);
            if (t) {
                let n = t[1].charAt(t[1].length - 1) === `\n` ? t[1].slice(0, -1) : t[1];
                return {
                    type: "paragraph",
                    raw: t[0],
                    text: n,
                    tokens: this.lexer.inline(n)
                };
            }
        }
        text(e) {
            let t = this.rules.block.text.exec(e);
            if (t) return {
                type: "text",
                raw: t[0],
                text: t[0],
                tokens: this.lexer.inline(t[0])
            };
        }
        escape(e) {
            let t = this.rules.inline.escape.exec(e);
            if (t) return {
                type: "escape",
                raw: t[0],
                text: t[1]
            };
        }
        tag(e) {
            let t = this.rules.inline.tag.exec(e);
            if (t) return !this.lexer.state.inLink && this.rules.other.startATag.test(t[0]) ? this.lexer.state.inLink = true : this.lexer.state.inLink && this.rules.other.endATag.test(t[0]) && (this.lexer.state.inLink = false), 
            !this.lexer.state.inRawBlock && this.rules.other.startPreScriptTag.test(t[0]) ? this.lexer.state.inRawBlock = true : this.lexer.state.inRawBlock && this.rules.other.endPreScriptTag.test(t[0]) && (this.lexer.state.inRawBlock = false), 
            {
                type: "html",
                raw: t[0],
                inLink: this.lexer.state.inLink,
                inRawBlock: this.lexer.state.inRawBlock,
                block: false,
                text: t[0]
            };
        }
        link(e) {
            let t = this.rules.inline.link.exec(e);
            if (t) {
                let n = t[2].trim();
                if (!this.options.pedantic && this.rules.other.startAngleBracket.test(n)) {
                    if (!this.rules.other.endAngleBracket.test(n)) return;
                    let i = $(n.slice(0, -1), "\\");
                    if ((n.length - i.length) % 2 === 0) return;
                } else {
                    let i = ge(t[2], "()");
                    if (i === -2) return;
                    if (i > -1) {
                        let u = (t[0].indexOf("!") === 0 ? 5 : 4) + t[1].length + i;
                        t[2] = t[2].substring(0, i), t[0] = t[0].substring(0, u).trim(), t[3] = "";
                    }
                }
                let s = t[2], r = "";
                if (this.options.pedantic) {
                    let i = this.rules.other.pedanticHrefTitle.exec(s);
                    i && (s = i[1], r = i[3]);
                } else r = t[3] ? t[3].slice(1, -1) : "";
                return s = s.trim(), this.rules.other.startAngleBracket.test(s) && (this.options.pedantic && !this.rules.other.endAngleBracket.test(n) ? s = s.slice(1) : s = s.slice(1, -1)), 
                me(t, {
                    href: s && s.replace(this.rules.inline.anyPunctuation, "$1"),
                    title: r && r.replace(this.rules.inline.anyPunctuation, "$1")
                }, t[0], this.lexer, this.rules);
            }
        }
        reflink(e, t) {
            let n;
            if ((n = this.rules.inline.reflink.exec(e)) || (n = this.rules.inline.nolink.exec(e))) {
                let s = (n[2] || n[1]).replace(this.rules.other.multipleSpaceGlobal, " "), r = t[s.toLowerCase()];
                if (!r) {
                    let i = n[0].charAt(0);
                    return {
                        type: "text",
                        raw: i,
                        text: i
                    };
                }
                return me(n, r, n[0], this.lexer, this.rules);
            }
        }
        emStrong(e, t, n = "") {
            let s = this.rules.inline.emStrongLDelim.exec(e);
            if (!s || !s[1] && !s[2] && !s[3] && !s[4] || s[4] && n.match(this.rules.other.unicodeAlphaNumeric)) return;
            if (!(s[1] || s[3] || "") || !n || this.rules.inline.punctuation.exec(n)) {
                let i = [ ...s[0] ].length - 1, o, u, a = i, c = 0, p = s[0][0] === "*" ? this.rules.inline.emStrongRDelimAst : this.rules.inline.emStrongRDelimUnd;
                for (p.lastIndex = 0, t = t.slice(-1 * e.length + i); (s = p.exec(t)) !== null; ) {
                    if (o = s[1] || s[2] || s[3] || s[4] || s[5] || s[6], !o) continue;
                    if (u = [ ...o ].length, s[3] || s[4]) {
                        a += u;
                        continue;
                    } else if ((s[5] || s[6]) && i % 3 && !((i + u) % 3)) {
                        c += u;
                        continue;
                    }
                    if (a -= u, a > 0) continue;
                    u = Math.min(u, u + a + c);
                    let k = [ ...s[0] ][0].length, h = e.slice(0, i + s.index + k + u);
                    if (Math.min(i, u) % 2) {
                        let f = h.slice(1, -1);
                        return {
                            type: "em",
                            raw: h,
                            text: f,
                            tokens: this.lexer.inlineTokens(f)
                        };
                    }
                    let R = h.slice(2, -2);
                    return {
                        type: "strong",
                        raw: h,
                        text: R,
                        tokens: this.lexer.inlineTokens(R)
                    };
                }
            }
        }
        codespan(e) {
            let t = this.rules.inline.code.exec(e);
            if (t) {
                let n = t[2].replace(this.rules.other.newLineCharGlobal, " "), s = this.rules.other.nonSpaceChar.test(n), r = this.rules.other.startingSpaceChar.test(n) && this.rules.other.endingSpaceChar.test(n);
                return s && r && (n = n.substring(1, n.length - 1)), {
                    type: "codespan",
                    raw: t[0],
                    text: n
                };
            }
        }
        br(e) {
            let t = this.rules.inline.br.exec(e);
            if (t) return {
                type: "br",
                raw: t[0]
            };
        }
        del(e, t, n = "") {
            let s = this.rules.inline.delLDelim.exec(e);
            if (!s) return;
            if (!(s[1] || "") || !n || this.rules.inline.punctuation.exec(n)) {
                let i = [ ...s[0] ].length - 1, o, u, a = i, c = this.rules.inline.delRDelim;
                for (c.lastIndex = 0, t = t.slice(-1 * e.length + i); (s = c.exec(t)) !== null; ) {
                    if (o = s[1] || s[2] || s[3] || s[4] || s[5] || s[6], !o || (u = [ ...o ].length, 
                    u !== i)) continue;
                    if (s[3] || s[4]) {
                        a += u;
                        continue;
                    }
                    if (a -= u, a > 0) continue;
                    u = Math.min(u, u + a);
                    let p = [ ...s[0] ][0].length, k = e.slice(0, i + s.index + p + u), h = k.slice(i, -i);
                    return {
                        type: "del",
                        raw: k,
                        text: h,
                        tokens: this.lexer.inlineTokens(h)
                    };
                }
            }
        }
        autolink(e) {
            let t = this.rules.inline.autolink.exec(e);
            if (t) {
                let n, s;
                return t[2] === "@" ? (n = t[1], s = "mailto:" + n) : (n = t[1], s = n), {
                    type: "link",
                    raw: t[0],
                    text: n,
                    href: s,
                    tokens: [ {
                        type: "text",
                        raw: n,
                        text: n
                    } ]
                };
            }
        }
        url(e) {
            let t;
            if (t = this.rules.inline.url.exec(e)) {
                let n, s;
                if (t[2] === "@") n = t[0], s = "mailto:" + n; else {
                    let r;
                    do {
                        r = t[0], t[0] = this.rules.inline._backpedal.exec(t[0])?.[0] ?? "";
                    } while (r !== t[0]);
                    n = t[0], t[1] === "www." ? s = "http://" + t[0] : s = t[0];
                }
                return {
                    type: "link",
                    raw: t[0],
                    text: n,
                    href: s,
                    tokens: [ {
                        type: "text",
                        raw: n,
                        text: n
                    } ]
                };
            }
        }
        inlineText(e) {
            let t = this.rules.inline.text.exec(e);
            if (t) {
                let n = this.lexer.state.inRawBlock;
                return {
                    type: "text",
                    raw: t[0],
                    text: t[0],
                    escaped: n
                };
            }
        }
    };
    var x = class l {
        tokens;
        options;
        state;
        inlineQueue;
        tokenizer;
        constructor(e) {
            this.tokens = [], this.tokens.links = Object.create(null), this.options = e || T, 
            this.options.tokenizer = this.options.tokenizer || new w, this.tokenizer = this.options.tokenizer, 
            this.tokenizer.options = this.options, this.tokenizer.lexer = this, this.inlineQueue = [], 
            this.state = {
                inLink: false,
                inRawBlock: false,
                top: true
            };
            let t = {
                other: m,
                block: B.normal,
                inline: A.normal
            };
            this.options.pedantic ? (t.block = B.pedantic, t.inline = A.pedantic) : this.options.gfm && (t.block = B.gfm, 
            this.options.breaks ? t.inline = A.breaks : t.inline = A.gfm), this.tokenizer.rules = t;
        }
        static get rules() {
            return {
                block: B,
                inline: A
            };
        }
        static lex(e, t) {
            return new l(t).lex(e);
        }
        static lexInline(e, t) {
            return new l(t).inlineTokens(e);
        }
        lex(e) {
            e = e.replace(m.carriageReturn, `\n`), this.blockTokens(e, this.tokens);
            for (let t = 0; t < this.inlineQueue.length; t++) {
                let n = this.inlineQueue[t];
                this.inlineTokens(n.src, n.tokens);
            }
            return this.inlineQueue = [], this.tokens;
        }
        blockTokens(e, t = [], n = false) {
            this.tokenizer.lexer = this, this.options.pedantic && (e = e.replace(m.tabCharGlobal, "    ").replace(m.spaceLine, ""));
            let s = 1 / 0;
            for (;e; ) {
                if (e.length < s) s = e.length; else {
                    this.infiniteLoopError(e.charCodeAt(0));
                    break;
                }
                let r;
                if (this.options.extensions?.block?.some((o => (r = o.call({
                    lexer: this
                }, e, t)) ? (e = e.substring(r.raw.length), t.push(r), true) : false))) continue;
                if (r = this.tokenizer.space(e)) {
                    e = e.substring(r.raw.length);
                    let o = t.at(-1);
                    r.raw.length === 1 && o !== void 0 ? o.raw += `\n` : t.push(r);
                    continue;
                }
                if (r = this.tokenizer.code(e)) {
                    e = e.substring(r.raw.length);
                    let o = t.at(-1);
                    o?.type === "paragraph" || o?.type === "text" ? (o.raw += (o.raw.endsWith(`\n`) ? "" : `\n`) + r.raw, 
                    o.text += `\n` + r.text, this.inlineQueue.at(-1).src = o.text) : t.push(r);
                    continue;
                }
                if (r = this.tokenizer.fences(e)) {
                    e = e.substring(r.raw.length), t.push(r);
                    continue;
                }
                if (r = this.tokenizer.heading(e)) {
                    e = e.substring(r.raw.length), t.push(r);
                    continue;
                }
                if (r = this.tokenizer.hr(e)) {
                    e = e.substring(r.raw.length), t.push(r);
                    continue;
                }
                if (r = this.tokenizer.blockquote(e)) {
                    e = e.substring(r.raw.length), t.push(r);
                    continue;
                }
                if (r = this.tokenizer.list(e)) {
                    e = e.substring(r.raw.length), t.push(r);
                    continue;
                }
                if (r = this.tokenizer.html(e)) {
                    e = e.substring(r.raw.length), t.push(r);
                    continue;
                }
                if (r = this.tokenizer.def(e)) {
                    e = e.substring(r.raw.length);
                    let o = t.at(-1);
                    o?.type === "paragraph" || o?.type === "text" ? (o.raw += (o.raw.endsWith(`\n`) ? "" : `\n`) + r.raw, 
                    o.text += `\n` + r.raw, this.inlineQueue.at(-1).src = o.text) : this.tokens.links[r.tag] || (this.tokens.links[r.tag] = {
                        href: r.href,
                        title: r.title
                    }, t.push(r));
                    continue;
                }
                if (r = this.tokenizer.table(e)) {
                    e = e.substring(r.raw.length), t.push(r);
                    continue;
                }
                if (r = this.tokenizer.lheading(e)) {
                    e = e.substring(r.raw.length), t.push(r);
                    continue;
                }
                let i = e;
                if (this.options.extensions?.startBlock) {
                    let o = 1 / 0, u = e.slice(1), a;
                    this.options.extensions.startBlock.forEach((c => {
                        a = c.call({
                            lexer: this
                        }, u), typeof a == "number" && a >= 0 && (o = Math.min(o, a));
                    })), o < 1 / 0 && o >= 0 && (i = e.substring(0, o + 1));
                }
                if (this.state.top && (r = this.tokenizer.paragraph(i))) {
                    let o = t.at(-1);
                    n && o?.type === "paragraph" ? (o.raw += (o.raw.endsWith(`\n`) ? "" : `\n`) + r.raw, 
                    o.text += `\n` + r.text, this.inlineQueue.pop(), this.inlineQueue.at(-1).src = o.text) : t.push(r), 
                    n = i.length !== e.length, e = e.substring(r.raw.length);
                    continue;
                }
                if (r = this.tokenizer.text(e)) {
                    e = e.substring(r.raw.length);
                    let o = t.at(-1);
                    o?.type === "text" ? (o.raw += (o.raw.endsWith(`\n`) ? "" : `\n`) + r.raw, o.text += `\n` + r.text, 
                    this.inlineQueue.pop(), this.inlineQueue.at(-1).src = o.text) : t.push(r);
                    continue;
                }
                if (e) {
                    this.infiniteLoopError(e.charCodeAt(0));
                    break;
                }
            }
            return this.state.top = true, t;
        }
        inline(e, t = []) {
            return this.inlineQueue.push({
                src: e,
                tokens: t
            }), t;
        }
        inlineTokens(e, t = []) {
            this.tokenizer.lexer = this;
            let n = e, s = null;
            if (this.tokens.links) {
                let a = Object.keys(this.tokens.links);
                if (a.length > 0) for (;(s = this.tokenizer.rules.inline.reflinkSearch.exec(n)) !== null; ) a.includes(s[0].slice(s[0].lastIndexOf("[") + 1, -1)) && (n = n.slice(0, s.index) + "[" + "a".repeat(s[0].length - 2) + "]" + n.slice(this.tokenizer.rules.inline.reflinkSearch.lastIndex));
            }
            for (;(s = this.tokenizer.rules.inline.anyPunctuation.exec(n)) !== null; ) n = n.slice(0, s.index) + "++" + n.slice(this.tokenizer.rules.inline.anyPunctuation.lastIndex);
            let r;
            for (;(s = this.tokenizer.rules.inline.blockSkip.exec(n)) !== null; ) r = s[2] ? s[2].length : 0, 
            n = n.slice(0, s.index + r) + "[" + "a".repeat(s[0].length - r - 2) + "]" + n.slice(this.tokenizer.rules.inline.blockSkip.lastIndex);
            n = this.options.hooks?.emStrongMask?.call({
                lexer: this
            }, n) ?? n;
            let i = false, o = "", u = 1 / 0;
            for (;e; ) {
                if (e.length < u) u = e.length; else {
                    this.infiniteLoopError(e.charCodeAt(0));
                    break;
                }
                i || (o = ""), i = false;
                let a;
                if (this.options.extensions?.inline?.some((p => (a = p.call({
                    lexer: this
                }, e, t)) ? (e = e.substring(a.raw.length), t.push(a), true) : false))) continue;
                if (a = this.tokenizer.escape(e)) {
                    e = e.substring(a.raw.length), t.push(a);
                    continue;
                }
                if (a = this.tokenizer.tag(e)) {
                    e = e.substring(a.raw.length), t.push(a);
                    continue;
                }
                if (a = this.tokenizer.link(e)) {
                    e = e.substring(a.raw.length), t.push(a);
                    continue;
                }
                if (a = this.tokenizer.reflink(e, this.tokens.links)) {
                    e = e.substring(a.raw.length);
                    let p = t.at(-1);
                    a.type === "text" && p?.type === "text" ? (p.raw += a.raw, p.text += a.text) : t.push(a);
                    continue;
                }
                if (a = this.tokenizer.emStrong(e, n, o)) {
                    e = e.substring(a.raw.length), t.push(a);
                    continue;
                }
                if (a = this.tokenizer.codespan(e)) {
                    e = e.substring(a.raw.length), t.push(a);
                    continue;
                }
                if (a = this.tokenizer.br(e)) {
                    e = e.substring(a.raw.length), t.push(a);
                    continue;
                }
                if (a = this.tokenizer.del(e, n, o)) {
                    e = e.substring(a.raw.length), t.push(a);
                    continue;
                }
                if (a = this.tokenizer.autolink(e)) {
                    e = e.substring(a.raw.length), t.push(a);
                    continue;
                }
                if (!this.state.inLink && (a = this.tokenizer.url(e))) {
                    e = e.substring(a.raw.length), t.push(a);
                    continue;
                }
                let c = e;
                if (this.options.extensions?.startInline) {
                    let p = 1 / 0, k = e.slice(1), h;
                    this.options.extensions.startInline.forEach((R => {
                        h = R.call({
                            lexer: this
                        }, k), typeof h == "number" && h >= 0 && (p = Math.min(p, h));
                    })), p < 1 / 0 && p >= 0 && (c = e.substring(0, p + 1));
                }
                if (a = this.tokenizer.inlineText(c)) {
                    e = e.substring(a.raw.length), a.raw.slice(-1) !== "_" && (o = a.raw.slice(-1)), 
                    i = true;
                    let p = t.at(-1);
                    p?.type === "text" ? (p.raw += a.raw, p.text += a.text) : t.push(a);
                    continue;
                }
                if (e) {
                    this.infiniteLoopError(e.charCodeAt(0));
                    break;
                }
            }
            return t;
        }
        infiniteLoopError(e) {
            let t = "Infinite loop on byte: " + e;
            if (this.options.silent) console.error(t); else throw new Error(t);
        }
    };
    var y = class {
        options;
        parser;
        constructor(e) {
            this.options = e || T;
        }
        space(e) {
            return "";
        }
        code({text: e, lang: t, escaped: n}) {
            let s = (t || "").match(m.notSpaceStart)?.[0], r = e.replace(m.endingNewline, "") + `\n`;
            return s ? '<pre><code class="language-' + O(s) + '">' + (n ? r : O(r, true)) + `</code></pre>\n` : "<pre><code>" + (n ? r : O(r, true)) + `</code></pre>\n`;
        }
        blockquote({tokens: e}) {
            return `<blockquote>\n${this.parser.parse(e)}</blockquote>\n`;
        }
        html({text: e}) {
            return e;
        }
        def(e) {
            return "";
        }
        heading({tokens: e, depth: t}) {
            return `<h${t}>${this.parser.parseInline(e)}</h${t}>\n`;
        }
        hr(e) {
            return `<hr>\n`;
        }
        list(e) {
            let t = e.ordered, n = e.start, s = "";
            for (let o = 0; o < e.items.length; o++) {
                let u = e.items[o];
                s += this.listitem(u);
            }
            let r = t ? "ol" : "ul", i = t && n !== 1 ? ' start="' + n + '"' : "";
            return "<" + r + i + `>\n` + s + "</" + r + `>\n`;
        }
        listitem(e) {
            return `<li>${this.parser.parse(e.tokens)}</li>\n`;
        }
        checkbox({checked: e}) {
            return "<input " + (e ? 'checked="" ' : "") + 'disabled="" type="checkbox"> ';
        }
        paragraph({tokens: e}) {
            return `<p>${this.parser.parseInline(e)}</p>\n`;
        }
        table(e) {
            let t = "", n = "";
            for (let r = 0; r < e.header.length; r++) n += this.tablecell(e.header[r]);
            t += this.tablerow({
                text: n
            });
            let s = "";
            for (let r = 0; r < e.rows.length; r++) {
                let i = e.rows[r];
                n = "";
                for (let o = 0; o < i.length; o++) n += this.tablecell(i[o]);
                s += this.tablerow({
                    text: n
                });
            }
            return s && (s = `<tbody>${s}</tbody>`), `<table>\n<thead>\n` + t + `</thead>\n` + s + `</table>\n`;
        }
        tablerow({text: e}) {
            return `<tr>\n${e}</tr>\n`;
        }
        tablecell(e) {
            let t = this.parser.parseInline(e.tokens), n = e.header ? "th" : "td";
            return (e.align ? `<${n} align="${e.align}">` : `<${n}>`) + t + `</${n}>\n`;
        }
        strong({tokens: e}) {
            return `<strong>${this.parser.parseInline(e)}</strong>`;
        }
        em({tokens: e}) {
            return `<em>${this.parser.parseInline(e)}</em>`;
        }
        codespan({text: e}) {
            return `<code>${O(e, true)}</code>`;
        }
        br(e) {
            return "<br>";
        }
        del({tokens: e}) {
            return `<del>${this.parser.parseInline(e)}</del>`;
        }
        link({href: e, title: t, tokens: n}) {
            let s = this.parser.parseInline(n), r = J(e);
            if (r === null) return s;
            e = r;
            let i = '<a href="' + e + '"';
            return t && (i += ' title="' + O(t) + '"'), i += ">" + s + "</a>", i;
        }
        image({href: e, title: t, text: n, tokens: s}) {
            s && (n = this.parser.parseInline(s, this.parser.textRenderer));
            let r = J(e);
            if (r === null) return O(n);
            e = r;
            let i = `<img src="${e}" alt="${O(n)}"`;
            return t && (i += ` title="${O(t)}"`), i += ">", i;
        }
        text(e) {
            return "tokens" in e && e.tokens ? this.parser.parseInline(e.tokens) : "escaped" in e && e.escaped ? e.text : O(e.text);
        }
    };
    var L = class {
        strong({text: e}) {
            return e;
        }
        em({text: e}) {
            return e;
        }
        codespan({text: e}) {
            return e;
        }
        del({text: e}) {
            return e;
        }
        html({text: e}) {
            return e;
        }
        text({text: e}) {
            return e;
        }
        link({text: e}) {
            return "" + e;
        }
        image({text: e}) {
            return "" + e;
        }
        br() {
            return "";
        }
        checkbox({raw: e}) {
            return e;
        }
    };
    var b = class l {
        options;
        renderer;
        textRenderer;
        constructor(e) {
            this.options = e || T, this.options.renderer = this.options.renderer || new y, this.renderer = this.options.renderer, 
            this.renderer.options = this.options, this.renderer.parser = this, this.textRenderer = new L;
        }
        static parse(e, t) {
            return new l(t).parse(e);
        }
        static parseInline(e, t) {
            return new l(t).parseInline(e);
        }
        parse(e) {
            this.renderer.parser = this;
            let t = "";
            for (let n = 0; n < e.length; n++) {
                let s = e[n];
                if (this.options.extensions?.renderers?.[s.type]) {
                    let i = s, o = this.options.extensions.renderers[i.type].call({
                        parser: this
                    }, i);
                    if (o !== false || ![ "space", "hr", "heading", "code", "table", "blockquote", "list", "html", "def", "paragraph", "text" ].includes(i.type)) {
                        t += o || "";
                        continue;
                    }
                }
                let r = s;
                switch (r.type) {
                  case "space":
                    {
                        t += this.renderer.space(r);
                        break;
                    }

                  case "hr":
                    {
                        t += this.renderer.hr(r);
                        break;
                    }

                  case "heading":
                    {
                        t += this.renderer.heading(r);
                        break;
                    }

                  case "code":
                    {
                        t += this.renderer.code(r);
                        break;
                    }

                  case "table":
                    {
                        t += this.renderer.table(r);
                        break;
                    }

                  case "blockquote":
                    {
                        t += this.renderer.blockquote(r);
                        break;
                    }

                  case "list":
                    {
                        t += this.renderer.list(r);
                        break;
                    }

                  case "checkbox":
                    {
                        t += this.renderer.checkbox(r);
                        break;
                    }

                  case "html":
                    {
                        t += this.renderer.html(r);
                        break;
                    }

                  case "def":
                    {
                        t += this.renderer.def(r);
                        break;
                    }

                  case "paragraph":
                    {
                        t += this.renderer.paragraph(r);
                        break;
                    }

                  case "text":
                    {
                        t += this.renderer.text(r);
                        break;
                    }

                  default:
                    {
                        let i = 'Token with "' + r.type + '" type was not found.';
                        if (this.options.silent) return console.error(i), "";
                        throw new Error(i);
                    }
                }
            }
            return t;
        }
        parseInline(e, t = this.renderer) {
            this.renderer.parser = this;
            let n = "";
            for (let s = 0; s < e.length; s++) {
                let r = e[s];
                if (this.options.extensions?.renderers?.[r.type]) {
                    let o = this.options.extensions.renderers[r.type].call({
                        parser: this
                    }, r);
                    if (o !== false || ![ "escape", "html", "link", "image", "strong", "em", "codespan", "br", "del", "text" ].includes(r.type)) {
                        n += o || "";
                        continue;
                    }
                }
                let i = r;
                switch (i.type) {
                  case "escape":
                    {
                        n += t.text(i);
                        break;
                    }

                  case "html":
                    {
                        n += t.html(i);
                        break;
                    }

                  case "link":
                    {
                        n += t.link(i);
                        break;
                    }

                  case "image":
                    {
                        n += t.image(i);
                        break;
                    }

                  case "checkbox":
                    {
                        n += t.checkbox(i);
                        break;
                    }

                  case "strong":
                    {
                        n += t.strong(i);
                        break;
                    }

                  case "em":
                    {
                        n += t.em(i);
                        break;
                    }

                  case "codespan":
                    {
                        n += t.codespan(i);
                        break;
                    }

                  case "br":
                    {
                        n += t.br(i);
                        break;
                    }

                  case "del":
                    {
                        n += t.del(i);
                        break;
                    }

                  case "text":
                    {
                        n += t.text(i);
                        break;
                    }

                  default:
                    {
                        let o = 'Token with "' + i.type + '" type was not found.';
                        if (this.options.silent) return console.error(o), "";
                        throw new Error(o);
                    }
                }
            }
            return n;
        }
    };
    var P = class {
        options;
        block;
        constructor(e) {
            this.options = e || T;
        }
        static passThroughHooks=new Set([ "preprocess", "postprocess", "processAllTokens", "emStrongMask" ]);
        static passThroughHooksRespectAsync=new Set([ "preprocess", "postprocess", "processAllTokens" ]);
        preprocess(e) {
            return e;
        }
        postprocess(e) {
            return e;
        }
        processAllTokens(e) {
            return e;
        }
        emStrongMask(e) {
            return e;
        }
        provideLexer(e = this.block) {
            return e ? x.lex : x.lexInline;
        }
        provideParser(e = this.block) {
            return e ? b.parse : b.parseInline;
        }
    };
    var D = class {
        defaults=z();
        options=this.setOptions;
        parse=this.parseMarkdown(true);
        parseInline=this.parseMarkdown(false);
        Parser=b;
        Renderer=y;
        TextRenderer=L;
        Lexer=x;
        Tokenizer=w;
        Hooks=P;
        constructor(...e) {
            this.use(...e);
        }
        walkTokens(e, t) {
            let n = [];
            for (let s of e) switch (n = n.concat(t.call(this, s)), s.type) {
              case "table":
                {
                    let r = s;
                    for (let i of r.header) n = n.concat(this.walkTokens(i.tokens, t));
                    for (let i of r.rows) for (let o of i) n = n.concat(this.walkTokens(o.tokens, t));
                    break;
                }

              case "list":
                {
                    let r = s;
                    n = n.concat(this.walkTokens(r.items, t));
                    break;
                }

              default:
                {
                    let r = s;
                    this.defaults.extensions?.childTokens?.[r.type] ? this.defaults.extensions.childTokens[r.type].forEach((i => {
                        let o = r[i].flat(1 / 0);
                        n = n.concat(this.walkTokens(o, t));
                    })) : r.tokens && (n = n.concat(this.walkTokens(r.tokens, t)));
                }
            }
            return n;
        }
        use(...e) {
            let t = this.defaults.extensions || {
                renderers: {},
                childTokens: {}
            };
            return e.forEach((n => {
                let s = {
                    ...n
                };
                if (s.async = this.defaults.async || s.async || false, n.extensions && (n.extensions.forEach((r => {
                    if (!r.name) throw new Error("extension name required");
                    if ("renderer" in r) {
                        let i = t.renderers[r.name];
                        i ? t.renderers[r.name] = function(...o) {
                            let u = r.renderer.apply(this, o);
                            return u === false && (u = i.apply(this, o)), u;
                        } : t.renderers[r.name] = r.renderer;
                    }
                    if ("tokenizer" in r) {
                        if (!r.level || r.level !== "block" && r.level !== "inline") throw new Error("extension level must be 'block' or 'inline'");
                        let i = t[r.level];
                        i ? i.unshift(r.tokenizer) : t[r.level] = [ r.tokenizer ], r.start && (r.level === "block" ? t.startBlock ? t.startBlock.push(r.start) : t.startBlock = [ r.start ] : r.level === "inline" && (t.startInline ? t.startInline.push(r.start) : t.startInline = [ r.start ]));
                    }
                    "childTokens" in r && r.childTokens && (t.childTokens[r.name] = r.childTokens);
                })), s.extensions = t), n.renderer) {
                    let r = this.defaults.renderer || new y(this.defaults);
                    for (let i in n.renderer) {
                        if (!(i in r)) throw new Error(`renderer '${i}' does not exist`);
                        if ([ "options", "parser" ].includes(i)) continue;
                        let o = i, u = n.renderer[o], a = r[o];
                        r[o] = (...c) => {
                            let p = u.apply(r, c);
                            return p === false && (p = a.apply(r, c)), p || "";
                        };
                    }
                    s.renderer = r;
                }
                if (n.tokenizer) {
                    let r = this.defaults.tokenizer || new w(this.defaults);
                    for (let i in n.tokenizer) {
                        if (!(i in r)) throw new Error(`tokenizer '${i}' does not exist`);
                        if ([ "options", "rules", "lexer" ].includes(i)) continue;
                        let o = i, u = n.tokenizer[o], a = r[o];
                        r[o] = (...c) => {
                            let p = u.apply(r, c);
                            return p === false && (p = a.apply(r, c)), p;
                        };
                    }
                    s.tokenizer = r;
                }
                if (n.hooks) {
                    let r = this.defaults.hooks || new P;
                    for (let i in n.hooks) {
                        if (!(i in r)) throw new Error(`hook '${i}' does not exist`);
                        if ([ "options", "block" ].includes(i)) continue;
                        let o = i, u = n.hooks[o], a = r[o];
                        P.passThroughHooks.has(i) ? r[o] = c => {
                            if (this.defaults.async && P.passThroughHooksRespectAsync.has(i)) return (async () => {
                                let k = await u.call(r, c);
                                return a.call(r, k);
                            })();
                            let p = u.call(r, c);
                            return a.call(r, p);
                        } : r[o] = (...c) => {
                            if (this.defaults.async) return (async () => {
                                let k = await u.apply(r, c);
                                return k === false && (k = await a.apply(r, c)), k;
                            })();
                            let p = u.apply(r, c);
                            return p === false && (p = a.apply(r, c)), p;
                        };
                    }
                    s.hooks = r;
                }
                if (n.walkTokens) {
                    let r = this.defaults.walkTokens, i = n.walkTokens;
                    s.walkTokens = function(o) {
                        let u = [];
                        return u.push(i.call(this, o)), r && (u = u.concat(r.call(this, o))), u;
                    };
                }
                this.defaults = {
                    ...this.defaults,
                    ...s
                };
            })), this;
        }
        setOptions(e) {
            return this.defaults = {
                ...this.defaults,
                ...e
            }, this;
        }
        lexer(e, t) {
            return x.lex(e, t ?? this.defaults);
        }
        parser(e, t) {
            return b.parse(e, t ?? this.defaults);
        }
        parseMarkdown(e) {
            return (n, s) => {
                let r = {
                    ...s
                }, i = {
                    ...this.defaults,
                    ...r
                }, o = this.onError(!!i.silent, !!i.async);
                if (this.defaults.async === true && r.async === false) return o(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."));
                if (typeof n > "u" || n === null) return o(new Error("marked(): input parameter is undefined or null"));
                if (typeof n != "string") return o(new Error("marked(): input parameter is of type " + Object.prototype.toString.call(n) + ", string expected"));
                if (i.hooks && (i.hooks.options = i, i.hooks.block = e), i.async) return (async () => {
                    let u = i.hooks ? await i.hooks.preprocess(n) : n, c = await (i.hooks ? await i.hooks.provideLexer(e) : e ? x.lex : x.lexInline)(u, i), p = i.hooks ? await i.hooks.processAllTokens(c) : c;
                    i.walkTokens && await Promise.all(this.walkTokens(p, i.walkTokens));
                    let h = await (i.hooks ? await i.hooks.provideParser(e) : e ? b.parse : b.parseInline)(p, i);
                    return i.hooks ? await i.hooks.postprocess(h) : h;
                })().catch(o);
                try {
                    i.hooks && (n = i.hooks.preprocess(n));
                    let a = (i.hooks ? i.hooks.provideLexer(e) : e ? x.lex : x.lexInline)(n, i);
                    i.hooks && (a = i.hooks.processAllTokens(a)), i.walkTokens && this.walkTokens(a, i.walkTokens);
                    let p = (i.hooks ? i.hooks.provideParser(e) : e ? b.parse : b.parseInline)(a, i);
                    return i.hooks && (p = i.hooks.postprocess(p)), p;
                } catch (u) {
                    return o(u);
                }
            };
        }
        onError(e, t) {
            return n => {
                if (n.message += `\nPlease report this to https://github.com/markedjs/marked.`, 
                e) {
                    let s = "<p>An error occurred:</p><pre>" + O(n.message + "", true) + "</pre>";
                    return t ? Promise.resolve(s) : s;
                }
                if (t) return Promise.reject(n);
                throw n;
            };
        }
    };
    var M = new D;
    function g(l, e) {
        return M.parse(l, e);
    }
    g.options = g.setOptions = function(l) {
        return M.setOptions(l), g.defaults = M.defaults, G(g.defaults), g;
    };
    g.getDefaults = z;
    g.defaults = T;
    g.use = function(...l) {
        return M.use(...l), g.defaults = M.defaults, G(g.defaults), g;
    };
    g.walkTokens = function(l, e) {
        return M.walkTokens(l, e);
    };
    g.parseInline = M.parseInline;
    g.Parser = b;
    g.parser = b.parse;
    g.Renderer = y;
    g.TextRenderer = L;
    g.Lexer = x;
    g.lexer = x.lex;
    g.Tokenizer = w;
    g.Hooks = P;
    g.parse = g;
    g.options;
    g.setOptions;
    g.use;
    g.walkTokens;
    g.parseInline;
    b.parse;
    x.lex;
    function corner(data, cornerExternalLinkTarget) {
        if (!data) {
            return "";
        }
        if (!/\/\//.test(data)) {
            data = "https://github.com/" + data;
        }
        data = data.replace(/^git\+/, "");
        cornerExternalLinkTarget = cornerExternalLinkTarget || "_blank";
        return `\n    <a href="${data}" target="${cornerExternalLinkTarget}" class="github-corner" aria-label="View source on GitHub">\n      <svg viewBox="0 0 250 250" aria-hidden="true">\n        <path d="M0,0 L115,115 L130,115 L142,142 L250,250 L250,0 Z"></path>\n        <path d="M128.3,109.0 C113.8,99.7 119.0,89.6 119.0,89.6 C122.0,82.7 120.5,78.6 120.5,78.6 C119.2,72.0 123.4,76.3 123.4,76.3 C127.3,80.9 125.5,87.3 125.5,87.3 C122.9,97.6 130.6,101.9 134.4,103.2" fill="currentColor" style="transform-origin: 130px 106px;" class="octo-arm"></path>\n        <path d="M115.0,115.0 C114.9,115.1 118.7,116.5 119.8,115.4 L133.7,101.6 C136.9,99.2 139.9,98.4 142.2,98.6 C133.8,88.0 127.5,74.4 143.8,58.0 C148.5,53.4 154.0,51.2 159.7,51.0 C160.3,49.4 163.2,43.6 171.4,40.1 C171.4,40.1 176.1,42.5 178.8,56.2 C183.1,58.6 187.2,61.8 190.9,65.4 C194.5,69.0 197.7,73.2 200.1,77.6 C213.8,80.2 216.3,84.9 216.3,84.9 C212.7,93.1 206.9,96.0 205.4,96.6 C205.1,102.4 203.0,107.8 198.3,112.5 C181.9,128.9 168.3,122.5 157.7,114.1 C157.9,116.9 156.7,120.9 152.7,124.9 L141.0,136.5 C139.8,137.7 141.6,141.9 141.8,141.8 Z" fill="currentColor" class="octo-body"></path>\n      </svg>\n    </a>\n  `;
    }
    function main(config) {
        const {hideSidebar: hideSidebar, name: name, sidebarPosition: sidebarPosition} = config;
        const sidebarPositionClass = sidebarPosition === "right" ? " sidebar-right" : "";
        const aside = hideSidebar ? "" : `\n    <button class="sidebar-toggle${sidebarPositionClass}" tabindex="-1" title="Press \\ to toggle">\n      <div class="sidebar-toggle-button" tabindex="0" aria-label="Hide primary navigation" aria-keyshortcuts="Use shortcut key \\" aria-controls="__sidebar" role="button">\n        <span></span><span></span><span></span>\n      </div>\n    </button>\n    <aside id="__sidebar" class="sidebar${sidebarPositionClass}${!isMobile() ? " show" : ""}" tabindex="-1" role="none">\n      ${config.name ? `\n            <h1 class="app-name"><a class="app-name-link" data-nosearch>${config.logo ? `<img alt="${name}" src=${config.logo} />` : name}</a></h1>\n          ` : ""}\n      <div class="sidebar-nav" role="navigation" aria-label="primary">\x3c!--sidebar--\x3e</div>\n    </aside>\n  `;
        return `\n    <main role="presentation">\n      ${aside}\n      <section class="content">\n        <article id="main" class="markdown-section" role="main" tabindex="-1">\x3c!--main--\x3e</article>\n      </section>\n    </main>\n  `;
    }
    function cover() {
        return `\n    <section class="cover show" role="complementary" aria-label="cover">\n      <div class="mask"></div>\n      <div class="cover-main">\x3c!--cover--\x3e</div>\n    </section>\n  `;
    }
    function tree(toc, tpl = '<ul class="app-sub-sidebar">{inner}</ul>') {
        if (!toc || !toc.length) {
            return "";
        }
        let innerHTML = "";
        toc.forEach((node => {
            const title = node.title.replace(/(<([^>]+)>)/g, "");
            let current = `<li><a class="section-link" href="${node.slug}" title="${title}">${node.title}</a></li>`;
            if (node.children) {
                const children = tree(node.children, "<ul>{inner}</ul>");
                current = `<li><a class="section-link" href="${node.slug}" title="${title}">${node.title}</a>${children}</li>`;
            }
            innerHTML += current;
        }));
        return tpl.replace("{inner}", innerHTML);
    }
    function helper(className, content) {
        return `<p class="${className}">${content.slice(5).trim()}</p>`;
    }
    function theme(color) {
        return `<style>:root{--theme-color: ${color};}</style>`;
    }
    function genTree(toc, maxLevel) {
        const headlines = [];
        const last = {};
        toc.forEach((headline => {
            const level = headline.depth || 1;
            const len = level - 1;
            if (level > maxLevel) {
                return;
            }
            if (last[len]) {
                last[len].children = [ ...last[len].children || [], headline ];
            } else {
                headlines.push(headline);
            }
            last[level] = headline;
        }));
        return headlines;
    }
    let cache$1 = {};
    const re = /[\u2000-\u206F\u2E00-\u2E7F\\'!"#$%&()*+,./:;<=>?@[\]^`{|}~]/g;
    function lower(string) {
        return string.toLowerCase();
    }
    function slugify(str) {
        if (typeof str !== "string") {
            return "";
        }
        let slug = str.trim().normalize("NFC").replace(/\[([^\]]+)\]\([^)]+\)/g, "$1").replace(/\uFE0F/g, "").replace(/[\p{Emoji_Presentation}\p{Extended_Pictographic}]/gu, "").replace(/[A-Z]+/g, lower).replace(/<[^>]+>/g, "").replace(re, "").replace(/\s/g, "-").replace(/^(\d)/, "_$1");
        let count = cache$1[slug];
        count = Object.prototype.hasOwnProperty.call(cache$1, slug) ? count + 1 : 0;
        cache$1[slug] = count;
        if (count) {
            slug = slug + "-" + count;
        }
        return slug;
    }
    slugify.clear = function() {
        cache$1 = {};
    };
    var emojiData = {
        baseURL: "https://github.githubassets.com/images/icons/emoji/",
        data: {
            100: "unicode/1f4af.png?v8",
            1234: "unicode/1f522.png?v8",
            "+1": "unicode/1f44d.png?v8",
            "-1": "unicode/1f44e.png?v8",
            "1st_place_medal": "unicode/1f947.png?v8",
            "2nd_place_medal": "unicode/1f948.png?v8",
            "3rd_place_medal": "unicode/1f949.png?v8",
            "8ball": "unicode/1f3b1.png?v8",
            a: "unicode/1f170.png?v8",
            ab: "unicode/1f18e.png?v8",
            abacus: "unicode/1f9ee.png?v8",
            abc: "unicode/1f524.png?v8",
            abcd: "unicode/1f521.png?v8",
            accept: "unicode/1f251.png?v8",
            accessibility: "accessibility.png?v8",
            accordion: "unicode/1fa97.png?v8",
            adhesive_bandage: "unicode/1fa79.png?v8",
            adult: "unicode/1f9d1.png?v8",
            aerial_tramway: "unicode/1f6a1.png?v8",
            afghanistan: "unicode/1f1e6-1f1eb.png?v8",
            airplane: "unicode/2708.png?v8",
            aland_islands: "unicode/1f1e6-1f1fd.png?v8",
            alarm_clock: "unicode/23f0.png?v8",
            albania: "unicode/1f1e6-1f1f1.png?v8",
            alembic: "unicode/2697.png?v8",
            algeria: "unicode/1f1e9-1f1ff.png?v8",
            alien: "unicode/1f47d.png?v8",
            ambulance: "unicode/1f691.png?v8",
            american_samoa: "unicode/1f1e6-1f1f8.png?v8",
            amphora: "unicode/1f3fa.png?v8",
            anatomical_heart: "unicode/1fac0.png?v8",
            anchor: "unicode/2693.png?v8",
            andorra: "unicode/1f1e6-1f1e9.png?v8",
            angel: "unicode/1f47c.png?v8",
            anger: "unicode/1f4a2.png?v8",
            angola: "unicode/1f1e6-1f1f4.png?v8",
            angry: "unicode/1f620.png?v8",
            anguilla: "unicode/1f1e6-1f1ee.png?v8",
            anguished: "unicode/1f627.png?v8",
            ant: "unicode/1f41c.png?v8",
            antarctica: "unicode/1f1e6-1f1f6.png?v8",
            antigua_barbuda: "unicode/1f1e6-1f1ec.png?v8",
            apple: "unicode/1f34e.png?v8",
            aquarius: "unicode/2652.png?v8",
            argentina: "unicode/1f1e6-1f1f7.png?v8",
            aries: "unicode/2648.png?v8",
            armenia: "unicode/1f1e6-1f1f2.png?v8",
            arrow_backward: "unicode/25c0.png?v8",
            arrow_double_down: "unicode/23ec.png?v8",
            arrow_double_up: "unicode/23eb.png?v8",
            arrow_down: "unicode/2b07.png?v8",
            arrow_down_small: "unicode/1f53d.png?v8",
            arrow_forward: "unicode/25b6.png?v8",
            arrow_heading_down: "unicode/2935.png?v8",
            arrow_heading_up: "unicode/2934.png?v8",
            arrow_left: "unicode/2b05.png?v8",
            arrow_lower_left: "unicode/2199.png?v8",
            arrow_lower_right: "unicode/2198.png?v8",
            arrow_right: "unicode/27a1.png?v8",
            arrow_right_hook: "unicode/21aa.png?v8",
            arrow_up: "unicode/2b06.png?v8",
            arrow_up_down: "unicode/2195.png?v8",
            arrow_up_small: "unicode/1f53c.png?v8",
            arrow_upper_left: "unicode/2196.png?v8",
            arrow_upper_right: "unicode/2197.png?v8",
            arrows_clockwise: "unicode/1f503.png?v8",
            arrows_counterclockwise: "unicode/1f504.png?v8",
            art: "unicode/1f3a8.png?v8",
            articulated_lorry: "unicode/1f69b.png?v8",
            artificial_satellite: "unicode/1f6f0.png?v8",
            artist: "unicode/1f9d1-1f3a8.png?v8",
            aruba: "unicode/1f1e6-1f1fc.png?v8",
            ascension_island: "unicode/1f1e6-1f1e8.png?v8",
            asterisk: "unicode/002a-20e3.png?v8",
            astonished: "unicode/1f632.png?v8",
            astronaut: "unicode/1f9d1-1f680.png?v8",
            athletic_shoe: "unicode/1f45f.png?v8",
            atm: "unicode/1f3e7.png?v8",
            atom: "atom.png?v8",
            atom_symbol: "unicode/269b.png?v8",
            australia: "unicode/1f1e6-1f1fa.png?v8",
            austria: "unicode/1f1e6-1f1f9.png?v8",
            auto_rickshaw: "unicode/1f6fa.png?v8",
            avocado: "unicode/1f951.png?v8",
            axe: "unicode/1fa93.png?v8",
            azerbaijan: "unicode/1f1e6-1f1ff.png?v8",
            b: "unicode/1f171.png?v8",
            baby: "unicode/1f476.png?v8",
            baby_bottle: "unicode/1f37c.png?v8",
            baby_chick: "unicode/1f424.png?v8",
            baby_symbol: "unicode/1f6bc.png?v8",
            back: "unicode/1f519.png?v8",
            bacon: "unicode/1f953.png?v8",
            badger: "unicode/1f9a1.png?v8",
            badminton: "unicode/1f3f8.png?v8",
            bagel: "unicode/1f96f.png?v8",
            baggage_claim: "unicode/1f6c4.png?v8",
            baguette_bread: "unicode/1f956.png?v8",
            bahamas: "unicode/1f1e7-1f1f8.png?v8",
            bahrain: "unicode/1f1e7-1f1ed.png?v8",
            balance_scale: "unicode/2696.png?v8",
            bald_man: "unicode/1f468-1f9b2.png?v8",
            bald_woman: "unicode/1f469-1f9b2.png?v8",
            ballet_shoes: "unicode/1fa70.png?v8",
            balloon: "unicode/1f388.png?v8",
            ballot_box: "unicode/1f5f3.png?v8",
            ballot_box_with_check: "unicode/2611.png?v8",
            bamboo: "unicode/1f38d.png?v8",
            banana: "unicode/1f34c.png?v8",
            bangbang: "unicode/203c.png?v8",
            bangladesh: "unicode/1f1e7-1f1e9.png?v8",
            banjo: "unicode/1fa95.png?v8",
            bank: "unicode/1f3e6.png?v8",
            bar_chart: "unicode/1f4ca.png?v8",
            barbados: "unicode/1f1e7-1f1e7.png?v8",
            barber: "unicode/1f488.png?v8",
            baseball: "unicode/26be.png?v8",
            basecamp: "basecamp.png?v8",
            basecampy: "basecampy.png?v8",
            basket: "unicode/1f9fa.png?v8",
            basketball: "unicode/1f3c0.png?v8",
            basketball_man: "unicode/26f9-2642.png?v8",
            basketball_woman: "unicode/26f9-2640.png?v8",
            bat: "unicode/1f987.png?v8",
            bath: "unicode/1f6c0.png?v8",
            bathtub: "unicode/1f6c1.png?v8",
            battery: "unicode/1f50b.png?v8",
            beach_umbrella: "unicode/1f3d6.png?v8",
            beans: "unicode/1fad8.png?v8",
            bear: "unicode/1f43b.png?v8",
            bearded_person: "unicode/1f9d4.png?v8",
            beaver: "unicode/1f9ab.png?v8",
            bed: "unicode/1f6cf.png?v8",
            bee: "unicode/1f41d.png?v8",
            beer: "unicode/1f37a.png?v8",
            beers: "unicode/1f37b.png?v8",
            beetle: "unicode/1fab2.png?v8",
            beginner: "unicode/1f530.png?v8",
            belarus: "unicode/1f1e7-1f1fe.png?v8",
            belgium: "unicode/1f1e7-1f1ea.png?v8",
            belize: "unicode/1f1e7-1f1ff.png?v8",
            bell: "unicode/1f514.png?v8",
            bell_pepper: "unicode/1fad1.png?v8",
            bellhop_bell: "unicode/1f6ce.png?v8",
            benin: "unicode/1f1e7-1f1ef.png?v8",
            bento: "unicode/1f371.png?v8",
            bermuda: "unicode/1f1e7-1f1f2.png?v8",
            beverage_box: "unicode/1f9c3.png?v8",
            bhutan: "unicode/1f1e7-1f1f9.png?v8",
            bicyclist: "unicode/1f6b4.png?v8",
            bike: "unicode/1f6b2.png?v8",
            biking_man: "unicode/1f6b4-2642.png?v8",
            biking_woman: "unicode/1f6b4-2640.png?v8",
            bikini: "unicode/1f459.png?v8",
            billed_cap: "unicode/1f9e2.png?v8",
            biohazard: "unicode/2623.png?v8",
            bird: "unicode/1f426.png?v8",
            birthday: "unicode/1f382.png?v8",
            bison: "unicode/1f9ac.png?v8",
            biting_lip: "unicode/1fae6.png?v8",
            black_bird: "unicode/1f426-2b1b.png?v8",
            black_cat: "unicode/1f408-2b1b.png?v8",
            black_circle: "unicode/26ab.png?v8",
            black_flag: "unicode/1f3f4.png?v8",
            black_heart: "unicode/1f5a4.png?v8",
            black_joker: "unicode/1f0cf.png?v8",
            black_large_square: "unicode/2b1b.png?v8",
            black_medium_small_square: "unicode/25fe.png?v8",
            black_medium_square: "unicode/25fc.png?v8",
            black_nib: "unicode/2712.png?v8",
            black_small_square: "unicode/25aa.png?v8",
            black_square_button: "unicode/1f532.png?v8",
            blond_haired_man: "unicode/1f471-2642.png?v8",
            blond_haired_person: "unicode/1f471.png?v8",
            blond_haired_woman: "unicode/1f471-2640.png?v8",
            blonde_woman: "unicode/1f471-2640.png?v8",
            blossom: "unicode/1f33c.png?v8",
            blowfish: "unicode/1f421.png?v8",
            blue_book: "unicode/1f4d8.png?v8",
            blue_car: "unicode/1f699.png?v8",
            blue_heart: "unicode/1f499.png?v8",
            blue_square: "unicode/1f7e6.png?v8",
            blueberries: "unicode/1fad0.png?v8",
            blush: "unicode/1f60a.png?v8",
            boar: "unicode/1f417.png?v8",
            boat: "unicode/26f5.png?v8",
            bolivia: "unicode/1f1e7-1f1f4.png?v8",
            bomb: "unicode/1f4a3.png?v8",
            bone: "unicode/1f9b4.png?v8",
            book: "unicode/1f4d6.png?v8",
            bookmark: "unicode/1f516.png?v8",
            bookmark_tabs: "unicode/1f4d1.png?v8",
            books: "unicode/1f4da.png?v8",
            boom: "unicode/1f4a5.png?v8",
            boomerang: "unicode/1fa83.png?v8",
            boot: "unicode/1f462.png?v8",
            bosnia_herzegovina: "unicode/1f1e7-1f1e6.png?v8",
            botswana: "unicode/1f1e7-1f1fc.png?v8",
            bouncing_ball_man: "unicode/26f9-2642.png?v8",
            bouncing_ball_person: "unicode/26f9.png?v8",
            bouncing_ball_woman: "unicode/26f9-2640.png?v8",
            bouquet: "unicode/1f490.png?v8",
            bouvet_island: "unicode/1f1e7-1f1fb.png?v8",
            bow: "unicode/1f647.png?v8",
            bow_and_arrow: "unicode/1f3f9.png?v8",
            bowing_man: "unicode/1f647-2642.png?v8",
            bowing_woman: "unicode/1f647-2640.png?v8",
            bowl_with_spoon: "unicode/1f963.png?v8",
            bowling: "unicode/1f3b3.png?v8",
            bowtie: "bowtie.png?v8",
            boxing_glove: "unicode/1f94a.png?v8",
            boy: "unicode/1f466.png?v8",
            brain: "unicode/1f9e0.png?v8",
            brazil: "unicode/1f1e7-1f1f7.png?v8",
            bread: "unicode/1f35e.png?v8",
            breast_feeding: "unicode/1f931.png?v8",
            bricks: "unicode/1f9f1.png?v8",
            bride_with_veil: "unicode/1f470-2640.png?v8",
            bridge_at_night: "unicode/1f309.png?v8",
            briefcase: "unicode/1f4bc.png?v8",
            british_indian_ocean_territory: "unicode/1f1ee-1f1f4.png?v8",
            british_virgin_islands: "unicode/1f1fb-1f1ec.png?v8",
            broccoli: "unicode/1f966.png?v8",
            broken_heart: "unicode/1f494.png?v8",
            broom: "unicode/1f9f9.png?v8",
            brown_circle: "unicode/1f7e4.png?v8",
            brown_heart: "unicode/1f90e.png?v8",
            brown_square: "unicode/1f7eb.png?v8",
            brunei: "unicode/1f1e7-1f1f3.png?v8",
            bubble_tea: "unicode/1f9cb.png?v8",
            bubbles: "unicode/1fae7.png?v8",
            bucket: "unicode/1faa3.png?v8",
            bug: "unicode/1f41b.png?v8",
            building_construction: "unicode/1f3d7.png?v8",
            bulb: "unicode/1f4a1.png?v8",
            bulgaria: "unicode/1f1e7-1f1ec.png?v8",
            bullettrain_front: "unicode/1f685.png?v8",
            bullettrain_side: "unicode/1f684.png?v8",
            burkina_faso: "unicode/1f1e7-1f1eb.png?v8",
            burrito: "unicode/1f32f.png?v8",
            burundi: "unicode/1f1e7-1f1ee.png?v8",
            bus: "unicode/1f68c.png?v8",
            business_suit_levitating: "unicode/1f574.png?v8",
            busstop: "unicode/1f68f.png?v8",
            bust_in_silhouette: "unicode/1f464.png?v8",
            busts_in_silhouette: "unicode/1f465.png?v8",
            butter: "unicode/1f9c8.png?v8",
            butterfly: "unicode/1f98b.png?v8",
            cactus: "unicode/1f335.png?v8",
            cake: "unicode/1f370.png?v8",
            calendar: "unicode/1f4c6.png?v8",
            call_me_hand: "unicode/1f919.png?v8",
            calling: "unicode/1f4f2.png?v8",
            cambodia: "unicode/1f1f0-1f1ed.png?v8",
            camel: "unicode/1f42b.png?v8",
            camera: "unicode/1f4f7.png?v8",
            camera_flash: "unicode/1f4f8.png?v8",
            cameroon: "unicode/1f1e8-1f1f2.png?v8",
            camping: "unicode/1f3d5.png?v8",
            canada: "unicode/1f1e8-1f1e6.png?v8",
            canary_islands: "unicode/1f1ee-1f1e8.png?v8",
            cancer: "unicode/264b.png?v8",
            candle: "unicode/1f56f.png?v8",
            candy: "unicode/1f36c.png?v8",
            canned_food: "unicode/1f96b.png?v8",
            canoe: "unicode/1f6f6.png?v8",
            cape_verde: "unicode/1f1e8-1f1fb.png?v8",
            capital_abcd: "unicode/1f520.png?v8",
            capricorn: "unicode/2651.png?v8",
            car: "unicode/1f697.png?v8",
            card_file_box: "unicode/1f5c3.png?v8",
            card_index: "unicode/1f4c7.png?v8",
            card_index_dividers: "unicode/1f5c2.png?v8",
            caribbean_netherlands: "unicode/1f1e7-1f1f6.png?v8",
            carousel_horse: "unicode/1f3a0.png?v8",
            carpentry_saw: "unicode/1fa9a.png?v8",
            carrot: "unicode/1f955.png?v8",
            cartwheeling: "unicode/1f938.png?v8",
            cat: "unicode/1f431.png?v8",
            cat2: "unicode/1f408.png?v8",
            cayman_islands: "unicode/1f1f0-1f1fe.png?v8",
            cd: "unicode/1f4bf.png?v8",
            central_african_republic: "unicode/1f1e8-1f1eb.png?v8",
            ceuta_melilla: "unicode/1f1ea-1f1e6.png?v8",
            chad: "unicode/1f1f9-1f1e9.png?v8",
            chains: "unicode/26d3.png?v8",
            chair: "unicode/1fa91.png?v8",
            champagne: "unicode/1f37e.png?v8",
            chart: "unicode/1f4b9.png?v8",
            chart_with_downwards_trend: "unicode/1f4c9.png?v8",
            chart_with_upwards_trend: "unicode/1f4c8.png?v8",
            checkered_flag: "unicode/1f3c1.png?v8",
            cheese: "unicode/1f9c0.png?v8",
            cherries: "unicode/1f352.png?v8",
            cherry_blossom: "unicode/1f338.png?v8",
            chess_pawn: "unicode/265f.png?v8",
            chestnut: "unicode/1f330.png?v8",
            chicken: "unicode/1f414.png?v8",
            child: "unicode/1f9d2.png?v8",
            children_crossing: "unicode/1f6b8.png?v8",
            chile: "unicode/1f1e8-1f1f1.png?v8",
            chipmunk: "unicode/1f43f.png?v8",
            chocolate_bar: "unicode/1f36b.png?v8",
            chopsticks: "unicode/1f962.png?v8",
            christmas_island: "unicode/1f1e8-1f1fd.png?v8",
            christmas_tree: "unicode/1f384.png?v8",
            church: "unicode/26ea.png?v8",
            cinema: "unicode/1f3a6.png?v8",
            circus_tent: "unicode/1f3aa.png?v8",
            city_sunrise: "unicode/1f307.png?v8",
            city_sunset: "unicode/1f306.png?v8",
            cityscape: "unicode/1f3d9.png?v8",
            cl: "unicode/1f191.png?v8",
            clamp: "unicode/1f5dc.png?v8",
            clap: "unicode/1f44f.png?v8",
            clapper: "unicode/1f3ac.png?v8",
            classical_building: "unicode/1f3db.png?v8",
            climbing: "unicode/1f9d7.png?v8",
            climbing_man: "unicode/1f9d7-2642.png?v8",
            climbing_woman: "unicode/1f9d7-2640.png?v8",
            clinking_glasses: "unicode/1f942.png?v8",
            clipboard: "unicode/1f4cb.png?v8",
            clipperton_island: "unicode/1f1e8-1f1f5.png?v8",
            clock1: "unicode/1f550.png?v8",
            clock10: "unicode/1f559.png?v8",
            clock1030: "unicode/1f565.png?v8",
            clock11: "unicode/1f55a.png?v8",
            clock1130: "unicode/1f566.png?v8",
            clock12: "unicode/1f55b.png?v8",
            clock1230: "unicode/1f567.png?v8",
            clock130: "unicode/1f55c.png?v8",
            clock2: "unicode/1f551.png?v8",
            clock230: "unicode/1f55d.png?v8",
            clock3: "unicode/1f552.png?v8",
            clock330: "unicode/1f55e.png?v8",
            clock4: "unicode/1f553.png?v8",
            clock430: "unicode/1f55f.png?v8",
            clock5: "unicode/1f554.png?v8",
            clock530: "unicode/1f560.png?v8",
            clock6: "unicode/1f555.png?v8",
            clock630: "unicode/1f561.png?v8",
            clock7: "unicode/1f556.png?v8",
            clock730: "unicode/1f562.png?v8",
            clock8: "unicode/1f557.png?v8",
            clock830: "unicode/1f563.png?v8",
            clock9: "unicode/1f558.png?v8",
            clock930: "unicode/1f564.png?v8",
            closed_book: "unicode/1f4d5.png?v8",
            closed_lock_with_key: "unicode/1f510.png?v8",
            closed_umbrella: "unicode/1f302.png?v8",
            cloud: "unicode/2601.png?v8",
            cloud_with_lightning: "unicode/1f329.png?v8",
            cloud_with_lightning_and_rain: "unicode/26c8.png?v8",
            cloud_with_rain: "unicode/1f327.png?v8",
            cloud_with_snow: "unicode/1f328.png?v8",
            clown_face: "unicode/1f921.png?v8",
            clubs: "unicode/2663.png?v8",
            cn: "unicode/1f1e8-1f1f3.png?v8",
            coat: "unicode/1f9e5.png?v8",
            cockroach: "unicode/1fab3.png?v8",
            cocktail: "unicode/1f378.png?v8",
            coconut: "unicode/1f965.png?v8",
            cocos_islands: "unicode/1f1e8-1f1e8.png?v8",
            coffee: "unicode/2615.png?v8",
            coffin: "unicode/26b0.png?v8",
            coin: "unicode/1fa99.png?v8",
            cold_face: "unicode/1f976.png?v8",
            cold_sweat: "unicode/1f630.png?v8",
            collision: "unicode/1f4a5.png?v8",
            colombia: "unicode/1f1e8-1f1f4.png?v8",
            comet: "unicode/2604.png?v8",
            comoros: "unicode/1f1f0-1f1f2.png?v8",
            compass: "unicode/1f9ed.png?v8",
            computer: "unicode/1f4bb.png?v8",
            computer_mouse: "unicode/1f5b1.png?v8",
            confetti_ball: "unicode/1f38a.png?v8",
            confounded: "unicode/1f616.png?v8",
            confused: "unicode/1f615.png?v8",
            congo_brazzaville: "unicode/1f1e8-1f1ec.png?v8",
            congo_kinshasa: "unicode/1f1e8-1f1e9.png?v8",
            congratulations: "unicode/3297.png?v8",
            construction: "unicode/1f6a7.png?v8",
            construction_worker: "unicode/1f477.png?v8",
            construction_worker_man: "unicode/1f477-2642.png?v8",
            construction_worker_woman: "unicode/1f477-2640.png?v8",
            control_knobs: "unicode/1f39b.png?v8",
            convenience_store: "unicode/1f3ea.png?v8",
            cook: "unicode/1f9d1-1f373.png?v8",
            cook_islands: "unicode/1f1e8-1f1f0.png?v8",
            cookie: "unicode/1f36a.png?v8",
            cool: "unicode/1f192.png?v8",
            cop: "unicode/1f46e.png?v8",
            copilot: "copilot.png?v8",
            copyright: "unicode/00a9.png?v8",
            coral: "unicode/1fab8.png?v8",
            corn: "unicode/1f33d.png?v8",
            costa_rica: "unicode/1f1e8-1f1f7.png?v8",
            cote_divoire: "unicode/1f1e8-1f1ee.png?v8",
            couch_and_lamp: "unicode/1f6cb.png?v8",
            couple: "unicode/1f46b.png?v8",
            couple_with_heart: "unicode/1f491.png?v8",
            couple_with_heart_man_man: "unicode/1f468-2764-1f468.png?v8",
            couple_with_heart_woman_man: "unicode/1f469-2764-1f468.png?v8",
            couple_with_heart_woman_woman: "unicode/1f469-2764-1f469.png?v8",
            couplekiss: "unicode/1f48f.png?v8",
            couplekiss_man_man: "unicode/1f468-2764-1f48b-1f468.png?v8",
            couplekiss_man_woman: "unicode/1f469-2764-1f48b-1f468.png?v8",
            couplekiss_woman_woman: "unicode/1f469-2764-1f48b-1f469.png?v8",
            cow: "unicode/1f42e.png?v8",
            cow2: "unicode/1f404.png?v8",
            cowboy_hat_face: "unicode/1f920.png?v8",
            crab: "unicode/1f980.png?v8",
            crayon: "unicode/1f58d.png?v8",
            credit_card: "unicode/1f4b3.png?v8",
            crescent_moon: "unicode/1f319.png?v8",
            cricket: "unicode/1f997.png?v8",
            cricket_game: "unicode/1f3cf.png?v8",
            croatia: "unicode/1f1ed-1f1f7.png?v8",
            crocodile: "unicode/1f40a.png?v8",
            croissant: "unicode/1f950.png?v8",
            crossed_fingers: "unicode/1f91e.png?v8",
            crossed_flags: "unicode/1f38c.png?v8",
            crossed_swords: "unicode/2694.png?v8",
            crown: "unicode/1f451.png?v8",
            crutch: "unicode/1fa7c.png?v8",
            cry: "unicode/1f622.png?v8",
            crying_cat_face: "unicode/1f63f.png?v8",
            crystal_ball: "unicode/1f52e.png?v8",
            cuba: "unicode/1f1e8-1f1fa.png?v8",
            cucumber: "unicode/1f952.png?v8",
            cup_with_straw: "unicode/1f964.png?v8",
            cupcake: "unicode/1f9c1.png?v8",
            cupid: "unicode/1f498.png?v8",
            curacao: "unicode/1f1e8-1f1fc.png?v8",
            curling_stone: "unicode/1f94c.png?v8",
            curly_haired_man: "unicode/1f468-1f9b1.png?v8",
            curly_haired_woman: "unicode/1f469-1f9b1.png?v8",
            curly_loop: "unicode/27b0.png?v8",
            currency_exchange: "unicode/1f4b1.png?v8",
            curry: "unicode/1f35b.png?v8",
            cursing_face: "unicode/1f92c.png?v8",
            custard: "unicode/1f36e.png?v8",
            customs: "unicode/1f6c3.png?v8",
            cut_of_meat: "unicode/1f969.png?v8",
            cyclone: "unicode/1f300.png?v8",
            cyprus: "unicode/1f1e8-1f1fe.png?v8",
            czech_republic: "unicode/1f1e8-1f1ff.png?v8",
            dagger: "unicode/1f5e1.png?v8",
            dancer: "unicode/1f483.png?v8",
            dancers: "unicode/1f46f.png?v8",
            dancing_men: "unicode/1f46f-2642.png?v8",
            dancing_women: "unicode/1f46f-2640.png?v8",
            dango: "unicode/1f361.png?v8",
            dark_sunglasses: "unicode/1f576.png?v8",
            dart: "unicode/1f3af.png?v8",
            dash: "unicode/1f4a8.png?v8",
            date: "unicode/1f4c5.png?v8",
            de: "unicode/1f1e9-1f1ea.png?v8",
            deaf_man: "unicode/1f9cf-2642.png?v8",
            deaf_person: "unicode/1f9cf.png?v8",
            deaf_woman: "unicode/1f9cf-2640.png?v8",
            deciduous_tree: "unicode/1f333.png?v8",
            deer: "unicode/1f98c.png?v8",
            denmark: "unicode/1f1e9-1f1f0.png?v8",
            department_store: "unicode/1f3ec.png?v8",
            dependabot: "dependabot.png?v8",
            derelict_house: "unicode/1f3da.png?v8",
            desert: "unicode/1f3dc.png?v8",
            desert_island: "unicode/1f3dd.png?v8",
            desktop_computer: "unicode/1f5a5.png?v8",
            detective: "unicode/1f575.png?v8",
            diamond_shape_with_a_dot_inside: "unicode/1f4a0.png?v8",
            diamonds: "unicode/2666.png?v8",
            diego_garcia: "unicode/1f1e9-1f1ec.png?v8",
            disappointed: "unicode/1f61e.png?v8",
            disappointed_relieved: "unicode/1f625.png?v8",
            disguised_face: "unicode/1f978.png?v8",
            diving_mask: "unicode/1f93f.png?v8",
            diya_lamp: "unicode/1fa94.png?v8",
            dizzy: "unicode/1f4ab.png?v8",
            dizzy_face: "unicode/1f635.png?v8",
            djibouti: "unicode/1f1e9-1f1ef.png?v8",
            dna: "unicode/1f9ec.png?v8",
            do_not_litter: "unicode/1f6af.png?v8",
            dodo: "unicode/1f9a4.png?v8",
            dog: "unicode/1f436.png?v8",
            dog2: "unicode/1f415.png?v8",
            dollar: "unicode/1f4b5.png?v8",
            dolls: "unicode/1f38e.png?v8",
            dolphin: "unicode/1f42c.png?v8",
            dominica: "unicode/1f1e9-1f1f2.png?v8",
            dominican_republic: "unicode/1f1e9-1f1f4.png?v8",
            donkey: "unicode/1facf.png?v8",
            door: "unicode/1f6aa.png?v8",
            dotted_line_face: "unicode/1fae5.png?v8",
            doughnut: "unicode/1f369.png?v8",
            dove: "unicode/1f54a.png?v8",
            dragon: "unicode/1f409.png?v8",
            dragon_face: "unicode/1f432.png?v8",
            dress: "unicode/1f457.png?v8",
            dromedary_camel: "unicode/1f42a.png?v8",
            drooling_face: "unicode/1f924.png?v8",
            drop_of_blood: "unicode/1fa78.png?v8",
            droplet: "unicode/1f4a7.png?v8",
            drum: "unicode/1f941.png?v8",
            duck: "unicode/1f986.png?v8",
            dumpling: "unicode/1f95f.png?v8",
            dvd: "unicode/1f4c0.png?v8",
            "e-mail": "unicode/1f4e7.png?v8",
            eagle: "unicode/1f985.png?v8",
            ear: "unicode/1f442.png?v8",
            ear_of_rice: "unicode/1f33e.png?v8",
            ear_with_hearing_aid: "unicode/1f9bb.png?v8",
            earth_africa: "unicode/1f30d.png?v8",
            earth_americas: "unicode/1f30e.png?v8",
            earth_asia: "unicode/1f30f.png?v8",
            ecuador: "unicode/1f1ea-1f1e8.png?v8",
            egg: "unicode/1f95a.png?v8",
            eggplant: "unicode/1f346.png?v8",
            egypt: "unicode/1f1ea-1f1ec.png?v8",
            eight: "unicode/0038-20e3.png?v8",
            eight_pointed_black_star: "unicode/2734.png?v8",
            eight_spoked_asterisk: "unicode/2733.png?v8",
            eject_button: "unicode/23cf.png?v8",
            el_salvador: "unicode/1f1f8-1f1fb.png?v8",
            electric_plug: "unicode/1f50c.png?v8",
            electron: "electron.png?v8",
            elephant: "unicode/1f418.png?v8",
            elevator: "unicode/1f6d7.png?v8",
            elf: "unicode/1f9dd.png?v8",
            elf_man: "unicode/1f9dd-2642.png?v8",
            elf_woman: "unicode/1f9dd-2640.png?v8",
            email: "unicode/1f4e7.png?v8",
            empty_nest: "unicode/1fab9.png?v8",
            end: "unicode/1f51a.png?v8",
            england: "unicode/1f3f4-e0067-e0062-e0065-e006e-e0067-e007f.png?v8",
            envelope: "unicode/2709.png?v8",
            envelope_with_arrow: "unicode/1f4e9.png?v8",
            equatorial_guinea: "unicode/1f1ec-1f1f6.png?v8",
            eritrea: "unicode/1f1ea-1f1f7.png?v8",
            es: "unicode/1f1ea-1f1f8.png?v8",
            estonia: "unicode/1f1ea-1f1ea.png?v8",
            ethiopia: "unicode/1f1ea-1f1f9.png?v8",
            eu: "unicode/1f1ea-1f1fa.png?v8",
            euro: "unicode/1f4b6.png?v8",
            european_castle: "unicode/1f3f0.png?v8",
            european_post_office: "unicode/1f3e4.png?v8",
            european_union: "unicode/1f1ea-1f1fa.png?v8",
            evergreen_tree: "unicode/1f332.png?v8",
            exclamation: "unicode/2757.png?v8",
            exploding_head: "unicode/1f92f.png?v8",
            expressionless: "unicode/1f611.png?v8",
            eye: "unicode/1f441.png?v8",
            eye_speech_bubble: "unicode/1f441-1f5e8.png?v8",
            eyeglasses: "unicode/1f453.png?v8",
            eyes: "unicode/1f440.png?v8",
            face_exhaling: "unicode/1f62e-1f4a8.png?v8",
            face_holding_back_tears: "unicode/1f979.png?v8",
            face_in_clouds: "unicode/1f636-1f32b.png?v8",
            face_with_diagonal_mouth: "unicode/1fae4.png?v8",
            face_with_head_bandage: "unicode/1f915.png?v8",
            face_with_open_eyes_and_hand_over_mouth: "unicode/1fae2.png?v8",
            face_with_peeking_eye: "unicode/1fae3.png?v8",
            face_with_spiral_eyes: "unicode/1f635-1f4ab.png?v8",
            face_with_thermometer: "unicode/1f912.png?v8",
            facepalm: "unicode/1f926.png?v8",
            facepunch: "unicode/1f44a.png?v8",
            factory: "unicode/1f3ed.png?v8",
            factory_worker: "unicode/1f9d1-1f3ed.png?v8",
            fairy: "unicode/1f9da.png?v8",
            fairy_man: "unicode/1f9da-2642.png?v8",
            fairy_woman: "unicode/1f9da-2640.png?v8",
            falafel: "unicode/1f9c6.png?v8",
            falkland_islands: "unicode/1f1eb-1f1f0.png?v8",
            fallen_leaf: "unicode/1f342.png?v8",
            family: "unicode/1f46a.png?v8",
            family_man_boy: "unicode/1f468-1f466.png?v8",
            family_man_boy_boy: "unicode/1f468-1f466-1f466.png?v8",
            family_man_girl: "unicode/1f468-1f467.png?v8",
            family_man_girl_boy: "unicode/1f468-1f467-1f466.png?v8",
            family_man_girl_girl: "unicode/1f468-1f467-1f467.png?v8",
            family_man_man_boy: "unicode/1f468-1f468-1f466.png?v8",
            family_man_man_boy_boy: "unicode/1f468-1f468-1f466-1f466.png?v8",
            family_man_man_girl: "unicode/1f468-1f468-1f467.png?v8",
            family_man_man_girl_boy: "unicode/1f468-1f468-1f467-1f466.png?v8",
            family_man_man_girl_girl: "unicode/1f468-1f468-1f467-1f467.png?v8",
            family_man_woman_boy: "unicode/1f468-1f469-1f466.png?v8",
            family_man_woman_boy_boy: "unicode/1f468-1f469-1f466-1f466.png?v8",
            family_man_woman_girl: "unicode/1f468-1f469-1f467.png?v8",
            family_man_woman_girl_boy: "unicode/1f468-1f469-1f467-1f466.png?v8",
            family_man_woman_girl_girl: "unicode/1f468-1f469-1f467-1f467.png?v8",
            family_woman_boy: "unicode/1f469-1f466.png?v8",
            family_woman_boy_boy: "unicode/1f469-1f466-1f466.png?v8",
            family_woman_girl: "unicode/1f469-1f467.png?v8",
            family_woman_girl_boy: "unicode/1f469-1f467-1f466.png?v8",
            family_woman_girl_girl: "unicode/1f469-1f467-1f467.png?v8",
            family_woman_woman_boy: "unicode/1f469-1f469-1f466.png?v8",
            family_woman_woman_boy_boy: "unicode/1f469-1f469-1f466-1f466.png?v8",
            family_woman_woman_girl: "unicode/1f469-1f469-1f467.png?v8",
            family_woman_woman_girl_boy: "unicode/1f469-1f469-1f467-1f466.png?v8",
            family_woman_woman_girl_girl: "unicode/1f469-1f469-1f467-1f467.png?v8",
            farmer: "unicode/1f9d1-1f33e.png?v8",
            faroe_islands: "unicode/1f1eb-1f1f4.png?v8",
            fast_forward: "unicode/23e9.png?v8",
            fax: "unicode/1f4e0.png?v8",
            fearful: "unicode/1f628.png?v8",
            feather: "unicode/1fab6.png?v8",
            feelsgood: "feelsgood.png?v8",
            feet: "unicode/1f43e.png?v8",
            female_detective: "unicode/1f575-2640.png?v8",
            female_sign: "unicode/2640.png?v8",
            ferris_wheel: "unicode/1f3a1.png?v8",
            ferry: "unicode/26f4.png?v8",
            field_hockey: "unicode/1f3d1.png?v8",
            fiji: "unicode/1f1eb-1f1ef.png?v8",
            file_cabinet: "unicode/1f5c4.png?v8",
            file_folder: "unicode/1f4c1.png?v8",
            film_projector: "unicode/1f4fd.png?v8",
            film_strip: "unicode/1f39e.png?v8",
            finland: "unicode/1f1eb-1f1ee.png?v8",
            finnadie: "finnadie.png?v8",
            fire: "unicode/1f525.png?v8",
            fire_engine: "unicode/1f692.png?v8",
            fire_extinguisher: "unicode/1f9ef.png?v8",
            firecracker: "unicode/1f9e8.png?v8",
            firefighter: "unicode/1f9d1-1f692.png?v8",
            fireworks: "unicode/1f386.png?v8",
            first_quarter_moon: "unicode/1f313.png?v8",
            first_quarter_moon_with_face: "unicode/1f31b.png?v8",
            fish: "unicode/1f41f.png?v8",
            fish_cake: "unicode/1f365.png?v8",
            fishing_pole_and_fish: "unicode/1f3a3.png?v8",
            fishsticks: "fishsticks.png?v8",
            fist: "unicode/270a.png?v8",
            fist_left: "unicode/1f91b.png?v8",
            fist_oncoming: "unicode/1f44a.png?v8",
            fist_raised: "unicode/270a.png?v8",
            fist_right: "unicode/1f91c.png?v8",
            five: "unicode/0035-20e3.png?v8",
            flags: "unicode/1f38f.png?v8",
            flamingo: "unicode/1f9a9.png?v8",
            flashlight: "unicode/1f526.png?v8",
            flat_shoe: "unicode/1f97f.png?v8",
            flatbread: "unicode/1fad3.png?v8",
            fleur_de_lis: "unicode/269c.png?v8",
            flight_arrival: "unicode/1f6ec.png?v8",
            flight_departure: "unicode/1f6eb.png?v8",
            flipper: "unicode/1f42c.png?v8",
            floppy_disk: "unicode/1f4be.png?v8",
            flower_playing_cards: "unicode/1f3b4.png?v8",
            flushed: "unicode/1f633.png?v8",
            flute: "unicode/1fa88.png?v8",
            fly: "unicode/1fab0.png?v8",
            flying_disc: "unicode/1f94f.png?v8",
            flying_saucer: "unicode/1f6f8.png?v8",
            fog: "unicode/1f32b.png?v8",
            foggy: "unicode/1f301.png?v8",
            folding_hand_fan: "unicode/1faad.png?v8",
            fondue: "unicode/1fad5.png?v8",
            foot: "unicode/1f9b6.png?v8",
            football: "unicode/1f3c8.png?v8",
            footprints: "unicode/1f463.png?v8",
            fork_and_knife: "unicode/1f374.png?v8",
            fortune_cookie: "unicode/1f960.png?v8",
            fountain: "unicode/26f2.png?v8",
            fountain_pen: "unicode/1f58b.png?v8",
            four: "unicode/0034-20e3.png?v8",
            four_leaf_clover: "unicode/1f340.png?v8",
            fox_face: "unicode/1f98a.png?v8",
            fr: "unicode/1f1eb-1f1f7.png?v8",
            framed_picture: "unicode/1f5bc.png?v8",
            free: "unicode/1f193.png?v8",
            french_guiana: "unicode/1f1ec-1f1eb.png?v8",
            french_polynesia: "unicode/1f1f5-1f1eb.png?v8",
            french_southern_territories: "unicode/1f1f9-1f1eb.png?v8",
            fried_egg: "unicode/1f373.png?v8",
            fried_shrimp: "unicode/1f364.png?v8",
            fries: "unicode/1f35f.png?v8",
            frog: "unicode/1f438.png?v8",
            frowning: "unicode/1f626.png?v8",
            frowning_face: "unicode/2639.png?v8",
            frowning_man: "unicode/1f64d-2642.png?v8",
            frowning_person: "unicode/1f64d.png?v8",
            frowning_woman: "unicode/1f64d-2640.png?v8",
            fu: "unicode/1f595.png?v8",
            fuelpump: "unicode/26fd.png?v8",
            full_moon: "unicode/1f315.png?v8",
            full_moon_with_face: "unicode/1f31d.png?v8",
            funeral_urn: "unicode/26b1.png?v8",
            gabon: "unicode/1f1ec-1f1e6.png?v8",
            gambia: "unicode/1f1ec-1f1f2.png?v8",
            game_die: "unicode/1f3b2.png?v8",
            garlic: "unicode/1f9c4.png?v8",
            gb: "unicode/1f1ec-1f1e7.png?v8",
            gear: "unicode/2699.png?v8",
            gem: "unicode/1f48e.png?v8",
            gemini: "unicode/264a.png?v8",
            genie: "unicode/1f9de.png?v8",
            genie_man: "unicode/1f9de-2642.png?v8",
            genie_woman: "unicode/1f9de-2640.png?v8",
            georgia: "unicode/1f1ec-1f1ea.png?v8",
            ghana: "unicode/1f1ec-1f1ed.png?v8",
            ghost: "unicode/1f47b.png?v8",
            gibraltar: "unicode/1f1ec-1f1ee.png?v8",
            gift: "unicode/1f381.png?v8",
            gift_heart: "unicode/1f49d.png?v8",
            ginger_root: "unicode/1fada.png?v8",
            giraffe: "unicode/1f992.png?v8",
            girl: "unicode/1f467.png?v8",
            globe_with_meridians: "unicode/1f310.png?v8",
            gloves: "unicode/1f9e4.png?v8",
            goal_net: "unicode/1f945.png?v8",
            goat: "unicode/1f410.png?v8",
            goberserk: "goberserk.png?v8",
            godmode: "godmode.png?v8",
            goggles: "unicode/1f97d.png?v8",
            golf: "unicode/26f3.png?v8",
            golfing: "unicode/1f3cc.png?v8",
            golfing_man: "unicode/1f3cc-2642.png?v8",
            golfing_woman: "unicode/1f3cc-2640.png?v8",
            goose: "unicode/1fabf.png?v8",
            gorilla: "unicode/1f98d.png?v8",
            grapes: "unicode/1f347.png?v8",
            greece: "unicode/1f1ec-1f1f7.png?v8",
            green_apple: "unicode/1f34f.png?v8",
            green_book: "unicode/1f4d7.png?v8",
            green_circle: "unicode/1f7e2.png?v8",
            green_heart: "unicode/1f49a.png?v8",
            green_salad: "unicode/1f957.png?v8",
            green_square: "unicode/1f7e9.png?v8",
            greenland: "unicode/1f1ec-1f1f1.png?v8",
            grenada: "unicode/1f1ec-1f1e9.png?v8",
            grey_exclamation: "unicode/2755.png?v8",
            grey_heart: "unicode/1fa76.png?v8",
            grey_question: "unicode/2754.png?v8",
            grimacing: "unicode/1f62c.png?v8",
            grin: "unicode/1f601.png?v8",
            grinning: "unicode/1f600.png?v8",
            guadeloupe: "unicode/1f1ec-1f1f5.png?v8",
            guam: "unicode/1f1ec-1f1fa.png?v8",
            guard: "unicode/1f482.png?v8",
            guardsman: "unicode/1f482-2642.png?v8",
            guardswoman: "unicode/1f482-2640.png?v8",
            guatemala: "unicode/1f1ec-1f1f9.png?v8",
            guernsey: "unicode/1f1ec-1f1ec.png?v8",
            guide_dog: "unicode/1f9ae.png?v8",
            guinea: "unicode/1f1ec-1f1f3.png?v8",
            guinea_bissau: "unicode/1f1ec-1f1fc.png?v8",
            guitar: "unicode/1f3b8.png?v8",
            gun: "unicode/1f52b.png?v8",
            guyana: "unicode/1f1ec-1f1fe.png?v8",
            hair_pick: "unicode/1faae.png?v8",
            haircut: "unicode/1f487.png?v8",
            haircut_man: "unicode/1f487-2642.png?v8",
            haircut_woman: "unicode/1f487-2640.png?v8",
            haiti: "unicode/1f1ed-1f1f9.png?v8",
            hamburger: "unicode/1f354.png?v8",
            hammer: "unicode/1f528.png?v8",
            hammer_and_pick: "unicode/2692.png?v8",
            hammer_and_wrench: "unicode/1f6e0.png?v8",
            hamsa: "unicode/1faac.png?v8",
            hamster: "unicode/1f439.png?v8",
            hand: "unicode/270b.png?v8",
            hand_over_mouth: "unicode/1f92d.png?v8",
            hand_with_index_finger_and_thumb_crossed: "unicode/1faf0.png?v8",
            handbag: "unicode/1f45c.png?v8",
            handball_person: "unicode/1f93e.png?v8",
            handshake: "unicode/1f91d.png?v8",
            hankey: "unicode/1f4a9.png?v8",
            hash: "unicode/0023-20e3.png?v8",
            hatched_chick: "unicode/1f425.png?v8",
            hatching_chick: "unicode/1f423.png?v8",
            headphones: "unicode/1f3a7.png?v8",
            headstone: "unicode/1faa6.png?v8",
            health_worker: "unicode/1f9d1-2695.png?v8",
            hear_no_evil: "unicode/1f649.png?v8",
            heard_mcdonald_islands: "unicode/1f1ed-1f1f2.png?v8",
            heart: "unicode/2764.png?v8",
            heart_decoration: "unicode/1f49f.png?v8",
            heart_eyes: "unicode/1f60d.png?v8",
            heart_eyes_cat: "unicode/1f63b.png?v8",
            heart_hands: "unicode/1faf6.png?v8",
            heart_on_fire: "unicode/2764-1f525.png?v8",
            heartbeat: "unicode/1f493.png?v8",
            heartpulse: "unicode/1f497.png?v8",
            hearts: "unicode/2665.png?v8",
            heavy_check_mark: "unicode/2714.png?v8",
            heavy_division_sign: "unicode/2797.png?v8",
            heavy_dollar_sign: "unicode/1f4b2.png?v8",
            heavy_equals_sign: "unicode/1f7f0.png?v8",
            heavy_exclamation_mark: "unicode/2757.png?v8",
            heavy_heart_exclamation: "unicode/2763.png?v8",
            heavy_minus_sign: "unicode/2796.png?v8",
            heavy_multiplication_x: "unicode/2716.png?v8",
            heavy_plus_sign: "unicode/2795.png?v8",
            hedgehog: "unicode/1f994.png?v8",
            helicopter: "unicode/1f681.png?v8",
            herb: "unicode/1f33f.png?v8",
            hibiscus: "unicode/1f33a.png?v8",
            high_brightness: "unicode/1f506.png?v8",
            high_heel: "unicode/1f460.png?v8",
            hiking_boot: "unicode/1f97e.png?v8",
            hindu_temple: "unicode/1f6d5.png?v8",
            hippopotamus: "unicode/1f99b.png?v8",
            hocho: "unicode/1f52a.png?v8",
            hole: "unicode/1f573.png?v8",
            honduras: "unicode/1f1ed-1f1f3.png?v8",
            honey_pot: "unicode/1f36f.png?v8",
            honeybee: "unicode/1f41d.png?v8",
            hong_kong: "unicode/1f1ed-1f1f0.png?v8",
            hook: "unicode/1fa9d.png?v8",
            horse: "unicode/1f434.png?v8",
            horse_racing: "unicode/1f3c7.png?v8",
            hospital: "unicode/1f3e5.png?v8",
            hot_face: "unicode/1f975.png?v8",
            hot_pepper: "unicode/1f336.png?v8",
            hotdog: "unicode/1f32d.png?v8",
            hotel: "unicode/1f3e8.png?v8",
            hotsprings: "unicode/2668.png?v8",
            hourglass: "unicode/231b.png?v8",
            hourglass_flowing_sand: "unicode/23f3.png?v8",
            house: "unicode/1f3e0.png?v8",
            house_with_garden: "unicode/1f3e1.png?v8",
            houses: "unicode/1f3d8.png?v8",
            hugs: "unicode/1f917.png?v8",
            hungary: "unicode/1f1ed-1f1fa.png?v8",
            hurtrealbad: "hurtrealbad.png?v8",
            hushed: "unicode/1f62f.png?v8",
            hut: "unicode/1f6d6.png?v8",
            hyacinth: "unicode/1fabb.png?v8",
            ice_cream: "unicode/1f368.png?v8",
            ice_cube: "unicode/1f9ca.png?v8",
            ice_hockey: "unicode/1f3d2.png?v8",
            ice_skate: "unicode/26f8.png?v8",
            icecream: "unicode/1f366.png?v8",
            iceland: "unicode/1f1ee-1f1f8.png?v8",
            id: "unicode/1f194.png?v8",
            identification_card: "unicode/1faaa.png?v8",
            ideograph_advantage: "unicode/1f250.png?v8",
            imp: "unicode/1f47f.png?v8",
            inbox_tray: "unicode/1f4e5.png?v8",
            incoming_envelope: "unicode/1f4e8.png?v8",
            index_pointing_at_the_viewer: "unicode/1faf5.png?v8",
            india: "unicode/1f1ee-1f1f3.png?v8",
            indonesia: "unicode/1f1ee-1f1e9.png?v8",
            infinity: "unicode/267e.png?v8",
            information_desk_person: "unicode/1f481.png?v8",
            information_source: "unicode/2139.png?v8",
            innocent: "unicode/1f607.png?v8",
            interrobang: "unicode/2049.png?v8",
            iphone: "unicode/1f4f1.png?v8",
            iran: "unicode/1f1ee-1f1f7.png?v8",
            iraq: "unicode/1f1ee-1f1f6.png?v8",
            ireland: "unicode/1f1ee-1f1ea.png?v8",
            isle_of_man: "unicode/1f1ee-1f1f2.png?v8",
            israel: "unicode/1f1ee-1f1f1.png?v8",
            it: "unicode/1f1ee-1f1f9.png?v8",
            izakaya_lantern: "unicode/1f3ee.png?v8",
            jack_o_lantern: "unicode/1f383.png?v8",
            jamaica: "unicode/1f1ef-1f1f2.png?v8",
            japan: "unicode/1f5fe.png?v8",
            japanese_castle: "unicode/1f3ef.png?v8",
            japanese_goblin: "unicode/1f47a.png?v8",
            japanese_ogre: "unicode/1f479.png?v8",
            jar: "unicode/1fad9.png?v8",
            jeans: "unicode/1f456.png?v8",
            jellyfish: "unicode/1fabc.png?v8",
            jersey: "unicode/1f1ef-1f1ea.png?v8",
            jigsaw: "unicode/1f9e9.png?v8",
            jordan: "unicode/1f1ef-1f1f4.png?v8",
            joy: "unicode/1f602.png?v8",
            joy_cat: "unicode/1f639.png?v8",
            joystick: "unicode/1f579.png?v8",
            jp: "unicode/1f1ef-1f1f5.png?v8",
            judge: "unicode/1f9d1-2696.png?v8",
            juggling_person: "unicode/1f939.png?v8",
            kaaba: "unicode/1f54b.png?v8",
            kangaroo: "unicode/1f998.png?v8",
            kazakhstan: "unicode/1f1f0-1f1ff.png?v8",
            kenya: "unicode/1f1f0-1f1ea.png?v8",
            key: "unicode/1f511.png?v8",
            keyboard: "unicode/2328.png?v8",
            keycap_ten: "unicode/1f51f.png?v8",
            khanda: "unicode/1faaf.png?v8",
            kick_scooter: "unicode/1f6f4.png?v8",
            kimono: "unicode/1f458.png?v8",
            kiribati: "unicode/1f1f0-1f1ee.png?v8",
            kiss: "unicode/1f48b.png?v8",
            kissing: "unicode/1f617.png?v8",
            kissing_cat: "unicode/1f63d.png?v8",
            kissing_closed_eyes: "unicode/1f61a.png?v8",
            kissing_heart: "unicode/1f618.png?v8",
            kissing_smiling_eyes: "unicode/1f619.png?v8",
            kite: "unicode/1fa81.png?v8",
            kiwi_fruit: "unicode/1f95d.png?v8",
            kneeling_man: "unicode/1f9ce-2642.png?v8",
            kneeling_person: "unicode/1f9ce.png?v8",
            kneeling_woman: "unicode/1f9ce-2640.png?v8",
            knife: "unicode/1f52a.png?v8",
            knot: "unicode/1faa2.png?v8",
            koala: "unicode/1f428.png?v8",
            koko: "unicode/1f201.png?v8",
            kosovo: "unicode/1f1fd-1f1f0.png?v8",
            kr: "unicode/1f1f0-1f1f7.png?v8",
            kuwait: "unicode/1f1f0-1f1fc.png?v8",
            kyrgyzstan: "unicode/1f1f0-1f1ec.png?v8",
            lab_coat: "unicode/1f97c.png?v8",
            label: "unicode/1f3f7.png?v8",
            lacrosse: "unicode/1f94d.png?v8",
            ladder: "unicode/1fa9c.png?v8",
            lady_beetle: "unicode/1f41e.png?v8",
            lantern: "unicode/1f3ee.png?v8",
            laos: "unicode/1f1f1-1f1e6.png?v8",
            large_blue_circle: "unicode/1f535.png?v8",
            large_blue_diamond: "unicode/1f537.png?v8",
            large_orange_diamond: "unicode/1f536.png?v8",
            last_quarter_moon: "unicode/1f317.png?v8",
            last_quarter_moon_with_face: "unicode/1f31c.png?v8",
            latin_cross: "unicode/271d.png?v8",
            latvia: "unicode/1f1f1-1f1fb.png?v8",
            laughing: "unicode/1f606.png?v8",
            leafy_green: "unicode/1f96c.png?v8",
            leaves: "unicode/1f343.png?v8",
            lebanon: "unicode/1f1f1-1f1e7.png?v8",
            ledger: "unicode/1f4d2.png?v8",
            left_luggage: "unicode/1f6c5.png?v8",
            left_right_arrow: "unicode/2194.png?v8",
            left_speech_bubble: "unicode/1f5e8.png?v8",
            leftwards_arrow_with_hook: "unicode/21a9.png?v8",
            leftwards_hand: "unicode/1faf2.png?v8",
            leftwards_pushing_hand: "unicode/1faf7.png?v8",
            leg: "unicode/1f9b5.png?v8",
            lemon: "unicode/1f34b.png?v8",
            leo: "unicode/264c.png?v8",
            leopard: "unicode/1f406.png?v8",
            lesotho: "unicode/1f1f1-1f1f8.png?v8",
            level_slider: "unicode/1f39a.png?v8",
            liberia: "unicode/1f1f1-1f1f7.png?v8",
            libra: "unicode/264e.png?v8",
            libya: "unicode/1f1f1-1f1fe.png?v8",
            liechtenstein: "unicode/1f1f1-1f1ee.png?v8",
            light_blue_heart: "unicode/1fa75.png?v8",
            light_rail: "unicode/1f688.png?v8",
            link: "unicode/1f517.png?v8",
            lion: "unicode/1f981.png?v8",
            lips: "unicode/1f444.png?v8",
            lipstick: "unicode/1f484.png?v8",
            lithuania: "unicode/1f1f1-1f1f9.png?v8",
            lizard: "unicode/1f98e.png?v8",
            llama: "unicode/1f999.png?v8",
            lobster: "unicode/1f99e.png?v8",
            lock: "unicode/1f512.png?v8",
            lock_with_ink_pen: "unicode/1f50f.png?v8",
            lollipop: "unicode/1f36d.png?v8",
            long_drum: "unicode/1fa98.png?v8",
            loop: "unicode/27bf.png?v8",
            lotion_bottle: "unicode/1f9f4.png?v8",
            lotus: "unicode/1fab7.png?v8",
            lotus_position: "unicode/1f9d8.png?v8",
            lotus_position_man: "unicode/1f9d8-2642.png?v8",
            lotus_position_woman: "unicode/1f9d8-2640.png?v8",
            loud_sound: "unicode/1f50a.png?v8",
            loudspeaker: "unicode/1f4e2.png?v8",
            love_hotel: "unicode/1f3e9.png?v8",
            love_letter: "unicode/1f48c.png?v8",
            love_you_gesture: "unicode/1f91f.png?v8",
            low_battery: "unicode/1faab.png?v8",
            low_brightness: "unicode/1f505.png?v8",
            luggage: "unicode/1f9f3.png?v8",
            lungs: "unicode/1fac1.png?v8",
            luxembourg: "unicode/1f1f1-1f1fa.png?v8",
            lying_face: "unicode/1f925.png?v8",
            m: "unicode/24c2.png?v8",
            macau: "unicode/1f1f2-1f1f4.png?v8",
            macedonia: "unicode/1f1f2-1f1f0.png?v8",
            madagascar: "unicode/1f1f2-1f1ec.png?v8",
            mag: "unicode/1f50d.png?v8",
            mag_right: "unicode/1f50e.png?v8",
            mage: "unicode/1f9d9.png?v8",
            mage_man: "unicode/1f9d9-2642.png?v8",
            mage_woman: "unicode/1f9d9-2640.png?v8",
            magic_wand: "unicode/1fa84.png?v8",
            magnet: "unicode/1f9f2.png?v8",
            mahjong: "unicode/1f004.png?v8",
            mailbox: "unicode/1f4eb.png?v8",
            mailbox_closed: "unicode/1f4ea.png?v8",
            mailbox_with_mail: "unicode/1f4ec.png?v8",
            mailbox_with_no_mail: "unicode/1f4ed.png?v8",
            malawi: "unicode/1f1f2-1f1fc.png?v8",
            malaysia: "unicode/1f1f2-1f1fe.png?v8",
            maldives: "unicode/1f1f2-1f1fb.png?v8",
            male_detective: "unicode/1f575-2642.png?v8",
            male_sign: "unicode/2642.png?v8",
            mali: "unicode/1f1f2-1f1f1.png?v8",
            malta: "unicode/1f1f2-1f1f9.png?v8",
            mammoth: "unicode/1f9a3.png?v8",
            man: "unicode/1f468.png?v8",
            man_artist: "unicode/1f468-1f3a8.png?v8",
            man_astronaut: "unicode/1f468-1f680.png?v8",
            man_beard: "unicode/1f9d4-2642.png?v8",
            man_cartwheeling: "unicode/1f938-2642.png?v8",
            man_cook: "unicode/1f468-1f373.png?v8",
            man_dancing: "unicode/1f57a.png?v8",
            man_facepalming: "unicode/1f926-2642.png?v8",
            man_factory_worker: "unicode/1f468-1f3ed.png?v8",
            man_farmer: "unicode/1f468-1f33e.png?v8",
            man_feeding_baby: "unicode/1f468-1f37c.png?v8",
            man_firefighter: "unicode/1f468-1f692.png?v8",
            man_health_worker: "unicode/1f468-2695.png?v8",
            man_in_manual_wheelchair: "unicode/1f468-1f9bd.png?v8",
            man_in_motorized_wheelchair: "unicode/1f468-1f9bc.png?v8",
            man_in_tuxedo: "unicode/1f935-2642.png?v8",
            man_judge: "unicode/1f468-2696.png?v8",
            man_juggling: "unicode/1f939-2642.png?v8",
            man_mechanic: "unicode/1f468-1f527.png?v8",
            man_office_worker: "unicode/1f468-1f4bc.png?v8",
            man_pilot: "unicode/1f468-2708.png?v8",
            man_playing_handball: "unicode/1f93e-2642.png?v8",
            man_playing_water_polo: "unicode/1f93d-2642.png?v8",
            man_scientist: "unicode/1f468-1f52c.png?v8",
            man_shrugging: "unicode/1f937-2642.png?v8",
            man_singer: "unicode/1f468-1f3a4.png?v8",
            man_student: "unicode/1f468-1f393.png?v8",
            man_teacher: "unicode/1f468-1f3eb.png?v8",
            man_technologist: "unicode/1f468-1f4bb.png?v8",
            man_with_gua_pi_mao: "unicode/1f472.png?v8",
            man_with_probing_cane: "unicode/1f468-1f9af.png?v8",
            man_with_turban: "unicode/1f473-2642.png?v8",
            man_with_veil: "unicode/1f470-2642.png?v8",
            mandarin: "unicode/1f34a.png?v8",
            mango: "unicode/1f96d.png?v8",
            mans_shoe: "unicode/1f45e.png?v8",
            mantelpiece_clock: "unicode/1f570.png?v8",
            manual_wheelchair: "unicode/1f9bd.png?v8",
            maple_leaf: "unicode/1f341.png?v8",
            maracas: "unicode/1fa87.png?v8",
            marshall_islands: "unicode/1f1f2-1f1ed.png?v8",
            martial_arts_uniform: "unicode/1f94b.png?v8",
            martinique: "unicode/1f1f2-1f1f6.png?v8",
            mask: "unicode/1f637.png?v8",
            massage: "unicode/1f486.png?v8",
            massage_man: "unicode/1f486-2642.png?v8",
            massage_woman: "unicode/1f486-2640.png?v8",
            mate: "unicode/1f9c9.png?v8",
            mauritania: "unicode/1f1f2-1f1f7.png?v8",
            mauritius: "unicode/1f1f2-1f1fa.png?v8",
            mayotte: "unicode/1f1fe-1f1f9.png?v8",
            meat_on_bone: "unicode/1f356.png?v8",
            mechanic: "unicode/1f9d1-1f527.png?v8",
            mechanical_arm: "unicode/1f9be.png?v8",
            mechanical_leg: "unicode/1f9bf.png?v8",
            medal_military: "unicode/1f396.png?v8",
            medal_sports: "unicode/1f3c5.png?v8",
            medical_symbol: "unicode/2695.png?v8",
            mega: "unicode/1f4e3.png?v8",
            melon: "unicode/1f348.png?v8",
            melting_face: "unicode/1fae0.png?v8",
            memo: "unicode/1f4dd.png?v8",
            men_wrestling: "unicode/1f93c-2642.png?v8",
            mending_heart: "unicode/2764-1fa79.png?v8",
            menorah: "unicode/1f54e.png?v8",
            mens: "unicode/1f6b9.png?v8",
            mermaid: "unicode/1f9dc-2640.png?v8",
            merman: "unicode/1f9dc-2642.png?v8",
            merperson: "unicode/1f9dc.png?v8",
            metal: "unicode/1f918.png?v8",
            metro: "unicode/1f687.png?v8",
            mexico: "unicode/1f1f2-1f1fd.png?v8",
            microbe: "unicode/1f9a0.png?v8",
            micronesia: "unicode/1f1eb-1f1f2.png?v8",
            microphone: "unicode/1f3a4.png?v8",
            microscope: "unicode/1f52c.png?v8",
            middle_finger: "unicode/1f595.png?v8",
            military_helmet: "unicode/1fa96.png?v8",
            milk_glass: "unicode/1f95b.png?v8",
            milky_way: "unicode/1f30c.png?v8",
            minibus: "unicode/1f690.png?v8",
            minidisc: "unicode/1f4bd.png?v8",
            mirror: "unicode/1fa9e.png?v8",
            mirror_ball: "unicode/1faa9.png?v8",
            mobile_phone_off: "unicode/1f4f4.png?v8",
            moldova: "unicode/1f1f2-1f1e9.png?v8",
            monaco: "unicode/1f1f2-1f1e8.png?v8",
            money_mouth_face: "unicode/1f911.png?v8",
            money_with_wings: "unicode/1f4b8.png?v8",
            moneybag: "unicode/1f4b0.png?v8",
            mongolia: "unicode/1f1f2-1f1f3.png?v8",
            monkey: "unicode/1f412.png?v8",
            monkey_face: "unicode/1f435.png?v8",
            monocle_face: "unicode/1f9d0.png?v8",
            monorail: "unicode/1f69d.png?v8",
            montenegro: "unicode/1f1f2-1f1ea.png?v8",
            montserrat: "unicode/1f1f2-1f1f8.png?v8",
            moon: "unicode/1f314.png?v8",
            moon_cake: "unicode/1f96e.png?v8",
            moose: "unicode/1face.png?v8",
            morocco: "unicode/1f1f2-1f1e6.png?v8",
            mortar_board: "unicode/1f393.png?v8",
            mosque: "unicode/1f54c.png?v8",
            mosquito: "unicode/1f99f.png?v8",
            motor_boat: "unicode/1f6e5.png?v8",
            motor_scooter: "unicode/1f6f5.png?v8",
            motorcycle: "unicode/1f3cd.png?v8",
            motorized_wheelchair: "unicode/1f9bc.png?v8",
            motorway: "unicode/1f6e3.png?v8",
            mount_fuji: "unicode/1f5fb.png?v8",
            mountain: "unicode/26f0.png?v8",
            mountain_bicyclist: "unicode/1f6b5.png?v8",
            mountain_biking_man: "unicode/1f6b5-2642.png?v8",
            mountain_biking_woman: "unicode/1f6b5-2640.png?v8",
            mountain_cableway: "unicode/1f6a0.png?v8",
            mountain_railway: "unicode/1f69e.png?v8",
            mountain_snow: "unicode/1f3d4.png?v8",
            mouse: "unicode/1f42d.png?v8",
            mouse2: "unicode/1f401.png?v8",
            mouse_trap: "unicode/1faa4.png?v8",
            movie_camera: "unicode/1f3a5.png?v8",
            moyai: "unicode/1f5ff.png?v8",
            mozambique: "unicode/1f1f2-1f1ff.png?v8",
            mrs_claus: "unicode/1f936.png?v8",
            muscle: "unicode/1f4aa.png?v8",
            mushroom: "unicode/1f344.png?v8",
            musical_keyboard: "unicode/1f3b9.png?v8",
            musical_note: "unicode/1f3b5.png?v8",
            musical_score: "unicode/1f3bc.png?v8",
            mute: "unicode/1f507.png?v8",
            mx_claus: "unicode/1f9d1-1f384.png?v8",
            myanmar: "unicode/1f1f2-1f1f2.png?v8",
            nail_care: "unicode/1f485.png?v8",
            name_badge: "unicode/1f4db.png?v8",
            namibia: "unicode/1f1f3-1f1e6.png?v8",
            national_park: "unicode/1f3de.png?v8",
            nauru: "unicode/1f1f3-1f1f7.png?v8",
            nauseated_face: "unicode/1f922.png?v8",
            nazar_amulet: "unicode/1f9ff.png?v8",
            neckbeard: "neckbeard.png?v8",
            necktie: "unicode/1f454.png?v8",
            negative_squared_cross_mark: "unicode/274e.png?v8",
            nepal: "unicode/1f1f3-1f1f5.png?v8",
            nerd_face: "unicode/1f913.png?v8",
            nest_with_eggs: "unicode/1faba.png?v8",
            nesting_dolls: "unicode/1fa86.png?v8",
            netherlands: "unicode/1f1f3-1f1f1.png?v8",
            neutral_face: "unicode/1f610.png?v8",
            new: "unicode/1f195.png?v8",
            new_caledonia: "unicode/1f1f3-1f1e8.png?v8",
            new_moon: "unicode/1f311.png?v8",
            new_moon_with_face: "unicode/1f31a.png?v8",
            new_zealand: "unicode/1f1f3-1f1ff.png?v8",
            newspaper: "unicode/1f4f0.png?v8",
            newspaper_roll: "unicode/1f5de.png?v8",
            next_track_button: "unicode/23ed.png?v8",
            ng: "unicode/1f196.png?v8",
            ng_man: "unicode/1f645-2642.png?v8",
            ng_woman: "unicode/1f645-2640.png?v8",
            nicaragua: "unicode/1f1f3-1f1ee.png?v8",
            niger: "unicode/1f1f3-1f1ea.png?v8",
            nigeria: "unicode/1f1f3-1f1ec.png?v8",
            night_with_stars: "unicode/1f303.png?v8",
            nine: "unicode/0039-20e3.png?v8",
            ninja: "unicode/1f977.png?v8",
            niue: "unicode/1f1f3-1f1fa.png?v8",
            no_bell: "unicode/1f515.png?v8",
            no_bicycles: "unicode/1f6b3.png?v8",
            no_entry: "unicode/26d4.png?v8",
            no_entry_sign: "unicode/1f6ab.png?v8",
            no_good: "unicode/1f645.png?v8",
            no_good_man: "unicode/1f645-2642.png?v8",
            no_good_woman: "unicode/1f645-2640.png?v8",
            no_mobile_phones: "unicode/1f4f5.png?v8",
            no_mouth: "unicode/1f636.png?v8",
            no_pedestrians: "unicode/1f6b7.png?v8",
            no_smoking: "unicode/1f6ad.png?v8",
            "non-potable_water": "unicode/1f6b1.png?v8",
            norfolk_island: "unicode/1f1f3-1f1eb.png?v8",
            north_korea: "unicode/1f1f0-1f1f5.png?v8",
            northern_mariana_islands: "unicode/1f1f2-1f1f5.png?v8",
            norway: "unicode/1f1f3-1f1f4.png?v8",
            nose: "unicode/1f443.png?v8",
            notebook: "unicode/1f4d3.png?v8",
            notebook_with_decorative_cover: "unicode/1f4d4.png?v8",
            notes: "unicode/1f3b6.png?v8",
            nut_and_bolt: "unicode/1f529.png?v8",
            o: "unicode/2b55.png?v8",
            o2: "unicode/1f17e.png?v8",
            ocean: "unicode/1f30a.png?v8",
            octocat: "octocat.png?v8",
            octopus: "unicode/1f419.png?v8",
            oden: "unicode/1f362.png?v8",
            office: "unicode/1f3e2.png?v8",
            office_worker: "unicode/1f9d1-1f4bc.png?v8",
            oil_drum: "unicode/1f6e2.png?v8",
            ok: "unicode/1f197.png?v8",
            ok_hand: "unicode/1f44c.png?v8",
            ok_man: "unicode/1f646-2642.png?v8",
            ok_person: "unicode/1f646.png?v8",
            ok_woman: "unicode/1f646-2640.png?v8",
            old_key: "unicode/1f5dd.png?v8",
            older_adult: "unicode/1f9d3.png?v8",
            older_man: "unicode/1f474.png?v8",
            older_woman: "unicode/1f475.png?v8",
            olive: "unicode/1fad2.png?v8",
            om: "unicode/1f549.png?v8",
            oman: "unicode/1f1f4-1f1f2.png?v8",
            on: "unicode/1f51b.png?v8",
            oncoming_automobile: "unicode/1f698.png?v8",
            oncoming_bus: "unicode/1f68d.png?v8",
            oncoming_police_car: "unicode/1f694.png?v8",
            oncoming_taxi: "unicode/1f696.png?v8",
            one: "unicode/0031-20e3.png?v8",
            one_piece_swimsuit: "unicode/1fa71.png?v8",
            onion: "unicode/1f9c5.png?v8",
            open_book: "unicode/1f4d6.png?v8",
            open_file_folder: "unicode/1f4c2.png?v8",
            open_hands: "unicode/1f450.png?v8",
            open_mouth: "unicode/1f62e.png?v8",
            open_umbrella: "unicode/2602.png?v8",
            ophiuchus: "unicode/26ce.png?v8",
            orange: "unicode/1f34a.png?v8",
            orange_book: "unicode/1f4d9.png?v8",
            orange_circle: "unicode/1f7e0.png?v8",
            orange_heart: "unicode/1f9e1.png?v8",
            orange_square: "unicode/1f7e7.png?v8",
            orangutan: "unicode/1f9a7.png?v8",
            orthodox_cross: "unicode/2626.png?v8",
            otter: "unicode/1f9a6.png?v8",
            outbox_tray: "unicode/1f4e4.png?v8",
            owl: "unicode/1f989.png?v8",
            ox: "unicode/1f402.png?v8",
            oyster: "unicode/1f9aa.png?v8",
            package: "unicode/1f4e6.png?v8",
            page_facing_up: "unicode/1f4c4.png?v8",
            page_with_curl: "unicode/1f4c3.png?v8",
            pager: "unicode/1f4df.png?v8",
            paintbrush: "unicode/1f58c.png?v8",
            pakistan: "unicode/1f1f5-1f1f0.png?v8",
            palau: "unicode/1f1f5-1f1fc.png?v8",
            palestinian_territories: "unicode/1f1f5-1f1f8.png?v8",
            palm_down_hand: "unicode/1faf3.png?v8",
            palm_tree: "unicode/1f334.png?v8",
            palm_up_hand: "unicode/1faf4.png?v8",
            palms_up_together: "unicode/1f932.png?v8",
            panama: "unicode/1f1f5-1f1e6.png?v8",
            pancakes: "unicode/1f95e.png?v8",
            panda_face: "unicode/1f43c.png?v8",
            paperclip: "unicode/1f4ce.png?v8",
            paperclips: "unicode/1f587.png?v8",
            papua_new_guinea: "unicode/1f1f5-1f1ec.png?v8",
            parachute: "unicode/1fa82.png?v8",
            paraguay: "unicode/1f1f5-1f1fe.png?v8",
            parasol_on_ground: "unicode/26f1.png?v8",
            parking: "unicode/1f17f.png?v8",
            parrot: "unicode/1f99c.png?v8",
            part_alternation_mark: "unicode/303d.png?v8",
            partly_sunny: "unicode/26c5.png?v8",
            partying_face: "unicode/1f973.png?v8",
            passenger_ship: "unicode/1f6f3.png?v8",
            passport_control: "unicode/1f6c2.png?v8",
            pause_button: "unicode/23f8.png?v8",
            paw_prints: "unicode/1f43e.png?v8",
            pea_pod: "unicode/1fadb.png?v8",
            peace_symbol: "unicode/262e.png?v8",
            peach: "unicode/1f351.png?v8",
            peacock: "unicode/1f99a.png?v8",
            peanuts: "unicode/1f95c.png?v8",
            pear: "unicode/1f350.png?v8",
            pen: "unicode/1f58a.png?v8",
            pencil: "unicode/1f4dd.png?v8",
            pencil2: "unicode/270f.png?v8",
            penguin: "unicode/1f427.png?v8",
            pensive: "unicode/1f614.png?v8",
            people_holding_hands: "unicode/1f9d1-1f91d-1f9d1.png?v8",
            people_hugging: "unicode/1fac2.png?v8",
            performing_arts: "unicode/1f3ad.png?v8",
            persevere: "unicode/1f623.png?v8",
            person_bald: "unicode/1f9d1-1f9b2.png?v8",
            person_curly_hair: "unicode/1f9d1-1f9b1.png?v8",
            person_feeding_baby: "unicode/1f9d1-1f37c.png?v8",
            person_fencing: "unicode/1f93a.png?v8",
            person_in_manual_wheelchair: "unicode/1f9d1-1f9bd.png?v8",
            person_in_motorized_wheelchair: "unicode/1f9d1-1f9bc.png?v8",
            person_in_tuxedo: "unicode/1f935.png?v8",
            person_red_hair: "unicode/1f9d1-1f9b0.png?v8",
            person_white_hair: "unicode/1f9d1-1f9b3.png?v8",
            person_with_crown: "unicode/1fac5.png?v8",
            person_with_probing_cane: "unicode/1f9d1-1f9af.png?v8",
            person_with_turban: "unicode/1f473.png?v8",
            person_with_veil: "unicode/1f470.png?v8",
            peru: "unicode/1f1f5-1f1ea.png?v8",
            petri_dish: "unicode/1f9eb.png?v8",
            philippines: "unicode/1f1f5-1f1ed.png?v8",
            phone: "unicode/260e.png?v8",
            pick: "unicode/26cf.png?v8",
            pickup_truck: "unicode/1f6fb.png?v8",
            pie: "unicode/1f967.png?v8",
            pig: "unicode/1f437.png?v8",
            pig2: "unicode/1f416.png?v8",
            pig_nose: "unicode/1f43d.png?v8",
            pill: "unicode/1f48a.png?v8",
            pilot: "unicode/1f9d1-2708.png?v8",
            pinata: "unicode/1fa85.png?v8",
            pinched_fingers: "unicode/1f90c.png?v8",
            pinching_hand: "unicode/1f90f.png?v8",
            pineapple: "unicode/1f34d.png?v8",
            ping_pong: "unicode/1f3d3.png?v8",
            pink_heart: "unicode/1fa77.png?v8",
            pirate_flag: "unicode/1f3f4-2620.png?v8",
            pisces: "unicode/2653.png?v8",
            pitcairn_islands: "unicode/1f1f5-1f1f3.png?v8",
            pizza: "unicode/1f355.png?v8",
            placard: "unicode/1faa7.png?v8",
            place_of_worship: "unicode/1f6d0.png?v8",
            plate_with_cutlery: "unicode/1f37d.png?v8",
            play_or_pause_button: "unicode/23ef.png?v8",
            playground_slide: "unicode/1f6dd.png?v8",
            pleading_face: "unicode/1f97a.png?v8",
            plunger: "unicode/1faa0.png?v8",
            point_down: "unicode/1f447.png?v8",
            point_left: "unicode/1f448.png?v8",
            point_right: "unicode/1f449.png?v8",
            point_up: "unicode/261d.png?v8",
            point_up_2: "unicode/1f446.png?v8",
            poland: "unicode/1f1f5-1f1f1.png?v8",
            polar_bear: "unicode/1f43b-2744.png?v8",
            police_car: "unicode/1f693.png?v8",
            police_officer: "unicode/1f46e.png?v8",
            policeman: "unicode/1f46e-2642.png?v8",
            policewoman: "unicode/1f46e-2640.png?v8",
            poodle: "unicode/1f429.png?v8",
            poop: "unicode/1f4a9.png?v8",
            popcorn: "unicode/1f37f.png?v8",
            portugal: "unicode/1f1f5-1f1f9.png?v8",
            post_office: "unicode/1f3e3.png?v8",
            postal_horn: "unicode/1f4ef.png?v8",
            postbox: "unicode/1f4ee.png?v8",
            potable_water: "unicode/1f6b0.png?v8",
            potato: "unicode/1f954.png?v8",
            potted_plant: "unicode/1fab4.png?v8",
            pouch: "unicode/1f45d.png?v8",
            poultry_leg: "unicode/1f357.png?v8",
            pound: "unicode/1f4b7.png?v8",
            pouring_liquid: "unicode/1fad7.png?v8",
            pout: "unicode/1f621.png?v8",
            pouting_cat: "unicode/1f63e.png?v8",
            pouting_face: "unicode/1f64e.png?v8",
            pouting_man: "unicode/1f64e-2642.png?v8",
            pouting_woman: "unicode/1f64e-2640.png?v8",
            pray: "unicode/1f64f.png?v8",
            prayer_beads: "unicode/1f4ff.png?v8",
            pregnant_man: "unicode/1fac3.png?v8",
            pregnant_person: "unicode/1fac4.png?v8",
            pregnant_woman: "unicode/1f930.png?v8",
            pretzel: "unicode/1f968.png?v8",
            previous_track_button: "unicode/23ee.png?v8",
            prince: "unicode/1f934.png?v8",
            princess: "unicode/1f478.png?v8",
            printer: "unicode/1f5a8.png?v8",
            probing_cane: "unicode/1f9af.png?v8",
            puerto_rico: "unicode/1f1f5-1f1f7.png?v8",
            punch: "unicode/1f44a.png?v8",
            purple_circle: "unicode/1f7e3.png?v8",
            purple_heart: "unicode/1f49c.png?v8",
            purple_square: "unicode/1f7ea.png?v8",
            purse: "unicode/1f45b.png?v8",
            pushpin: "unicode/1f4cc.png?v8",
            put_litter_in_its_place: "unicode/1f6ae.png?v8",
            qatar: "unicode/1f1f6-1f1e6.png?v8",
            question: "unicode/2753.png?v8",
            rabbit: "unicode/1f430.png?v8",
            rabbit2: "unicode/1f407.png?v8",
            raccoon: "unicode/1f99d.png?v8",
            racehorse: "unicode/1f40e.png?v8",
            racing_car: "unicode/1f3ce.png?v8",
            radio: "unicode/1f4fb.png?v8",
            radio_button: "unicode/1f518.png?v8",
            radioactive: "unicode/2622.png?v8",
            rage: "unicode/1f621.png?v8",
            rage1: "rage1.png?v8",
            rage2: "rage2.png?v8",
            rage3: "rage3.png?v8",
            rage4: "rage4.png?v8",
            railway_car: "unicode/1f683.png?v8",
            railway_track: "unicode/1f6e4.png?v8",
            rainbow: "unicode/1f308.png?v8",
            rainbow_flag: "unicode/1f3f3-1f308.png?v8",
            raised_back_of_hand: "unicode/1f91a.png?v8",
            raised_eyebrow: "unicode/1f928.png?v8",
            raised_hand: "unicode/270b.png?v8",
            raised_hand_with_fingers_splayed: "unicode/1f590.png?v8",
            raised_hands: "unicode/1f64c.png?v8",
            raising_hand: "unicode/1f64b.png?v8",
            raising_hand_man: "unicode/1f64b-2642.png?v8",
            raising_hand_woman: "unicode/1f64b-2640.png?v8",
            ram: "unicode/1f40f.png?v8",
            ramen: "unicode/1f35c.png?v8",
            rat: "unicode/1f400.png?v8",
            razor: "unicode/1fa92.png?v8",
            receipt: "unicode/1f9fe.png?v8",
            record_button: "unicode/23fa.png?v8",
            recycle: "unicode/267b.png?v8",
            red_car: "unicode/1f697.png?v8",
            red_circle: "unicode/1f534.png?v8",
            red_envelope: "unicode/1f9e7.png?v8",
            red_haired_man: "unicode/1f468-1f9b0.png?v8",
            red_haired_woman: "unicode/1f469-1f9b0.png?v8",
            red_square: "unicode/1f7e5.png?v8",
            registered: "unicode/00ae.png?v8",
            relaxed: "unicode/263a.png?v8",
            relieved: "unicode/1f60c.png?v8",
            reminder_ribbon: "unicode/1f397.png?v8",
            repeat: "unicode/1f501.png?v8",
            repeat_one: "unicode/1f502.png?v8",
            rescue_worker_helmet: "unicode/26d1.png?v8",
            restroom: "unicode/1f6bb.png?v8",
            reunion: "unicode/1f1f7-1f1ea.png?v8",
            revolving_hearts: "unicode/1f49e.png?v8",
            rewind: "unicode/23ea.png?v8",
            rhinoceros: "unicode/1f98f.png?v8",
            ribbon: "unicode/1f380.png?v8",
            rice: "unicode/1f35a.png?v8",
            rice_ball: "unicode/1f359.png?v8",
            rice_cracker: "unicode/1f358.png?v8",
            rice_scene: "unicode/1f391.png?v8",
            right_anger_bubble: "unicode/1f5ef.png?v8",
            rightwards_hand: "unicode/1faf1.png?v8",
            rightwards_pushing_hand: "unicode/1faf8.png?v8",
            ring: "unicode/1f48d.png?v8",
            ring_buoy: "unicode/1f6df.png?v8",
            ringed_planet: "unicode/1fa90.png?v8",
            robot: "unicode/1f916.png?v8",
            rock: "unicode/1faa8.png?v8",
            rocket: "unicode/1f680.png?v8",
            rofl: "unicode/1f923.png?v8",
            roll_eyes: "unicode/1f644.png?v8",
            roll_of_paper: "unicode/1f9fb.png?v8",
            roller_coaster: "unicode/1f3a2.png?v8",
            roller_skate: "unicode/1f6fc.png?v8",
            romania: "unicode/1f1f7-1f1f4.png?v8",
            rooster: "unicode/1f413.png?v8",
            rose: "unicode/1f339.png?v8",
            rosette: "unicode/1f3f5.png?v8",
            rotating_light: "unicode/1f6a8.png?v8",
            round_pushpin: "unicode/1f4cd.png?v8",
            rowboat: "unicode/1f6a3.png?v8",
            rowing_man: "unicode/1f6a3-2642.png?v8",
            rowing_woman: "unicode/1f6a3-2640.png?v8",
            ru: "unicode/1f1f7-1f1fa.png?v8",
            rugby_football: "unicode/1f3c9.png?v8",
            runner: "unicode/1f3c3.png?v8",
            running: "unicode/1f3c3.png?v8",
            running_man: "unicode/1f3c3-2642.png?v8",
            running_shirt_with_sash: "unicode/1f3bd.png?v8",
            running_woman: "unicode/1f3c3-2640.png?v8",
            rwanda: "unicode/1f1f7-1f1fc.png?v8",
            sa: "unicode/1f202.png?v8",
            safety_pin: "unicode/1f9f7.png?v8",
            safety_vest: "unicode/1f9ba.png?v8",
            sagittarius: "unicode/2650.png?v8",
            sailboat: "unicode/26f5.png?v8",
            sake: "unicode/1f376.png?v8",
            salt: "unicode/1f9c2.png?v8",
            saluting_face: "unicode/1fae1.png?v8",
            samoa: "unicode/1f1fc-1f1f8.png?v8",
            san_marino: "unicode/1f1f8-1f1f2.png?v8",
            sandal: "unicode/1f461.png?v8",
            sandwich: "unicode/1f96a.png?v8",
            santa: "unicode/1f385.png?v8",
            sao_tome_principe: "unicode/1f1f8-1f1f9.png?v8",
            sari: "unicode/1f97b.png?v8",
            sassy_man: "unicode/1f481-2642.png?v8",
            sassy_woman: "unicode/1f481-2640.png?v8",
            satellite: "unicode/1f4e1.png?v8",
            satisfied: "unicode/1f606.png?v8",
            saudi_arabia: "unicode/1f1f8-1f1e6.png?v8",
            sauna_man: "unicode/1f9d6-2642.png?v8",
            sauna_person: "unicode/1f9d6.png?v8",
            sauna_woman: "unicode/1f9d6-2640.png?v8",
            sauropod: "unicode/1f995.png?v8",
            saxophone: "unicode/1f3b7.png?v8",
            scarf: "unicode/1f9e3.png?v8",
            school: "unicode/1f3eb.png?v8",
            school_satchel: "unicode/1f392.png?v8",
            scientist: "unicode/1f9d1-1f52c.png?v8",
            scissors: "unicode/2702.png?v8",
            scorpion: "unicode/1f982.png?v8",
            scorpius: "unicode/264f.png?v8",
            scotland: "unicode/1f3f4-e0067-e0062-e0073-e0063-e0074-e007f.png?v8",
            scream: "unicode/1f631.png?v8",
            scream_cat: "unicode/1f640.png?v8",
            screwdriver: "unicode/1fa9b.png?v8",
            scroll: "unicode/1f4dc.png?v8",
            seal: "unicode/1f9ad.png?v8",
            seat: "unicode/1f4ba.png?v8",
            secret: "unicode/3299.png?v8",
            see_no_evil: "unicode/1f648.png?v8",
            seedling: "unicode/1f331.png?v8",
            selfie: "unicode/1f933.png?v8",
            senegal: "unicode/1f1f8-1f1f3.png?v8",
            serbia: "unicode/1f1f7-1f1f8.png?v8",
            service_dog: "unicode/1f415-1f9ba.png?v8",
            seven: "unicode/0037-20e3.png?v8",
            sewing_needle: "unicode/1faa1.png?v8",
            seychelles: "unicode/1f1f8-1f1e8.png?v8",
            shaking_face: "unicode/1fae8.png?v8",
            shallow_pan_of_food: "unicode/1f958.png?v8",
            shamrock: "unicode/2618.png?v8",
            shark: "unicode/1f988.png?v8",
            shaved_ice: "unicode/1f367.png?v8",
            sheep: "unicode/1f411.png?v8",
            shell: "unicode/1f41a.png?v8",
            shield: "unicode/1f6e1.png?v8",
            shinto_shrine: "unicode/26e9.png?v8",
            ship: "unicode/1f6a2.png?v8",
            shipit: "shipit.png?v8",
            shirt: "unicode/1f455.png?v8",
            shit: "unicode/1f4a9.png?v8",
            shoe: "unicode/1f45e.png?v8",
            shopping: "unicode/1f6cd.png?v8",
            shopping_cart: "unicode/1f6d2.png?v8",
            shorts: "unicode/1fa73.png?v8",
            shower: "unicode/1f6bf.png?v8",
            shrimp: "unicode/1f990.png?v8",
            shrug: "unicode/1f937.png?v8",
            shushing_face: "unicode/1f92b.png?v8",
            sierra_leone: "unicode/1f1f8-1f1f1.png?v8",
            signal_strength: "unicode/1f4f6.png?v8",
            singapore: "unicode/1f1f8-1f1ec.png?v8",
            singer: "unicode/1f9d1-1f3a4.png?v8",
            sint_maarten: "unicode/1f1f8-1f1fd.png?v8",
            six: "unicode/0036-20e3.png?v8",
            six_pointed_star: "unicode/1f52f.png?v8",
            skateboard: "unicode/1f6f9.png?v8",
            ski: "unicode/1f3bf.png?v8",
            skier: "unicode/26f7.png?v8",
            skull: "unicode/1f480.png?v8",
            skull_and_crossbones: "unicode/2620.png?v8",
            skunk: "unicode/1f9a8.png?v8",
            sled: "unicode/1f6f7.png?v8",
            sleeping: "unicode/1f634.png?v8",
            sleeping_bed: "unicode/1f6cc.png?v8",
            sleepy: "unicode/1f62a.png?v8",
            slightly_frowning_face: "unicode/1f641.png?v8",
            slightly_smiling_face: "unicode/1f642.png?v8",
            slot_machine: "unicode/1f3b0.png?v8",
            sloth: "unicode/1f9a5.png?v8",
            slovakia: "unicode/1f1f8-1f1f0.png?v8",
            slovenia: "unicode/1f1f8-1f1ee.png?v8",
            small_airplane: "unicode/1f6e9.png?v8",
            small_blue_diamond: "unicode/1f539.png?v8",
            small_orange_diamond: "unicode/1f538.png?v8",
            small_red_triangle: "unicode/1f53a.png?v8",
            small_red_triangle_down: "unicode/1f53b.png?v8",
            smile: "unicode/1f604.png?v8",
            smile_cat: "unicode/1f638.png?v8",
            smiley: "unicode/1f603.png?v8",
            smiley_cat: "unicode/1f63a.png?v8",
            smiling_face_with_tear: "unicode/1f972.png?v8",
            smiling_face_with_three_hearts: "unicode/1f970.png?v8",
            smiling_imp: "unicode/1f608.png?v8",
            smirk: "unicode/1f60f.png?v8",
            smirk_cat: "unicode/1f63c.png?v8",
            smoking: "unicode/1f6ac.png?v8",
            snail: "unicode/1f40c.png?v8",
            snake: "unicode/1f40d.png?v8",
            sneezing_face: "unicode/1f927.png?v8",
            snowboarder: "unicode/1f3c2.png?v8",
            snowflake: "unicode/2744.png?v8",
            snowman: "unicode/26c4.png?v8",
            snowman_with_snow: "unicode/2603.png?v8",
            soap: "unicode/1f9fc.png?v8",
            sob: "unicode/1f62d.png?v8",
            soccer: "unicode/26bd.png?v8",
            socks: "unicode/1f9e6.png?v8",
            softball: "unicode/1f94e.png?v8",
            solomon_islands: "unicode/1f1f8-1f1e7.png?v8",
            somalia: "unicode/1f1f8-1f1f4.png?v8",
            soon: "unicode/1f51c.png?v8",
            sos: "unicode/1f198.png?v8",
            sound: "unicode/1f509.png?v8",
            south_africa: "unicode/1f1ff-1f1e6.png?v8",
            south_georgia_south_sandwich_islands: "unicode/1f1ec-1f1f8.png?v8",
            south_sudan: "unicode/1f1f8-1f1f8.png?v8",
            space_invader: "unicode/1f47e.png?v8",
            spades: "unicode/2660.png?v8",
            spaghetti: "unicode/1f35d.png?v8",
            sparkle: "unicode/2747.png?v8",
            sparkler: "unicode/1f387.png?v8",
            sparkles: "unicode/2728.png?v8",
            sparkling_heart: "unicode/1f496.png?v8",
            speak_no_evil: "unicode/1f64a.png?v8",
            speaker: "unicode/1f508.png?v8",
            speaking_head: "unicode/1f5e3.png?v8",
            speech_balloon: "unicode/1f4ac.png?v8",
            speedboat: "unicode/1f6a4.png?v8",
            spider: "unicode/1f577.png?v8",
            spider_web: "unicode/1f578.png?v8",
            spiral_calendar: "unicode/1f5d3.png?v8",
            spiral_notepad: "unicode/1f5d2.png?v8",
            sponge: "unicode/1f9fd.png?v8",
            spoon: "unicode/1f944.png?v8",
            squid: "unicode/1f991.png?v8",
            sri_lanka: "unicode/1f1f1-1f1f0.png?v8",
            st_barthelemy: "unicode/1f1e7-1f1f1.png?v8",
            st_helena: "unicode/1f1f8-1f1ed.png?v8",
            st_kitts_nevis: "unicode/1f1f0-1f1f3.png?v8",
            st_lucia: "unicode/1f1f1-1f1e8.png?v8",
            st_martin: "unicode/1f1f2-1f1eb.png?v8",
            st_pierre_miquelon: "unicode/1f1f5-1f1f2.png?v8",
            st_vincent_grenadines: "unicode/1f1fb-1f1e8.png?v8",
            stadium: "unicode/1f3df.png?v8",
            standing_man: "unicode/1f9cd-2642.png?v8",
            standing_person: "unicode/1f9cd.png?v8",
            standing_woman: "unicode/1f9cd-2640.png?v8",
            star: "unicode/2b50.png?v8",
            star2: "unicode/1f31f.png?v8",
            star_and_crescent: "unicode/262a.png?v8",
            star_of_david: "unicode/2721.png?v8",
            star_struck: "unicode/1f929.png?v8",
            stars: "unicode/1f320.png?v8",
            station: "unicode/1f689.png?v8",
            statue_of_liberty: "unicode/1f5fd.png?v8",
            steam_locomotive: "unicode/1f682.png?v8",
            stethoscope: "unicode/1fa7a.png?v8",
            stew: "unicode/1f372.png?v8",
            stop_button: "unicode/23f9.png?v8",
            stop_sign: "unicode/1f6d1.png?v8",
            stopwatch: "unicode/23f1.png?v8",
            straight_ruler: "unicode/1f4cf.png?v8",
            strawberry: "unicode/1f353.png?v8",
            stuck_out_tongue: "unicode/1f61b.png?v8",
            stuck_out_tongue_closed_eyes: "unicode/1f61d.png?v8",
            stuck_out_tongue_winking_eye: "unicode/1f61c.png?v8",
            student: "unicode/1f9d1-1f393.png?v8",
            studio_microphone: "unicode/1f399.png?v8",
            stuffed_flatbread: "unicode/1f959.png?v8",
            sudan: "unicode/1f1f8-1f1e9.png?v8",
            sun_behind_large_cloud: "unicode/1f325.png?v8",
            sun_behind_rain_cloud: "unicode/1f326.png?v8",
            sun_behind_small_cloud: "unicode/1f324.png?v8",
            sun_with_face: "unicode/1f31e.png?v8",
            sunflower: "unicode/1f33b.png?v8",
            sunglasses: "unicode/1f60e.png?v8",
            sunny: "unicode/2600.png?v8",
            sunrise: "unicode/1f305.png?v8",
            sunrise_over_mountains: "unicode/1f304.png?v8",
            superhero: "unicode/1f9b8.png?v8",
            superhero_man: "unicode/1f9b8-2642.png?v8",
            superhero_woman: "unicode/1f9b8-2640.png?v8",
            supervillain: "unicode/1f9b9.png?v8",
            supervillain_man: "unicode/1f9b9-2642.png?v8",
            supervillain_woman: "unicode/1f9b9-2640.png?v8",
            surfer: "unicode/1f3c4.png?v8",
            surfing_man: "unicode/1f3c4-2642.png?v8",
            surfing_woman: "unicode/1f3c4-2640.png?v8",
            suriname: "unicode/1f1f8-1f1f7.png?v8",
            sushi: "unicode/1f363.png?v8",
            suspect: "suspect.png?v8",
            suspension_railway: "unicode/1f69f.png?v8",
            svalbard_jan_mayen: "unicode/1f1f8-1f1ef.png?v8",
            swan: "unicode/1f9a2.png?v8",
            swaziland: "unicode/1f1f8-1f1ff.png?v8",
            sweat: "unicode/1f613.png?v8",
            sweat_drops: "unicode/1f4a6.png?v8",
            sweat_smile: "unicode/1f605.png?v8",
            sweden: "unicode/1f1f8-1f1ea.png?v8",
            sweet_potato: "unicode/1f360.png?v8",
            swim_brief: "unicode/1fa72.png?v8",
            swimmer: "unicode/1f3ca.png?v8",
            swimming_man: "unicode/1f3ca-2642.png?v8",
            swimming_woman: "unicode/1f3ca-2640.png?v8",
            switzerland: "unicode/1f1e8-1f1ed.png?v8",
            symbols: "unicode/1f523.png?v8",
            synagogue: "unicode/1f54d.png?v8",
            syria: "unicode/1f1f8-1f1fe.png?v8",
            syringe: "unicode/1f489.png?v8",
            "t-rex": "unicode/1f996.png?v8",
            taco: "unicode/1f32e.png?v8",
            tada: "unicode/1f389.png?v8",
            taiwan: "unicode/1f1f9-1f1fc.png?v8",
            tajikistan: "unicode/1f1f9-1f1ef.png?v8",
            takeout_box: "unicode/1f961.png?v8",
            tamale: "unicode/1fad4.png?v8",
            tanabata_tree: "unicode/1f38b.png?v8",
            tangerine: "unicode/1f34a.png?v8",
            tanzania: "unicode/1f1f9-1f1ff.png?v8",
            taurus: "unicode/2649.png?v8",
            taxi: "unicode/1f695.png?v8",
            tea: "unicode/1f375.png?v8",
            teacher: "unicode/1f9d1-1f3eb.png?v8",
            teapot: "unicode/1fad6.png?v8",
            technologist: "unicode/1f9d1-1f4bb.png?v8",
            teddy_bear: "unicode/1f9f8.png?v8",
            telephone: "unicode/260e.png?v8",
            telephone_receiver: "unicode/1f4de.png?v8",
            telescope: "unicode/1f52d.png?v8",
            tennis: "unicode/1f3be.png?v8",
            tent: "unicode/26fa.png?v8",
            test_tube: "unicode/1f9ea.png?v8",
            thailand: "unicode/1f1f9-1f1ed.png?v8",
            thermometer: "unicode/1f321.png?v8",
            thinking: "unicode/1f914.png?v8",
            thong_sandal: "unicode/1fa74.png?v8",
            thought_balloon: "unicode/1f4ad.png?v8",
            thread: "unicode/1f9f5.png?v8",
            three: "unicode/0033-20e3.png?v8",
            thumbsdown: "unicode/1f44e.png?v8",
            thumbsup: "unicode/1f44d.png?v8",
            ticket: "unicode/1f3ab.png?v8",
            tickets: "unicode/1f39f.png?v8",
            tiger: "unicode/1f42f.png?v8",
            tiger2: "unicode/1f405.png?v8",
            timer_clock: "unicode/23f2.png?v8",
            timor_leste: "unicode/1f1f9-1f1f1.png?v8",
            tipping_hand_man: "unicode/1f481-2642.png?v8",
            tipping_hand_person: "unicode/1f481.png?v8",
            tipping_hand_woman: "unicode/1f481-2640.png?v8",
            tired_face: "unicode/1f62b.png?v8",
            tm: "unicode/2122.png?v8",
            togo: "unicode/1f1f9-1f1ec.png?v8",
            toilet: "unicode/1f6bd.png?v8",
            tokelau: "unicode/1f1f9-1f1f0.png?v8",
            tokyo_tower: "unicode/1f5fc.png?v8",
            tomato: "unicode/1f345.png?v8",
            tonga: "unicode/1f1f9-1f1f4.png?v8",
            tongue: "unicode/1f445.png?v8",
            toolbox: "unicode/1f9f0.png?v8",
            tooth: "unicode/1f9b7.png?v8",
            toothbrush: "unicode/1faa5.png?v8",
            top: "unicode/1f51d.png?v8",
            tophat: "unicode/1f3a9.png?v8",
            tornado: "unicode/1f32a.png?v8",
            tr: "unicode/1f1f9-1f1f7.png?v8",
            trackball: "unicode/1f5b2.png?v8",
            tractor: "unicode/1f69c.png?v8",
            traffic_light: "unicode/1f6a5.png?v8",
            train: "unicode/1f68b.png?v8",
            train2: "unicode/1f686.png?v8",
            tram: "unicode/1f68a.png?v8",
            transgender_flag: "unicode/1f3f3-26a7.png?v8",
            transgender_symbol: "unicode/26a7.png?v8",
            triangular_flag_on_post: "unicode/1f6a9.png?v8",
            triangular_ruler: "unicode/1f4d0.png?v8",
            trident: "unicode/1f531.png?v8",
            trinidad_tobago: "unicode/1f1f9-1f1f9.png?v8",
            tristan_da_cunha: "unicode/1f1f9-1f1e6.png?v8",
            triumph: "unicode/1f624.png?v8",
            troll: "unicode/1f9cc.png?v8",
            trolleybus: "unicode/1f68e.png?v8",
            trollface: "trollface.png?v8",
            trophy: "unicode/1f3c6.png?v8",
            tropical_drink: "unicode/1f379.png?v8",
            tropical_fish: "unicode/1f420.png?v8",
            truck: "unicode/1f69a.png?v8",
            trumpet: "unicode/1f3ba.png?v8",
            tshirt: "unicode/1f455.png?v8",
            tulip: "unicode/1f337.png?v8",
            tumbler_glass: "unicode/1f943.png?v8",
            tunisia: "unicode/1f1f9-1f1f3.png?v8",
            turkey: "unicode/1f983.png?v8",
            turkmenistan: "unicode/1f1f9-1f1f2.png?v8",
            turks_caicos_islands: "unicode/1f1f9-1f1e8.png?v8",
            turtle: "unicode/1f422.png?v8",
            tuvalu: "unicode/1f1f9-1f1fb.png?v8",
            tv: "unicode/1f4fa.png?v8",
            twisted_rightwards_arrows: "unicode/1f500.png?v8",
            two: "unicode/0032-20e3.png?v8",
            two_hearts: "unicode/1f495.png?v8",
            two_men_holding_hands: "unicode/1f46c.png?v8",
            two_women_holding_hands: "unicode/1f46d.png?v8",
            u5272: "unicode/1f239.png?v8",
            u5408: "unicode/1f234.png?v8",
            u55b6: "unicode/1f23a.png?v8",
            u6307: "unicode/1f22f.png?v8",
            u6708: "unicode/1f237.png?v8",
            u6709: "unicode/1f236.png?v8",
            u6e80: "unicode/1f235.png?v8",
            u7121: "unicode/1f21a.png?v8",
            u7533: "unicode/1f238.png?v8",
            u7981: "unicode/1f232.png?v8",
            u7a7a: "unicode/1f233.png?v8",
            uganda: "unicode/1f1fa-1f1ec.png?v8",
            uk: "unicode/1f1ec-1f1e7.png?v8",
            ukraine: "unicode/1f1fa-1f1e6.png?v8",
            umbrella: "unicode/2614.png?v8",
            unamused: "unicode/1f612.png?v8",
            underage: "unicode/1f51e.png?v8",
            unicorn: "unicode/1f984.png?v8",
            united_arab_emirates: "unicode/1f1e6-1f1ea.png?v8",
            united_nations: "unicode/1f1fa-1f1f3.png?v8",
            unlock: "unicode/1f513.png?v8",
            up: "unicode/1f199.png?v8",
            upside_down_face: "unicode/1f643.png?v8",
            uruguay: "unicode/1f1fa-1f1fe.png?v8",
            us: "unicode/1f1fa-1f1f8.png?v8",
            us_outlying_islands: "unicode/1f1fa-1f1f2.png?v8",
            us_virgin_islands: "unicode/1f1fb-1f1ee.png?v8",
            uzbekistan: "unicode/1f1fa-1f1ff.png?v8",
            v: "unicode/270c.png?v8",
            vampire: "unicode/1f9db.png?v8",
            vampire_man: "unicode/1f9db-2642.png?v8",
            vampire_woman: "unicode/1f9db-2640.png?v8",
            vanuatu: "unicode/1f1fb-1f1fa.png?v8",
            vatican_city: "unicode/1f1fb-1f1e6.png?v8",
            venezuela: "unicode/1f1fb-1f1ea.png?v8",
            vertical_traffic_light: "unicode/1f6a6.png?v8",
            vhs: "unicode/1f4fc.png?v8",
            vibration_mode: "unicode/1f4f3.png?v8",
            video_camera: "unicode/1f4f9.png?v8",
            video_game: "unicode/1f3ae.png?v8",
            vietnam: "unicode/1f1fb-1f1f3.png?v8",
            violin: "unicode/1f3bb.png?v8",
            virgo: "unicode/264d.png?v8",
            volcano: "unicode/1f30b.png?v8",
            volleyball: "unicode/1f3d0.png?v8",
            vomiting_face: "unicode/1f92e.png?v8",
            vs: "unicode/1f19a.png?v8",
            vulcan_salute: "unicode/1f596.png?v8",
            waffle: "unicode/1f9c7.png?v8",
            wales: "unicode/1f3f4-e0067-e0062-e0077-e006c-e0073-e007f.png?v8",
            walking: "unicode/1f6b6.png?v8",
            walking_man: "unicode/1f6b6-2642.png?v8",
            walking_woman: "unicode/1f6b6-2640.png?v8",
            wallis_futuna: "unicode/1f1fc-1f1eb.png?v8",
            waning_crescent_moon: "unicode/1f318.png?v8",
            waning_gibbous_moon: "unicode/1f316.png?v8",
            warning: "unicode/26a0.png?v8",
            wastebasket: "unicode/1f5d1.png?v8",
            watch: "unicode/231a.png?v8",
            water_buffalo: "unicode/1f403.png?v8",
            water_polo: "unicode/1f93d.png?v8",
            watermelon: "unicode/1f349.png?v8",
            wave: "unicode/1f44b.png?v8",
            wavy_dash: "unicode/3030.png?v8",
            waxing_crescent_moon: "unicode/1f312.png?v8",
            waxing_gibbous_moon: "unicode/1f314.png?v8",
            wc: "unicode/1f6be.png?v8",
            weary: "unicode/1f629.png?v8",
            wedding: "unicode/1f492.png?v8",
            weight_lifting: "unicode/1f3cb.png?v8",
            weight_lifting_man: "unicode/1f3cb-2642.png?v8",
            weight_lifting_woman: "unicode/1f3cb-2640.png?v8",
            western_sahara: "unicode/1f1ea-1f1ed.png?v8",
            whale: "unicode/1f433.png?v8",
            whale2: "unicode/1f40b.png?v8",
            wheel: "unicode/1f6de.png?v8",
            wheel_of_dharma: "unicode/2638.png?v8",
            wheelchair: "unicode/267f.png?v8",
            white_check_mark: "unicode/2705.png?v8",
            white_circle: "unicode/26aa.png?v8",
            white_flag: "unicode/1f3f3.png?v8",
            white_flower: "unicode/1f4ae.png?v8",
            white_haired_man: "unicode/1f468-1f9b3.png?v8",
            white_haired_woman: "unicode/1f469-1f9b3.png?v8",
            white_heart: "unicode/1f90d.png?v8",
            white_large_square: "unicode/2b1c.png?v8",
            white_medium_small_square: "unicode/25fd.png?v8",
            white_medium_square: "unicode/25fb.png?v8",
            white_small_square: "unicode/25ab.png?v8",
            white_square_button: "unicode/1f533.png?v8",
            wilted_flower: "unicode/1f940.png?v8",
            wind_chime: "unicode/1f390.png?v8",
            wind_face: "unicode/1f32c.png?v8",
            window: "unicode/1fa9f.png?v8",
            wine_glass: "unicode/1f377.png?v8",
            wing: "unicode/1fabd.png?v8",
            wink: "unicode/1f609.png?v8",
            wireless: "unicode/1f6dc.png?v8",
            wolf: "unicode/1f43a.png?v8",
            woman: "unicode/1f469.png?v8",
            woman_artist: "unicode/1f469-1f3a8.png?v8",
            woman_astronaut: "unicode/1f469-1f680.png?v8",
            woman_beard: "unicode/1f9d4-2640.png?v8",
            woman_cartwheeling: "unicode/1f938-2640.png?v8",
            woman_cook: "unicode/1f469-1f373.png?v8",
            woman_dancing: "unicode/1f483.png?v8",
            woman_facepalming: "unicode/1f926-2640.png?v8",
            woman_factory_worker: "unicode/1f469-1f3ed.png?v8",
            woman_farmer: "unicode/1f469-1f33e.png?v8",
            woman_feeding_baby: "unicode/1f469-1f37c.png?v8",
            woman_firefighter: "unicode/1f469-1f692.png?v8",
            woman_health_worker: "unicode/1f469-2695.png?v8",
            woman_in_manual_wheelchair: "unicode/1f469-1f9bd.png?v8",
            woman_in_motorized_wheelchair: "unicode/1f469-1f9bc.png?v8",
            woman_in_tuxedo: "unicode/1f935-2640.png?v8",
            woman_judge: "unicode/1f469-2696.png?v8",
            woman_juggling: "unicode/1f939-2640.png?v8",
            woman_mechanic: "unicode/1f469-1f527.png?v8",
            woman_office_worker: "unicode/1f469-1f4bc.png?v8",
            woman_pilot: "unicode/1f469-2708.png?v8",
            woman_playing_handball: "unicode/1f93e-2640.png?v8",
            woman_playing_water_polo: "unicode/1f93d-2640.png?v8",
            woman_scientist: "unicode/1f469-1f52c.png?v8",
            woman_shrugging: "unicode/1f937-2640.png?v8",
            woman_singer: "unicode/1f469-1f3a4.png?v8",
            woman_student: "unicode/1f469-1f393.png?v8",
            woman_teacher: "unicode/1f469-1f3eb.png?v8",
            woman_technologist: "unicode/1f469-1f4bb.png?v8",
            woman_with_headscarf: "unicode/1f9d5.png?v8",
            woman_with_probing_cane: "unicode/1f469-1f9af.png?v8",
            woman_with_turban: "unicode/1f473-2640.png?v8",
            woman_with_veil: "unicode/1f470-2640.png?v8",
            womans_clothes: "unicode/1f45a.png?v8",
            womans_hat: "unicode/1f452.png?v8",
            women_wrestling: "unicode/1f93c-2640.png?v8",
            womens: "unicode/1f6ba.png?v8",
            wood: "unicode/1fab5.png?v8",
            woozy_face: "unicode/1f974.png?v8",
            world_map: "unicode/1f5fa.png?v8",
            worm: "unicode/1fab1.png?v8",
            worried: "unicode/1f61f.png?v8",
            wrench: "unicode/1f527.png?v8",
            wrestling: "unicode/1f93c.png?v8",
            writing_hand: "unicode/270d.png?v8",
            x: "unicode/274c.png?v8",
            x_ray: "unicode/1fa7b.png?v8",
            yarn: "unicode/1f9f6.png?v8",
            yawning_face: "unicode/1f971.png?v8",
            yellow_circle: "unicode/1f7e1.png?v8",
            yellow_heart: "unicode/1f49b.png?v8",
            yellow_square: "unicode/1f7e8.png?v8",
            yemen: "unicode/1f1fe-1f1ea.png?v8",
            yen: "unicode/1f4b4.png?v8",
            yin_yang: "unicode/262f.png?v8",
            yo_yo: "unicode/1fa80.png?v8",
            yum: "unicode/1f60b.png?v8",
            zambia: "unicode/1f1ff-1f1f2.png?v8",
            zany_face: "unicode/1f92a.png?v8",
            zap: "unicode/26a1.png?v8",
            zebra: "unicode/1f993.png?v8",
            zero: "unicode/0030-20e3.png?v8",
            zimbabwe: "unicode/1f1ff-1f1fc.png?v8",
            zipper_mouth_face: "unicode/1f910.png?v8",
            zombie: "unicode/1f9df.png?v8",
            zombie_man: "unicode/1f9df-2642.png?v8",
            zombie_woman: "unicode/1f9df-2640.png?v8",
            zzz: "unicode/1f4a4.png?v8"
        }
    };
    function replaceEmojiShorthand(m, $1, useNativeEmoji) {
        const emojiMatch = emojiData.data[$1];
        let result = m;
        if (emojiMatch) {
            if (useNativeEmoji && /unicode/.test(emojiMatch)) {
                const emojiUnicode = emojiMatch.replace("unicode/", "").replace(/\.png.*/, "").split("-").map((u => `&#x${u};`)).join("&zwj;").concat("&#xFE0E;");
                result = `<span class="emoji">${emojiUnicode}</span>`;
            } else {
                result = `<img src="${emojiData.baseURL}${emojiMatch}.png" alt="${$1}" class="emoji" loading="lazy">`;
            }
        }
        return result;
    }
    function emojify(text, useNativeEmoji) {
        return text.replace(/<(code|pre|script|template)[^>]*?>[\s\S]+?<\/(code|pre|script|template)>/g, (m => m.replace(/:/g, "__colon__"))).replace(/<!--[\s\S]+?-->/g, (m => m.replace(/:/g, "__colon__"))).replace(/([a-z]{2,}:)?\/\/[^\s'">)]+/gi, (m => m.replace(/:/g, "__colon__"))).replace(/:([a-z0-9_\-+]+?):/g, ((m, $1) => replaceEmojiShorthand(m, $1, useNativeEmoji))).replace(/__colon__/g, ":");
    }
    function getAndRemoveConfig(str = "") {
        const config = {};
        if (str) {
            str = str.replace(/^('|")/, "").replace(/('|")$/, "").replace(/(?:^|\s):([\w-]+:?)=?([\w-%]+)?/g, ((m, key, value) => {
                if (key.indexOf(":") !== -1) {
                    return m;
                }
                value = value && value.replace(/&quot;/g, "") || true;
                if (value !== true && config[key] !== undefined) {
                    if (!Array.isArray(config[key]) && value !== config[key]) {
                        config[key] = [ config[key] ];
                    }
                    config[key].includes(value) || config[key].push(value);
                } else {
                    config[key] = value;
                }
                return "";
            })).trim();
        }
        return {
            str: str,
            config: config
        };
    }
    function removeAtag(str = "") {
        return str.replace(/(<\/?a.*?>)/gi, "");
    }
    function getAndRemoveDocsifyIgnoreConfig(content = "") {
        let ignoreAllSubs, ignoreSubHeading;
        if (/<!-- {docsify-ignore} -->/g.test(content)) {
            content = content.replace("\x3c!-- {docsify-ignore} --\x3e", "");
            ignoreSubHeading = true;
        }
        if (/{docsify-ignore}/g.test(content)) {
            content = content.replace("{docsify-ignore}", "");
            ignoreSubHeading = true;
        }
        if (/<!-- {docsify-ignore-all} -->/g.test(content)) {
            content = content.replace("\x3c!-- {docsify-ignore-all} --\x3e", "");
            ignoreAllSubs = true;
        }
        if (/{docsify-ignore-all}/g.test(content)) {
            content = content.replace("{docsify-ignore-all}", "");
            ignoreAllSubs = true;
        }
        return {
            content: content,
            ignoreAllSubs: ignoreAllSubs,
            ignoreSubHeading: ignoreSubHeading
        };
    }
    function escapeHtml(string) {
        const entityMap = {
            "&": "&amp;",
            "<": "&lt;",
            ">": "&gt;",
            '"': "&quot;",
            "'": "&#39;"
        };
        return String(string).replace(/[&<>"']/g, (s => entityMap[s]));
    }
    const imageCompiler = ({renderer: renderer, contentBase: contentBase, router: router}) => renderer.image = ({href: href, title: title, text: text}) => {
        let url = href;
        const attrs = [];
        const {str: str, config: config} = getAndRemoveConfig(title);
        title = str;
        if (config["no-zoom"]) {
            attrs.push("data-no-zoom");
        }
        if (title) {
            attrs.push(`title="${escapeHtml(title)}"`);
        }
        if (config.size) {
            const [width, height] = config.size.split("x");
            if (height) {
                attrs.push(`width="${width}" height="${height}"`);
            } else {
                attrs.push(`width="${width}"`);
            }
        }
        if (config.class) {
            let classes = config.class;
            if (Array.isArray(config.class)) {
                classes = config.class.join(" ");
            }
            attrs.push(`class="${classes}"`);
        }
        if (config.id) {
            attrs.push(`id="${config.id}"`);
        }
        if (!isAbsolutePath(href)) {
            url = getPath(contentBase, getParentPath(router.getCurrentPath()), href);
        }
        return `<img src="${escapeHtml(url)}" data-origin="${escapeHtml(href)}" alt="${escapeHtml(text)}" ${attrs.join(" ")} />`;
    };
    const headingCompiler = ({renderer: renderer, router: router, compiler: compiler}) => renderer.heading = function({tokens: tokens, depth: depth, text: text}) {
        const parsedText = this.parser.parseInline(tokens);
        let {str: str, config: config} = getAndRemoveConfig(parsedText);
        const nextToc = {
            depth: depth,
            title: str
        };
        const {content: content, ignoreAllSubs: ignoreAllSubs, ignoreSubHeading: ignoreSubHeading} = getAndRemoveDocsifyIgnoreConfig(str);
        str = content.trim();
        nextToc.title = removeAtag(str);
        nextToc.ignoreAllSubs = ignoreAllSubs;
        nextToc.ignoreSubHeading = ignoreSubHeading;
        const slug = slugify(config.id || text);
        const url = router.toURL(router.getCurrentPath(), {
            id: slug
        });
        nextToc.slug = stripUrlExceptId(url);
        if (compiler.blockquoteDepth === 0) {
            compiler.toc.push(nextToc);
        }
        return `<h${depth} id="${slug}" tabindex="-1"><a href="${url}" data-id="${slug}" class="anchor"><span>${str}</span></a></h${depth}>`;
    };
    (function(Prism) {
        function getPlaceholder(language, index) {
            return "___" + language.toUpperCase() + index + "___";
        }
        Object.defineProperties(Prism.languages["markup-templating"] = {}, {
            buildPlaceholders: {
                value: function(env, language, placeholderPattern, replaceFilter) {
                    if (env.language !== language) {
                        return;
                    }
                    var tokenStack = env.tokenStack = [];
                    env.code = env.code.replace(placeholderPattern, (function(match) {
                        if (typeof replaceFilter === "function" && !replaceFilter(match)) {
                            return match;
                        }
                        var i = tokenStack.length;
                        var placeholder;
                        while (env.code.indexOf(placeholder = getPlaceholder(language, i)) !== -1) {
                            ++i;
                        }
                        tokenStack[i] = match;
                        return placeholder;
                    }));
                    env.grammar = Prism.languages.markup;
                }
            },
            tokenizePlaceholders: {
                value: function(env, language) {
                    if (env.language !== language || !env.tokenStack) {
                        return;
                    }
                    env.grammar = Prism.languages[language];
                    var j = 0;
                    var keys = Object.keys(env.tokenStack);
                    function walkTokens(tokens) {
                        for (var i = 0; i < tokens.length; i++) {
                            if (j >= keys.length) {
                                break;
                            }
                            var token = tokens[i];
                            if (typeof token === "string" || token.content && typeof token.content === "string") {
                                var k = keys[j];
                                var t = env.tokenStack[k];
                                var s = typeof token === "string" ? token : token.content;
                                var placeholder = getPlaceholder(language, k);
                                var index = s.indexOf(placeholder);
                                if (index > -1) {
                                    ++j;
                                    var before = s.substring(0, index);
                                    var middle = new Prism.Token(language, Prism.tokenize(t, env.grammar), "language-" + language, t);
                                    var after = s.substring(index + placeholder.length);
                                    var replacement = [];
                                    if (before) {
                                        replacement.push.apply(replacement, walkTokens([ before ]));
                                    }
                                    replacement.push(middle);
                                    if (after) {
                                        replacement.push.apply(replacement, walkTokens([ after ]));
                                    }
                                    if (typeof token === "string") {
                                        tokens.splice.apply(tokens, [ i, 1 ].concat(replacement));
                                    } else {
                                        token.content = replacement;
                                    }
                                }
                            } else if (token.content) {
                                walkTokens(token.content);
                            }
                        }
                        return tokens;
                    }
                    walkTokens(env.tokens);
                }
            }
        });
    })(Prism);
    const lang_dependencies = {
        javascript: "clike",
        actionscript: "javascript",
        apex: [ "clike", "sql" ],
        arduino: "cpp",
        aspnet: [ "markup", "csharp" ],
        birb: "clike",
        bison: "c",
        c: "clike",
        csharp: "clike",
        cpp: "c",
        cfscript: "clike",
        chaiscript: [ "clike", "cpp" ],
        cilkc: "c",
        cilkcpp: "cpp",
        coffeescript: "javascript",
        crystal: "ruby",
        "css-extras": "css",
        d: "clike",
        dart: "clike",
        django: "markup-templating",
        ejs: [ "javascript", "markup-templating" ],
        etlua: [ "lua", "markup-templating" ],
        erb: [ "ruby", "markup-templating" ],
        fsharp: "clike",
        "firestore-security-rules": "clike",
        flow: "javascript",
        ftl: "markup-templating",
        gml: "clike",
        glsl: "c",
        go: "clike",
        gradle: "clike",
        groovy: "clike",
        haml: "ruby",
        handlebars: "markup-templating",
        haxe: "clike",
        hlsl: "c",
        idris: "haskell",
        java: "clike",
        javadoc: [ "markup", "java", "javadoclike" ],
        jolie: "clike",
        jsdoc: [ "javascript", "javadoclike", "typescript" ],
        "js-extras": "javascript",
        json5: "json",
        jsonp: "json",
        "js-templates": "javascript",
        kotlin: "clike",
        latte: [ "clike", "markup-templating", "php" ],
        less: "css",
        lilypond: "scheme",
        liquid: "markup-templating",
        markdown: "markup",
        "markup-templating": "markup",
        mongodb: "javascript",
        n4js: "javascript",
        objectivec: "c",
        opencl: "c",
        parser: "markup",
        php: "markup-templating",
        phpdoc: [ "php", "javadoclike" ],
        "php-extras": "php",
        plsql: "sql",
        processing: "clike",
        protobuf: "clike",
        pug: [ "markup", "javascript" ],
        purebasic: "clike",
        purescript: "haskell",
        qsharp: "clike",
        qml: "javascript",
        qore: "clike",
        racket: "scheme",
        cshtml: [ "markup", "csharp" ],
        jsx: [ "markup", "javascript" ],
        tsx: [ "jsx", "typescript" ],
        reason: "clike",
        ruby: "clike",
        sass: "css",
        scss: "css",
        scala: "java",
        "shell-session": "bash",
        smarty: "markup-templating",
        solidity: "clike",
        soy: "markup-templating",
        sparql: "turtle",
        sqf: "clike",
        squirrel: "clike",
        stata: [ "mata", "java", "python" ],
        "t4-cs": [ "t4-templating", "csharp" ],
        "t4-vb": [ "t4-templating", "vbnet" ],
        tap: "yaml",
        tt2: [ "clike", "markup-templating" ],
        textile: "markup",
        twig: "markup-templating",
        typescript: "javascript",
        v: "clike",
        vala: "clike",
        vbnet: "basic",
        velocity: "markup",
        wiki: "markup",
        xeora: "markup",
        "xml-doc": "markup",
        xquery: "markup"
    };
    const lang_aliases = {
        html: "markup",
        xml: "markup",
        svg: "markup",
        mathml: "markup",
        ssml: "markup",
        atom: "markup",
        rss: "markup",
        js: "javascript",
        g4: "antlr4",
        ino: "arduino",
        "arm-asm": "armasm",
        art: "arturo",
        adoc: "asciidoc",
        avs: "avisynth",
        avdl: "avro-idl",
        gawk: "awk",
        sh: "bash",
        shell: "bash",
        shortcode: "bbcode",
        rbnf: "bnf",
        oscript: "bsl",
        cs: "csharp",
        dotnet: "csharp",
        cfc: "cfscript",
        "cilk-c": "cilkc",
        "cilk-cpp": "cilkcpp",
        cilk: "cilkcpp",
        coffee: "coffeescript",
        conc: "concurnas",
        jinja2: "django",
        "dns-zone": "dns-zone-file",
        dockerfile: "docker",
        gv: "dot",
        eta: "ejs",
        xlsx: "excel-formula",
        xls: "excel-formula",
        gamemakerlanguage: "gml",
        po: "gettext",
        gni: "gn",
        ld: "linker-script",
        "go-mod": "go-module",
        hbs: "handlebars",
        mustache: "handlebars",
        hs: "haskell",
        idr: "idris",
        gitignore: "ignore",
        hgignore: "ignore",
        npmignore: "ignore",
        webmanifest: "json",
        kt: "kotlin",
        kts: "kotlin",
        kum: "kumir",
        tex: "latex",
        context: "latex",
        ly: "lilypond",
        emacs: "lisp",
        elisp: "lisp",
        "emacs-lisp": "lisp",
        md: "markdown",
        moon: "moonscript",
        n4jsd: "n4js",
        nani: "naniscript",
        objc: "objectivec",
        qasm: "openqasm",
        objectpascal: "pascal",
        px: "pcaxis",
        pcode: "peoplecode",
        plantuml: "plant-uml",
        pq: "powerquery",
        mscript: "powerquery",
        pbfasm: "purebasic",
        purs: "purescript",
        py: "python",
        qs: "qsharp",
        rkt: "racket",
        razor: "cshtml",
        rpy: "renpy",
        res: "rescript",
        robot: "robotframework",
        rb: "ruby",
        "sh-session": "shell-session",
        shellsession: "shell-session",
        smlnj: "sml",
        sol: "solidity",
        sln: "solution-file",
        rq: "sparql",
        sclang: "supercollider",
        t4: "t4-cs",
        trickle: "tremor",
        troy: "tremor",
        trig: "turtle",
        ts: "typescript",
        tsconfig: "typoscript",
        uscript: "unrealscript",
        uc: "unrealscript",
        url: "uri",
        vb: "visual-basic",
        vba: "visual-basic",
        webidl: "web-idl",
        mathematica: "wolfram",
        nb: "wolfram",
        wl: "wolfram",
        xeoracube: "xeora",
        yml: "yaml"
    };
    const depTreeCache = {};
    const sanitizeCodeLang = lang => {
        const codeLang = typeof lang === "string" && lang.trim().length ? lang.trim() : "markup";
        const prismLang = lang_aliases[codeLang] || codeLang;
        return {
            codeLang: codeLang,
            prismLang: prismLang,
            escapedLang: escapeHtml(codeLang)
        };
    };
    function checkLangDependenciesAllLoaded(lang) {
        if (!lang) {
            return;
        }
        lang = lang_aliases[lang] || lang;
        const validLang = lang_dependencies[lang];
        if (!validLang) {
            return;
        }
        if (!depTreeCache[lang]) {
            const dummy = {
                loaded: true,
                dependencies: []
            };
            buildAndCheckDepTree(lang, dummy, dummy);
            const depTree = dummy.dependencies[0];
            depTreeCache[lang] = depTree;
            if (!dummy.loaded) {
                const prettyOutput = prettyPrint(depTree, 1);
                console.warn(`The language '${lang}' required dependencies for code block highlighting are not satisfied.`, `Priority dependencies from low to high, consider to place all the necessary dependencies by priority (higher first): \n`, prettyOutput);
            }
        }
    }
    const buildAndCheckDepTree = (lang, parent, dummy) => {
        if (!lang) {
            return;
        }
        const cur = {
            cur: lang,
            loaded: true,
            dependencies: []
        };
        let deps = lang_dependencies[lang] || [];
        if (!(lang in prismExports.languages)) {
            dummy.loaded = false;
            cur.loaded = false;
        }
        if (typeof deps === "string") {
            deps = [ deps ];
        }
        deps.forEach((dep => {
            buildAndCheckDepTree(dep, cur, dummy);
        }));
        parent.dependencies.push(cur);
    };
    const prettyPrint = (depTree, level) => {
        let cur = `${"  ".repeat(level * 3)} ${depTree.cur} ${depTree.loaded ? "(+)" : "(-)"}`;
        if (depTree.dependencies.length) {
            depTree.dependencies.forEach((dep => {
                cur += prettyPrint(dep, level + 1);
            }));
        }
        return "\n" + cur;
    };
    const highlightCodeCompiler = ({renderer: renderer}) => renderer.code = function({text: text, lang: lang = "markup"}) {
        const {escapedLang: escapedLang, prismLang: prismLang} = sanitizeCodeLang(lang);
        checkLangDependenciesAllLoaded(prismLang);
        const langOrMarkup = prismExports.languages[prismLang] || prismExports.languages.markup;
        const code = prismExports.highlight(text.replace(/@DOCSIFY_QM@/g, "`"), langOrMarkup, prismLang);
        return `<pre data-lang="${escapedLang}" class="language-${escapedLang}"><code class="lang-${escapedLang} language-${escapedLang}" tabindex="0">${code}</code></pre>`;
    };
    function renderParagraphText(text) {
        if (text.startsWith("!&gt;")) {
            return helper("callout important", text);
        }
        if (text.startsWith("?&gt;")) {
            return helper("callout tip", text);
        }
        return `<p>${text}</p>`;
    }
    const paragraphCompiler = ({renderer: renderer}) => renderer.paragraph = function({tokens: tokens, embedTokenMap: embedTokenMap}) {
        let result;
        if (embedTokenMap && tokens?.length) {
            const parts = [];
            let inlineBuffer = [];
            const flushInlineBuffer = () => {
                if (!inlineBuffer.length) {
                    return;
                }
                const text = this.parser.parseInline(inlineBuffer);
                parts.push(renderParagraphText(text));
                inlineBuffer = [];
            };
            tokens.forEach(((inlineToken, inlineIndex) => {
                const embedToken = embedTokenMap[inlineIndex];
                if (embedToken?.length) {
                    flushInlineBuffer();
                    parts.push(this.parser.parse(embedToken));
                } else {
                    inlineBuffer.push(inlineToken);
                }
            }));
            flushInlineBuffer();
            result = parts.join("");
        } else {
            const text = this.parser.parseInline(tokens);
            result = renderParagraphText(text);
        }
        return result;
    };
    const blockquoteCompiler = ({renderer: renderer, compiler: compiler}) => renderer.blockquote = function({tokens: tokens}) {
        let openTag = "<blockquote>";
        let closeTag = "</blockquote>";
        const firstParagraphIndex = tokens.findIndex((t => t.type === "paragraph"));
        const firstParagraph = tokens[firstParagraphIndex];
        if (firstParagraph) {
            const calloutData = firstParagraph.raw.match(/^(\[!(\w+)\])/);
            if (calloutData) {
                const calloutMark = calloutData[1];
                const calloutType = calloutData[2].toLowerCase();
                tokens = tokens.slice();
                const paragraph = {
                    ...firstParagraph
                };
                if (firstParagraph.tokens) {
                    paragraph.tokens = firstParagraph.tokens.map((t => ({
                        ...t
                    })));
                }
                tokens[firstParagraphIndex] = paragraph;
                paragraph.raw = paragraph.raw.replace(calloutMark, "").trimStart();
                if (paragraph.tokens && paragraph.tokens.length > 0) {
                    paragraph.tokens.forEach((t => {
                        if (t.raw) {
                            t.raw = t.raw.replace(calloutMark, "");
                        }
                        if (t.text) {
                            t.text = t.text.replace(calloutMark, "");
                        }
                    }));
                }
                if (!paragraph.raw.trim()) {
                    tokens.splice(firstParagraphIndex, 1);
                }
                openTag = `<div class="callout ${calloutType}">`;
                closeTag = `</div>`;
            }
        }
        compiler.blockquoteDepth++;
        let body = "";
        try {
            body = this.parser.parse(tokens);
        } finally {
            compiler.blockquoteDepth--;
        }
        return `${openTag}${body}${closeTag}`;
    };
    const taskListCompiler = ({renderer: renderer}) => renderer.list = function(token) {
        const ordered = token.ordered;
        const start = token.start;
        let body = "";
        for (let j = 0; j < token.items.length; j++) {
            const item = token.items[j];
            body += this.listitem?.(item);
        }
        const isTaskList = /<li class="task-list-item">/.test(body.split('class="task-list"')[0]);
        const isStartReq = start && start > 1;
        const tag = ordered ? "ol" : "ul";
        const tagAttrs = [ isTaskList ? 'class="task-list"' : "", isStartReq ? `start="${start}"` : "" ].join(" ").trim();
        return `<${tag} ${tagAttrs}>${body}</${tag}>`;
    };
    const taskListItemCompiler = ({renderer: renderer}) => renderer.listitem = function(item) {
        let text = "";
        if (item.task) {
            const checkbox = this.checkbox?.({
                checked: !!item.checked
            });
            if (item.loose) {
                if (item.tokens.length > 0 && item.tokens[0].type === "paragraph") {
                    item.tokens[0].text = checkbox + " " + item.tokens[0].text;
                    if (item.tokens[0].tokens && item.tokens[0].tokens.length > 0 && item.tokens[0].tokens[0].type === "text") {
                        item.tokens[0].tokens[0].text = checkbox + " " + item.tokens[0].tokens[0].text;
                    }
                } else {
                    item.tokens.unshift({
                        type: "text",
                        raw: checkbox + " ",
                        text: checkbox + " "
                    });
                }
            }
        }
        text += this.parser?.parse(item.tokens, !!item.loose);
        const isTaskItem = /^(<input.*type="checkbox"[^>]*>)/.test(text);
        const html = isTaskItem ? `<li class="task-list-item"><label>${text}</label></li>` : `<li>${text}</li>`;
        return html;
    };
    const linkCompiler = ({renderer: renderer, router: router, linkTarget: defaultLinkTarget, compiler: compiler}) => renderer.link = function({href: href, title: title = "", tokens: tokens}) {
        const attrs = [];
        const text = this.parser.parseInline(tokens) || "";
        const {str: str, config: config} = getAndRemoveConfig(title);
        const isAbsolute = isAbsolutePath(href);
        const isNotCompilable = compiler._matchNotCompileLink(href);
        const isMailto = href.startsWith("mailto:");
        const linkTarget = config.target || defaultLinkTarget;
        const linkRel = linkTarget === "_blank" ? compiler.config.externalLinkRel || "noopener" : "";
        title = str;
        if (!isAbsolute && !isNotCompilable && !config.ignore) {
            if (href === compiler.config.homepage) {
                href = "README";
            }
            href = router.toURL(href, null, router.getCurrentPath());
            if (config.target && !isMailto) {
                attrs.push(`target="${linkTarget}"`);
            }
        } else {
            if (!isAbsolute && href.startsWith("./")) {
                href = router.toURL(href, null, router.getCurrentPath()).replace(/^#\//, "/");
            }
            if (!isMailto) {
                attrs.push(`target="${linkTarget}"`);
                if (linkRel !== "") {
                    attrs.push(`rel="${linkRel}"`);
                }
            }
        }
        if (config.disabled) {
            attrs.push("disabled");
            href = "javascript:void(0)";
        }
        if (config.class) {
            let classes = config.class;
            if (Array.isArray(config.class)) {
                classes = config.class.join(" ");
            }
            attrs.push(`class="${classes}"`);
        }
        if (config.id) {
            attrs.push(`id="${config.id}"`);
        }
        if (title) {
            attrs.push(`title="${escapeHtml(title)}"`);
        }
        return `<a href="${escapeHtml(href)}" ${attrs.join(" ")}>${text}</a>`;
    };
    const compileMedia = {
        markdown(url) {
            return {
                url: url
            };
        },
        mermaid(url) {
            return {
                url: url
            };
        },
        iframe(url, title) {
            return {
                html: `<iframe src="${escapeHtml(url)}" ${title || "width=100% height=400"}></iframe>`
            };
        },
        video(url, title) {
            return {
                html: `<video src="${escapeHtml(url)}" ${title || "controls"}>Not Supported</video>`
            };
        },
        audio(url, title) {
            return {
                html: `<audio src="${escapeHtml(url)}" ${title || "controls"}>Not Supported</audio>`
            };
        },
        code(url, title) {
            let lang = url.match(/\.(\w+)$/);
            lang = title || lang && lang[1];
            if (lang === "md") {
                lang = "markdown";
            }
            return {
                url: url,
                lang: lang
            };
        }
    };
    const tableCellCompiler = ({renderer: renderer}) => renderer.tablecell = function(token) {
        let content;
        if (token.embedTokenMap && token.tokens?.length) {
            content = "";
            token.tokens.forEach(((inlineToken, inlineIndex) => {
                const embedToken = token.embedTokenMap[inlineIndex];
                if (embedToken?.length) {
                    content += this.parser.parse(embedToken);
                } else {
                    content += this.parser.parseInline([ inlineToken ]);
                }
            }));
        } else if (token.embedTokens && token.embedTokens.length > 0) {
            content = this.parser.parse(token.embedTokens);
        } else {
            content = this.parser.parseInline(token.tokens);
        }
        const type = token.header ? "th" : "td";
        const tag = token.align ? `<${type} align="${token.align}">` : `<${type}>`;
        return tag + content + `</${type}>\n`;
    };
    const cachedLinks = {};
    class Compiler {
        constructor(config, router) {
            this.config = config;
            this.router = router;
            this.cacheTree = {};
            this.toc = [];
            this.blockquoteDepth = 0;
            this.cacheTOC = {};
            this.linkTarget = config.externalLinkTarget || "_blank";
            this.linkRel = this.linkTarget === "_blank" ? config.externalLinkRel || "noopener" : "";
            this.contentBase = router.getBasePath();
            this.renderer = this._initRenderer();
            let compile;
            const mdConf = config.markdown || {};
            if (isFn(mdConf)) {
                compile = mdConf(g, this.renderer);
            } else {
                g.setOptions(Object.assign(mdConf, {
                    renderer: Object.assign(this.renderer, mdConf.renderer)
                }));
                compile = g;
            }
            this._marked = compile;
            this.compile = text => {
                let isCached = true;
                const result = cached$1((_ => {
                    isCached = false;
                    let html = "";
                    if (!text) {
                        return text;
                    }
                    if (isPrimitive(text)) {
                        html = compile(text);
                    } else {
                        html = compile.parser(text);
                    }
                    html = config.noEmoji ? html : emojify(html, config.nativeEmoji);
                    slugify.clear();
                    return html;
                }))(text);
                const curFileName = this.router.parse().file;
                if (isCached) {
                    this.toc = this.cacheTOC[curFileName];
                } else {
                    this.cacheTOC[curFileName] = [ ...this.toc ];
                }
                return result;
            };
        }
        compileEmbed(href, title) {
            const {str: str, config: config} = getAndRemoveConfig(title);
            let embed;
            title = str;
            if (config.include) {
                if (!isAbsolutePath(href)) {
                    href = getPath(this.contentBase, getParentPath(this.router.getCurrentPath()), href);
                }
                let media;
                const mediaType = Array.isArray(config.type) ? config.type[0] : config.type;
                if (mediaType && (media = compileMedia[mediaType])) {
                    embed = media.call(this, href, title);
                    embed.type = mediaType;
                } else {
                    let type = "code";
                    if (/\.(md|markdown)/.test(href)) {
                        type = "markdown";
                    } else if (/\.mmd/.test(href)) {
                        type = "mermaid";
                    } else if (/\.html?/.test(href)) {
                        type = "iframe";
                    } else if (/\.(mp4|ogg)/.test(href)) {
                        type = "video";
                    } else if (/\.mp3/.test(href)) {
                        type = "audio";
                    }
                    embed = compileMedia[type](href, title);
                    embed.type = type;
                }
                embed.fragment = config.fragment;
                embed.omitFragmentLine = config.omitFragmentLine;
                return embed;
            }
        }
        _matchNotCompileLink(link) {
            const links = this.config.noCompileLinks || [];
            for (const n of links) {
                const re = cachedLinks[n] || (cachedLinks[n] = new RegExp(`^${n}$`));
                if (re.test(link)) {
                    return link;
                }
            }
        }
        _initRenderer() {
            const renderer = new g.Renderer;
            const {linkTarget: linkTarget, router: router, contentBase: contentBase} = this;
            const origin = {};
            origin.heading = headingCompiler({
                renderer: renderer,
                router: router,
                compiler: this
            });
            origin.blockquoteCompiler = blockquoteCompiler({
                renderer: renderer,
                compiler: this
            });
            origin.code = highlightCodeCompiler({
                renderer: renderer
            });
            origin.link = linkCompiler({
                renderer: renderer,
                router: router,
                linkTarget: linkTarget,
                compiler: this
            });
            origin.paragraph = paragraphCompiler({
                renderer: renderer
            });
            origin.image = imageCompiler({
                renderer: renderer,
                contentBase: contentBase,
                router: router
            });
            origin.list = taskListCompiler({
                renderer: renderer
            });
            origin.listitem = taskListItemCompiler({
                renderer: renderer
            });
            origin.tablecell = tableCellCompiler({
                renderer: renderer
            });
            renderer.origin = origin;
            return renderer;
        }
        sidebar(text, level) {
            const {toc: toc} = this;
            const currentPath = this.router.getCurrentPath();
            let html = "";
            if (typeof text === "string") {
                return this.compile(text);
            }
            for (let i = 0; i < toc.length; i++) {
                if (toc[i].ignoreSubHeading) {
                    const deletedHeaderLevel = toc[i].depth;
                    toc.splice(i, 1);
                    while (i < toc.length && toc[i].depth > deletedHeaderLevel) {
                        toc.splice(i, 1);
                    }
                    i--;
                }
            }
            const tree$1 = this.cacheTree[currentPath] || genTree(toc, level);
            html = tree(tree$1);
            this.cacheTree[currentPath] = tree$1;
            return html;
        }
        resetToc() {
            this.toc = [];
        }
        subSidebar(level) {
            const currentPath = this.router.getCurrentPath();
            const {cacheTree: cacheTree, toc: toc} = this;
            toc[0] && toc[0].ignoreAllSubs && toc.splice(0);
            toc[0] && toc[0].depth === 1 && toc.shift();
            for (let i = 0; i < toc.length; i++) {
                toc[i].ignoreSubHeading && toc.splice(i, 1) && i--;
            }
            const tree$1 = cacheTree[currentPath] || genTree(toc, level);
            cacheTree[currentPath] = tree$1;
            this.toc = [];
            return tree(tree$1);
        }
        header(text, level) {
            const tokenHeading = {
                type: "heading",
                raw: text,
                depth: level,
                text: text,
                tokens: [ {
                    type: "text",
                    raw: text,
                    text: text
                } ]
            };
            return this.renderer.heading(tokenHeading);
        }
        cover(text) {
            const cacheToc = this.toc.slice();
            const html = this.compile(text);
            this.toc = cacheToc.slice();
            return html;
        }
    }
    var _createClass = function() {
        function defineProperties(target, props) {
            for (var i = 0; i < props.length; i++) {
                var descriptor = props[i];
                descriptor.enumerable = descriptor.enumerable || false;
                descriptor.configurable = true;
                if ("value" in descriptor) descriptor.writable = true;
                Object.defineProperty(target, descriptor.key, descriptor);
            }
        }
        return function(Constructor, protoProps, staticProps) {
            if (protoProps) defineProperties(Constructor.prototype, protoProps);
            if (staticProps) defineProperties(Constructor, staticProps);
            return Constructor;
        };
    }();
    var _templateObject = _taggedTemplateLiteral([ "", "" ], [ "", "" ]);
    function _taggedTemplateLiteral(strings, raw) {
        return Object.freeze(Object.defineProperties(strings, {
            raw: {
                value: Object.freeze(raw)
            }
        }));
    }
    function _classCallCheck(instance, Constructor) {
        if (!(instance instanceof Constructor)) {
            throw new TypeError("Cannot call a class as a function");
        }
    }
    var TemplateTag = function() {
        function TemplateTag() {
            var _this = this;
            for (var _len = arguments.length, transformers = Array(_len), _key = 0; _key < _len; _key++) {
                transformers[_key] = arguments[_key];
            }
            _classCallCheck(this, TemplateTag);
            this.tag = function(strings) {
                for (var _len2 = arguments.length, expressions = Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {
                    expressions[_key2 - 1] = arguments[_key2];
                }
                if (typeof strings === "function") {
                    return _this.interimTag.bind(_this, strings);
                }
                if (typeof strings === "string") {
                    return _this.transformEndResult(strings);
                }
                strings = strings.map(_this.transformString.bind(_this));
                return _this.transformEndResult(strings.reduce(_this.processSubstitutions.bind(_this, expressions)));
            };
            if (transformers.length > 0 && Array.isArray(transformers[0])) {
                transformers = transformers[0];
            }
            this.transformers = transformers.map((function(transformer) {
                return typeof transformer === "function" ? transformer() : transformer;
            }));
            return this.tag;
        }
        _createClass(TemplateTag, [ {
            key: "interimTag",
            value: function interimTag(previousTag, template) {
                for (var _len3 = arguments.length, substitutions = Array(_len3 > 2 ? _len3 - 2 : 0), _key3 = 2; _key3 < _len3; _key3++) {
                    substitutions[_key3 - 2] = arguments[_key3];
                }
                return this.tag(_templateObject, previousTag.apply(undefined, [ template ].concat(substitutions)));
            }
        }, {
            key: "processSubstitutions",
            value: function processSubstitutions(substitutions, resultSoFar, remainingPart) {
                var substitution = this.transformSubstitution(substitutions.shift(), resultSoFar);
                return "".concat(resultSoFar, substitution, remainingPart);
            }
        }, {
            key: "transformString",
            value: function transformString(str) {
                var cb = function cb(res, transform) {
                    return transform.onString ? transform.onString(res) : res;
                };
                return this.transformers.reduce(cb, str);
            }
        }, {
            key: "transformSubstitution",
            value: function transformSubstitution(substitution, resultSoFar) {
                var cb = function cb(res, transform) {
                    return transform.onSubstitution ? transform.onSubstitution(res, resultSoFar) : res;
                };
                return this.transformers.reduce(cb, substitution);
            }
        }, {
            key: "transformEndResult",
            value: function transformEndResult(endResult) {
                var cb = function cb(res, transform) {
                    return transform.onEndResult ? transform.onEndResult(res) : res;
                };
                return this.transformers.reduce(cb, endResult);
            }
        } ]);
        return TemplateTag;
    }();
    var trimResultTransformer = function trimResultTransformer() {
        var side = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : "";
        return {
            onEndResult: function onEndResult(endResult) {
                if (side === "") {
                    return endResult.trim();
                }
                side = side.toLowerCase();
                if (side === "start" || side === "left") {
                    return endResult.replace(/^\s*/, "");
                }
                if (side === "end" || side === "right") {
                    return endResult.replace(/\s*$/, "");
                }
                throw new Error("Side not supported: " + side);
            }
        };
    };
    function _toConsumableArray(arr) {
        if (Array.isArray(arr)) {
            for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) {
                arr2[i] = arr[i];
            }
            return arr2;
        } else {
            return Array.from(arr);
        }
    }
    var stripIndentTransformer = function stripIndentTransformer() {
        var type = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : "initial";
        return {
            onEndResult: function onEndResult(endResult) {
                if (type === "initial") {
                    var match = endResult.match(/^[^\S\n]*(?=\S)/gm);
                    var indent = match && Math.min.apply(Math, _toConsumableArray(match.map((function(el) {
                        return el.length;
                    }))));
                    if (indent) {
                        var regexp = new RegExp("^.{" + indent + "}", "gm");
                        return endResult.replace(regexp, "");
                    }
                    return endResult;
                }
                if (type === "all") {
                    return endResult.replace(/^[^\S\n]+/gm, "");
                }
                throw new Error("Unknown type: " + type);
            }
        };
    };
    var replaceResultTransformer = function replaceResultTransformer(replaceWhat, replaceWith) {
        return {
            onEndResult: function onEndResult(endResult) {
                if (replaceWhat == null || replaceWith == null) {
                    throw new Error("replaceResultTransformer requires at least 2 arguments.");
                }
                return endResult.replace(replaceWhat, replaceWith);
            }
        };
    };
    var replaceSubstitutionTransformer = function replaceSubstitutionTransformer(replaceWhat, replaceWith) {
        return {
            onSubstitution: function onSubstitution(substitution, resultSoFar) {
                if (replaceWhat == null || replaceWith == null) {
                    throw new Error("replaceSubstitutionTransformer requires at least 2 arguments.");
                }
                if (substitution == null) {
                    return substitution;
                } else {
                    return substitution.toString().replace(replaceWhat, replaceWith);
                }
            }
        };
    };
    var defaults = {
        separator: "",
        conjunction: "",
        serial: false
    };
    var inlineArrayTransformer = function inlineArrayTransformer() {
        var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : defaults;
        return {
            onSubstitution: function onSubstitution(substitution, resultSoFar) {
                if (Array.isArray(substitution)) {
                    var arrayLength = substitution.length;
                    var separator = opts.separator;
                    var conjunction = opts.conjunction;
                    var serial = opts.serial;
                    var indent = resultSoFar.match(/(\n?[^\S\n]+)$/);
                    if (indent) {
                        substitution = substitution.join(separator + indent[1]);
                    } else {
                        substitution = substitution.join(separator + " ");
                    }
                    if (conjunction && arrayLength > 1) {
                        var separatorIndex = substitution.lastIndexOf(separator);
                        substitution = substitution.slice(0, separatorIndex) + (serial ? separator : "") + " " + conjunction + substitution.slice(separatorIndex + 1);
                    }
                }
                return substitution;
            }
        };
    };
    var splitStringTransformer = function splitStringTransformer(splitBy) {
        return {
            onSubstitution: function onSubstitution(substitution, resultSoFar) {
                {
                    if (typeof substitution === "string" && substitution.includes(splitBy)) {
                        substitution = substitution.split(splitBy);
                    }
                }
                return substitution;
            }
        };
    };
    var isValidValue = function isValidValue(x) {
        return x != null && !Number.isNaN(x) && typeof x !== "boolean";
    };
    var removeNonPrintingValuesTransformer = function removeNonPrintingValuesTransformer() {
        return {
            onSubstitution: function onSubstitution(substitution) {
                if (Array.isArray(substitution)) {
                    return substitution.filter(isValidValue);
                }
                if (isValidValue(substitution)) {
                    return substitution;
                }
                return "";
            }
        };
    };
    new TemplateTag(inlineArrayTransformer({
        separator: ","
    }), stripIndentTransformer, trimResultTransformer);
    new TemplateTag(inlineArrayTransformer({
        separator: ",",
        conjunction: "and"
    }), stripIndentTransformer, trimResultTransformer);
    new TemplateTag(inlineArrayTransformer({
        separator: ",",
        conjunction: "or"
    }), stripIndentTransformer, trimResultTransformer);
    new TemplateTag(splitStringTransformer("\n"), removeNonPrintingValuesTransformer, inlineArrayTransformer, stripIndentTransformer, trimResultTransformer);
    new TemplateTag(splitStringTransformer("\n"), inlineArrayTransformer, stripIndentTransformer, trimResultTransformer, replaceSubstitutionTransformer(/&/g, "&amp;"), replaceSubstitutionTransformer(/</g, "&lt;"), replaceSubstitutionTransformer(/>/g, "&gt;"), replaceSubstitutionTransformer(/"/g, "&quot;"), replaceSubstitutionTransformer(/'/g, "&#x27;"), replaceSubstitutionTransformer(/`/g, "&#x60;"));
    new TemplateTag(replaceResultTransformer(/(?:\n(?:\s*))+/g, " "), trimResultTransformer);
    new TemplateTag(replaceResultTransformer(/(?:\n\s*)/g, ""), trimResultTransformer);
    new TemplateTag(inlineArrayTransformer({
        separator: ","
    }), replaceResultTransformer(/(?:\s+)/g, " "), trimResultTransformer);
    new TemplateTag(inlineArrayTransformer({
        separator: ",",
        conjunction: "or"
    }), replaceResultTransformer(/(?:\s+)/g, " "), trimResultTransformer);
    new TemplateTag(inlineArrayTransformer({
        separator: ",",
        conjunction: "and"
    }), replaceResultTransformer(/(?:\s+)/g, " "), trimResultTransformer);
    new TemplateTag(inlineArrayTransformer, stripIndentTransformer, trimResultTransformer);
    new TemplateTag(inlineArrayTransformer, replaceResultTransformer(/(?:\s+)/g, " "), trimResultTransformer);
    var stripIndent = new TemplateTag(stripIndentTransformer, trimResultTransformer);
    new TemplateTag(stripIndentTransformer("all"), trimResultTransformer);
    let barEl;
    let timeId;
    function init() {
        const div = create("div");
        div.classList.add("progress");
        div.setAttribute("role", "progressbar");
        div.setAttribute("aria-valuemin", "0");
        div.setAttribute("aria-valuemax", "100");
        div.setAttribute("aria-label", "Loading...");
        appendTo(body, div);
        barEl = div;
    }
    function progressbar(info) {
        const {loaded: loaded, total: total, step: step} = info;
        let num;
        !barEl && init();
        if (typeof step !== "undefined") {
            num = parseInt(barEl.style.width || 0, 10) + step;
            num = num > 80 ? 80 : num;
        } else {
            num = Math.floor(loaded / total * 100);
        }
        barEl.style.opacity = 1;
        barEl.style.width = num >= 95 ? "100%" : num + "%";
        barEl.setAttribute("aria-valuenow", num >= 95 ? 100 : num);
        if (num >= 95) {
            clearTimeout(timeId);
            timeId = setTimeout((_ => {
                barEl.style.opacity = 0;
                barEl.style.width = "0%";
                barEl.removeAttribute("aria-valuenow");
            }), 200);
        }
    }
    const cache = {};
    function get(url, hasBar = false, headers = {}) {
        const xhr = new XMLHttpRequest;
        const cached = cache[url];
        if (cached) {
            return {
                then: cb => cb(cached.content, cached.opt, cached.response),
                abort: noop
            };
        }
        xhr.open("GET", url);
        for (const i of Object.keys(headers)) {
            xhr.setRequestHeader(i, headers[i]);
        }
        xhr.send();
        return {
            then(success, error = noop) {
                const getResponseStatus = event => ({
                    ok: event.target.status >= 200 && event.target.status < 300,
                    status: event.target.status,
                    statusText: event.target.statusText
                });
                if (hasBar) {
                    const id = setInterval((_ => progressbar({
                        step: Math.floor(Math.random() * 5 + 1)
                    })), 500);
                    xhr.addEventListener("progress", progressbar);
                    xhr.addEventListener("loadend", (evt => {
                        progressbar(evt);
                        clearInterval(id);
                    }));
                }
                xhr.addEventListener("error", (event => {
                    error(event, getResponseStatus(event));
                }));
                xhr.addEventListener("load", (event => {
                    const target = event.target;
                    if (target.status >= 400) {
                        error(event, getResponseStatus(event));
                    } else {
                        if (typeof target.response !== "string") {
                            throw new TypeError("Unsupported content type.");
                        }
                        const result = cache[url] = {
                            content: target.response,
                            opt: {
                                updatedAt: xhr.getResponseHeader("last-modified") ?? ""
                            },
                            response: getResponseStatus(event)
                        };
                        success(result.content, result.opt, result.response);
                    }
                }));
            },
            abort: _ => xhr.readyState !== 4 && xhr.abort()
        };
    }
    const cached = {};
    function extractFragmentContent(text, fragment, fullLine) {
        if (!fragment) {
            return text;
        }
        let fragmentRegex = `(?:###|\\/\\/\\/)\\s*\\[${fragment}\\]`;
        const contentRegex = `[\\s\\S]*?`;
        if (fullLine) {
            fragmentRegex = `.*${fragmentRegex}.*\n`;
        }
        const pattern = new RegExp(`(?:${fragmentRegex})(${contentRegex})(?:${fragmentRegex})`);
        const match = text.match(pattern);
        return stripIndent((match || [])[1] || "").trim();
    }
    function walkFetchEmbed({embedTokens: embedTokens, compile: compile, fetch: fetch, frontMatter: frontMatter}, cb) {
        if (!embedTokens.length) {
            return cb({});
        }
        const processStep = step => {
            const currentToken = embedTokens[step];
            const next = text => {
                let embedToken;
                if (text) {
                    if (currentToken.embed.type === "markdown") {
                        let path = currentToken.embed.url.split("/");
                        path.pop();
                        path = path.join("/");
                        text = text.replace(/\[([^[\]]+)\]\(([^)]+)\)/g, (x => {
                            const linkBeginIndex = x.indexOf("(");
                            if (x.slice(linkBeginIndex, linkBeginIndex + 2) === "(.") {
                                return x.substring(0, linkBeginIndex) + `(${window.location.protocol}//${window.location.host}${path}/` + x.substring(linkBeginIndex + 1, x.length - 1) + ")";
                            }
                            return x;
                        }));
                        const frontMatterInstalled = frontMatter?.installed;
                        if (frontMatterInstalled) {
                            text = frontMatter?.parseMarkdown(text);
                        }
                        if (currentToken.embed.fragment) {
                            text = extractFragmentContent(text, currentToken.embed.fragment, currentToken.embed.omitFragmentLine);
                        }
                        embedToken = compile.lexer(text);
                    } else if (currentToken.embed.type === "code") {
                        if (currentToken.embed.fragment) {
                            text = extractFragmentContent(text, currentToken.embed.fragment, currentToken.embed.omitFragmentLine);
                        }
                        embedToken = compile.lexer("```" + currentToken.embed.lang + "\n" + text.replace(/`/g, "@DOCSIFY_QM@") + "\n```\n");
                    } else if (currentToken.embed.type === "mermaid") {
                        embedToken = [ {
                            type: "html",
                            text: `<div class="mermaid">\n${text}\n</div>`
                        } ];
                        embedToken.links = {};
                    } else {
                        embedToken = [ {
                            type: "html",
                            text: text
                        } ];
                        embedToken.links = {};
                    }
                }
                cb({
                    token: currentToken,
                    embedToken: embedToken,
                    rowIndex: currentToken.rowIndex,
                    cellIndex: currentToken.cellIndex,
                    tokenRef: currentToken.tokenRef
                });
                if (step + 1 >= embedTokens.length) {
                    cb({});
                } else {
                    processStep(step + 1);
                }
            };
            if (currentToken.embed.url) {
                get(currentToken.embed.url).then(next, (() => next()));
            } else {
                next(currentToken.embed.html);
            }
        };
        processStep(0);
    }
    function prerenderEmbed({compiler: compiler, raw: raw = "", fetch: fetch}, done) {
        const hit = cached[raw];
        if (hit) {
            const copy = hit.slice();
            copy.links = hit.links;
            return done(copy);
        }
        const compile = compiler._marked;
        const frontMatter = compiler.config.frontMatter;
        let tokens = compile.lexer(raw);
        const embedTokens = [];
        const links = tokens.links;
        tokens.forEach(((token, index) => {
            if (token.type === "paragraph") {
                (token.tokens || []).forEach(((inlineToken, inlineIndex) => {
                    if (inlineToken.type !== "link") {
                        return;
                    }
                    const embed = compiler.compileEmbed(inlineToken.href, inlineToken.title);
                    if (embed) {
                        embedTokens.push({
                            index: index,
                            tokenRef: token,
                            inlineIndex: inlineIndex,
                            embed: embed
                        });
                    }
                }));
            } else if (token.type === "table") {
                token.rows.forEach(((row, rowIndex) => {
                    row.forEach(((cell, cellIndex) => {
                        (cell.tokens || []).forEach(((inlineToken, inlineIndex) => {
                            if (inlineToken.type !== "link") {
                                return;
                            }
                            const embed = compiler.compileEmbed(inlineToken.href, inlineToken.title);
                            if (embed) {
                                embedTokens.push({
                                    index: index,
                                    tokenRef: token,
                                    rowIndex: rowIndex,
                                    cellIndex: cellIndex,
                                    inlineIndex: inlineIndex,
                                    embed: embed
                                });
                            }
                        }));
                    }));
                }));
            }
        }));
        const moves = [];
        const tokenInsertState = new WeakMap;
        walkFetchEmbed({
            compile: compile,
            embedTokens: embedTokens,
            fetch: fetch,
            frontMatter: frontMatter
        }, (({embedToken: embedToken, token: token, rowIndex: rowIndex, cellIndex: cellIndex, tokenRef: tokenRef}) => {
            if (token && embedToken) {
                Object.assign(links, embedToken.links);
                if (typeof rowIndex === "number" && typeof cellIndex === "number") {
                    const cell = tokenRef.rows[rowIndex][cellIndex];
                    if (typeof token.inlineIndex === "number") {
                        cell.embedTokenMap ||= {};
                        const existing = cell.embedTokenMap[token.inlineIndex];
                        cell.embedTokenMap[token.inlineIndex] = existing ? existing.concat(embedToken) : embedToken;
                    }
                    if (cell.embedTokens && cell.embedTokens.length) {
                        cell.embedTokens = cell.embedTokens.concat(embedToken);
                    } else {
                        cell.embedTokens = embedToken;
                    }
                } else if (tokenRef.type === "paragraph") {
                    if (typeof token.inlineIndex === "number") {
                        tokenRef.embedTokenMap ||= {};
                        const existing = tokenRef.embedTokenMap[token.inlineIndex];
                        tokenRef.embedTokenMap[token.inlineIndex] = existing ? existing.concat(embedToken) : embedToken;
                    }
                    if (tokenRef.embedTokens && tokenRef.embedTokens.length) {
                        tokenRef.embedTokens = tokenRef.embedTokens.concat(embedToken);
                    } else {
                        tokenRef.embedTokens = embedToken;
                    }
                } else {
                    const state = tokenInsertState.get(tokenRef);
                    if (state) {
                        const insertAt = state.nextIndex;
                        tokens = tokens.slice(0, insertAt).concat(embedToken, tokens.slice(insertAt));
                        moves.push({
                            start: insertAt,
                            delta: embedToken.length
                        });
                        state.nextIndex = insertAt + embedToken.length;
                    } else {
                        let index = token.index;
                        moves.forEach((pos => {
                            if (index > pos.start) {
                                index += pos.delta;
                            }
                        }));
                        tokens = tokens.slice(0, index).concat(embedToken, tokens.slice(index + 1));
                        moves.push({
                            start: index,
                            delta: embedToken.length - 1
                        });
                        tokenInsertState.set(tokenRef, {
                            nextIndex: index + embedToken.length
                        });
                    }
                }
            } else if (!token) {
                cached[raw] = tokens.concat();
                tokens.links = cached[raw].links = links;
                done(tokens);
            }
        }));
    }
    function Render(Base) {
        return class Render extends Base {
            compiler;
            #vueGlobalData;
            #addTextAsTitleAttribute(cssSelector) {
                findAll(cssSelector).forEach((elm => {
                    const e = elm;
                    if (!e.title && e.innerText) {
                        e.title = e.innerText;
                    }
                }));
            }
            #normalizeSidebarPageLinks(sidebarNavEl) {
                findAll(sidebarNavEl, "li > p").forEach((paragraph => {
                    const link = paragraph.firstElementChild;
                    const onlyContainsLink = [ ...paragraph.childNodes ].every((node => node === link || node.nodeType === 3 && !node.textContent?.trim()));
                    if (!paragraph.attributes.length && paragraph.children.length === 1 && link?.tagName === "A" && onlyContainsLink) {
                        paragraph.replaceWith(link);
                    }
                }));
            }
            #executeScript() {
                const script = findAll(".markdown-section>script").filter((s => !/template/.test(s.type)))[0];
                if (!script) {
                    return false;
                }
                const code = script.innerText.trim();
                if (!code) {
                    return false;
                }
                new Function(code)();
            }
            #formatUpdated(html, updated, fn) {
                updated = typeof fn === "function" ? fn(updated) : typeof fn === "string" ? tinydate(fn)(new Date(updated)) : updated;
                return html.replace(/{docsify-updated}/g, updated);
            }
            #renderMain(html) {
                const docsifyConfig = this.config;
                const markdownElm = find(".markdown-section");
                const vueVersion = "Vue" in window && window.Vue.version && Number(window.Vue.version.charAt(0));
                const isMountedVue = elm => {
                    const isVue2 = Boolean(elm.__vue__ && elm.__vue__._isVue);
                    const isVue3 = Boolean(elm._vnode && elm._vnode.__v_skip);
                    return isVue2 || isVue3;
                };
                if ("Vue" in window) {
                    const mountedElms = findAll(".markdown-section > *").filter((elm => isMountedVue(elm)));
                    for (const mountedElm of mountedElms) {
                        if (vueVersion === 2) {
                            mountedElm.__vue__?.$destroy?.();
                        } else if (vueVersion === 3) {
                            mountedElm.__vue_app__?.unmount();
                        }
                    }
                }
                setHTML(markdownElm, html);
                if (docsifyConfig.executeScript || "Vue" in window && docsifyConfig.executeScript !== false) {
                    this.#executeScript();
                }
                if ("Vue" in window) {
                    const vueGlobalOptions = docsifyConfig.vueGlobalOptions || {};
                    const vueMountData = [];
                    const vueComponentNames = Object.keys(docsifyConfig.vueComponents || {});
                    if (vueVersion === 2 && vueComponentNames.length) {
                        vueComponentNames.forEach((name => {
                            const isNotRegistered = !window.Vue.options.components[name];
                            if (isNotRegistered) {
                                window.Vue.component(name, docsifyConfig.vueComponents[name]);
                            }
                        }));
                    }
                    if (!this.#vueGlobalData && vueGlobalOptions.data && typeof vueGlobalOptions.data === "function") {
                        this.#vueGlobalData = vueGlobalOptions.data();
                    }
                    vueMountData.push(...Object.keys(docsifyConfig.vueMounts || {}).map((cssSelector => [ find(markdownElm, cssSelector), docsifyConfig.vueMounts[cssSelector] ])).filter((([elm, vueConfig]) => elm)));
                    const reHasBraces = /{{2}[^{}]*}{2}/;
                    const reHasDirective = /<[^>/]+\s([@:]|v-)[\w-:.[\]]+[=>\s]/;
                    vueMountData.push(...findAll(".markdown-section > *").filter((elm => !vueMountData.some((([e, c]) => e === elm)))).filter((elm => {
                        const selector = vueComponentNames.join(",");
                        const hasComponents = selector ? Boolean(elm.querySelector(selector)) : false;
                        const isVueMount = elm.tagName.toLowerCase() in (docsifyConfig.vueComponents || {}) || hasComponents || reHasBraces.test(elm.outerHTML) || reHasDirective.test(elm.outerHTML);
                        return isVueMount;
                    })).map((elm => {
                        const vueConfig = {
                            ...vueGlobalOptions
                        };
                        if (this.#vueGlobalData) {
                            vueConfig.data = () => this.#vueGlobalData;
                        }
                        return [ elm, vueConfig ];
                    })));
                    if (vueMountData.length === 0) {
                        return;
                    }
                    for (const [mountElm, vueConfig] of vueMountData) {
                        const isVueAttr = "data-isvue";
                        const isSkipElm = mountElm.matches("pre, :not([v-template]):has(pre), script") || isMountedVue(mountElm) || mountElm.querySelector(`[${isVueAttr}]`);
                        if (!isSkipElm) {
                            mountElm.setAttribute(isVueAttr, "");
                            if (vueVersion === 2) {
                                vueConfig.el = undefined;
                                new window.Vue(vueConfig).$mount(mountElm);
                            } else if (vueVersion === 3) {
                                const app = window.Vue.createApp(vueConfig);
                                vueComponentNames.forEach((name => {
                                    const config = docsifyConfig.vueComponents[name];
                                    app.component(name, config);
                                }));
                                app.mount(mountElm);
                            }
                        }
                    }
                }
            }
            #renderNameLink(vm) {
                const el = getNode(".app-name-link");
                const nameLink = vm.config.nameLink;
                const path = vm.route.path;
                if (!el) {
                    return;
                }
                if (isPrimitive(vm.config.nameLink)) {
                    el.setAttribute("href", nameLink);
                } else if (typeof nameLink === "object") {
                    const match = Object.keys(nameLink).filter((key => path.indexOf(key) > -1))[0];
                    el.setAttribute("href", nameLink[match]);
                }
            }
            #renderSkipLink(vm) {
                const {skipLink: skipLink} = vm.config;
                if (skipLink !== false) {
                    const el = getNode("#skip-to-content");
                    let skipLinkText = typeof skipLink === "string" ? skipLink : "Skip to main content";
                    if (skipLink?.constructor === Object) {
                        const matchingPath = Object.keys(skipLink).find((path => vm.route.path.startsWith(path.startsWith("/") ? path : `/${path}`)));
                        const matchingText = matchingPath && skipLink[matchingPath];
                        skipLinkText = matchingText || skipLinkText;
                    }
                    if (el) {
                        el.innerHTML = skipLinkText;
                    } else {
                        const html = `<button type="button" id="skip-to-content" class="primary">${skipLinkText}</button>`;
                        body.insertAdjacentHTML("afterbegin", html);
                    }
                }
            }
            _renderSidebar(text) {
                const {collapseSidebarGroups: collapseSidebarGroups, collapsibleSidebarGroups: collapsibleSidebarGroups, maxLevel: maxLevel, subMaxLevel: subMaxLevel, loadSidebar: loadSidebar, hideSidebar: hideSidebar} = this.config;
                const sidebarEl = getNode("aside.sidebar");
                const sidebarNavEl = getNode(".sidebar-nav");
                const sidebarToggleEl = getNode("button.sidebar-toggle");
                if (hideSidebar) {
                    sidebarEl?.remove();
                    sidebarToggleEl?.remove();
                    return null;
                }
                if (!this.compiler) {
                    throw new Error("Compiler is not initialized");
                }
                const sidebarGroupStates = new Map(findAll(sidebarNavEl, 'li.group > .group-toggle[role="button"][data-group-id]').map((elm => [ elm.getAttribute("data-group-id"), elm.closest("li")?.classList.contains("collapse") ])));
                setHTML(".sidebar-nav", this.compiler.sidebar(text, maxLevel));
                this.#normalizeSidebarPageLinks(sidebarNavEl);
                sidebarToggleEl.setAttribute("aria-expanded", String(!isMobile()));
                const activeEl = findLinkByHref(sidebarNavEl, this.router.toURL(this.route.path), "a");
                this.#addTextAsTitleAttribute(".sidebar-nav a");
                if (loadSidebar && activeEl) {
                    const activeItem = activeEl.closest("li");
                    activeItem?.insertAdjacentHTML("beforeend", this.compiler.subSidebar(subMaxLevel) || "");
                    if (activeItem?.querySelector(":scope > .app-sub-sidebar")) {
                        activeEl.setAttribute("aria-expanded", "true");
                    }
                } else {
                    this.compiler.resetToc();
                }
                this._bindEventOnRendered(activeEl);
                const pageLinks = findAll(sidebarNavEl, 'li > a:not(.section-link, [target="_blank"])');
                const pageLinkGroups = findAll(sidebarEl, "li").filter((elm => elm.querySelector(":scope > ul") && !elm.querySelector(":scope > a")));
                pageLinks.forEach((elm => {
                    elm.classList.add("page-link");
                }));
                pageLinkGroups.forEach((elm => {
                    elm.classList.add("group");
                    let groupTitle = [ ...elm.children ].find((child => child.tagName === "P" && !child.querySelector("a")));
                    const styledGroupTitle = groupTitle && !groupTitle.children.length ? groupTitle : null;
                    if (!groupTitle) {
                        const sublist = [ ...elm.children ].find((child => child.tagName === "UL"));
                        const titleNodes = [];
                        for (const child of elm.childNodes) {
                            if (child === sublist) {
                                break;
                            }
                            titleNodes.push(child);
                        }
                        if (sublist && titleNodes.some((node => node.textContent?.trim()))) {
                            const newGroupTitle = document.createElement("p");
                            titleNodes.forEach((node => newGroupTitle.append(node)));
                            groupTitle = newGroupTitle;
                            elm.insertBefore(newGroupTitle, sublist);
                        }
                    }
                    styledGroupTitle?.classList.add("group-title");
                    const rootList = elm.parentElement;
                    if (collapsibleSidebarGroups && groupTitle && rootList?.parentElement === sidebarNavEl) {
                        const groupId = `${[ ...sidebarNavEl.children ].indexOf(rootList)}:${[ ...rootList.children ].indexOf(elm)}`;
                        const isCollapsed = sidebarGroupStates.get(groupId) ?? collapseSidebarGroups;
                        elm.classList.toggle("collapse", isCollapsed);
                        groupTitle.classList.add("group-toggle");
                        groupTitle.setAttribute("data-group-id", groupId);
                        groupTitle.setAttribute("role", "button");
                        groupTitle.setAttribute("tabindex", "0");
                        groupTitle.setAttribute("aria-expanded", String(!isCollapsed));
                    }
                }));
            }
            _bindEventOnRendered(activeEl) {
                const {autoHeader: autoHeader} = this.config;
                this.onRender();
                if (autoHeader && activeEl) {
                    const main = getNode("#main");
                    const hasH1 = main.querySelector("h1");
                    if (!hasH1) {
                        const h1HTML = this.compiler.header(activeEl.innerText, 1);
                        const h1Node = create("div", h1HTML).firstElementChild;
                        if (h1Node) {
                            before(main, h1Node);
                        }
                    }
                }
            }
            _renderNav(text) {
                if (!text) {
                    return;
                }
                const html = this.compiler.compile(text);
                [ ".app-nav", ".app-nav-merged" ].forEach((selector => {
                    setHTML(selector, html);
                    if (this.config.navbarPreservePath) {
                        this.#appendNavbarPath(selector);
                    }
                    this.#addTextAsTitleAttribute(`${selector} a`);
                }));
            }
            #appendNavbarPath(selector) {
                const nav = find(selector);
                if (!nav) {
                    return;
                }
                const links = findAll(nav, "a").reduce(((links, link) => {
                    const anchor = link;
                    const href = anchor.getAttribute("href");
                    if (!href || isExternal(anchor.href) || href.startsWith("#") && !href.startsWith("#/")) {
                        return links;
                    }
                    const route = this.router.parse(href);
                    const path = cleanPath(`/${route.path}`);
                    if (route.query.id || path !== "/" && !path.endsWith("/")) {
                        return links;
                    }
                    links.push({
                        link: anchor,
                        path: path,
                        query: route.query
                    });
                    return links;
                }), []);
                const currentPath = cleanPath(`/${this.route.path}`);
                const currentRoot = links.filter((({path: path}) => currentPath.startsWith(path))).sort(((a, b) => b.path.length - a.path.length))[0];
                if (!currentRoot) {
                    return;
                }
                const suffix = currentPath.slice(currentRoot.path.length);
                links.forEach((({link: link, path: path, query: query}) => {
                    link.setAttribute("href", this.router.toURL(`${path}${suffix}`, query));
                }));
            }
            _renderMain(text, opt = {}, next) {
                const {response: response} = this.route;
                if (response && !response.ok && (!text || response.status !== 404)) {
                    text = `# ${response.status} - ${response.statusText}`;
                }
                this.callHook("beforeEach", text, (result => {
                    let html;
                    const callback = () => {
                        if (opt.updatedAt) {
                            html = this.#formatUpdated(html, opt.updatedAt, this.config.formatUpdated);
                        }
                        this.callHook("afterEach", html, (hookData => {
                            this.#renderMain(hookData);
                            next();
                        }));
                    };
                    if (this.isHTML) {
                        html = this.result = text;
                        callback();
                    } else {
                        prerenderEmbed({
                            compiler: this.compiler,
                            raw: result,
                            fetch: undefined
                        }, (tokens => {
                            html = this.compiler.compile(tokens);
                            callback();
                        }));
                    }
                }));
            }
            _renderCover(text, coverOnly) {
                const el = getNode(".cover");
                const rootElm = document.documentElement;
                const coverBg = getComputedStyle(rootElm).getPropertyValue("--cover-bg");
                getNode("main").classList[coverOnly ? "add" : "remove"]("hidden");
                if (!text) {
                    el.classList.remove("show");
                    return;
                }
                el.classList.add("show");
                let html = this.coverIsHTML ? text : this.compiler.cover(text);
                if (!coverBg) {
                    const mdBgMatch = html.trim().match('<p><img.*?data-origin="(.*?)".*?alt="(.*?)"[^>]*?>([^<]*?)</p>$');
                    let mdCoverBg;
                    if (mdBgMatch) {
                        const [bgMatch, bgValue, bgType] = mdBgMatch;
                        if (bgType === "color") {
                            mdCoverBg = bgValue;
                        } else {
                            const path = !isAbsolutePath(bgValue) ? getPath(this.router.getBasePath(), bgValue) : bgValue;
                            mdCoverBg = `center center / cover url(${path})`;
                        }
                        html = html.replace(bgMatch, "");
                    } else {
                        const degrees = Math.round(Math.random() * 120 / 2);
                        let hue1 = Math.round(Math.random() * 360);
                        let hue2 = Math.round(Math.random() * 360);
                        if (Math.abs(hue1 - hue2) < 50) {
                            const hueShift = Math.round(Math.random() * 25) + 25;
                            hue1 = Math.max(hue1, hue2) + hueShift;
                            hue2 = Math.min(hue1, hue2) - hueShift;
                        }
                        if (window?.CSS?.supports("color", "oklch(0 0 0 / 1%)")) {
                            const l = 90;
                            const c = 20;
                            mdCoverBg = `linear-gradient(\n              ${degrees}deg,\n              oklch(${l}% ${c}% ${hue1}) 0%,\n              oklch(${l}% ${c}% ${hue2}) 100%\n            )`.replace(/\s+/g, " ");
                        } else {
                            const s = 100;
                            const l = 85;
                            const o = 100;
                            mdCoverBg = `linear-gradient(\n              ${degrees}deg,\n              hsl(${hue1} ${s}% ${l}% / ${o}%) 0%,\n              hsl(${hue2} ${s}% ${l}% / ${o}%) 100%\n            )`.replace(/\s+/g, " ");
                        }
                    }
                    rootElm.style.setProperty("--cover-bg", mdCoverBg);
                }
                setHTML(".cover-main", html);
                findAll(".cover-main > p:last-of-type > a:not([class])").forEach((elm => {
                    const buttonType = elm.matches(":first-child") ? "primary" : "secondary";
                    elm.classList.add("button", buttonType);
                }));
            }
            _updateRender() {
                this.#renderNameLink(this);
                this.#renderSkipLink(this);
            }
            initRender() {
                const config = this.config;
                this.compiler = new Compiler(config, this.router);
                window.__current_docsify_compiler__ = this.compiler;
                const id = config.el || "#app";
                const el = find(id);
                if (el) {
                    let html = "";
                    if (config.repo) {
                        html += corner(config.repo, config.cornerExternalLinkTarget);
                    }
                    if (config.coverpage) {
                        html += cover();
                    }
                    if (config.logo) {
                        const isBase64 = /^data:image/.test(config.logo);
                        const isExternal = /(?:http[s]?:)?\/\//.test(config.logo);
                        const isRelative = /^\./.test(config.logo);
                        if (!isBase64 && !isExternal && !isRelative) {
                            config.logo = getPath(this.router.getBasePath(), config.logo);
                        }
                    }
                    html += main(config);
                    setHTML(el, html, true);
                } else {
                    this.rendered = true;
                }
                if (config.loadNavbar) {
                    const navEl = find("nav") || create("nav");
                    const isMergedSidebar = config.mergeNavbar;
                    navEl.classList.add("app-nav");
                    navEl.setAttribute("aria-label", "secondary");
                    body.prepend(navEl);
                    if (isMergedSidebar) {
                        const mergedNavEl = create("div");
                        const sidebarEl = find(".sidebar");
                        const sidebarNavEl = find(".sidebar-nav");
                        mergedNavEl?.classList.add("app-nav-merged");
                        sidebarEl?.insertBefore(mergedNavEl, sidebarNavEl);
                    }
                }
                if (config.themeColor) {
                    const themeNode = create("div", theme(config.themeColor)).firstElementChild;
                    if (themeNode) {
                        $$1.head.appendChild(themeNode);
                    }
                }
                this._updateRender();
                body.classList.add("ready");
            }
        };
    }
    function Fetch(Base) {
        return class Fetch extends Base {
            #loadNested(path, qs, file, next, vm, first) {
                path = first ? path : path.replace(/\/$/, "");
                path = getParentPath(path);
                if (!path) {
                    next("");
                    return;
                }
                get(vm.router.getFile(path + file) + qs, false, vm.config.requestHeaders).then(next, (_error => this.#loadNested(path, qs, file, next, vm)));
            }
            #last;
            #abort=() => this.#last && this.#last.abort && this.#last.abort();
            #request=(url, requestHeaders) => {
                this.#abort();
                this.#last = get(url, true, requestHeaders);
                return this.#last;
            };
            #get404Path=(path, config) => {
                const {notFoundPage: notFoundPage, ext: ext} = config;
                const defaultPath = "_404" + (ext || ".md");
                let key;
                let path404;
                switch (typeof notFoundPage) {
                  case "boolean":
                    path404 = defaultPath;
                    break;

                  case "string":
                    path404 = notFoundPage;
                    break;

                  case "object":
                    key = Object.keys(notFoundPage).sort(((a, b) => b.length - a.length)).filter((k => path.match(new RegExp("^" + k))))[0];
                    path404 = key && notFoundPage[key] || defaultPath;
                    break;
                }
                return path404;
            };
            _loadSideAndNav(path, qs, loadSidebar, cb) {
                return () => {
                    const renderSidebar = result => {
                        this._renderSidebar(result);
                        cb();
                    };
                    if (!loadSidebar) {
                        renderSidebar(null);
                        return;
                    }
                    this.#loadNested(path, qs, loadSidebar, renderSidebar, this, true);
                };
            }
            _fetch(cb = noop) {
                const {query: query} = this.route;
                const {path: path} = this.route;
                if (isExternal(path)) {
                    history.replaceState(null, "", "#");
                    this.router.normalize();
                } else {
                    const qs = stringifyQuery(query, [ "id" ]);
                    const {loadNavbar: loadNavbar, requestHeaders: requestHeaders, loadSidebar: loadSidebar} = this.config;
                    const file = this.router.getFile(path);
                    this.isRemoteUrl = isExternal(file);
                    this.isHTML = /\.html$/g.test(file);
                    const contentFetched = (text, opt, response) => {
                        this.route.response = response;
                        this._renderMain(text, opt, this._loadSideAndNav(path, qs, loadSidebar, cb));
                    };
                    const contentFailedToFetch = (_error, response) => {
                        this.route.response = response;
                        this._fetchFallbackPage(path, qs, cb) || this._fetch404(file, qs, cb);
                    };
                    if (!this.isRemoteUrl) {
                        this.matchVirtualRoute(path).then((contents => {
                            if (typeof contents === "string") {
                                contentFetched(contents);
                            } else {
                                this.#request(file + qs, requestHeaders).then(contentFetched, contentFailedToFetch);
                            }
                        }));
                    } else {
                        this.#request(file + qs, requestHeaders).then(contentFetched, contentFailedToFetch);
                    }
                    loadNavbar && this.#loadNested(path, qs, loadNavbar, (text => this._renderNav(text)), this, true);
                }
            }
            _fetchCover() {
                const {coverpage: coverpage, requestHeaders: requestHeaders} = this.config;
                const query = this.route.query;
                const root = getParentPath(this.route.path);
                if (coverpage) {
                    let path = null;
                    const routePath = this.route.path;
                    if (typeof coverpage === "string") {
                        if (routePath === "/") {
                            path = coverpage;
                        }
                    } else if (Array.isArray(coverpage)) {
                        path = coverpage.indexOf(routePath) > -1 && "_coverpage";
                    } else {
                        const cover = coverpage[routePath];
                        path = cover === true ? "_coverpage" : cover;
                    }
                    const coverOnly = Boolean(path) && this.config.onlyCover;
                    if (path) {
                        path = this.router.getFile(root + path);
                        this.coverIsHTML = /\.html$/g.test(path);
                        get(path + stringifyQuery(query, [ "id" ]), false, requestHeaders).then((text => this._renderCover(text, coverOnly)));
                    } else {
                        this._renderCover(null, coverOnly);
                    }
                    return coverOnly;
                }
            }
            $fetch(cb = noop, onNavigate = this.onNavigate.bind(this)) {
                const done = () => {
                    this.callHook("doneEach");
                    cb();
                };
                const onlyCover = this._fetchCover();
                if (onlyCover) {
                    done();
                } else {
                    this._fetch((() => {
                        onNavigate();
                        done();
                    }));
                }
            }
            _fetchFallbackPage(path, qs, cb = noop) {
                const {requestHeaders: requestHeaders, fallbackLanguages: fallbackLanguages, fallbackDefaultLanguage: fallbackDefaultLanguage, loadSidebar: loadSidebar} = this.config;
                if (!fallbackLanguages) {
                    return false;
                }
                const local = path.split("/")[1];
                if (fallbackLanguages.indexOf(local) === -1) {
                    return false;
                }
                const newPath = this.router.getFile(path.replace(new RegExp(`^/${local}`), fallbackDefaultLanguage));
                const req = this.#request(newPath + qs, requestHeaders);
                req.then(((text, opt) => this._renderMain(text, opt, this._loadSideAndNav(path, qs, loadSidebar, cb))), (_error => this._fetch404(path, qs, cb)));
                return true;
            }
            _fetch404(path, qs, cb = noop) {
                const {loadSidebar: loadSidebar, requestHeaders: requestHeaders, notFoundPage: notFoundPage} = this.config;
                const fnLoadSideAndNav = this._loadSideAndNav(path, qs, loadSidebar, cb);
                if (notFoundPage) {
                    const path404 = this.#get404Path(path, this.config);
                    this.#request(this.router.getFile(path404), requestHeaders).then(((text, opt) => this._renderMain(text, opt, fnLoadSideAndNav)), (_error => this._renderMain(null, {}, fnLoadSideAndNav)));
                    return true;
                }
                this._renderMain(null, {}, fnLoadSideAndNav);
                return false;
            }
            initFetch() {
                this.$fetch((() => this.callHook("ready")));
            }
        };
    }
    function Events(Base) {
        return class Events extends Base {
            #intersectionObserver=new IntersectionObserver((() => {}));
            #isScrolling=false;
            #cancelAnchorScroll=noop;
            #title=$$1.title;
            initEvent() {
                const {topMargin: topMargin} = this.config;
                if (topMargin) {
                    const value = typeof topMargin === "number" ? `${topMargin}px` : topMargin;
                    document.documentElement.style.setProperty("--scroll-padding-top", value);
                }
                this.#initCover();
                this.#initSkipToContent();
                this.#initSidebar();
                this.#initSidebarToggle();
                this.#initKeyBindings();
            }
            #initCover() {
                const coverElm = find("section.cover");
                if (!coverElm) {
                    body.classList.add("sticky");
                    return;
                }
                const observer = new IntersectionObserver((entries => {
                    const isIntersecting = entries[0].isIntersecting;
                    const op = isIntersecting ? "remove" : "add";
                    body.classList[op]("sticky");
                }), {
                    threshold: .01
                });
                observer.observe(coverElm);
            }
            #initHeadings() {
                const headingElms = findAll("#main :where(h1, h2, h3, h4, h5, h6)");
                const headingsInView = new Set;
                let isInitialLoad = true;
                this.#intersectionObserver?.disconnect();
                this.#intersectionObserver = new IntersectionObserver((entries => {
                    if (isInitialLoad) {
                        isInitialLoad = false;
                        return;
                    }
                    if (this.#isScrolling) {
                        return;
                    }
                    for (const entry of entries) {
                        const op = entry.isIntersecting ? "add" : "delete";
                        headingsInView[op](entry.target);
                    }
                    let activeHeading;
                    if (headingsInView.size === 1) {
                        activeHeading = headingsInView.values().next().value;
                    } else if (headingsInView.size > 1) {
                        activeHeading = Array.from(headingsInView).reduce(((closest, current) => !closest || closest.compareDocumentPosition(current) & Node.DOCUMENT_POSITION_FOLLOWING ? current : closest), null);
                    }
                    if (activeHeading) {
                        const id = activeHeading.getAttribute("id");
                        const href = this.router.toURL(this.router.getCurrentPath(), {
                            id: id
                        });
                        const newSidebarActiveElm = this.#markSidebarActiveElm(href);
                        newSidebarActiveElm?.scrollIntoView({
                            behavior: "instant",
                            block: "nearest",
                            inline: "nearest"
                        });
                    }
                }), {
                    rootMargin: "0% 0% -50% 0%"
                });
                headingElms.forEach((elm => {
                    this.#intersectionObserver.observe(elm);
                }));
            }
            #initKeyBindings() {
                const {keyBindings: keyBindings} = this.config;
                const modifierKeys = [ "alt", "ctrl", "meta", "shift" ];
                if (keyBindings && keyBindings.constructor === Object) {
                    Object.values(keyBindings || []).forEach((bindingConfig => {
                        const {bindings: bindings} = bindingConfig;
                        if (!bindings) {
                            return;
                        }
                        bindingConfig.bindings = Array.isArray(bindings) ? bindings : [ bindings ];
                        bindingConfig.bindings = bindingConfig.bindings.map((keys => {
                            const sortedKeys = [ [], [] ];
                            if (typeof keys === "string") {
                                keys = keys.split("+");
                            }
                            keys.forEach((key => {
                                const isModifierKey = modifierKeys.includes(key);
                                const targetArray = sortedKeys[isModifierKey ? 0 : 1];
                                const newKeyValue = key.trim().toLowerCase();
                                targetArray.push(newKeyValue);
                            }));
                            sortedKeys.forEach((arr => arr.sort()));
                            return sortedKeys.flat();
                        }));
                    }));
                    on("keydown", (e => {
                        const isTextEntry = document.activeElement.matches("input, select, textarea");
                        if (isTextEntry) {
                            return;
                        }
                        const bindingConfigs = Object.values(keyBindings || []);
                        const matchingConfigs = bindingConfigs.filter((({bindings: bindings}) => bindings && bindings.some((keys => keys.every((k => modifierKeys.includes(k) && e[k + "Key"] || e.key === k || e.code.toLowerCase() === k || e.code.toLowerCase() === `key${k}`))))));
                        matchingConfigs.forEach((({callback: callback}) => {
                            e.preventDefault();
                            callback(e);
                        }));
                    }));
                }
            }
            #initSidebar() {
                const sidebarElm = document.querySelector(".sidebar");
                if (!sidebarElm) {
                    return;
                }
                window?.matchMedia?.(`(max-width: ${mobileBreakpoint})`).addEventListener("change", (evt => {
                    this.#toggleSidebar(!evt.matches);
                }));
                on(sidebarElm, "click", (({target: target}) => {
                    const groupToggle = target.closest('.group-toggle[role="button"]');
                    if (groupToggle) {
                        this.#toggleSidebarGroup(groupToggle);
                        return;
                    }
                    const linkElm = target.closest("a");
                    const linkParent = linkElm?.closest("li");
                    const hasSubSidebar = linkParent?.querySelector(".app-sub-sidebar");
                    if (hasSubSidebar) {
                        const isCollapsed = linkParent.classList.toggle("collapse");
                        linkElm?.setAttribute("aria-expanded", String(!isCollapsed));
                    }
                }));
                on(sidebarElm, "keydown", (event => {
                    const groupToggle = event.target.closest('.group-toggle[role="button"]');
                    if (groupToggle && (event.key === "Enter" || event.key === " ")) {
                        event.preventDefault();
                        this.#toggleSidebarGroup(groupToggle);
                    }
                }));
            }
            #toggleSidebarGroup(groupToggle) {
                const group = groupToggle.closest("li");
                if (!group) {
                    return;
                }
                const isCollapsed = group.classList.toggle("collapse");
                groupToggle.setAttribute("aria-expanded", String(!isCollapsed));
            }
            #initSidebarToggle() {
                const contentElm = find("main > .content");
                const toggleElm = find("button.sidebar-toggle");
                if (!toggleElm) {
                    return;
                }
                let lastContentFocusElm;
                on(contentElm, "focusin", (e => {
                    const focusAttr = "data-restore-focus";
                    lastContentFocusElm?.removeAttribute(focusAttr);
                    lastContentFocusElm = e.target;
                    lastContentFocusElm.setAttribute(focusAttr, "");
                }));
                on(toggleElm, "click", (e => {
                    e.stopPropagation();
                    this.#toggleSidebar();
                }));
            }
            #initSkipToContent() {
                const skipElm = document.querySelector("#skip-to-content");
                if (!skipElm) {
                    return;
                }
                skipElm.addEventListener("click", (evt => {
                    const focusElm = this.#focusContent();
                    evt.preventDefault();
                    focusElm?.scrollIntoView({
                        behavior: "smooth"
                    });
                }));
            }
            onRender() {
                const {name: name, pageTitleFormatter: pageTitleFormatter} = this.config;
                const currentPath = this.router.toURL(this.router.getCurrentPath());
                const currentSection = find(`.sidebar a[href='${currentPath}']`)?.getAttribute("title");
                const plainName = typeof pageTitleFormatter === "function" && typeof name === "string" ? pageTitleFormatter(name) : name ? name.replace(/<[^>]+>/g, "").trim() : name;
                const currentTitle = plainName ? currentSection ? `${currentSection} - ${plainName}` : plainName : currentSection;
                $$1.title = currentTitle || this.#title;
                this.#markAppNavActiveElm();
                this.#markSidebarCurrentPage();
                this.#initHeadings();
            }
            onNavigate(source, focusTarget) {
                const {auto2top: auto2top, topMargin: topMargin} = this.config;
                const {path: path, query: query} = this.route;
                const activeSidebarElm = this.#markSidebarActiveElm();
                if (source !== "history") {
                    if (query.id) {
                        const headingElm = find(`.markdown-section :where(h1, h2, h3, h4, h5, h6)[id="${query.id}"]`);
                        if (headingElm) {
                            this.#scrollToHeading(headingElm);
                        }
                    } else if (source === "navigate") {
                        if (auto2top) {
                            document.scrollingElement.scrollTop = topMargin ?? 0;
                        }
                    }
                }
                const isNavigate = source === "navigate";
                const hasId = "id" in query;
                const noSubSidebar = !activeSidebarElm?.querySelector(".app-sub-sidebar");
                const shouldCloseSidebar = path === "/" || isNavigate && (hasId || noSubSidebar);
                if (shouldCloseSidebar && isMobile()) {
                    this.#toggleSidebar(false);
                }
                if (hasId || isNavigate) {
                    const sidebarFocused = isNavigate && this.#focusSidebarNavigation(focusTarget);
                    if (!sidebarFocused) {
                        this.#focusContent();
                    }
                }
            }
            #focusContent(options = {}) {
                const settings = {
                    preventScroll: true,
                    ...options
                };
                const {query: query} = this.route;
                const focusEl = query.id ? find(`#${query.id}`) : find("#main :where(h1, h2, h3, h4, h5, h6)") || find("#main");
                if (focusEl) {
                    if (!focusEl.hasAttribute("tabindex")) {
                        focusEl.setAttribute("tabindex", "-1");
                        focusEl.setAttribute("data-added-tabindex", "true");
                    }
                    if (focusEl.hasAttribute("data-added-tabindex")) {
                        focusEl.scrollIntoView({
                            behavior: "smooth"
                        });
                    }
                    focusEl.focus(settings);
                }
                return focusEl;
            }
            #focusSidebarNavigation(target) {
                if (!target || isMobile()) {
                    return false;
                }
                const sidebarElm = find(".sidebar");
                if (!sidebarElm) {
                    return false;
                }
                const focusElm = findAll(sidebarElm, "a").find((linkElm => linkElm.classList.contains(target.className) && linkElm.href === target.href));
                if (!focusElm) {
                    return false;
                }
                focusElm.focus({
                    preventScroll: true
                });
                return true;
            }
            #markAppNavActiveElm() {
                const href = resolveHref(this.router.toURL(this.route.path));
                [ ".app-nav", ".app-nav-merged" ].forEach((selector => {
                    const navElm = find(selector);
                    if (!navElm) {
                        return;
                    }
                    const newActive = findAll(navElm, "a").sort(((a, b) => b.href.length - a.href.length)).find((a => href.includes(a.href)))?.closest("li");
                    const oldActive = find(navElm, "li.active");
                    if (newActive && newActive !== oldActive) {
                        oldActive?.classList.remove("active");
                        newActive.classList.add("active");
                    }
                }));
            }
            #markSidebarActiveElm(href) {
                href ??= this.router.toURL(this.router.getCurrentPath());
                const sidebar = find(".sidebar");
                if (!sidebar) {
                    return;
                }
                const matchingHref = stripUrlExceptId(href);
                const oldActive = find(sidebar, "li.active");
                const newActive = findLinkByHref(sidebar, matchingHref, ".sidebar-nav a")?.closest("li");
                if (newActive && newActive !== oldActive) {
                    oldActive?.classList.remove("active");
                    newActive.classList.add("active");
                }
                return newActive;
            }
            #markSidebarCurrentPage(href) {
                href ??= this.router.toURL(this.route.path);
                const sidebar = find(".sidebar");
                if (!sidebar) {
                    return;
                }
                const path = href?.split("?")[0];
                const oldPage = find(sidebar, "li[aria-current]");
                const newPage = path ? findLinkByHref(sidebar, path, ".sidebar-nav a")?.closest("li") : undefined;
                if (newPage && newPage !== oldPage) {
                    oldPage?.removeAttribute("aria-current");
                    newPage.setAttribute("aria-current", "page");
                }
                return newPage;
            }
            #toggleSidebar(force) {
                const sidebarElm = find(".sidebar");
                if (!sidebarElm) {
                    return;
                }
                const ariaElms = findAll('[aria-controls="__sidebar"]');
                const inertElms = findAll("body > *:not(main, script), main > .content");
                const isShow = sidebarElm.classList.toggle("show", force);
                ariaElms.forEach((toggleElm => {
                    const expanded = force ?? sidebarElm.classList.contains("show");
                    toggleElm.setAttribute("aria-expanded", String(expanded));
                    toggleElm.setAttribute("aria-label", expanded ? "Hide primary navigation" : "Show primary navigation");
                }));
                if (isShow && isMobile()) {
                    inertElms.forEach((elm => elm.setAttribute("inert", "")));
                } else {
                    inertElms.forEach((elm => elm.removeAttribute("inert")));
                }
                if (isShow) {
                    sidebarElm.focus();
                } else {
                    const restoreElm = document.querySelector("main > .content [data-restore-focus]");
                    if (restoreElm) {
                        restoreElm.focus({
                            preventScroll: true
                        });
                    }
                }
            }
            #scrollToHeading(headingElm) {
                this.#cancelAnchorScroll();
                const contentElm = find(".markdown-section");
                const userEvents = [ "keydown", "mousedown", "touchstart", "wheel" ];
                const timers = {};
                let animationFrame = 0;
                let correctionFrame = 0;
                let cancelled = false;
                let cancel = noop;
                let hasScrolled = false;
                let scrollScheduled = false;
                let remainingImages = 0;
                let cleanup = () => {};
                const imageListeners = [];
                const pendingImageCorrections = [];
                const removeUserListeners = () => {
                    userEvents.forEach((eventName => {
                        window.removeEventListener(eventName, cancel);
                    }));
                };
                const removeImageListeners = () => {
                    imageListeners.forEach((({image: image, eventName: eventName, listener: listener}) => {
                        image.removeEventListener(eventName, listener);
                    }));
                    imageListeners.length = 0;
                };
                const scrollToHeading = () => {
                    if (cancelled) {
                        return;
                    }
                    if (!document.contains(headingElm)) {
                        cancel();
                        return;
                    }
                    hasScrolled = true;
                    this.#watchNextScroll();
                    headingElm.scrollIntoView({
                        behavior: "smooth",
                        block: "start"
                    });
                    if (remainingImages === 0) {
                        cleanup();
                    }
                };
                const scheduleScroll = () => {
                    if (hasScrolled || scrollScheduled) {
                        return;
                    }
                    scrollScheduled = true;
                    clearTimeout(timers.wait);
                    animationFrame = requestAnimationFrame(scrollToHeading);
                };
                const scheduleCorrection = (image, previousHeight) => {
                    if (cancelled || !hasScrolled) {
                        return;
                    }
                    pendingImageCorrections.push({
                        image: image,
                        previousHeight: previousHeight
                    });
                    if (correctionFrame) {
                        return;
                    }
                    correctionFrame = requestAnimationFrame((() => {
                        correctionFrame = 0;
                        if (cancelled) {
                            return;
                        }
                        if (!document.contains(headingElm)) {
                            cleanup();
                            return;
                        }
                        let heightChange = 0;
                        for (const {image: image, previousHeight: previousHeight} of pendingImageCorrections) {
                            const isBeforeHeading = image.compareDocumentPosition(headingElm) & Node.DOCUMENT_POSITION_FOLLOWING;
                            const currentHeight = image.getBoundingClientRect().height;
                            if (isBeforeHeading) {
                                heightChange += currentHeight - previousHeight;
                            }
                        }
                        pendingImageCorrections.length = 0;
                        if (Math.abs(heightChange) < 1) {
                            if (remainingImages === 0) {
                                cleanup();
                            }
                            return;
                        }
                        const scrollingElm = document.scrollingElement;
                        if (!scrollingElm) {
                            cleanup();
                            return;
                        }
                        const scrollPaddingTop = parseFloat(getComputedStyle(scrollingElm).scrollPaddingTop) || 0;
                        const headingTop = headingElm.getBoundingClientRect().top;
                        const scrollAdjustment = headingTop - scrollPaddingTop;
                        if (Math.abs(scrollAdjustment) < 1) {
                            if (remainingImages === 0) {
                                cleanup();
                            }
                            return;
                        }
                        this.#watchNextScroll();
                        scrollingElm.scrollTop += scrollAdjustment;
                        if (remainingImages === 0) {
                            cleanup();
                        }
                    }));
                };
                cleanup = () => {
                    if (cancelled) {
                        return;
                    }
                    cancelled = true;
                    cancelAnimationFrame(animationFrame);
                    cancelAnimationFrame(correctionFrame);
                    clearTimeout(timers.wait);
                    removeImageListeners();
                    removeUserListeners();
                    this.#cancelAnchorScroll = noop;
                };
                cancel = cleanup;
                const waitForImages = () => {
                    const images = (contentElm ? Array.from(contentElm.querySelectorAll("img")) : []).filter((image => !image.complete && image.compareDocumentPosition(headingElm) & Node.DOCUMENT_POSITION_FOLLOWING));
                    if (!images.length) {
                        scheduleScroll();
                        return;
                    }
                    remainingImages = images.length;
                    const onImageSettled = (image, previousHeight) => {
                        remainingImages -= 1;
                        if (hasScrolled) {
                            scheduleCorrection(image, previousHeight);
                        } else if (remainingImages === 0) {
                            scheduleScroll();
                        }
                        if (remainingImages === 0 && hasScrolled && !correctionFrame) {
                            cleanup();
                        }
                    };
                    images.forEach((image => {
                        let settled = false;
                        const previousHeight = image.getBoundingClientRect().height;
                        const listener = () => {
                            if (settled) {
                                return;
                            }
                            settled = true;
                            onImageSettled(image, previousHeight);
                        };
                        image.addEventListener("load", listener, {
                            once: true
                        });
                        image.addEventListener("error", listener, {
                            once: true
                        });
                        imageListeners.push({
                            image: image,
                            eventName: "load",
                            listener: listener
                        }, {
                            image: image,
                            eventName: "error",
                            listener: listener
                        });
                    }));
                    timers.wait = setTimeout(scheduleScroll, 300);
                };
                userEvents.forEach((eventName => {
                    window.addEventListener(eventName, cancel, {
                        once: true,
                        passive: true
                    });
                }));
                waitForImages();
                this.#cancelAnchorScroll = cancel;
            }
            #watchNextScroll() {
                document.addEventListener("scroll", (() => {
                    this.#isScrolling = true;
                    if ("onscrollend" in window) {
                        document.addEventListener("scrollend", (() => this.#isScrolling = false), {
                            once: true
                        });
                    } else {
                        let scrollTimer;
                        const callback = () => {
                            clearTimeout(scrollTimer);
                            scrollTimer = setTimeout((() => {
                                document.removeEventListener("scroll", callback);
                                this.#isScrolling = false;
                            }), 100);
                        };
                        document.addEventListener("scroll", callback, false);
                        callback();
                    }
                }), {
                    once: true
                });
            }
        };
    }
    function makeExactMatcher(matcher) {
        const matcherWithBeginningOfInput = matcher.startsWith("^") ? matcher : `^${matcher}`;
        const matcherWithBeginningAndEndOfInput = matcherWithBeginningOfInput.endsWith("$") ? matcherWithBeginningOfInput : `${matcherWithBeginningOfInput}$`;
        return matcherWithBeginningAndEndOfInput;
    }
    function createNextFunction() {
        let storedCb = () => {};
        function next(value) {
            storedCb(value);
        }
        function onNext(cb) {
            storedCb = cb;
        }
        return [ next, onNext ];
    }
    function VirtualRoutes(Base) {
        return class VirtualRoutes extends Base {
            routes() {
                return this.config.routes || {};
            }
            matchVirtualRoute(path) {
                const virtualRoutes = this.routes();
                const virtualRoutePaths = Object.keys(virtualRoutes);
                let done = () => null;
                function asyncMatchNextRoute() {
                    const virtualRoutePath = virtualRoutePaths.shift();
                    if (!virtualRoutePath) {
                        return done(null);
                    }
                    const matcher = makeExactMatcher(virtualRoutePath);
                    const matched = path.match(matcher);
                    if (!matched) {
                        return asyncMatchNextRoute();
                    }
                    const virtualRouteContentOrFn = virtualRoutes[virtualRoutePath];
                    if (typeof virtualRouteContentOrFn === "string") {
                        const contents = virtualRouteContentOrFn;
                        return done(contents);
                    }
                    if (typeof virtualRouteContentOrFn === "function") {
                        const fn = virtualRouteContentOrFn;
                        const [next, onNext] = createNextFunction();
                        onNext((contents => {
                            if (typeof contents === "string") {
                                return done(contents);
                            } else if (contents === false) {
                                return done(null);
                            } else {
                                return asyncMatchNextRoute();
                            }
                        }));
                        if (fn.length <= 2) {
                            const returnedValue = fn(path, matched);
                            return next(returnedValue);
                        } else {
                            return fn(path, matched, next);
                        }
                    }
                    return asyncMatchNextRoute();
                }
                return {
                    then(cb) {
                        done = cb;
                        asyncMatchNextRoute();
                    }
                };
            }
        };
    }
    const currentScript = document.currentScript;
    const defaultDocsifyConfig = () => ({
        alias: {},
        auto2top: false,
        autoHeader: false,
        basePath: "",
        catchPluginErrors: true,
        collapseSidebarGroups: false,
        collapsibleSidebarGroups: false,
        cornerExternalLinkTarget: "_blank",
        coverpage: "",
        el: "#app",
        executeScript: null,
        ext: ".md",
        externalLinkRel: "noopener",
        externalLinkTarget: "_blank",
        fallbackLanguages: null,
        fallbackDefaultLanguage: "",
        formatUpdated: "",
        pageTitleFormatter: null,
        frontMatter: null,
        hideSidebar: false,
        homepage: "README.md",
        keyBindings: {},
        loadNavbar: null,
        loadSidebar: null,
        logo: false,
        markdown: null,
        maxLevel: 6,
        mergeNavbar: false,
        navbarPreservePath: false,
        name: "",
        nameLink: window.location.pathname,
        nativeEmoji: false,
        noCompileLinks: [],
        noEmoji: false,
        notFoundPage: false,
        onlyCover: false,
        plugins: [],
        relativePath: false,
        repo: "",
        requestHeaders: {},
        routerMode: "hash",
        routes: {},
        skipLink: "Skip to main content",
        sidebarPosition: "left",
        subMaxLevel: 0,
        vueComponents: {},
        vueGlobalOptions: {},
        vueMounts: {},
        get themeColor() {
            return this.__themeColor;
        },
        set themeColor(value) {
            if (value) {
                this.__themeColor = value;
                console.warn(stripIndent(`\n          $docsify.themeColor is deprecated as of v5. Use the "--theme-color" CSS property to customize your theme color.\n          <style>\n            :root {\n              --theme-color: deeppink;\n            }\n          </style>\n        `).trim());
            }
        },
        __themeColor: "",
        get topMargin() {
            return this.__topMargin;
        },
        set topMargin(value) {
            if (value) {
                this.__topMargin = value;
                console.warn(stripIndent(`\n          $docsify.topMargin is deprecated as of v5. Use the "--scroll-padding-top" CSS property to specify a scroll margin when using a sticky navbar.\n          <style>\n            :root {\n              --scroll-padding-top: 10px;\n            }\n          </style>\n        `).trim());
            }
        },
        __topMargin: 0
    });
    function config(vm, config = {}) {
        config = Object.assign(defaultDocsifyConfig(), window.$docsify, typeof window.$docsify === "function" ? window.$docsify(vm) : undefined, config);
        if (config.keyBindings !== false) {
            config.keyBindings = Object.assign({
                toggleSidebar: {
                    bindings: [ "\\" ],
                    callback(e) {
                        const toggleElm = document.querySelector(".sidebar-toggle-button");
                        if (toggleElm) {
                            toggleElm.click();
                        }
                    }
                }
            }, config.keyBindings);
        }
        const script = currentScript || Array.from(document.getElementsByTagName("script")).filter((n => /docsify\./.test(n.src)))[0];
        if (script) {
            for (const prop of Object.keys(config)) {
                const val = script.getAttribute("data-" + hyphenate(prop));
                if (isPrimitive(val)) {
                    console.warn(`DEPRECATION: data-* attributes on the docsify global script (f.e. ${"data-" + hyphenate(prop)}) are deprecated.`);
                    config[prop] = val === "" ? true : val;
                }
            }
        }
        if (config.loadSidebar === true) {
            config.loadSidebar = "_sidebar" + config.ext;
        }
        if (config.loadNavbar === true) {
            config.loadNavbar = "_navbar" + config.ext;
        }
        if (config.coverpage === true) {
            config.coverpage = "_coverpage" + config.ext;
        }
        if (config.name === true) {
            config.name = "";
        }
        return config;
    }
    function Lifecycle(Base) {
        return class Lifecycle extends Base {
            _hooks={};
            _lifecycle={};
            initLifecycle() {
                const hooks = [ "init", "mounted", "beforeEach", "afterEach", "doneEach", "ready" ];
                hooks.forEach((hook => {
                    const arr = this._hooks[hook] = [];
                    this._lifecycle[hook] = fn => arr.push(fn);
                }));
            }
            callHook(hookName, data, next = noop) {
                const queue = this._hooks[hookName];
                const catchPluginErrors = this.config.catchPluginErrors;
                const step = function(index) {
                    const hookFn = queue[index];
                    if (index >= queue.length) {
                        next(data);
                    } else if (typeof hookFn === "function") {
                        const errTitle = "Docsify plugin error";
                        if (hookFn.length === 2) {
                            try {
                                hookFn(data, (result => {
                                    data = result === undefined ? data : result;
                                    step(index + 1);
                                }));
                            } catch (err) {
                                if (catchPluginErrors) {
                                    console.error(errTitle, err);
                                } else {
                                    throw err;
                                }
                                step(index + 1);
                            }
                        } else {
                            try {
                                const result = hookFn(data);
                                data = result === undefined ? data : result;
                                step(index + 1);
                            } catch (err) {
                                if (catchPluginErrors) {
                                    console.error(errTitle, err);
                                } else {
                                    throw err;
                                }
                                step(index + 1);
                            }
                        }
                    } else {
                        step(index + 1);
                    }
                };
                step(0);
            }
        };
    }
    var util = Object.freeze({
        __proto__: null,
        cached: cached$1,
        cleanPath: cleanPath,
        findLinkByHref: findLinkByHref,
        getClickedLink: getClickedLink,
        getParentPath: getParentPath,
        getPath: getPath,
        getSidebarNavigationTarget: getSidebarNavigationTarget,
        hyphenate: hyphenate,
        isAbsolutePath: isAbsolutePath,
        isCurrentContextNavigation: isCurrentContextNavigation,
        isExternal: isExternal,
        isFn: isFn,
        isMobile: isMobile,
        isPrimitive: isPrimitive,
        mobileBreakpoint: mobileBreakpoint,
        noop: noop,
        parseQuery: parseQuery,
        removeParams: removeParams,
        replaceSlug: replaceSlug,
        resolveHref: resolveHref,
        resolvePath: resolvePath,
        stringifyQuery: stringifyQuery,
        stripUrlExceptId: stripUrlExceptId
    });
    class Docsify extends(Fetch(Events(Render(VirtualRoutes(Router(Lifecycle(Object))))))){
        config;
        constructor(conf = {}) {
            super();
            this.config = config(this, conf);
            this.initLifecycle();
            this.initPlugin();
            this.callHook("init");
            this.initRouter();
            this.initRender();
            this.initEvent();
            this.initFetch();
            this.callHook("mounted");
        }
        initPlugin() {
            this.config.plugins.forEach((fn => {
                try {
                    isFn(fn) && fn(this._lifecycle, this);
                } catch (err) {
                    if (this.config.catchPluginErrors) {
                        const errTitle = "Docsify plugin error";
                        console.error(errTitle, err);
                    } else {
                        throw err;
                    }
                }
            }));
        }
    }
    function initGlobalAPI() {
        window.Docsify = {
            util: util,
            dom: dom,
            get: get,
            slugify: slugify,
            version: "5.1.0"
        };
        window.DocsifyCompiler = Compiler;
        window.marked = g;
        window.Prism = prism$1;
    }
    initGlobalAPI();
    documentReady((() => new Docsify));
})();