{"version":3,"sources":["jsdelivr-header.js","/npm/markdown-it@14.2.0/lib/common/utils.mjs","/npm/markdown-it@14.2.0/lib/helpers/parse_link_label.mjs","/npm/markdown-it@14.2.0/lib/helpers/parse_link_destination.mjs","/npm/markdown-it@14.2.0/lib/helpers/parse_link_title.mjs","/npm/markdown-it@14.2.0/lib/renderer.mjs","/npm/markdown-it@14.2.0/lib/ruler.mjs","/npm/markdown-it@14.2.0/lib/token.mjs","/npm/markdown-it@14.2.0/lib/rules_core/state_core.mjs","/npm/markdown-it@14.2.0/lib/rules_core/normalize.mjs","/npm/markdown-it@14.2.0/lib/rules_core/linkify.mjs","/npm/markdown-it@14.2.0/lib/rules_core/replacements.mjs","/npm/markdown-it@14.2.0/lib/rules_core/smartquotes.mjs","/npm/markdown-it@14.2.0/lib/parser_core.mjs","/npm/markdown-it@14.2.0/lib/rules_core/block.mjs","/npm/markdown-it@14.2.0/lib/rules_core/inline.mjs","/npm/markdown-it@14.2.0/lib/rules_core/text_join.mjs","/npm/markdown-it@14.2.0/lib/rules_block/state_block.mjs","/npm/markdown-it@14.2.0/lib/rules_block/table.mjs","/npm/markdown-it@14.2.0/lib/rules_block/list.mjs","/npm/markdown-it@14.2.0/lib/common/html_re.mjs","/npm/markdown-it@14.2.0/lib/rules_block/html_block.mjs","/npm/markdown-it@14.2.0/lib/common/html_blocks.mjs","/npm/markdown-it@14.2.0/lib/parser_block.mjs","/npm/markdown-it@14.2.0/lib/rules_block/code.mjs","/npm/markdown-it@14.2.0/lib/rules_block/fence.mjs","/npm/markdown-it@14.2.0/lib/rules_block/blockquote.mjs","/npm/markdown-it@14.2.0/lib/rules_block/hr.mjs","/npm/markdown-it@14.2.0/lib/rules_block/reference.mjs","/npm/markdown-it@14.2.0/lib/rules_block/heading.mjs","/npm/markdown-it@14.2.0/lib/rules_block/lheading.mjs","/npm/markdown-it@14.2.0/lib/rules_block/paragraph.mjs","/npm/markdown-it@14.2.0/lib/rules_inline/state_inline.mjs","/npm/markdown-it@14.2.0/lib/rules_inline/text.mjs","/npm/markdown-it@14.2.0/lib/rules_inline/linkify.mjs","/npm/markdown-it@14.2.0/lib/rules_inline/escape.mjs","/npm/markdown-it@14.2.0/lib/rules_inline/strikethrough.mjs","/npm/markdown-it@14.2.0/lib/rules_inline/emphasis.mjs","/npm/markdown-it@14.2.0/lib/rules_inline/autolink.mjs","/npm/markdown-it@14.2.0/lib/rules_inline/entity.mjs","/npm/markdown-it@14.2.0/lib/rules_inline/balance_pairs.mjs","/npm/markdown-it@14.2.0/lib/parser_inline.mjs","/npm/markdown-it@14.2.0/lib/rules_inline/newline.mjs","/npm/markdown-it@14.2.0/lib/rules_inline/backticks.mjs","/npm/markdown-it@14.2.0/lib/rules_inline/link.mjs","/npm/markdown-it@14.2.0/lib/rules_inline/image.mjs","/npm/markdown-it@14.2.0/lib/rules_inline/html_inline.mjs","/npm/markdown-it@14.2.0/lib/rules_inline/fragments_join.mjs","/npm/markdown-it@14.2.0/lib/index.mjs","/npm/markdown-it@14.2.0/lib/presets/default.mjs","/npm/markdown-it@14.2.0/lib/presets/zero.mjs","/npm/markdown-it@14.2.0/lib/presets/commonmark.mjs"],"names":[],"mappings":"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","file":"/npm/markdown-it@14.2.0/index.mjs/+esm","sourceRoot":"","sourcesContent":["/**\n * Bundled by jsDelivr using Rollup v2.79.2 and Terser v5.48.0.\n * Original file: /npm/markdown-it@14.2.0/index.mjs\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","// Utilities\n//\n\nimport * as mdurl from 'mdurl'\nimport * as ucmicro from 'uc.micro'\nimport { decodeHTML } from 'entities'\n\nfunction _class (obj) { return Object.prototype.toString.call(obj) }\n\nfunction isString (obj) { return _class(obj) === '[object String]' }\n\nconst _hasOwnProperty = Object.prototype.hasOwnProperty\n\nfunction has (object, key) {\n  return _hasOwnProperty.call(object, key)\n}\n\n// Merge objects\n//\nfunction assign (obj /* from1, from2, from3, ... */) {\n  const sources = Array.prototype.slice.call(arguments, 1)\n\n  sources.forEach(function (source) {\n    if (!source) { return }\n\n    if (typeof source !== 'object') {\n      throw new TypeError(source + 'must be object')\n    }\n\n    Object.keys(source).forEach(function (key) {\n      obj[key] = source[key]\n    })\n  })\n\n  return obj\n}\n\n// Remove element from array and put another array at those position.\n// Useful for some operations with tokens\nfunction arrayReplaceAt (src, pos, newElements) {\n  return [].concat(src.slice(0, pos), newElements, src.slice(pos + 1))\n}\n\nfunction isValidEntityCode (c) {\n  /* eslint no-bitwise:0 */\n  // broken sequence\n  if (c >= 0xD800 && c <= 0xDFFF) { return false }\n  // never used\n  if (c >= 0xFDD0 && c <= 0xFDEF) { return false }\n  if ((c & 0xFFFF) === 0xFFFF || (c & 0xFFFF) === 0xFFFE) { return false }\n  // control codes\n  if (c >= 0x00 && c <= 0x08) { return false }\n  if (c === 0x0B) { return false }\n  if (c >= 0x0E && c <= 0x1F) { return false }\n  if (c >= 0x7F && c <= 0x9F) { return false }\n  // out of range\n  if (c > 0x10FFFF) { return false }\n  return true\n}\n\nfunction fromCodePoint (c) {\n  /* eslint no-bitwise:0 */\n  if (c > 0xffff) {\n    c -= 0x10000\n    const surrogate1 = 0xd800 + (c >> 10)\n    const surrogate2 = 0xdc00 + (c & 0x3ff)\n\n    return String.fromCharCode(surrogate1, surrogate2)\n  }\n  return String.fromCharCode(c)\n}\n\nconst UNESCAPE_MD_RE  = /\\\\([!\"#$%&'()*+,\\-./:;<=>?@[\\\\\\]^_`{|}~])/g\nconst ENTITY_RE       = /&([a-z#][a-z0-9]{1,31});/gi\nconst UNESCAPE_ALL_RE = new RegExp(UNESCAPE_MD_RE.source + '|' + ENTITY_RE.source, 'gi')\n\nconst DIGITAL_ENTITY_TEST_RE = /^#((?:x[a-f0-9]{1,8}|[0-9]{1,8}))$/i\n\nfunction replaceEntityPattern (match, name) {\n  if (name.charCodeAt(0) === 0x23/* # */ && DIGITAL_ENTITY_TEST_RE.test(name)) {\n    const code = name[1].toLowerCase() === 'x'\n      ? parseInt(name.slice(2), 16)\n      : parseInt(name.slice(1), 10)\n\n    if (isValidEntityCode(code)) {\n      return fromCodePoint(code)\n    }\n\n    return match\n  }\n\n  const decoded = decodeHTML(match)\n  if (decoded !== match) {\n    return decoded\n  }\n\n  return match\n}\n\n/* function replaceEntities(str) {\n  if (str.indexOf('&') < 0) { return str; }\n\n  return str.replace(ENTITY_RE, replaceEntityPattern);\n} */\n\nfunction unescapeMd (str) {\n  if (str.indexOf('\\\\') < 0) { return str }\n  return str.replace(UNESCAPE_MD_RE, '$1')\n}\n\nfunction unescapeAll (str) {\n  if (str.indexOf('\\\\') < 0 && str.indexOf('&') < 0) { return str }\n\n  return str.replace(UNESCAPE_ALL_RE, function (match, escaped, entity) {\n    if (escaped) { return escaped }\n    return replaceEntityPattern(match, entity)\n  })\n}\n\nconst HTML_ESCAPE_TEST_RE = /[&<>\"]/\nconst HTML_ESCAPE_REPLACE_RE = /[&<>\"]/g\nconst HTML_REPLACEMENTS = {\n  '&': '&amp;',\n  '<': '&lt;',\n  '>': '&gt;',\n  '\"': '&quot;'\n}\n\nfunction replaceUnsafeChar (ch) {\n  return HTML_REPLACEMENTS[ch]\n}\n\nfunction escapeHtml (str) {\n  if (HTML_ESCAPE_TEST_RE.test(str)) {\n    return str.replace(HTML_ESCAPE_REPLACE_RE, replaceUnsafeChar)\n  }\n  return str\n}\n\nconst REGEXP_ESCAPE_RE = /[.?*+^$[\\]\\\\(){}|-]/g\n\nfunction escapeRE (str) {\n  return str.replace(REGEXP_ESCAPE_RE, '\\\\$&')\n}\n\nfunction isSpace (code) {\n  switch (code) {\n    case 0x09:\n    case 0x20:\n      return true\n  }\n  return false\n}\n\n// Zs (unicode class) || [\\t\\f\\v\\r\\n]\nfunction isWhiteSpace (code) {\n  if (code >= 0x2000 && code <= 0x200A) { return true }\n  switch (code) {\n    case 0x09: // \\t\n    case 0x0A: // \\n\n    case 0x0B: // \\v\n    case 0x0C: // \\f\n    case 0x0D: // \\r\n    case 0x20:\n    case 0xA0:\n    case 0x1680:\n    case 0x202F:\n    case 0x205F:\n    case 0x3000:\n      return true\n  }\n  return false\n}\n\n/* eslint-disable max-len */\n\n// Currently without astral characters support.\nfunction isPunctChar (ch) {\n  return ucmicro.P.test(ch) || ucmicro.S.test(ch)\n}\n\nfunction isPunctCharCode (code) {\n  return isPunctChar(fromCodePoint(code))\n}\n\n// Markdown ASCII punctuation characters.\n//\n// !, \", #, $, %, &, ', (, ), *, +, ,, -, ., /, :, ;, <, =, >, ?, @, [, \\, ], ^, _, `, {, |, }, or ~\n// http://spec.commonmark.org/0.15/#ascii-punctuation-character\n//\n// Don't confuse with unicode punctuation !!! It lacks some chars in ascii range.\n//\nfunction isMdAsciiPunct (ch) {\n  switch (ch) {\n    case 0x21/* ! */:\n    case 0x22/* \" */:\n    case 0x23/* # */:\n    case 0x24/* $ */:\n    case 0x25/* % */:\n    case 0x26/* & */:\n    case 0x27/* ' */:\n    case 0x28/* ( */:\n    case 0x29/* ) */:\n    case 0x2A/* * */:\n    case 0x2B/* + */:\n    case 0x2C/* , */:\n    case 0x2D/* - */:\n    case 0x2E/* . */:\n    case 0x2F/* / */:\n    case 0x3A/* : */:\n    case 0x3B/* ; */:\n    case 0x3C/* < */:\n    case 0x3D/* = */:\n    case 0x3E/* > */:\n    case 0x3F/* ? */:\n    case 0x40/* @ */:\n    case 0x5B/* [ */:\n    case 0x5C/* \\ */:\n    case 0x5D/* ] */:\n    case 0x5E/* ^ */:\n    case 0x5F/* _ */:\n    case 0x60/* ` */:\n    case 0x7B/* { */:\n    case 0x7C/* | */:\n    case 0x7D/* } */:\n    case 0x7E/* ~ */:\n      return true\n    default:\n      return false\n  }\n}\n\n// Hepler to unify [reference labels].\n//\nfunction normalizeReference (str) {\n  // Trim and collapse whitespace\n  //\n  str = str.trim().replace(/\\s+/g, ' ')\n\n  // In node v10 'ẞ'.toLowerCase() === 'Ṿ', which is presumed to be a bug\n  // fixed in v12 (couldn't find any details).\n  //\n  // So treat this one as a special case\n  // (remove this when node v10 is no longer supported).\n  //\n  if ('ẞ'.toLowerCase() === 'Ṿ') {\n    /* c8 ignore next 2 */\n    str = str.replace(/ẞ/g, 'ß')\n  }\n\n  // .toLowerCase().toUpperCase() should get rid of all differences\n  // between letter variants.\n  //\n  // Simple .toLowerCase() doesn't normalize 125 code points correctly,\n  // and .toUpperCase doesn't normalize 6 of them (list of exceptions:\n  // İ, ϴ, ẞ, Ω, K, Å - those are already uppercased, but have differently\n  // uppercased versions).\n  //\n  // Here's an example showing how it happens. Lets take greek letter omega:\n  // uppercase U+0398 (Θ), U+03f4 (ϴ) and lowercase U+03b8 (θ), U+03d1 (ϑ)\n  //\n  // Unicode entries:\n  // 0398;GREEK CAPITAL LETTER THETA;Lu;0;L;;;;;N;;;;03B8;\n  // 03B8;GREEK SMALL LETTER THETA;Ll;0;L;;;;;N;;;0398;;0398\n  // 03D1;GREEK THETA SYMBOL;Ll;0;L;<compat> 03B8;;;;N;GREEK SMALL LETTER SCRIPT THETA;;0398;;0398\n  // 03F4;GREEK CAPITAL THETA SYMBOL;Lu;0;L;<compat> 0398;;;;N;;;;03B8;\n  //\n  // Case-insensitive comparison should treat all of them as equivalent.\n  //\n  // But .toLowerCase() doesn't change ϑ (it's already lowercase),\n  // and .toUpperCase() doesn't change ϴ (already uppercase).\n  //\n  // Applying first lower then upper case normalizes any character:\n  // '\\u0398\\u03f4\\u03b8\\u03d1'.toLowerCase().toUpperCase() === '\\u0398\\u0398\\u0398\\u0398'\n  //\n  // Note: this is equivalent to unicode case folding; unicode normalization\n  // is a different step that is not required here.\n  //\n  // Final result should be uppercased, because it's later stored in an object\n  // (this avoid a conflict with Object.prototype members,\n  // most notably, `__proto__`)\n  //\n  return str.toLowerCase().toUpperCase()\n}\n\nfunction isAsciiTrimmable (c) {\n  return c === 0x20 || c === 0x09 || c === 0x0a || c === 0x0d\n}\n\n// \"Light\" .trim() for blocks (headers, paragraphs), where unicode spaces\n// should be preserved.\nfunction asciiTrim (str) {\n  let start = 0\n  for (; start < str.length; start++) {\n    if (!isAsciiTrimmable(str.charCodeAt(start))) {\n      break\n    }\n  }\n  let end = str.length - 1\n  for (; end >= start; end--) {\n    if (!isAsciiTrimmable(str.charCodeAt(end))) {\n      break\n    }\n  }\n  return str.slice(start, end + 1)\n}\n\n// Re-export libraries commonly used in both markdown-it and its plugins,\n// so plugins won't have to depend on them explicitly, which reduces their\n// bundled size (e.g. a browser build).\n//\nconst lib = { mdurl, ucmicro }\n\nexport {\n  lib,\n  assign,\n  isString,\n  has,\n  unescapeMd,\n  unescapeAll,\n  isValidEntityCode,\n  fromCodePoint,\n  escapeHtml,\n  arrayReplaceAt,\n  isSpace,\n  isWhiteSpace,\n  isMdAsciiPunct,\n  isPunctChar,\n  isPunctCharCode,\n  escapeRE,\n  normalizeReference,\n  asciiTrim\n}\n","// Parse link label\n//\n// this function assumes that first character (\"[\") already matches;\n// returns the end of the label\n//\n\nexport default function parseLinkLabel (state, start, disableNested) {\n  let level, found, marker, prevPos\n\n  const max = state.posMax\n  const oldPos = state.pos\n\n  state.pos = start + 1\n  level = 1\n\n  while (state.pos < max) {\n    marker = state.src.charCodeAt(state.pos)\n    if (marker === 0x5D /* ] */) {\n      level--\n      if (level === 0) {\n        found = true\n        break\n      }\n    }\n\n    prevPos = state.pos\n    state.md.inline.skipToken(state)\n    if (marker === 0x5B /* [ */) {\n      if (prevPos === state.pos - 1) {\n        // increase level if we find text `[`, which is not a part of any token\n        level++\n      } else if (disableNested) {\n        state.pos = oldPos\n        return -1\n      }\n    }\n  }\n\n  let labelEnd = -1\n\n  if (found) {\n    labelEnd = state.pos\n  }\n\n  // restore old state\n  state.pos = oldPos\n\n  return labelEnd\n}\n","// Parse link destination\n//\n\nimport { unescapeAll } from '../common/utils.mjs'\n\nexport default function parseLinkDestination (str, start, max) {\n  let code\n  let pos = start\n\n  const result = {\n    ok: false,\n    pos: 0,\n    str: ''\n  }\n\n  if (str.charCodeAt(pos) === 0x3C /* < */) {\n    pos++\n    while (pos < max) {\n      code = str.charCodeAt(pos)\n      if (code === 0x0A /* \\n */) { return result }\n      if (code === 0x3C /* < */) { return result }\n      if (code === 0x3E /* > */) {\n        result.pos = pos + 1\n        result.str = unescapeAll(str.slice(start + 1, pos))\n        result.ok = true\n        return result\n      }\n      if (code === 0x5C /* \\ */ && pos + 1 < max) {\n        pos += 2\n        continue\n      }\n\n      pos++\n    }\n\n    // no closing '>'\n    return result\n  }\n\n  // this should be ... } else { ... branch\n\n  let level = 0\n  while (pos < max) {\n    code = str.charCodeAt(pos)\n\n    if (code === 0x20) { break }\n\n    // ascii control characters\n    if (code < 0x20 || code === 0x7F) { break }\n\n    if (code === 0x5C /* \\ */ && pos + 1 < max) {\n      if (str.charCodeAt(pos + 1) === 0x20) { break }\n      pos += 2\n      continue\n    }\n\n    if (code === 0x28 /* ( */) {\n      level++\n      if (level > 32) { return result }\n    }\n\n    if (code === 0x29 /* ) */) {\n      if (level === 0) { break }\n      level--\n    }\n\n    pos++\n  }\n\n  if (start === pos) { return result }\n  if (level !== 0) { return result }\n\n  result.str = unescapeAll(str.slice(start, pos))\n  result.pos = pos\n  result.ok = true\n  return result\n}\n","// Parse link title\n//\n\nimport { unescapeAll } from '../common/utils.mjs'\n\n// Parse link title within `str` in [start, max] range,\n// or continue previous parsing if `prev_state` is defined (equal to result of last execution).\n//\nexport default function parseLinkTitle (str, start, max, prev_state) {\n  let code\n  let pos = start\n\n  const state = {\n    // if `true`, this is a valid link title\n    ok: false,\n    // if `true`, this link can be continued on the next line\n    can_continue: false,\n    // if `ok`, it's the position of the first character after the closing marker\n    pos: 0,\n    // if `ok`, it's the unescaped title\n    str: '',\n    // expected closing marker character code\n    marker: 0\n  }\n\n  if (prev_state) {\n    // this is a continuation of a previous parseLinkTitle call on the next line,\n    // used in reference links only\n    state.str = prev_state.str\n    state.marker = prev_state.marker\n  } else {\n    if (pos >= max) { return state }\n\n    let marker = str.charCodeAt(pos)\n    if (marker !== 0x22 /* \" */ && marker !== 0x27 /* ' */ && marker !== 0x28 /* ( */) { return state }\n\n    start++\n    pos++\n\n    // if opening marker is \"(\", switch it to closing marker \")\"\n    if (marker === 0x28) { marker = 0x29 }\n\n    state.marker = marker\n  }\n\n  while (pos < max) {\n    code = str.charCodeAt(pos)\n    if (code === state.marker) {\n      state.pos = pos + 1\n      state.str += unescapeAll(str.slice(start, pos))\n      state.ok = true\n      return state\n    } else if (code === 0x28 /* ( */ && state.marker === 0x29 /* ) */) {\n      return state\n    } else if (code === 0x5C /* \\ */ && pos + 1 < max) {\n      pos++\n    }\n\n    pos++\n  }\n\n  // no closing marker found, but this link title may continue on the next line (for references)\n  state.can_continue = true\n  state.str += unescapeAll(str.slice(start, pos))\n  return state\n}\n","/**\n * class Renderer\n *\n * Generates HTML from parsed token stream. Each instance has independent\n * copy of rules. Those can be rewritten with ease. Also, you can add new\n * rules if you create plugin and adds new token types.\n **/\n\nimport { assign, unescapeAll, escapeHtml } from './common/utils.mjs'\n\nconst default_rules = {}\n\ndefault_rules.code_inline = function (tokens, idx, options, env, slf) {\n  const token = tokens[idx]\n\n  return  '<code' + slf.renderAttrs(token) + '>' +\n          escapeHtml(token.content) +\n          '</code>'\n}\n\ndefault_rules.code_block = function (tokens, idx, options, env, slf) {\n  const token = tokens[idx]\n\n  return  '<pre' + slf.renderAttrs(token) + '><code>' +\n          escapeHtml(tokens[idx].content) +\n          '</code></pre>\\n'\n}\n\ndefault_rules.fence = function (tokens, idx, options, env, slf) {\n  const token = tokens[idx]\n  const info = token.info ? unescapeAll(token.info).trim() : ''\n  let langName = ''\n  let langAttrs = ''\n\n  if (info) {\n    const arr = info.split(/(\\s+)/g)\n    langName = arr[0]\n    langAttrs = arr.slice(2).join('')\n  }\n\n  let highlighted\n  if (options.highlight) {\n    highlighted = options.highlight(token.content, langName, langAttrs) || escapeHtml(token.content)\n  } else {\n    highlighted = escapeHtml(token.content)\n  }\n\n  if (highlighted.indexOf('<pre') === 0) {\n    return highlighted + '\\n'\n  }\n\n  // If language exists, inject class gently, without modifying original token.\n  // May be, one day we will add .deepClone() for token and simplify this part, but\n  // now we prefer to keep things local.\n  if (info) {\n    const i = token.attrIndex('class')\n    const tmpAttrs = token.attrs ? token.attrs.slice() : []\n\n    if (i < 0) {\n      tmpAttrs.push(['class', options.langPrefix + langName])\n    } else {\n      tmpAttrs[i] = tmpAttrs[i].slice()\n      tmpAttrs[i][1] += ' ' + options.langPrefix + langName\n    }\n\n    // Fake token just to render attributes\n    const tmpToken = {\n      attrs: tmpAttrs\n    }\n\n    return `<pre><code${slf.renderAttrs(tmpToken)}>${highlighted}</code></pre>\\n`\n  }\n\n  return `<pre><code${slf.renderAttrs(token)}>${highlighted}</code></pre>\\n`\n}\n\ndefault_rules.image = function (tokens, idx, options, env, slf) {\n  const token = tokens[idx]\n\n  // \"alt\" attr MUST be set, even if empty. Because it's mandatory and\n  // should be placed on proper position for tests.\n  //\n  // Replace content with actual value\n\n  token.attrs[token.attrIndex('alt')][1] =\n    slf.renderInlineAsText(token.children, options, env)\n\n  return slf.renderToken(tokens, idx, options)\n}\n\ndefault_rules.hardbreak = function (tokens, idx, options /*, env */) {\n  return options.xhtmlOut ? '<br />\\n' : '<br>\\n'\n}\ndefault_rules.softbreak = function (tokens, idx, options /*, env */) {\n  return options.breaks ? (options.xhtmlOut ? '<br />\\n' : '<br>\\n') : '\\n'\n}\n\ndefault_rules.text = function (tokens, idx /*, options, env */) {\n  return escapeHtml(tokens[idx].content)\n}\n\ndefault_rules.html_block = function (tokens, idx /*, options, env */) {\n  return tokens[idx].content\n}\ndefault_rules.html_inline = function (tokens, idx /*, options, env */) {\n  return tokens[idx].content\n}\n\n/**\n * new Renderer()\n *\n * Creates new [[Renderer]] instance and fill [[Renderer#rules]] with defaults.\n **/\nfunction Renderer () {\n  /**\n   * Renderer#rules -> Object\n   *\n   * Contains render rules for tokens. Can be updated and extended.\n   *\n   * ##### Example\n   *\n   * ```javascript\n   * var md = require('markdown-it')();\n   *\n   * md.renderer.rules.strong_open  = function () { return '<b>'; };\n   * md.renderer.rules.strong_close = function () { return '</b>'; };\n   *\n   * var result = md.renderInline(...);\n   * ```\n   *\n   * Each rule is called as independent static function with fixed signature:\n   *\n   * ```javascript\n   * function my_token_render(tokens, idx, options, env, renderer) {\n   *   // ...\n   *   return renderedHTML;\n   * }\n   * ```\n   *\n   * See [source code](https://github.com/markdown-it/markdown-it/blob/master/lib/renderer.mjs)\n   * for more details and examples.\n   **/\n  this.rules = assign({}, default_rules)\n}\n\n/**\n * Renderer.renderAttrs(token) -> String\n *\n * Render token attributes to string.\n **/\nRenderer.prototype.renderAttrs = function renderAttrs (token) {\n  let i, l, result\n\n  if (!token.attrs) { return '' }\n\n  result = ''\n\n  for (i = 0, l = token.attrs.length; i < l; i++) {\n    result += ' ' + escapeHtml(token.attrs[i][0]) + '=\"' + escapeHtml(token.attrs[i][1]) + '\"'\n  }\n\n  return result\n}\n\n/**\n * Renderer.renderToken(tokens, idx, options) -> String\n * - tokens (Array): list of tokens\n * - idx (Numbed): token index to render\n * - options (Object): params of parser instance\n *\n * Default token renderer. Can be overriden by custom function\n * in [[Renderer#rules]].\n **/\nRenderer.prototype.renderToken = function renderToken (tokens, idx, options) {\n  const token = tokens[idx]\n  let result = ''\n\n  // Tight list paragraphs\n  if (token.hidden) {\n    return ''\n  }\n\n  // Insert a newline between hidden paragraph and subsequent opening\n  // block-level tag.\n  //\n  // For example, here we should insert a newline before blockquote:\n  //  - a\n  //    >\n  //\n  if (token.block && token.nesting !== -1 && idx && tokens[idx - 1].hidden) {\n    result += '\\n'\n  }\n\n  // Add token name, e.g. `<img`\n  result += (token.nesting === -1 ? '</' : '<') + token.tag\n\n  // Encode attributes, e.g. `<img src=\"foo\"`\n  result += this.renderAttrs(token)\n\n  // Add a slash for self-closing tags, e.g. `<img src=\"foo\" /`\n  if (token.nesting === 0 && options.xhtmlOut) {\n    result += ' /'\n  }\n\n  // Check if we need to add a newline after this tag\n  let needLf = false\n  if (token.block) {\n    needLf = true\n\n    if (token.nesting === 1) {\n      if (idx + 1 < tokens.length) {\n        const nextToken = tokens[idx + 1]\n\n        if (nextToken.type === 'inline' || nextToken.hidden) {\n          // Block-level tag containing an inline tag.\n          //\n          needLf = false\n        } else if (nextToken.nesting === -1 && nextToken.tag === token.tag) {\n          // Opening tag + closing tag of the same type. E.g. `<li></li>`.\n          //\n          needLf = false\n        }\n      }\n    }\n  }\n\n  result += needLf ? '>\\n' : '>'\n\n  return result\n}\n\n/**\n * Renderer.renderInline(tokens, options, env) -> String\n * - tokens (Array): list on block tokens to render\n * - options (Object): params of parser instance\n * - env (Object): additional data from parsed input (references, for example)\n *\n * The same as [[Renderer.render]], but for single token of `inline` type.\n **/\nRenderer.prototype.renderInline = function (tokens, options, env) {\n  let result = ''\n  const rules = this.rules\n\n  for (let i = 0, len = tokens.length; i < len; i++) {\n    const type = tokens[i].type\n\n    if (typeof rules[type] !== 'undefined') {\n      result += rules[type](tokens, i, options, env, this)\n    } else {\n      result += this.renderToken(tokens, i, options)\n    }\n  }\n\n  return result\n}\n\n/** internal\n * Renderer.renderInlineAsText(tokens, options, env) -> String\n * - tokens (Array): list on block tokens to render\n * - options (Object): params of parser instance\n * - env (Object): additional data from parsed input (references, for example)\n *\n * Special kludge for image `alt` attributes to conform CommonMark spec.\n * Don't try to use it! Spec requires to show `alt` content with stripped markup,\n * instead of simple escaping.\n **/\nRenderer.prototype.renderInlineAsText = function (tokens, options, env) {\n  let result = ''\n\n  for (let i = 0, len = tokens.length; i < len; i++) {\n    switch (tokens[i].type) {\n      case 'text':\n        result += tokens[i].content\n        break\n      case 'image':\n        result += this.renderInlineAsText(tokens[i].children, options, env)\n        break\n      case 'html_inline':\n      case 'html_block':\n        result += tokens[i].content\n        break\n      case 'softbreak':\n      case 'hardbreak':\n        result += '\\n'\n        break\n      default:\n        // all other tokens are skipped\n    }\n  }\n\n  return result\n}\n\n/**\n * Renderer.render(tokens, options, env) -> String\n * - tokens (Array): list on block tokens to render\n * - options (Object): params of parser instance\n * - env (Object): additional data from parsed input (references, for example)\n *\n * Takes token stream and generates HTML. Probably, you will never need to call\n * this method directly.\n **/\nRenderer.prototype.render = function (tokens, options, env) {\n  let result = ''\n  const rules = this.rules\n\n  for (let i = 0, len = tokens.length; i < len; i++) {\n    const type = tokens[i].type\n\n    if (type === 'inline') {\n      result += this.renderInline(tokens[i].children, options, env)\n    } else if (typeof rules[type] !== 'undefined') {\n      result += rules[type](tokens, i, options, env, this)\n    } else {\n      result += this.renderToken(tokens, i, options, env)\n    }\n  }\n\n  return result\n}\n\nexport default Renderer\n","/**\n * class Ruler\n *\n * Helper class, used by [[MarkdownIt#core]], [[MarkdownIt#block]] and\n * [[MarkdownIt#inline]] to manage sequences of functions (rules):\n *\n * - keep rules in defined order\n * - assign the name to each rule\n * - enable/disable rules\n * - add/replace rules\n * - allow assign rules to additional named chains (in the same)\n * - cacheing lists of active rules\n *\n * You will not need use this class directly until write plugins. For simple\n * rules control use [[MarkdownIt.disable]], [[MarkdownIt.enable]] and\n * [[MarkdownIt.use]].\n **/\n\n/**\n * new Ruler()\n **/\nfunction Ruler () {\n  // List of added rules. Each element is:\n  //\n  // {\n  //   name: XXX,\n  //   enabled: Boolean,\n  //   fn: Function(),\n  //   alt: [ name2, name3 ]\n  // }\n  //\n  this.__rules__ = []\n\n  // Cached rule chains.\n  //\n  // First level - chain name, '' for default.\n  // Second level - diginal anchor for fast filtering by charcodes.\n  //\n  this.__cache__ = null\n}\n\n// Helper methods, should not be used directly\n\n// Find rule index by name\n//\nRuler.prototype.__find__ = function (name) {\n  for (let i = 0; i < this.__rules__.length; i++) {\n    if (this.__rules__[i].name === name) {\n      return i\n    }\n  }\n  return -1\n}\n\n// Build rules lookup cache\n//\nRuler.prototype.__compile__ = function () {\n  const self = this\n  const chains = ['']\n\n  // collect unique names\n  self.__rules__.forEach(function (rule) {\n    if (!rule.enabled) { return }\n\n    rule.alt.forEach(function (altName) {\n      if (chains.indexOf(altName) < 0) {\n        chains.push(altName)\n      }\n    })\n  })\n\n  self.__cache__ = {}\n\n  chains.forEach(function (chain) {\n    self.__cache__[chain] = []\n    self.__rules__.forEach(function (rule) {\n      if (!rule.enabled) { return }\n\n      if (chain && rule.alt.indexOf(chain) < 0) { return }\n\n      self.__cache__[chain].push(rule.fn)\n    })\n  })\n}\n\n/**\n * Ruler.at(name, fn [, options])\n * - name (String): rule name to replace.\n * - fn (Function): new rule function.\n * - options (Object): new rule options (not mandatory).\n *\n * Replace rule by name with new function & options. Throws error if name not\n * found.\n *\n * ##### Options:\n *\n * - __alt__ - array with names of \"alternate\" chains.\n *\n * ##### Example\n *\n * Replace existing typographer replacement rule with new one:\n *\n * ```javascript\n * var md = require('markdown-it')();\n *\n * md.core.ruler.at('replacements', function replace(state) {\n *   //...\n * });\n * ```\n **/\nRuler.prototype.at = function (name, fn, options) {\n  const index = this.__find__(name)\n  const opt = options || {}\n\n  if (index === -1) { throw new Error('Parser rule not found: ' + name) }\n\n  this.__rules__[index].fn = fn\n  this.__rules__[index].alt = opt.alt || []\n  this.__cache__ = null\n}\n\n/**\n * Ruler.before(beforeName, ruleName, fn [, options])\n * - beforeName (String): new rule will be added before this one.\n * - ruleName (String): name of added rule.\n * - fn (Function): rule function.\n * - options (Object): rule options (not mandatory).\n *\n * Add new rule to chain before one with given name. See also\n * [[Ruler.after]], [[Ruler.push]].\n *\n * ##### Options:\n *\n * - __alt__ - array with names of \"alternate\" chains.\n *\n * ##### Example\n *\n * ```javascript\n * var md = require('markdown-it')();\n *\n * md.block.ruler.before('paragraph', 'my_rule', function replace(state) {\n *   //...\n * });\n * ```\n **/\nRuler.prototype.before = function (beforeName, ruleName, fn, options) {\n  const index = this.__find__(beforeName)\n  const opt = options || {}\n\n  if (index === -1) { throw new Error('Parser rule not found: ' + beforeName) }\n\n  this.__rules__.splice(index, 0, {\n    name: ruleName,\n    enabled: true,\n    fn,\n    alt: opt.alt || []\n  })\n\n  this.__cache__ = null\n}\n\n/**\n * Ruler.after(afterName, ruleName, fn [, options])\n * - afterName (String): new rule will be added after this one.\n * - ruleName (String): name of added rule.\n * - fn (Function): rule function.\n * - options (Object): rule options (not mandatory).\n *\n * Add new rule to chain after one with given name. See also\n * [[Ruler.before]], [[Ruler.push]].\n *\n * ##### Options:\n *\n * - __alt__ - array with names of \"alternate\" chains.\n *\n * ##### Example\n *\n * ```javascript\n * var md = require('markdown-it')();\n *\n * md.inline.ruler.after('text', 'my_rule', function replace(state) {\n *   //...\n * });\n * ```\n **/\nRuler.prototype.after = function (afterName, ruleName, fn, options) {\n  const index = this.__find__(afterName)\n  const opt = options || {}\n\n  if (index === -1) { throw new Error('Parser rule not found: ' + afterName) }\n\n  this.__rules__.splice(index + 1, 0, {\n    name: ruleName,\n    enabled: true,\n    fn,\n    alt: opt.alt || []\n  })\n\n  this.__cache__ = null\n}\n\n/**\n * Ruler.push(ruleName, fn [, options])\n * - ruleName (String): name of added rule.\n * - fn (Function): rule function.\n * - options (Object): rule options (not mandatory).\n *\n * Push new rule to the end of chain. See also\n * [[Ruler.before]], [[Ruler.after]].\n *\n * ##### Options:\n *\n * - __alt__ - array with names of \"alternate\" chains.\n *\n * ##### Example\n *\n * ```javascript\n * var md = require('markdown-it')();\n *\n * md.core.ruler.push('my_rule', function replace(state) {\n *   //...\n * });\n * ```\n **/\nRuler.prototype.push = function (ruleName, fn, options) {\n  const opt = options || {}\n\n  this.__rules__.push({\n    name: ruleName,\n    enabled: true,\n    fn,\n    alt: opt.alt || []\n  })\n\n  this.__cache__ = null\n}\n\n/**\n * Ruler.enable(list [, ignoreInvalid]) -> Array\n * - list (String|Array): list of rule names to enable.\n * - ignoreInvalid (Boolean): set `true` to ignore errors when rule not found.\n *\n * Enable rules with given names. If any rule name not found - throw Error.\n * Errors can be disabled by second param.\n *\n * Returns list of found rule names (if no exception happened).\n *\n * See also [[Ruler.disable]], [[Ruler.enableOnly]].\n **/\nRuler.prototype.enable = function (list, ignoreInvalid) {\n  if (!Array.isArray(list)) { list = [list] }\n\n  const result = []\n\n  // Search by name and enable\n  list.forEach(function (name) {\n    const idx = this.__find__(name)\n\n    if (idx < 0) {\n      if (ignoreInvalid) { return }\n      throw new Error('Rules manager: invalid rule name ' + name)\n    }\n    this.__rules__[idx].enabled = true\n    result.push(name)\n  }, this)\n\n  this.__cache__ = null\n  return result\n}\n\n/**\n * Ruler.enableOnly(list [, ignoreInvalid])\n * - list (String|Array): list of rule names to enable (whitelist).\n * - ignoreInvalid (Boolean): set `true` to ignore errors when rule not found.\n *\n * Enable rules with given names, and disable everything else. If any rule name\n * not found - throw Error. Errors can be disabled by second param.\n *\n * See also [[Ruler.disable]], [[Ruler.enable]].\n **/\nRuler.prototype.enableOnly = function (list, ignoreInvalid) {\n  if (!Array.isArray(list)) { list = [list] }\n\n  this.__rules__.forEach(function (rule) { rule.enabled = false })\n\n  this.enable(list, ignoreInvalid)\n}\n\n/**\n * Ruler.disable(list [, ignoreInvalid]) -> Array\n * - list (String|Array): list of rule names to disable.\n * - ignoreInvalid (Boolean): set `true` to ignore errors when rule not found.\n *\n * Disable rules with given names. If any rule name not found - throw Error.\n * Errors can be disabled by second param.\n *\n * Returns list of found rule names (if no exception happened).\n *\n * See also [[Ruler.enable]], [[Ruler.enableOnly]].\n **/\nRuler.prototype.disable = function (list, ignoreInvalid) {\n  if (!Array.isArray(list)) { list = [list] }\n\n  const result = []\n\n  // Search by name and disable\n  list.forEach(function (name) {\n    const idx = this.__find__(name)\n\n    if (idx < 0) {\n      if (ignoreInvalid) { return }\n      throw new Error('Rules manager: invalid rule name ' + name)\n    }\n    this.__rules__[idx].enabled = false\n    result.push(name)\n  }, this)\n\n  this.__cache__ = null\n  return result\n}\n\n/**\n * Ruler.getRules(chainName) -> Array\n *\n * Return array of active functions (rules) for given chain name. It analyzes\n * rules configuration, compiles caches if not exists and returns result.\n *\n * Default chain name is `''` (empty string). It can't be skipped. That's\n * done intentionally, to keep signature monomorphic for high speed.\n **/\nRuler.prototype.getRules = function (chainName) {\n  if (this.__cache__ === null) {\n    this.__compile__()\n  }\n\n  // Chain can be empty, if rules disabled. But we still have to return Array.\n  return this.__cache__[chainName] || []\n}\n\nexport default Ruler\n","// Token class\n\n/**\n * class Token\n **/\n\n/**\n * new Token(type, tag, nesting)\n *\n * Create new token and fill passed properties.\n **/\nfunction Token (type, tag, nesting) {\n  /**\n   * Token#type -> String\n   *\n   * Type of the token (string, e.g. \"paragraph_open\")\n   **/\n  this.type     = type\n\n  /**\n   * Token#tag -> String\n   *\n   * html tag name, e.g. \"p\"\n   **/\n  this.tag      = tag\n\n  /**\n   * Token#attrs -> Array\n   *\n   * Html attributes. Format: `[ [ name1, value1 ], [ name2, value2 ] ]`\n   **/\n  this.attrs    = null\n\n  /**\n   * Token#map -> Array\n   *\n   * Source map info. Format: `[ line_begin, line_end ]`\n   **/\n  this.map      = null\n\n  /**\n   * Token#nesting -> Number\n   *\n   * Level change (number in {-1, 0, 1} set), where:\n   *\n   * -  `1` means the tag is opening\n   * -  `0` means the tag is self-closing\n   * - `-1` means the tag is closing\n   **/\n  this.nesting  = nesting\n\n  /**\n   * Token#level -> Number\n   *\n   * nesting level, the same as `state.level`\n   **/\n  this.level    = 0\n\n  /**\n   * Token#children -> Array\n   *\n   * An array of child nodes (inline and img tokens)\n   **/\n  this.children = null\n\n  /**\n   * Token#content -> String\n   *\n   * In a case of self-closing tag (code, html, fence, etc.),\n   * it has contents of this tag.\n   **/\n  this.content  = ''\n\n  /**\n   * Token#markup -> String\n   *\n   * '*' or '_' for emphasis, fence string for fence, etc.\n   **/\n  this.markup   = ''\n\n  /**\n   * Token#info -> String\n   *\n   * Additional information:\n   *\n   * - Info string for \"fence\" tokens\n   * - The value \"auto\" for autolink \"link_open\" and \"link_close\" tokens\n   * - The string value of the item marker for ordered-list \"list_item_open\" tokens\n   **/\n  this.info     = ''\n\n  /**\n   * Token#meta -> Object\n   *\n   * A place for plugins to store an arbitrary data\n   **/\n  this.meta     = null\n\n  /**\n   * Token#block -> Boolean\n   *\n   * True for block-level tokens, false for inline tokens.\n   * Used in renderer to calculate line breaks\n   **/\n  this.block    = false\n\n  /**\n   * Token#hidden -> Boolean\n   *\n   * If it's true, ignore this element when rendering. Used for tight lists\n   * to hide paragraphs.\n   **/\n  this.hidden   = false\n}\n\n/**\n * Token.attrIndex(name) -> Number\n *\n * Search attribute index by name.\n **/\nToken.prototype.attrIndex = function attrIndex (name) {\n  if (!this.attrs) { return -1 }\n\n  const attrs = this.attrs\n\n  for (let i = 0, len = attrs.length; i < len; i++) {\n    if (attrs[i][0] === name) { return i }\n  }\n  return -1\n}\n\n/**\n * Token.attrPush(attrData)\n *\n * Add `[ name, value ]` attribute to list. Init attrs if necessary\n **/\nToken.prototype.attrPush = function attrPush (attrData) {\n  if (this.attrs) {\n    this.attrs.push(attrData)\n  } else {\n    this.attrs = [attrData]\n  }\n}\n\n/**\n * Token.attrSet(name, value)\n *\n * Set `name` attribute to `value`. Override old value if exists.\n **/\nToken.prototype.attrSet = function attrSet (name, value) {\n  const idx = this.attrIndex(name)\n  const attrData = [name, value]\n\n  if (idx < 0) {\n    this.attrPush(attrData)\n  } else {\n    this.attrs[idx] = attrData\n  }\n}\n\n/**\n * Token.attrGet(name)\n *\n * Get the value of attribute `name`, or null if it does not exist.\n **/\nToken.prototype.attrGet = function attrGet (name) {\n  const idx = this.attrIndex(name)\n  let value = null\n  if (idx >= 0) {\n    value = this.attrs[idx][1]\n  }\n  return value\n}\n\n/**\n * Token.attrJoin(name, value)\n *\n * Join value to existing attribute via space. Or create new attribute if not\n * exists. Useful to operate with token classes.\n **/\nToken.prototype.attrJoin = function attrJoin (name, value) {\n  const idx = this.attrIndex(name)\n\n  if (idx < 0) {\n    this.attrPush([name, value])\n  } else {\n    this.attrs[idx][1] = this.attrs[idx][1] + ' ' + value\n  }\n}\n\nexport default Token\n","// Core state object\n//\n\nimport Token from '../token.mjs'\n\nfunction StateCore (src, md, env) {\n  this.src = src\n  this.env = env\n  this.tokens = []\n  this.inlineMode = false\n  this.md = md // link to parser instance\n}\n\n// re-export Token class to use in core rules\nStateCore.prototype.Token = Token\n\nexport default StateCore\n","// Normalize input string\n\n// https://spec.commonmark.org/0.29/#line-ending\nconst NEWLINES_RE  = /\\r\\n?|\\n/g\nconst NULL_RE      = /\\0/g\n\nexport default function normalize (state) {\n  let str\n\n  // Normalize newlines\n  str = state.src.replace(NEWLINES_RE, '\\n')\n\n  // Replace NULL characters\n  str = str.replace(NULL_RE, '\\uFFFD')\n\n  state.src = str\n}\n","// Replace link-like texts with link nodes.\n//\n// Currently restricted by `md.validateLink()` to http/https/ftp\n//\n\nimport { arrayReplaceAt } from '../common/utils.mjs'\n\nfunction isLinkOpen (str) {\n  return /^<a[>\\s]/i.test(str)\n}\nfunction isLinkClose (str) {\n  return /^<\\/a\\s*>/i.test(str)\n}\n\nexport default function linkify (state) {\n  const blockTokens = state.tokens\n\n  if (!state.md.options.linkify) { return }\n\n  for (let j = 0, l = blockTokens.length; j < l; j++) {\n    if (blockTokens[j].type !== 'inline' ||\n        !state.md.linkify.pretest(blockTokens[j].content)) {\n      continue\n    }\n\n    let tokens = blockTokens[j].children\n\n    let htmlLinkLevel = 0\n\n    // We scan from the end, to keep position when new tags added.\n    // Use reversed logic in links start/end match\n    for (let i = tokens.length - 1; i >= 0; i--) {\n      const currentToken = tokens[i]\n\n      // Skip content of markdown links\n      if (currentToken.type === 'link_close') {\n        i--\n        while (tokens[i].level !== currentToken.level && tokens[i].type !== 'link_open') {\n          i--\n        }\n        continue\n      }\n\n      // Skip content of html tag links\n      if (currentToken.type === 'html_inline') {\n        if (isLinkOpen(currentToken.content) && htmlLinkLevel > 0) {\n          htmlLinkLevel--\n        }\n        if (isLinkClose(currentToken.content)) {\n          htmlLinkLevel++\n        }\n      }\n      if (htmlLinkLevel > 0) { continue }\n\n      if (currentToken.type === 'text' && state.md.linkify.test(currentToken.content)) {\n        const text = currentToken.content\n        let links = state.md.linkify.match(text)\n\n        // Now split string to nodes\n        const nodes = []\n        let level = currentToken.level\n        let lastPos = 0\n\n        // forbid escape sequence at the start of the string,\n        // this avoids http\\://example.com/ from being linkified as\n        // http:<a href=\"//example.com/\">//example.com/</a>\n        if (links.length > 0 &&\n            links[0].index === 0 &&\n            i > 0 &&\n            tokens[i - 1].type === 'text_special') {\n          links = links.slice(1)\n        }\n\n        for (let ln = 0; ln < links.length; ln++) {\n          const url = links[ln].url\n          const fullUrl = state.md.normalizeLink(url)\n          if (!state.md.validateLink(fullUrl)) { continue }\n\n          let urlText = links[ln].text\n\n          // Linkifier might send raw hostnames like \"example.com\", where url\n          // starts with domain name. So we prepend http:// in those cases,\n          // and remove it afterwards.\n          //\n          if (!links[ln].schema) {\n            urlText = state.md.normalizeLinkText('http://' + urlText).replace(/^http:\\/\\//, '')\n          } else if (links[ln].schema === 'mailto:' && !/^mailto:/i.test(urlText)) {\n            urlText = state.md.normalizeLinkText('mailto:' + urlText).replace(/^mailto:/, '')\n          } else {\n            urlText = state.md.normalizeLinkText(urlText)\n          }\n\n          const pos = links[ln].index\n\n          if (pos > lastPos) {\n            const token   = new state.Token('text', '', 0)\n            token.content = text.slice(lastPos, pos)\n            token.level   = level\n            nodes.push(token)\n          }\n\n          const token_o   = new state.Token('link_open', 'a', 1)\n          token_o.attrs   = [['href', fullUrl]]\n          token_o.level   = level++\n          token_o.markup  = 'linkify'\n          token_o.info    = 'auto'\n          nodes.push(token_o)\n\n          const token_t   = new state.Token('text', '', 0)\n          token_t.content = urlText\n          token_t.level   = level\n          nodes.push(token_t)\n\n          const token_c   = new state.Token('link_close', 'a', -1)\n          token_c.level   = --level\n          token_c.markup  = 'linkify'\n          token_c.info    = 'auto'\n          nodes.push(token_c)\n\n          lastPos = links[ln].lastIndex\n        }\n        if (lastPos < text.length) {\n          const token   = new state.Token('text', '', 0)\n          token.content = text.slice(lastPos)\n          token.level   = level\n          nodes.push(token)\n        }\n\n        // replace current node\n        blockTokens[j].children = tokens = arrayReplaceAt(tokens, i, nodes)\n      }\n    }\n  }\n}\n","// Simple typographic replacements\n//\n// (c) (C) → ©\n// (tm) (TM) → ™\n// (r) (R) → ®\n// +- → ±\n// ... → … (also ?.... → ?.., !.... → !..)\n// ???????? → ???, !!!!! → !!!, `,,` → `,`\n// -- → &ndash;, --- → &mdash;\n//\n\n// TODO:\n// - fractionals 1/2, 1/4, 3/4 -> ½, ¼, ¾\n// - multiplications 2 x 4 -> 2 × 4\n\nconst RARE_RE = /\\+-|\\.\\.|\\?\\?\\?\\?|!!!!|,,|--/\n\n// Workaround for phantomjs - need regex without /g flag,\n// or root check will fail every second time\nconst SCOPED_ABBR_TEST_RE = /\\((c|tm|r)\\)/i\n\nconst SCOPED_ABBR_RE = /\\((c|tm|r)\\)/ig\nconst SCOPED_ABBR = {\n  c: '©',\n  r: '®',\n  tm: '™'\n}\n\nfunction replaceFn (match, name) {\n  return SCOPED_ABBR[name.toLowerCase()]\n}\n\nfunction replace_scoped (inlineTokens) {\n  let inside_autolink = 0\n\n  for (let i = inlineTokens.length - 1; i >= 0; i--) {\n    const token = inlineTokens[i]\n\n    if (token.type === 'text' && !inside_autolink) {\n      token.content = token.content.replace(SCOPED_ABBR_RE, replaceFn)\n    }\n\n    if (token.type === 'link_open' && token.info === 'auto') {\n      inside_autolink--\n    }\n\n    if (token.type === 'link_close' && token.info === 'auto') {\n      inside_autolink++\n    }\n  }\n}\n\nfunction replace_rare (inlineTokens) {\n  let inside_autolink = 0\n\n  for (let i = inlineTokens.length - 1; i >= 0; i--) {\n    const token = inlineTokens[i]\n\n    if (token.type === 'text' && !inside_autolink) {\n      if (RARE_RE.test(token.content)) {\n        token.content = token.content\n          .replace(/\\+-/g, '±')\n          // .., ..., ....... -> …\n          // but ?..... & !..... -> ?.. & !..\n          .replace(/\\.{2,}/g, '…').replace(/([?!])…/g, '$1..')\n          .replace(/([?!]){4,}/g, '$1$1$1').replace(/,{2,}/g, ',')\n          // em-dash\n          .replace(/(^|[^-])---(?=[^-]|$)/mg, '$1\\u2014')\n          // en-dash\n          .replace(/(^|\\s)--(?=\\s|$)/mg, '$1\\u2013')\n          .replace(/(^|[^-\\s])--(?=[^-\\s]|$)/mg, '$1\\u2013')\n      }\n    }\n\n    if (token.type === 'link_open' && token.info === 'auto') {\n      inside_autolink--\n    }\n\n    if (token.type === 'link_close' && token.info === 'auto') {\n      inside_autolink++\n    }\n  }\n}\n\nexport default function replace (state) {\n  let blkIdx\n\n  if (!state.md.options.typographer) { return }\n\n  for (blkIdx = state.tokens.length - 1; blkIdx >= 0; blkIdx--) {\n    if (state.tokens[blkIdx].type !== 'inline') { continue }\n\n    if (SCOPED_ABBR_TEST_RE.test(state.tokens[blkIdx].content)) {\n      replace_scoped(state.tokens[blkIdx].children)\n    }\n\n    if (RARE_RE.test(state.tokens[blkIdx].content)) {\n      replace_rare(state.tokens[blkIdx].children)\n    }\n  }\n}\n","// Convert straight quotation marks to typographic ones\n//\n\nimport { isWhiteSpace, isPunctCharCode, isMdAsciiPunct } from '../common/utils.mjs'\n\nconst QUOTE_TEST_RE = /['\"]/\nconst QUOTE_RE = /['\"]/g\nconst APOSTROPHE = '\\u2019' /* ’ */\n\nfunction addReplacement (replacements, tokenIdx, pos, ch) {\n  if (!replacements[tokenIdx]) {\n    replacements[tokenIdx] = []\n  }\n\n  replacements[tokenIdx].push({ pos, ch })\n}\n\nfunction applyReplacements (str, replacements) {\n  let result = ''\n  let lastPos = 0\n\n  replacements.sort((a, b) => a.pos - b.pos)\n\n  for (let i = 0; i < replacements.length; i++) {\n    const replacement = replacements[i]\n\n    result += str.slice(lastPos, replacement.pos) + replacement.ch\n    lastPos = replacement.pos + 1\n  }\n\n  return result + str.slice(lastPos)\n}\n\nfunction process_inlines (tokens, state) {\n  let j\n\n  const stack = []\n  // token index -> list of replacements in the original token content\n  const replacements = {}\n\n  for (let i = 0; i < tokens.length; i++) {\n    const token = tokens[i]\n\n    const thisLevel = tokens[i].level\n\n    for (j = stack.length - 1; j >= 0; j--) {\n      if (stack[j].level <= thisLevel) { break }\n    }\n    stack.length = j + 1\n\n    if (token.type !== 'text') { continue }\n\n    const text = token.content\n    let pos = 0\n    const max = text.length\n\n    /* eslint no-labels:0,block-scoped-var:0 */\n    OUTER:\n    while (pos < max) {\n      QUOTE_RE.lastIndex = pos\n      const t = QUOTE_RE.exec(text)\n      if (!t) { break }\n\n      let canOpen = true\n      let canClose = true\n      pos = t.index + 1\n      const isSingle = (t[0] === \"'\")\n\n      // Find previous character,\n      // default to space if it's the beginning of the line\n      //\n      let lastChar = 0x20\n\n      if (t.index - 1 >= 0) {\n        lastChar = text.charCodeAt(t.index - 1)\n      } else {\n        for (j = i - 1; j >= 0; j--) {\n          if (tokens[j].type === 'softbreak' || tokens[j].type === 'hardbreak') break // lastChar defaults to 0x20\n          if (!tokens[j].content) continue // should skip all tokens except 'text', 'html_inline' or 'code_inline'\n\n          lastChar = tokens[j].content.charCodeAt(tokens[j].content.length - 1)\n          break\n        }\n      }\n\n      // Find next character,\n      // default to space if it's the end of the line\n      //\n      let nextChar = 0x20\n\n      if (pos < max) {\n        nextChar = text.charCodeAt(pos)\n      } else {\n        for (j = i + 1; j < tokens.length; j++) {\n          if (tokens[j].type === 'softbreak' || tokens[j].type === 'hardbreak') break // nextChar defaults to 0x20\n          if (!tokens[j].content) continue // should skip all tokens except 'text', 'html_inline' or 'code_inline'\n\n          nextChar = tokens[j].content.charCodeAt(0)\n          break\n        }\n      }\n\n      const isLastPunctChar = isMdAsciiPunct(lastChar) || isPunctCharCode(lastChar)\n      const isNextPunctChar = isMdAsciiPunct(nextChar) || isPunctCharCode(nextChar)\n\n      const isLastWhiteSpace = isWhiteSpace(lastChar)\n      const isNextWhiteSpace = isWhiteSpace(nextChar)\n\n      if (isNextWhiteSpace) {\n        canOpen = false\n      } else if (isNextPunctChar) {\n        if (!(isLastWhiteSpace || isLastPunctChar)) {\n          canOpen = false\n        }\n      }\n\n      if (isLastWhiteSpace) {\n        canClose = false\n      } else if (isLastPunctChar) {\n        if (!(isNextWhiteSpace || isNextPunctChar)) {\n          canClose = false\n        }\n      }\n\n      if (nextChar === 0x22 /* \" */ && t[0] === '\"') {\n        if (lastChar >= 0x30 /* 0 */ && lastChar <= 0x39 /* 9 */) {\n          // special case: 1\"\" - count first quote as an inch\n          canClose = canOpen = false\n        }\n      }\n\n      if (canOpen && canClose) {\n        // Replace quotes in the middle of punctuation sequence, but not\n        // in the middle of the words, i.e.:\n        //\n        // 1. foo \" bar \" baz - not replaced\n        // 2. foo-\"-bar-\"-baz - replaced\n        // 3. foo\"bar\"baz     - not replaced\n        //\n        canOpen = isLastPunctChar\n        canClose = isNextPunctChar\n      }\n\n      if (!canOpen && !canClose) {\n        // middle of word\n        if (isSingle) {\n          addReplacement(replacements, i, t.index, APOSTROPHE)\n        }\n        continue\n      }\n\n      if (canClose) {\n        // this could be a closing quote, rewind the stack to get a match\n        for (j = stack.length - 1; j >= 0; j--) {\n          let item = stack[j]\n          if (stack[j].level < thisLevel) { break }\n          if (item.single === isSingle && stack[j].level === thisLevel) {\n            item = stack[j]\n\n            let openQuote\n            let closeQuote\n            if (isSingle) {\n              openQuote = state.md.options.quotes[2]\n              closeQuote = state.md.options.quotes[3]\n            } else {\n              openQuote = state.md.options.quotes[0]\n              closeQuote = state.md.options.quotes[1]\n            }\n\n            addReplacement(replacements, i, t.index, closeQuote)\n            addReplacement(replacements, item.token, item.pos, openQuote)\n\n            stack.length = j\n            continue OUTER\n          }\n        }\n      }\n\n      if (canOpen) {\n        stack.push({\n          token: i,\n          pos: t.index,\n          single: isSingle,\n          level: thisLevel\n        })\n      } else if (canClose && isSingle) {\n        addReplacement(replacements, i, t.index, APOSTROPHE)\n      }\n    }\n  }\n\n  Object.keys(replacements).forEach(function (tokenIdx) {\n    tokens[tokenIdx].content = applyReplacements(tokens[tokenIdx].content, replacements[tokenIdx])\n  })\n}\n\nexport default function smartquotes (state) {\n  /* eslint max-depth:0 */\n  if (!state.md.options.typographer) { return }\n\n  for (let blkIdx = state.tokens.length - 1; blkIdx >= 0; blkIdx--) {\n    if (state.tokens[blkIdx].type !== 'inline' ||\n        !QUOTE_TEST_RE.test(state.tokens[blkIdx].content)) {\n      continue\n    }\n\n    process_inlines(state.tokens[blkIdx].children, state)\n  }\n}\n","/** internal\n * class Core\n *\n * Top-level rules executor. Glues block/inline parsers and does intermediate\n * transformations.\n **/\n\nimport Ruler from './ruler.mjs'\nimport StateCore from './rules_core/state_core.mjs'\n\nimport r_normalize from './rules_core/normalize.mjs'\nimport r_block from './rules_core/block.mjs'\nimport r_inline from './rules_core/inline.mjs'\nimport r_linkify from './rules_core/linkify.mjs'\nimport r_replacements from './rules_core/replacements.mjs'\nimport r_smartquotes from './rules_core/smartquotes.mjs'\nimport r_text_join from './rules_core/text_join.mjs'\n\nconst _rules = [\n  ['normalize',      r_normalize],\n  ['block',          r_block],\n  ['inline',         r_inline],\n  ['linkify',        r_linkify],\n  ['replacements',   r_replacements],\n  ['smartquotes',    r_smartquotes],\n  // `text_join` finds `text_special` tokens (for escape sequences)\n  // and joins them with the rest of the text\n  ['text_join',      r_text_join]\n]\n\n/**\n * new Core()\n **/\nfunction Core () {\n  /**\n   * Core#ruler -> Ruler\n   *\n   * [[Ruler]] instance. Keep configuration of core rules.\n   **/\n  this.ruler = new Ruler()\n\n  for (let i = 0; i < _rules.length; i++) {\n    this.ruler.push(_rules[i][0], _rules[i][1])\n  }\n}\n\n/**\n * Core.process(state)\n *\n * Executes core chain rules.\n **/\nCore.prototype.process = function (state) {\n  const rules = this.ruler.getRules('')\n\n  for (let i = 0, l = rules.length; i < l; i++) {\n    rules[i](state)\n  }\n}\n\nCore.prototype.State = StateCore\n\nexport default Core\n","export default function block (state) {\n  let token\n\n  if (state.inlineMode) {\n    token          = new state.Token('inline', '', 0)\n    token.content  = state.src\n    token.map      = [0, 1]\n    token.children = []\n    state.tokens.push(token)\n  } else {\n    state.md.block.parse(state.src, state.md, state.env, state.tokens)\n  }\n}\n","export default function inline (state) {\n  const tokens = state.tokens\n\n  // Parse inlines\n  for (let i = 0, l = tokens.length; i < l; i++) {\n    const tok = tokens[i]\n    if (tok.type === 'inline') {\n      state.md.inline.parse(tok.content, state.md, state.env, tok.children)\n    }\n  }\n}\n","// Join raw text tokens with the rest of the text\n//\n// This is set as a separate rule to provide an opportunity for plugins\n// to run text replacements after text join, but before escape join.\n//\n// For example, `\\:)` shouldn't be replaced with an emoji.\n//\n\nexport default function text_join (state) {\n  let curr, last\n  const blockTokens = state.tokens\n  const l = blockTokens.length\n\n  for (let j = 0; j < l; j++) {\n    if (blockTokens[j].type !== 'inline') continue\n\n    const tokens = blockTokens[j].children\n    const max = tokens.length\n\n    for (curr = 0; curr < max; curr++) {\n      if (tokens[curr].type === 'text_special') {\n        tokens[curr].type = 'text'\n      }\n    }\n\n    for (curr = last = 0; curr < max; curr++) {\n      if (tokens[curr].type === 'text' &&\n          curr + 1 < max &&\n          tokens[curr + 1].type === 'text') {\n        // collapse two adjacent text nodes\n        tokens[curr + 1].content = tokens[curr].content + tokens[curr + 1].content\n      } else {\n        if (curr !== last) { tokens[last] = tokens[curr] }\n\n        last++\n      }\n    }\n\n    if (curr !== last) {\n      tokens.length = last\n    }\n  }\n}\n","// Parser state class\n\nimport Token from '../token.mjs'\nimport { isSpace } from '../common/utils.mjs'\n\nfunction StateBlock (src, md, env, tokens) {\n  this.src = src\n\n  // link to parser instance\n  this.md     = md\n\n  this.env = env\n\n  //\n  // Internal state vartiables\n  //\n\n  this.tokens = tokens\n\n  this.bMarks = []  // line begin offsets for fast jumps\n  this.eMarks = []  // line end offsets for fast jumps\n  this.tShift = []  // offsets of the first non-space characters (tabs not expanded)\n  this.sCount = []  // indents for each line (tabs expanded)\n\n  // An amount of virtual spaces (tabs expanded) between beginning\n  // of each line (bMarks) and real beginning of that line.\n  //\n  // It exists only as a hack because blockquotes override bMarks\n  // losing information in the process.\n  //\n  // It's used only when expanding tabs, you can think about it as\n  // an initial tab length, e.g. bsCount=21 applied to string `\\t123`\n  // means first tab should be expanded to 4-21%4 === 3 spaces.\n  //\n  this.bsCount = []\n\n  // block parser variables\n\n  // required block content indent (for example, if we are\n  // inside a list, it would be positioned after list marker)\n  this.blkIndent  = 0\n  this.line       = 0 // line index in src\n  this.lineMax    = 0 // lines count\n  this.tight      = false  // loose/tight mode for lists\n  this.ddIndent   = -1 // indent of the current dd block (-1 if there isn't any)\n  this.listIndent = -1 // indent of the current list block (-1 if there isn't any)\n\n  // can be 'blockquote', 'list', 'root', 'paragraph' or 'reference'\n  // used in lists to determine if they interrupt a paragraph\n  this.parentType = 'root'\n\n  this.level = 0\n\n  // Create caches\n  // Generate markers.\n  const s = this.src\n\n  for (let start = 0, pos = 0, indent = 0, offset = 0, len = s.length, indent_found = false; pos < len; pos++) {\n    const ch = s.charCodeAt(pos)\n\n    if (!indent_found) {\n      if (isSpace(ch)) {\n        indent++\n\n        if (ch === 0x09) {\n          offset += 4 - offset % 4\n        } else {\n          offset++\n        }\n        continue\n      } else {\n        indent_found = true\n      }\n    }\n\n    if (ch === 0x0A || pos === len - 1) {\n      if (ch !== 0x0A) { pos++ }\n      this.bMarks.push(start)\n      this.eMarks.push(pos)\n      this.tShift.push(indent)\n      this.sCount.push(offset)\n      this.bsCount.push(0)\n\n      indent_found = false\n      indent = 0\n      offset = 0\n      start = pos + 1\n    }\n  }\n\n  // Push fake entry to simplify cache bounds checks\n  this.bMarks.push(s.length)\n  this.eMarks.push(s.length)\n  this.tShift.push(0)\n  this.sCount.push(0)\n  this.bsCount.push(0)\n\n  this.lineMax = this.bMarks.length - 1 // don't count last fake line\n}\n\n// Push new token to \"stream\".\n//\nStateBlock.prototype.push = function (type, tag, nesting) {\n  const token = new Token(type, tag, nesting)\n  token.block = true\n\n  if (nesting < 0) this.level-- // closing tag\n  token.level = this.level\n  if (nesting > 0) this.level++ // opening tag\n\n  this.tokens.push(token)\n  return token\n}\n\nStateBlock.prototype.isEmpty = function isEmpty (line) {\n  return this.bMarks[line] + this.tShift[line] >= this.eMarks[line]\n}\n\nStateBlock.prototype.skipEmptyLines = function skipEmptyLines (from) {\n  for (let max = this.lineMax; from < max; from++) {\n    if (this.bMarks[from] + this.tShift[from] < this.eMarks[from]) {\n      break\n    }\n  }\n  return from\n}\n\n// Skip spaces from given position.\nStateBlock.prototype.skipSpaces = function skipSpaces (pos) {\n  for (let max = this.src.length; pos < max; pos++) {\n    const ch = this.src.charCodeAt(pos)\n    if (!isSpace(ch)) { break }\n  }\n  return pos\n}\n\n// Skip spaces from given position in reverse.\nStateBlock.prototype.skipSpacesBack = function skipSpacesBack (pos, min) {\n  if (pos <= min) { return pos }\n\n  while (pos > min) {\n    if (!isSpace(this.src.charCodeAt(--pos))) { return pos + 1 }\n  }\n  return pos\n}\n\n// Skip char codes from given position\nStateBlock.prototype.skipChars = function skipChars (pos, code) {\n  for (let max = this.src.length; pos < max; pos++) {\n    if (this.src.charCodeAt(pos) !== code) { break }\n  }\n  return pos\n}\n\n// Skip char codes reverse from given position - 1\nStateBlock.prototype.skipCharsBack = function skipCharsBack (pos, code, min) {\n  if (pos <= min) { return pos }\n\n  while (pos > min) {\n    if (code !== this.src.charCodeAt(--pos)) { return pos + 1 }\n  }\n  return pos\n}\n\n// cut lines range from source.\nStateBlock.prototype.getLines = function getLines (begin, end, indent, keepLastLF) {\n  if (begin >= end) {\n    return ''\n  }\n\n  const queue = new Array(end - begin)\n\n  for (let i = 0, line = begin; line < end; line++, i++) {\n    let lineIndent = 0\n    const lineStart = this.bMarks[line]\n    let first = lineStart\n    let last\n\n    if (line + 1 < end || keepLastLF) {\n      // No need for bounds check because we have fake entry on tail.\n      last = this.eMarks[line] + 1\n    } else {\n      last = this.eMarks[line]\n    }\n\n    while (first < last && lineIndent < indent) {\n      const ch = this.src.charCodeAt(first)\n\n      if (isSpace(ch)) {\n        if (ch === 0x09) {\n          lineIndent += 4 - (lineIndent + this.bsCount[line]) % 4\n        } else {\n          lineIndent++\n        }\n      } else if (first - lineStart < this.tShift[line]) {\n        // patched tShift masked characters to look like spaces (blockquotes, list markers)\n        lineIndent++\n      } else {\n        break\n      }\n\n      first++\n    }\n\n    if (lineIndent > indent) {\n      // partially expanding tabs in code blocks, e.g '\\t\\tfoobar'\n      // with indent=2 becomes '  \\tfoobar'\n      queue[i] = new Array(lineIndent - indent + 1).join(' ') + this.src.slice(first, last)\n    } else {\n      queue[i] = this.src.slice(first, last)\n    }\n  }\n\n  return queue.join('')\n}\n\n// re-export Token class to use in block rules\nStateBlock.prototype.Token = Token\n\nexport default StateBlock\n","// GFM table, https://github.github.com/gfm/#tables-extension-\n\nimport { isSpace } from '../common/utils.mjs'\n\n// Limit the amount of empty autocompleted cells in a table,\n// see https://github.com/markdown-it/markdown-it/issues/1000,\n//\n// Both pulldown-cmark and commonmark-hs limit the number of cells this way to ~200k.\n// We set it to 65k, which can expand user input by a factor of x370\n// (256x256 square is 1.8kB expanded into 650kB).\nconst MAX_AUTOCOMPLETED_CELLS = 0x10000\n\nfunction getLine (state, line) {\n  const pos = state.bMarks[line] + state.tShift[line]\n  const max = state.eMarks[line]\n\n  return state.src.slice(pos, max)\n}\n\nfunction escapedSplit (str) {\n  const result = []\n  const max = str.length\n\n  let pos = 0\n  let ch = str.charCodeAt(pos)\n  let isEscaped = false\n  let lastPos = 0\n  let current = ''\n\n  while (pos < max) {\n    if (ch === 0x7c/* | */) {\n      if (!isEscaped) {\n        // pipe separating cells, '|'\n        result.push(current + str.substring(lastPos, pos))\n        current = ''\n        lastPos = pos + 1\n      } else {\n        // escaped pipe, '\\|'\n        current += str.substring(lastPos, pos - 1)\n        lastPos = pos\n      }\n    }\n\n    isEscaped = (ch === 0x5c/* \\ */)\n    pos++\n\n    ch = str.charCodeAt(pos)\n  }\n\n  result.push(current + str.substring(lastPos))\n\n  return result\n}\n\nexport default function table (state, startLine, endLine, silent) {\n  // should have at least two lines\n  if (startLine + 2 > endLine) { return false }\n\n  let nextLine = startLine + 1\n\n  if (state.sCount[nextLine] < state.blkIndent) { return false }\n\n  // if it's indented more than 3 spaces, it should be a code block\n  if (state.sCount[nextLine] - state.blkIndent >= 4) { return false }\n\n  // first character of the second line should be '|', '-', ':',\n  // and no other characters are allowed but spaces;\n  // basically, this is the equivalent of /^[-:|][-:|\\s]*$/ regexp\n\n  let pos = state.bMarks[nextLine] + state.tShift[nextLine]\n  if (pos >= state.eMarks[nextLine]) { return false }\n\n  const firstCh = state.src.charCodeAt(pos++)\n  if (firstCh !== 0x7C/* | */ && firstCh !== 0x2D/* - */ && firstCh !== 0x3A/* : */) { return false }\n\n  if (pos >= state.eMarks[nextLine]) { return false }\n\n  const secondCh = state.src.charCodeAt(pos++)\n  if (secondCh !== 0x7C/* | */ && secondCh !== 0x2D/* - */ && secondCh !== 0x3A/* : */ && !isSpace(secondCh)) {\n    return false\n  }\n\n  // if first character is '-', then second character must not be a space\n  // (due to parsing ambiguity with list)\n  if (firstCh === 0x2D/* - */ && isSpace(secondCh)) { return false }\n\n  while (pos < state.eMarks[nextLine]) {\n    const ch = state.src.charCodeAt(pos)\n\n    if (ch !== 0x7C/* | */ && ch !== 0x2D/* - */ && ch !== 0x3A/* : */ && !isSpace(ch)) { return false }\n\n    pos++\n  }\n\n  let lineText = getLine(state, startLine + 1)\n  let columns = lineText.split('|')\n  const aligns = []\n  for (let i = 0; i < columns.length; i++) {\n    const t = columns[i].trim()\n    if (!t) {\n      // allow empty columns before and after table, but not in between columns;\n      // e.g. allow ` |---| `, disallow ` ---||--- `\n      if (i === 0 || i === columns.length - 1) {\n        continue\n      } else {\n        return false\n      }\n    }\n\n    if (!/^:?-+:?$/.test(t)) { return false }\n    if (t.charCodeAt(t.length - 1) === 0x3A/* : */) {\n      aligns.push(t.charCodeAt(0) === 0x3A/* : */ ? 'center' : 'right')\n    } else if (t.charCodeAt(0) === 0x3A/* : */) {\n      aligns.push('left')\n    } else {\n      aligns.push('')\n    }\n  }\n\n  lineText = getLine(state, startLine).trim()\n  if (lineText.indexOf('|') === -1) { return false }\n  if (state.sCount[startLine] - state.blkIndent >= 4) { return false }\n  columns = escapedSplit(lineText)\n  if (columns.length && columns[0] === '') columns.shift()\n  if (columns.length && columns[columns.length - 1] === '') columns.pop()\n\n  // header row will define an amount of columns in the entire table,\n  // and align row should be exactly the same (the rest of the rows can differ)\n  const columnCount = columns.length\n  if (columnCount === 0 || columnCount !== aligns.length) { return false }\n\n  if (silent) { return true }\n\n  const oldParentType = state.parentType\n  state.parentType = 'table'\n\n  // use 'blockquote' lists for termination because it's\n  // the most similar to tables\n  const terminatorRules = state.md.block.ruler.getRules('blockquote')\n\n  const token_to = state.push('table_open', 'table', 1)\n  const tableLines = [startLine, 0]\n  token_to.map = tableLines\n\n  const token_tho = state.push('thead_open', 'thead', 1)\n  token_tho.map = [startLine, startLine + 1]\n\n  const token_htro = state.push('tr_open', 'tr', 1)\n  token_htro.map = [startLine, startLine + 1]\n\n  for (let i = 0; i < columns.length; i++) {\n    const token_ho = state.push('th_open', 'th', 1)\n    if (aligns[i]) {\n      token_ho.attrs  = [['style', 'text-align:' + aligns[i]]]\n    }\n\n    const token_il = state.push('inline', '', 0)\n    token_il.content  = columns[i].trim()\n    token_il.children = []\n\n    state.push('th_close', 'th', -1)\n  }\n\n  state.push('tr_close', 'tr', -1)\n  state.push('thead_close', 'thead', -1)\n\n  let tbodyLines\n  let autocompletedCells = 0\n\n  for (nextLine = startLine + 2; nextLine < endLine; nextLine++) {\n    if (state.sCount[nextLine] < state.blkIndent) { break }\n\n    let terminate = false\n    for (let i = 0, l = terminatorRules.length; i < l; i++) {\n      if (terminatorRules[i](state, nextLine, endLine, true)) {\n        terminate = true\n        break\n      }\n    }\n\n    if (terminate) { break }\n    lineText = getLine(state, nextLine).trim()\n    if (!lineText) { break }\n    if (state.sCount[nextLine] - state.blkIndent >= 4) { break }\n    columns = escapedSplit(lineText)\n    if (columns.length && columns[0] === '') columns.shift()\n    if (columns.length && columns[columns.length - 1] === '') columns.pop()\n\n    // note: autocomplete count can be negative if user specifies more columns than header,\n    // but that does not affect intended use (which is limiting expansion)\n    autocompletedCells += columnCount - columns.length\n    if (autocompletedCells > MAX_AUTOCOMPLETED_CELLS) { break }\n\n    if (nextLine === startLine + 2) {\n      const token_tbo = state.push('tbody_open', 'tbody', 1)\n      token_tbo.map = tbodyLines = [startLine + 2, 0]\n    }\n\n    const token_tro = state.push('tr_open', 'tr', 1)\n    token_tro.map = [nextLine, nextLine + 1]\n\n    for (let i = 0; i < columnCount; i++) {\n      const token_tdo = state.push('td_open', 'td', 1)\n      if (aligns[i]) {\n        token_tdo.attrs  = [['style', 'text-align:' + aligns[i]]]\n      }\n\n      const token_il = state.push('inline', '', 0)\n      token_il.content  = columns[i] ? columns[i].trim() : ''\n      token_il.children = []\n\n      state.push('td_close', 'td', -1)\n    }\n    state.push('tr_close', 'tr', -1)\n  }\n\n  if (tbodyLines) {\n    state.push('tbody_close', 'tbody', -1)\n    tbodyLines[1] = nextLine\n  }\n\n  state.push('table_close', 'table', -1)\n  tableLines[1] = nextLine\n\n  state.parentType = oldParentType\n  state.line = nextLine\n  return true\n}\n","// Lists\n\nimport { isSpace } from '../common/utils.mjs'\n\n// Search `[-+*][\\n ]`, returns next pos after marker on success\n// or -1 on fail.\nfunction skipBulletListMarker (state, startLine) {\n  const max = state.eMarks[startLine]\n  let pos = state.bMarks[startLine] + state.tShift[startLine]\n\n  const marker = state.src.charCodeAt(pos++)\n  // Check bullet\n  if (marker !== 0x2A/* * */ &&\n      marker !== 0x2D/* - */ &&\n      marker !== 0x2B/* + */) {\n    return -1\n  }\n\n  if (pos < max) {\n    const ch = state.src.charCodeAt(pos)\n\n    if (!isSpace(ch)) {\n      // \" -test \" - is not a list item\n      return -1\n    }\n  }\n\n  return pos\n}\n\n// Search `\\d+[.)][\\n ]`, returns next pos after marker on success\n// or -1 on fail.\nfunction skipOrderedListMarker (state, startLine) {\n  const start = state.bMarks[startLine] + state.tShift[startLine]\n  const max = state.eMarks[startLine]\n  let pos = start\n\n  // List marker should have at least 2 chars (digit + dot)\n  if (pos + 1 >= max) { return -1 }\n\n  let ch = state.src.charCodeAt(pos++)\n\n  if (ch < 0x30/* 0 */ || ch > 0x39/* 9 */) { return -1 }\n\n  for (;;) {\n    // EOL -> fail\n    if (pos >= max) { return -1 }\n\n    ch = state.src.charCodeAt(pos++)\n\n    if (ch >= 0x30/* 0 */ && ch <= 0x39/* 9 */) {\n      // List marker should have no more than 9 digits\n      // (prevents integer overflow in browsers)\n      if (pos - start >= 10) { return -1 }\n\n      continue\n    }\n\n    // found valid marker\n    if (ch === 0x29/* ) */ || ch === 0x2e/* . */) {\n      break\n    }\n\n    return -1\n  }\n\n  if (pos < max) {\n    ch = state.src.charCodeAt(pos)\n\n    if (!isSpace(ch)) {\n      // \" 1.test \" - is not a list item\n      return -1\n    }\n  }\n  return pos\n}\n\nfunction markTightParagraphs (state, idx) {\n  const level = state.level + 2\n\n  for (let i = idx + 2, l = state.tokens.length - 2; i < l; i++) {\n    if (state.tokens[i].level === level && state.tokens[i].type === 'paragraph_open') {\n      state.tokens[i + 2].hidden = true\n      state.tokens[i].hidden = true\n      i += 2\n    }\n  }\n}\n\nexport default function list (state, startLine, endLine, silent) {\n  let max, pos, start, token\n  let nextLine = startLine\n  let tight = true\n\n  // if it's indented more than 3 spaces, it should be a code block\n  if (state.sCount[nextLine] - state.blkIndent >= 4) { return false }\n\n  // Special case:\n  //  - item 1\n  //   - item 2\n  //    - item 3\n  //     - item 4\n  //      - this one is a paragraph continuation\n  if (state.listIndent >= 0 &&\n      state.sCount[nextLine] - state.listIndent >= 4 &&\n      state.sCount[nextLine] < state.blkIndent) {\n    return false\n  }\n\n  let isTerminatingParagraph = false\n\n  // limit conditions when list can interrupt\n  // a paragraph (validation mode only)\n  if (silent && state.parentType === 'paragraph') {\n    // Next list item should still terminate previous list item;\n    //\n    // This code can fail if plugins use blkIndent as well as lists,\n    // but I hope the spec gets fixed long before that happens.\n    //\n    if (state.sCount[nextLine] >= state.blkIndent) {\n      isTerminatingParagraph = true\n    }\n  }\n\n  // Detect list type and position after marker\n  let isOrdered\n  let markerValue\n  let posAfterMarker\n  if ((posAfterMarker = skipOrderedListMarker(state, nextLine)) >= 0) {\n    isOrdered = true\n    start = state.bMarks[nextLine] + state.tShift[nextLine]\n    markerValue = Number(state.src.slice(start, posAfterMarker - 1))\n\n    // If we're starting a new ordered list right after\n    // a paragraph, it should start with 1.\n    if (isTerminatingParagraph && markerValue !== 1) return false\n  } else if ((posAfterMarker = skipBulletListMarker(state, nextLine)) >= 0) {\n    isOrdered = false\n  } else {\n    return false\n  }\n\n  // If we're starting a new unordered list right after\n  // a paragraph, first line should not be empty.\n  if (isTerminatingParagraph) {\n    if (state.skipSpaces(posAfterMarker) >= state.eMarks[nextLine]) return false\n  }\n\n  // For validation mode we can terminate immediately\n  if (silent) { return true }\n\n  // We should terminate list on style change. Remember first one to compare.\n  const markerCharCode = state.src.charCodeAt(posAfterMarker - 1)\n\n  // Start list\n  const listTokIdx = state.tokens.length\n\n  if (isOrdered) {\n    token       = state.push('ordered_list_open', 'ol', 1)\n    if (markerValue !== 1) {\n      token.attrs = [['start', markerValue]]\n    }\n  } else {\n    token       = state.push('bullet_list_open', 'ul', 1)\n  }\n\n  const listLines = [nextLine, 0]\n  token.map    = listLines\n  token.markup = String.fromCharCode(markerCharCode)\n\n  //\n  // Iterate list items\n  //\n\n  let prevEmptyEnd = false\n  const terminatorRules = state.md.block.ruler.getRules('list')\n\n  const oldParentType = state.parentType\n  state.parentType = 'list'\n\n  while (nextLine < endLine) {\n    pos = posAfterMarker\n    max = state.eMarks[nextLine]\n\n    const initial = state.sCount[nextLine] + posAfterMarker - (state.bMarks[nextLine] + state.tShift[nextLine])\n    let offset = initial\n\n    while (pos < max) {\n      const ch = state.src.charCodeAt(pos)\n\n      if (ch === 0x09) {\n        offset += 4 - (offset + state.bsCount[nextLine]) % 4\n      } else if (ch === 0x20) {\n        offset++\n      } else {\n        break\n      }\n\n      pos++\n    }\n\n    const contentStart = pos\n    let indentAfterMarker\n\n    if (contentStart >= max) {\n      // trimming space in \"-    \\n  3\" case, indent is 1 here\n      indentAfterMarker = 1\n    } else {\n      indentAfterMarker = offset - initial\n    }\n\n    // If we have more than 4 spaces, the indent is 1\n    // (the rest is just indented code block)\n    if (indentAfterMarker > 4) { indentAfterMarker = 1 }\n\n    // \"  -  test\"\n    //  ^^^^^ - calculating total length of this thing\n    const indent = initial + indentAfterMarker\n\n    // Run subparser & write tokens\n    token        = state.push('list_item_open', 'li', 1)\n    token.markup = String.fromCharCode(markerCharCode)\n    const itemLines = [nextLine, 0]\n    token.map    = itemLines\n    if (isOrdered) {\n      token.info = state.src.slice(start, posAfterMarker - 1)\n    }\n\n    // change current state, then restore it after parser subcall\n    const oldTight = state.tight\n    const oldTShift = state.tShift[nextLine]\n    const oldSCount = state.sCount[nextLine]\n\n    //  - example list\n    // ^ listIndent position will be here\n    //   ^ blkIndent position will be here\n    //\n    const oldListIndent = state.listIndent\n    state.listIndent = state.blkIndent\n    state.blkIndent = indent\n\n    state.tight = true\n    state.tShift[nextLine] = contentStart - state.bMarks[nextLine]\n    state.sCount[nextLine] = offset\n\n    if (contentStart >= max && state.isEmpty(nextLine + 1)) {\n      // workaround for this case\n      // (list item is empty, list terminates before \"foo\"):\n      // ~~~~~~~~\n      //   -\n      //\n      //     foo\n      // ~~~~~~~~\n      state.line = Math.min(state.line + 2, endLine)\n    } else {\n      state.md.block.tokenize(state, nextLine, endLine, true)\n    }\n\n    // If any of list item is tight, mark list as tight\n    if (!state.tight || prevEmptyEnd) {\n      tight = false\n    }\n    // Item become loose if finish with empty line,\n    // but we should filter last element, because it means list finish\n    prevEmptyEnd = (state.line - nextLine) > 1 && state.isEmpty(state.line - 1)\n\n    state.blkIndent = state.listIndent\n    state.listIndent = oldListIndent\n    state.tShift[nextLine] = oldTShift\n    state.sCount[nextLine] = oldSCount\n    state.tight = oldTight\n\n    token        = state.push('list_item_close', 'li', -1)\n    token.markup = String.fromCharCode(markerCharCode)\n\n    nextLine = state.line\n    itemLines[1] = nextLine\n\n    if (nextLine >= endLine) { break }\n\n    //\n    // Try to check if list is terminated or continued.\n    //\n    if (state.sCount[nextLine] < state.blkIndent) { break }\n\n    // if it's indented more than 3 spaces, it should be a code block\n    if (state.sCount[nextLine] - state.blkIndent >= 4) { break }\n\n    // fail if terminating block found\n    let terminate = false\n    for (let i = 0, l = terminatorRules.length; i < l; i++) {\n      if (terminatorRules[i](state, nextLine, endLine, true)) {\n        terminate = true\n        break\n      }\n    }\n    if (terminate) { break }\n\n    // fail if list has another type\n    if (isOrdered) {\n      posAfterMarker = skipOrderedListMarker(state, nextLine)\n      if (posAfterMarker < 0) { break }\n      start = state.bMarks[nextLine] + state.tShift[nextLine]\n    } else {\n      posAfterMarker = skipBulletListMarker(state, nextLine)\n      if (posAfterMarker < 0) { break }\n    }\n\n    if (markerCharCode !== state.src.charCodeAt(posAfterMarker - 1)) { break }\n  }\n\n  // Finalize list\n  if (isOrdered) {\n    token = state.push('ordered_list_close', 'ol', -1)\n  } else {\n    token = state.push('bullet_list_close', 'ul', -1)\n  }\n  token.markup = String.fromCharCode(markerCharCode)\n\n  listLines[1] = nextLine\n  state.line = nextLine\n\n  state.parentType = oldParentType\n\n  // mark paragraphs tight if needed\n  if (tight) {\n    markTightParagraphs(state, listTokIdx)\n  }\n\n  return true\n}\n","// Regexps to match html elements\n\nconst attr_name     = '[a-zA-Z_:][a-zA-Z0-9:._-]*'\n\nconst unquoted      = '[^\"\\'=<>`\\\\x00-\\\\x20]+'\nconst single_quoted = \"'[^']*'\"\nconst double_quoted = '\"[^\"]*\"'\n\nconst attr_value  = '(?:' + unquoted + '|' + single_quoted + '|' + double_quoted + ')'\n\nconst attribute   = '(?:\\\\s+' + attr_name + '(?:\\\\s*=\\\\s*' + attr_value + ')?)'\n\nconst open_tag    = '<[A-Za-z][A-Za-z0-9\\\\-]*' + attribute + '*\\\\s*\\\\/?>'\n\nconst close_tag   = '<\\\\/[A-Za-z][A-Za-z0-9\\\\-]*\\\\s*>'\nconst comment     = '<!---?>|<!--(?:[^-]|-[^-]|--[^>])*-->'\nconst processing  = '<[?][\\\\s\\\\S]*?[?]>'\nconst declaration = '<![A-Za-z][^>]*>'\nconst cdata       = '<!\\\\[CDATA\\\\[[\\\\s\\\\S]*?\\\\]\\\\]>'\n\nconst HTML_TAG_RE = new RegExp('^(?:' + open_tag + '|' + close_tag + '|' + comment +\n                        '|' + processing + '|' + declaration + '|' + cdata + ')')\nconst HTML_OPEN_CLOSE_TAG_RE = new RegExp('^(?:' + open_tag + '|' + close_tag + ')')\n\nexport { HTML_TAG_RE, HTML_OPEN_CLOSE_TAG_RE }\n","// HTML block\n\nimport block_names from '../common/html_blocks.mjs'\nimport { HTML_OPEN_CLOSE_TAG_RE } from '../common/html_re.mjs'\n\n// An array of opening and corresponding closing sequences for html tags,\n// last argument defines whether it can terminate a paragraph or not\n//\nconst HTML_SEQUENCES = [\n  [/^<(script|pre|style|textarea)(?=(\\s|>|$))/i, /<\\/(script|pre|style|textarea)>/i, true],\n  [/^<!--/,        /-->/,   true],\n  [/^<\\?/,         /\\?>/,   true],\n  [/^<![A-Z]/,     />/,     true],\n  [/^<!\\[CDATA\\[/, /\\]\\]>/, true],\n  [new RegExp('^</?(' + block_names.join('|') + ')(?=(\\\\s|/?>|$))', 'i'), /^$/, true],\n  [new RegExp(HTML_OPEN_CLOSE_TAG_RE.source + '\\\\s*$'),  /^$/, false]\n]\n\nexport default function html_block (state, startLine, endLine, silent) {\n  let pos = state.bMarks[startLine] + state.tShift[startLine]\n  let max = state.eMarks[startLine]\n\n  // if it's indented more than 3 spaces, it should be a code block\n  if (state.sCount[startLine] - state.blkIndent >= 4) { return false }\n\n  if (!state.md.options.html) { return false }\n\n  if (state.src.charCodeAt(pos) !== 0x3C/* < */) { return false }\n\n  let lineText = state.src.slice(pos, max)\n\n  let i = 0\n  for (; i < HTML_SEQUENCES.length; i++) {\n    if (HTML_SEQUENCES[i][0].test(lineText)) { break }\n  }\n  if (i === HTML_SEQUENCES.length) { return false }\n\n  if (silent) {\n    // true if this sequence can be a terminator, false otherwise\n    return HTML_SEQUENCES[i][2]\n  }\n\n  let nextLine = startLine + 1\n\n  // Block types 6 and 7 (the only ones whose end condition is a blank line)\n  // have `/^$/` as their closing regexp. For all other types (1-5, e.g.\n  // `<!--` comments), a blank line is regular content and must not terminate\n  // the block - it ends only when its closing sequence is found.\n  const endsOnBlankLine = HTML_SEQUENCES[i][1].test('')\n\n  // If we are here - we detected HTML block.\n  // Let's roll down till block end.\n  if (!HTML_SEQUENCES[i][1].test(lineText)) {\n    for (; nextLine < endLine; nextLine++) {\n      if (state.sCount[nextLine] < state.blkIndent) {\n        // An outdented blank line shouldn't end a block that doesn't end on a\n        // blank line (e.g. a `<!--` comment inside a list item). Such blocks\n        // must continue until their closing sequence regardless of indent.\n        if (endsOnBlankLine || !state.isEmpty(nextLine)) { break }\n      }\n\n      pos = state.bMarks[nextLine] + state.tShift[nextLine]\n      max = state.eMarks[nextLine]\n      lineText = state.src.slice(pos, max)\n\n      if (HTML_SEQUENCES[i][1].test(lineText)) {\n        if (lineText.length !== 0) { nextLine++ }\n        break\n      }\n    }\n  }\n\n  state.line = nextLine\n\n  const token   = state.push('html_block', '', 0)\n  token.map     = [startLine, nextLine]\n  token.content = state.getLines(startLine, nextLine, state.blkIndent, true)\n\n  return true\n}\n","// List of valid html blocks names, according to commonmark spec\n// https://spec.commonmark.org/0.30/#html-blocks\n\nexport default [\n  'address',\n  'article',\n  'aside',\n  'base',\n  'basefont',\n  'blockquote',\n  'body',\n  'caption',\n  'center',\n  'col',\n  'colgroup',\n  'dd',\n  'details',\n  'dialog',\n  'dir',\n  'div',\n  'dl',\n  'dt',\n  'fieldset',\n  'figcaption',\n  'figure',\n  'footer',\n  'form',\n  'frame',\n  'frameset',\n  'h1',\n  'h2',\n  'h3',\n  'h4',\n  'h5',\n  'h6',\n  'head',\n  'header',\n  'hr',\n  'html',\n  'iframe',\n  'legend',\n  'li',\n  'link',\n  'main',\n  'menu',\n  'menuitem',\n  'nav',\n  'noframes',\n  'ol',\n  'optgroup',\n  'option',\n  'p',\n  'param',\n  'search',\n  'section',\n  'summary',\n  'table',\n  'tbody',\n  'td',\n  'tfoot',\n  'th',\n  'thead',\n  'title',\n  'tr',\n  'track',\n  'ul'\n]\n","/** internal\n * class ParserBlock\n *\n * Block-level tokenizer.\n **/\n\nimport Ruler from './ruler.mjs'\nimport StateBlock from './rules_block/state_block.mjs'\n\nimport r_table from './rules_block/table.mjs'\nimport r_code from './rules_block/code.mjs'\nimport r_fence from './rules_block/fence.mjs'\nimport r_blockquote from './rules_block/blockquote.mjs'\nimport r_hr from './rules_block/hr.mjs'\nimport r_list from './rules_block/list.mjs'\nimport r_reference from './rules_block/reference.mjs'\nimport r_html_block from './rules_block/html_block.mjs'\nimport r_heading from './rules_block/heading.mjs'\nimport r_lheading from './rules_block/lheading.mjs'\nimport r_paragraph from './rules_block/paragraph.mjs'\n\nconst _rules = [\n  // First 2 params - rule name & source. Secondary array - list of rules,\n  // which can be terminated by this one.\n  ['table',      r_table,      ['paragraph', 'reference']],\n  ['code',       r_code],\n  ['fence',      r_fence,      ['paragraph', 'reference', 'blockquote', 'list']],\n  ['blockquote', r_blockquote, ['paragraph', 'reference', 'blockquote', 'list']],\n  ['hr',         r_hr,         ['paragraph', 'reference', 'blockquote', 'list']],\n  ['list',       r_list,       ['paragraph', 'reference', 'blockquote']],\n  ['reference',  r_reference],\n  ['html_block', r_html_block, ['paragraph', 'reference', 'blockquote']],\n  ['heading',    r_heading,    ['paragraph', 'reference', 'blockquote']],\n  ['lheading',   r_lheading],\n  ['paragraph',  r_paragraph]\n]\n\n/**\n * new ParserBlock()\n **/\nfunction ParserBlock () {\n  /**\n   * ParserBlock#ruler -> Ruler\n   *\n   * [[Ruler]] instance. Keep configuration of block rules.\n   **/\n  this.ruler = new Ruler()\n\n  for (let i = 0; i < _rules.length; i++) {\n    this.ruler.push(_rules[i][0], _rules[i][1], { alt: (_rules[i][2] || []).slice() })\n  }\n}\n\n// Generate tokens for input range\n//\nParserBlock.prototype.tokenize = function (state, startLine, endLine) {\n  const rules = this.ruler.getRules('')\n  const len = rules.length\n  const maxNesting = state.md.options.maxNesting\n  let line = startLine\n  let hasEmptyLines = false\n\n  while (line < endLine) {\n    state.line = line = state.skipEmptyLines(line)\n    if (line >= endLine) { break }\n\n    // Termination condition for nested calls.\n    // Nested calls currently used for blockquotes & lists\n    if (state.sCount[line] < state.blkIndent) { break }\n\n    // If nesting level exceeded - skip tail to the end. That's not ordinary\n    // situation and we should not care about content.\n    if (state.level >= maxNesting) {\n      state.line = endLine\n      break\n    }\n\n    // Try all possible rules.\n    // On success, rule should:\n    //\n    // - update `state.line`\n    // - update `state.tokens`\n    // - return true\n    const prevLine = state.line\n    let ok = false\n\n    for (let i = 0; i < len; i++) {\n      ok = rules[i](state, line, endLine, false)\n      if (ok) {\n        if (prevLine >= state.line) {\n          throw new Error(\"block rule didn't increment state.line\")\n        }\n        break\n      }\n    }\n\n    // this can only happen if user disables paragraph rule\n    if (!ok) throw new Error('none of the block rules matched')\n\n    // set state.tight if we had an empty line before current tag\n    // i.e. latest empty line should not count\n    state.tight = !hasEmptyLines\n\n    // paragraph might \"eat\" one newline after it in nested lists\n    if (state.isEmpty(state.line - 1)) {\n      hasEmptyLines = true\n    }\n\n    line = state.line\n\n    if (line < endLine && state.isEmpty(line)) {\n      hasEmptyLines = true\n      line++\n      state.line = line\n    }\n  }\n}\n\n/**\n * ParserBlock.parse(str, md, env, outTokens)\n *\n * Process input string and push block tokens into `outTokens`\n **/\nParserBlock.prototype.parse = function (src, md, env, outTokens) {\n  if (!src) { return }\n\n  const state = new this.State(src, md, env, outTokens)\n\n  this.tokenize(state, state.line, state.lineMax)\n}\n\nParserBlock.prototype.State = StateBlock\n\nexport default ParserBlock\n","// Code block (4 spaces padded)\n\nexport default function code (state, startLine, endLine/*, silent */) {\n  if (state.sCount[startLine] - state.blkIndent < 4) { return false }\n\n  let nextLine = startLine + 1\n  let last = nextLine\n\n  while (nextLine < endLine) {\n    if (state.isEmpty(nextLine)) {\n      nextLine++\n      continue\n    }\n\n    if (state.sCount[nextLine] - state.blkIndent >= 4) {\n      nextLine++\n      last = nextLine\n      continue\n    }\n    break\n  }\n\n  state.line = last\n\n  const token   = state.push('code_block', 'code', 0)\n  token.content = state.getLines(startLine, last, 4 + state.blkIndent, false) + '\\n'\n  token.map     = [startLine, state.line]\n\n  return true\n}\n","// fences (``` lang, ~~~ lang)\n\nexport default function fence (state, startLine, endLine, silent) {\n  let pos = state.bMarks[startLine] + state.tShift[startLine]\n  let max = state.eMarks[startLine]\n\n  // if it's indented more than 3 spaces, it should be a code block\n  if (state.sCount[startLine] - state.blkIndent >= 4) { return false }\n\n  if (pos + 3 > max) { return false }\n\n  const marker = state.src.charCodeAt(pos)\n\n  if (marker !== 0x7E/* ~ */ && marker !== 0x60 /* ` */) {\n    return false\n  }\n\n  // scan marker length\n  let mem = pos\n  pos = state.skipChars(pos, marker)\n\n  let len = pos - mem\n\n  if (len < 3) { return false }\n\n  const markup = state.src.slice(mem, pos)\n  const params = state.src.slice(pos, max)\n\n  if (marker === 0x60 /* ` */) {\n    if (params.indexOf(String.fromCharCode(marker)) >= 0) {\n      return false\n    }\n  }\n\n  // Since start is found, we can report success here in validation mode\n  if (silent) { return true }\n\n  // search end of block\n  let nextLine = startLine\n  let haveEndMarker = false\n\n  for (;;) {\n    nextLine++\n    if (nextLine >= endLine) {\n      // unclosed block should be autoclosed by end of document.\n      // also block seems to be autoclosed by end of parent\n      break\n    }\n\n    pos = mem = state.bMarks[nextLine] + state.tShift[nextLine]\n    max = state.eMarks[nextLine]\n\n    if (pos < max && state.sCount[nextLine] < state.blkIndent) {\n      // non-empty line with negative indent should stop the list:\n      // - ```\n      //  test\n      break\n    }\n\n    if (state.src.charCodeAt(pos) !== marker) { continue }\n\n    if (state.sCount[nextLine] - state.blkIndent >= 4) {\n      // closing fence should be indented less than 4 spaces\n      continue\n    }\n\n    pos = state.skipChars(pos, marker)\n\n    // closing code fence must be at least as long as the opening one\n    if (pos - mem < len) { continue }\n\n    // make sure tail has spaces only\n    pos = state.skipSpaces(pos)\n\n    if (pos < max) { continue }\n\n    haveEndMarker = true\n    // found!\n    break\n  }\n\n  // If a fence has heading spaces, they should be removed from its inner block\n  len = state.sCount[startLine]\n\n  state.line = nextLine + (haveEndMarker ? 1 : 0)\n\n  const token   = state.push('fence', 'code', 0)\n  token.info    = params\n  token.content = state.getLines(startLine + 1, nextLine, len, true)\n  token.markup  = markup\n  token.map     = [startLine, state.line]\n\n  return true\n}\n","// Block quotes\n\nimport { isSpace } from '../common/utils.mjs'\n\nexport default function blockquote (state, startLine, endLine, silent) {\n  let pos = state.bMarks[startLine] + state.tShift[startLine]\n  let max = state.eMarks[startLine]\n\n  const oldLineMax = state.lineMax\n\n  // if it's indented more than 3 spaces, it should be a code block\n  if (state.sCount[startLine] - state.blkIndent >= 4) { return false }\n\n  // check the block quote marker\n  if (state.src.charCodeAt(pos) !== 0x3E/* > */) { return false }\n\n  // we know that it's going to be a valid blockquote,\n  // so no point trying to find the end of it in silent mode\n  if (silent) { return true }\n\n  const oldBMarks  = []\n  const oldBSCount = []\n  const oldSCount  = []\n  const oldTShift  = []\n\n  const terminatorRules = state.md.block.ruler.getRules('blockquote')\n\n  const oldParentType = state.parentType\n  state.parentType = 'blockquote'\n  let lastLineEmpty = false\n  let nextLine\n\n  // Search the end of the block\n  //\n  // Block ends with either:\n  //  1. an empty line outside:\n  //     ```\n  //     > test\n  //\n  //     ```\n  //  2. an empty line inside:\n  //     ```\n  //     >\n  //     test\n  //     ```\n  //  3. another tag:\n  //     ```\n  //     > test\n  //      - - -\n  //     ```\n  for (nextLine = startLine; nextLine < endLine; nextLine++) {\n    // check if it's outdented, i.e. it's inside list item and indented\n    // less than said list item:\n    //\n    // ```\n    // 1. anything\n    //    > current blockquote\n    // 2. checking this line\n    // ```\n    const isOutdented = state.sCount[nextLine] < state.blkIndent\n\n    pos = state.bMarks[nextLine] + state.tShift[nextLine]\n    max = state.eMarks[nextLine]\n\n    if (pos >= max) {\n      // Case 1: line is not inside the blockquote, and this line is empty.\n      break\n    }\n\n    if (state.src.charCodeAt(pos++) === 0x3E/* > */ && !isOutdented) {\n      // This line is inside the blockquote.\n\n      // set offset past spaces and \">\"\n      let initial = state.sCount[nextLine] + 1\n      let spaceAfterMarker\n      let adjustTab\n\n      // skip one optional space after '>'\n      if (state.src.charCodeAt(pos) === 0x20 /* space */) {\n        // ' >   test '\n        //     ^ -- position start of line here:\n        pos++\n        initial++\n        adjustTab = false\n        spaceAfterMarker = true\n      } else if (state.src.charCodeAt(pos) === 0x09 /* tab */) {\n        spaceAfterMarker = true\n\n        if ((state.bsCount[nextLine] + initial) % 4 === 3) {\n          // '  >\\t  test '\n          //       ^ -- position start of line here (tab has width===1)\n          pos++\n          initial++\n          adjustTab = false\n        } else {\n          // ' >\\t  test '\n          //    ^ -- position start of line here + shift bsCount slightly\n          //         to make extra space appear\n          adjustTab = true\n        }\n      } else {\n        spaceAfterMarker = false\n      }\n\n      let offset = initial\n      oldBMarks.push(state.bMarks[nextLine])\n      state.bMarks[nextLine] = pos\n\n      while (pos < max) {\n        const ch = state.src.charCodeAt(pos)\n\n        if (isSpace(ch)) {\n          if (ch === 0x09) {\n            offset += 4 - (offset + state.bsCount[nextLine] + (adjustTab ? 1 : 0)) % 4\n          } else {\n            offset++\n          }\n        } else {\n          break\n        }\n\n        pos++\n      }\n\n      lastLineEmpty = pos >= max\n\n      oldBSCount.push(state.bsCount[nextLine])\n      state.bsCount[nextLine] = state.sCount[nextLine] + 1 + (spaceAfterMarker ? 1 : 0)\n\n      oldSCount.push(state.sCount[nextLine])\n      state.sCount[nextLine] = offset - initial\n\n      oldTShift.push(state.tShift[nextLine])\n      state.tShift[nextLine] = pos - state.bMarks[nextLine]\n      continue\n    }\n\n    // Case 2: line is not inside the blockquote, and the last line was empty.\n    if (lastLineEmpty) { break }\n\n    // Case 3: another tag found.\n    let terminate = false\n    for (let i = 0, l = terminatorRules.length; i < l; i++) {\n      if (terminatorRules[i](state, nextLine, endLine, true)) {\n        terminate = true\n        break\n      }\n    }\n\n    if (terminate) {\n      // Quirk to enforce \"hard termination mode\" for paragraphs;\n      // normally if you call `tokenize(state, startLine, nextLine)`,\n      // paragraphs will look below nextLine for paragraph continuation,\n      // but if blockquote is terminated by another tag, they shouldn't\n      state.lineMax = nextLine\n\n      if (state.blkIndent !== 0) {\n        // state.blkIndent was non-zero, we now set it to zero,\n        // so we need to re-calculate all offsets to appear as\n        // if indent wasn't changed\n        oldBMarks.push(state.bMarks[nextLine])\n        oldBSCount.push(state.bsCount[nextLine])\n        oldTShift.push(state.tShift[nextLine])\n        oldSCount.push(state.sCount[nextLine])\n        state.sCount[nextLine] -= state.blkIndent\n      }\n\n      break\n    }\n\n    oldBMarks.push(state.bMarks[nextLine])\n    oldBSCount.push(state.bsCount[nextLine])\n    oldTShift.push(state.tShift[nextLine])\n    oldSCount.push(state.sCount[nextLine])\n\n    // A negative indentation means that this is a paragraph continuation\n    //\n    state.sCount[nextLine] = -1\n  }\n\n  const oldIndent = state.blkIndent\n  state.blkIndent = 0\n\n  const token_o  = state.push('blockquote_open', 'blockquote', 1)\n  token_o.markup = '>'\n  const lines = [startLine, 0]\n  token_o.map    = lines\n\n  state.md.block.tokenize(state, startLine, nextLine)\n\n  const token_c  = state.push('blockquote_close', 'blockquote', -1)\n  token_c.markup = '>'\n\n  state.lineMax = oldLineMax\n  state.parentType = oldParentType\n  lines[1] = state.line\n\n  // Restore original tShift; this might not be necessary since the parser\n  // has already been here, but just to make sure we can do that.\n  for (let i = 0; i < oldTShift.length; i++) {\n    state.bMarks[i + startLine] = oldBMarks[i]\n    state.tShift[i + startLine] = oldTShift[i]\n    state.sCount[i + startLine] = oldSCount[i]\n    state.bsCount[i + startLine] = oldBSCount[i]\n  }\n  state.blkIndent = oldIndent\n\n  return true\n}\n","// Horizontal rule\n\nimport { isSpace } from '../common/utils.mjs'\n\nexport default function hr (state, startLine, endLine, silent) {\n  const max = state.eMarks[startLine]\n  // if it's indented more than 3 spaces, it should be a code block\n  if (state.sCount[startLine] - state.blkIndent >= 4) { return false }\n\n  let pos = state.bMarks[startLine] + state.tShift[startLine]\n  const marker = state.src.charCodeAt(pos++)\n\n  // Check hr marker\n  if (marker !== 0x2A/* * */ &&\n      marker !== 0x2D/* - */ &&\n      marker !== 0x5F/* _ */) {\n    return false\n  }\n\n  // markers can be mixed with spaces, but there should be at least 3 of them\n\n  let cnt = 1\n  while (pos < max) {\n    const ch = state.src.charCodeAt(pos++)\n    if (ch !== marker && !isSpace(ch)) { return false }\n    if (ch === marker) { cnt++ }\n  }\n\n  if (cnt < 3) { return false }\n\n  if (silent) { return true }\n\n  state.line = startLine + 1\n\n  const token  = state.push('hr', 'hr', 0)\n  token.map    = [startLine, state.line]\n  token.markup = Array(cnt + 1).join(String.fromCharCode(marker))\n\n  return true\n}\n","import { isSpace, normalizeReference } from '../common/utils.mjs'\n\nexport default function reference (state, startLine, _endLine, silent) {\n  let pos = state.bMarks[startLine] + state.tShift[startLine]\n  let max = state.eMarks[startLine]\n  let nextLine = startLine + 1\n\n  // if it's indented more than 3 spaces, it should be a code block\n  if (state.sCount[startLine] - state.blkIndent >= 4) { return false }\n\n  if (state.src.charCodeAt(pos) !== 0x5B/* [ */) { return false }\n\n  function getNextLine (nextLine) {\n    const endLine = state.lineMax\n\n    if (nextLine >= endLine || state.isEmpty(nextLine)) {\n      // empty line or end of input\n      return null\n    }\n\n    let isContinuation = false\n\n    // this would be a code block normally, but after paragraph\n    // it's considered a lazy continuation regardless of what's there\n    if (state.sCount[nextLine] - state.blkIndent > 3) { isContinuation = true }\n\n    // quirk for blockquotes, this line should already be checked by that rule\n    if (state.sCount[nextLine] < 0) { isContinuation = true }\n\n    if (!isContinuation) {\n      const terminatorRules = state.md.block.ruler.getRules('reference')\n      const oldParentType = state.parentType\n      state.parentType = 'reference'\n\n      // Some tags can terminate paragraph without empty line.\n      let terminate = false\n      for (let i = 0, l = terminatorRules.length; i < l; i++) {\n        if (terminatorRules[i](state, nextLine, endLine, true)) {\n          terminate = true\n          break\n        }\n      }\n\n      state.parentType = oldParentType\n      if (terminate) {\n        // terminated by another block\n        return null\n      }\n    }\n\n    const pos = state.bMarks[nextLine] + state.tShift[nextLine]\n    const max = state.eMarks[nextLine]\n\n    // max + 1 explicitly includes the newline\n    return state.src.slice(pos, max + 1)\n  }\n\n  let str = state.src.slice(pos, max + 1)\n\n  max = str.length\n  let labelEnd = -1\n\n  for (pos = 1; pos < max; pos++) {\n    const ch = str.charCodeAt(pos)\n    if (ch === 0x5B /* [ */) {\n      return false\n    } else if (ch === 0x5D /* ] */) {\n      labelEnd = pos\n      break\n    } else if (ch === 0x0A /* \\n */) {\n      const lineContent = getNextLine(nextLine)\n      if (lineContent !== null) {\n        str += lineContent\n        max = str.length\n        nextLine++\n      }\n    } else if (ch === 0x5C /* \\ */) {\n      pos++\n      if (pos < max && str.charCodeAt(pos) === 0x0A) {\n        const lineContent = getNextLine(nextLine)\n        if (lineContent !== null) {\n          str += lineContent\n          max = str.length\n          nextLine++\n        }\n      }\n    }\n  }\n\n  if (labelEnd < 0 || str.charCodeAt(labelEnd + 1) !== 0x3A/* : */) { return false }\n\n  // [label]:   destination   'title'\n  //         ^^^ skip optional whitespace here\n  for (pos = labelEnd + 2; pos < max; pos++) {\n    const ch = str.charCodeAt(pos)\n    if (ch === 0x0A) {\n      const lineContent = getNextLine(nextLine)\n      if (lineContent !== null) {\n        str += lineContent\n        max = str.length\n        nextLine++\n      }\n    } else if (isSpace(ch)) {\n      /* eslint no-empty:0 */\n    } else {\n      break\n    }\n  }\n\n  // [label]:   destination   'title'\n  //            ^^^^^^^^^^^ parse this\n  const destRes = state.md.helpers.parseLinkDestination(str, pos, max)\n  if (!destRes.ok) { return false }\n\n  const href = state.md.normalizeLink(destRes.str)\n  if (!state.md.validateLink(href)) { return false }\n\n  pos = destRes.pos\n\n  // save cursor state, we could require to rollback later\n  const destEndPos = pos\n  const destEndLineNo = nextLine\n\n  // [label]:   destination   'title'\n  //                       ^^^ skipping those spaces\n  const start = pos\n  for (; pos < max; pos++) {\n    const ch = str.charCodeAt(pos)\n    if (ch === 0x0A) {\n      const lineContent = getNextLine(nextLine)\n      if (lineContent !== null) {\n        str += lineContent\n        max = str.length\n        nextLine++\n      }\n    } else if (isSpace(ch)) {\n      /* eslint no-empty:0 */\n    } else {\n      break\n    }\n  }\n\n  // [label]:   destination   'title'\n  //                          ^^^^^^^ parse this\n  let titleRes = state.md.helpers.parseLinkTitle(str, pos, max)\n  while (titleRes.can_continue) {\n    const lineContent = getNextLine(nextLine)\n    if (lineContent === null) break\n    str += lineContent\n    pos = max\n    max = str.length\n    nextLine++\n    titleRes = state.md.helpers.parseLinkTitle(str, pos, max, titleRes)\n  }\n  let title\n\n  if (pos < max && start !== pos && titleRes.ok) {\n    title = titleRes.str\n    pos = titleRes.pos\n  } else {\n    title = ''\n    pos = destEndPos\n    nextLine = destEndLineNo\n  }\n\n  // skip trailing spaces until the rest of the line\n  while (pos < max) {\n    const ch = str.charCodeAt(pos)\n    if (!isSpace(ch)) { break }\n    pos++\n  }\n\n  if (pos < max && str.charCodeAt(pos) !== 0x0A) {\n    if (title) {\n      // garbage at the end of the line after title,\n      // but it could still be a valid reference if we roll back\n      title = ''\n      pos = destEndPos\n      nextLine = destEndLineNo\n      while (pos < max) {\n        const ch = str.charCodeAt(pos)\n        if (!isSpace(ch)) { break }\n        pos++\n      }\n    }\n  }\n\n  if (pos < max && str.charCodeAt(pos) !== 0x0A) {\n    // garbage at the end of the line\n    return false\n  }\n\n  const label = normalizeReference(str.slice(1, labelEnd))\n  if (!label) {\n    // CommonMark 0.20 disallows empty labels\n    return false\n  }\n\n  // Reference can not terminate anything. This check is for safety only.\n  /* istanbul ignore if */\n  if (silent) { return true }\n\n  if (typeof state.env.references === 'undefined') {\n    state.env.references = {}\n  }\n  if (typeof state.env.references[label] === 'undefined') {\n    state.env.references[label] = { title, href }\n  }\n\n  state.line = nextLine\n  return true\n}\n","// heading (#, ##, ...)\n\nimport { isSpace, asciiTrim } from '../common/utils.mjs'\n\nexport default function heading (state, startLine, endLine, silent) {\n  let pos = state.bMarks[startLine] + state.tShift[startLine]\n  let max = state.eMarks[startLine]\n\n  // if it's indented more than 3 spaces, it should be a code block\n  if (state.sCount[startLine] - state.blkIndent >= 4) { return false }\n\n  let ch  = state.src.charCodeAt(pos)\n\n  if (ch !== 0x23/* # */ || pos >= max) { return false }\n\n  // count heading level\n  let level = 1\n  ch = state.src.charCodeAt(++pos)\n  while (ch === 0x23/* # */ && pos < max && level <= 6) {\n    level++\n    ch = state.src.charCodeAt(++pos)\n  }\n\n  if (level > 6 || (pos < max && !isSpace(ch))) { return false }\n\n  if (silent) { return true }\n\n  // Let's cut tails like '    ###  ' from the end of string\n\n  max = state.skipSpacesBack(max, pos)\n  const tmp = state.skipCharsBack(max, 0x23, pos) // #\n  if (tmp > pos && isSpace(state.src.charCodeAt(tmp - 1))) {\n    max = tmp\n  }\n\n  state.line = startLine + 1\n\n  const token_o  = state.push('heading_open', 'h' + String(level), 1)\n  token_o.markup = '########'.slice(0, level)\n  token_o.map    = [startLine, state.line]\n\n  const token_i    = state.push('inline', '', 0)\n  token_i.content  = asciiTrim(state.src.slice(pos, max))\n  token_i.map      = [startLine, state.line]\n  token_i.children = []\n\n  const token_c  = state.push('heading_close', 'h' + String(level), -1)\n  token_c.markup = '########'.slice(0, level)\n\n  return true\n}\n","// lheading (---, ===)\n\nimport { asciiTrim } from '../common/utils.mjs'\n\nexport default function lheading (state, startLine, endLine/*, silent */) {\n  const terminatorRules = state.md.block.ruler.getRules('paragraph')\n\n  // if it's indented more than 3 spaces, it should be a code block\n  if (state.sCount[startLine] - state.blkIndent >= 4) { return false }\n\n  const oldParentType = state.parentType\n  state.parentType = 'paragraph' // use paragraph to match terminatorRules\n\n  // jump line-by-line until empty one or EOF\n  let level = 0\n  let marker\n  let nextLine = startLine + 1\n\n  for (; nextLine < endLine && !state.isEmpty(nextLine); nextLine++) {\n    // this would be a code block normally, but after paragraph\n    // it's considered a lazy continuation regardless of what's there\n    if (state.sCount[nextLine] - state.blkIndent > 3) { continue }\n\n    //\n    // Check for underline in setext header\n    //\n    if (state.sCount[nextLine] >= state.blkIndent) {\n      let pos = state.bMarks[nextLine] + state.tShift[nextLine]\n      const max = state.eMarks[nextLine]\n\n      if (pos < max) {\n        marker = state.src.charCodeAt(pos)\n\n        if (marker === 0x2D/* - */ || marker === 0x3D/* = */) {\n          pos = state.skipChars(pos, marker)\n          pos = state.skipSpaces(pos)\n\n          if (pos >= max) {\n            level = (marker === 0x3D/* = */ ? 1 : 2)\n            break\n          }\n        }\n      }\n    }\n\n    // quirk for blockquotes, this line should already be checked by that rule\n    if (state.sCount[nextLine] < 0) { continue }\n\n    // Some tags can terminate paragraph without empty line.\n    let terminate = false\n    for (let i = 0, l = terminatorRules.length; i < l; i++) {\n      if (terminatorRules[i](state, nextLine, endLine, true)) {\n        terminate = true\n        break\n      }\n    }\n    if (terminate) { break }\n  }\n\n  if (!level) {\n    // Didn't find valid underline\n    state.parentType = oldParentType\n    return false\n  }\n\n  const content = asciiTrim(state.getLines(startLine, nextLine, state.blkIndent, false))\n\n  state.line = nextLine + 1\n\n  const token_o    = state.push('heading_open', 'h' + String(level), 1)\n  token_o.markup   = String.fromCharCode(marker)\n  token_o.map      = [startLine, state.line]\n\n  const token_i    = state.push('inline', '', 0)\n  token_i.content  = content\n  token_i.map      = [startLine, state.line - 1]\n  token_i.children = []\n\n  const token_c    = state.push('heading_close', 'h' + String(level), -1)\n  token_c.markup   = String.fromCharCode(marker)\n\n  state.parentType = oldParentType\n\n  return true\n}\n","// Paragraph\n\nimport { asciiTrim } from '../common/utils.mjs'\n\nexport default function paragraph (state, startLine, endLine) {\n  const terminatorRules = state.md.block.ruler.getRules('paragraph')\n  const oldParentType = state.parentType\n  let nextLine = startLine + 1\n  state.parentType = 'paragraph'\n\n  // jump line-by-line until empty one or EOF\n  for (; nextLine < endLine && !state.isEmpty(nextLine); nextLine++) {\n    // this would be a code block normally, but after paragraph\n    // it's considered a lazy continuation regardless of what's there\n    if (state.sCount[nextLine] - state.blkIndent > 3) { continue }\n\n    // quirk for blockquotes, this line should already be checked by that rule\n    if (state.sCount[nextLine] < 0) { continue }\n\n    // Some tags can terminate paragraph without empty line.\n    let terminate = false\n    for (let i = 0, l = terminatorRules.length; i < l; i++) {\n      if (terminatorRules[i](state, nextLine, endLine, true)) {\n        terminate = true\n        break\n      }\n    }\n    if (terminate) { break }\n  }\n\n  const content = asciiTrim(state.getLines(startLine, nextLine, state.blkIndent, false))\n\n  state.line = nextLine\n\n  const token_o    = state.push('paragraph_open', 'p', 1)\n  token_o.map      = [startLine, state.line]\n\n  const token_i    = state.push('inline', '', 0)\n  token_i.content  = content\n  token_i.map      = [startLine, state.line]\n  token_i.children = []\n\n  state.push('paragraph_close', 'p', -1)\n\n  state.parentType = oldParentType\n\n  return true\n}\n","// Inline parser state\n\nimport Token from '../token.mjs'\nimport { isWhiteSpace, isPunctCharCode, isMdAsciiPunct } from '../common/utils.mjs'\n\nfunction StateInline (src, md, env, outTokens) {\n  this.src = src\n  this.env = env\n  this.md = md\n  this.tokens = outTokens\n  this.tokens_meta = Array(outTokens.length)\n\n  this.pos = 0\n  this.posMax = this.src.length\n  this.level = 0\n  this.pending = ''\n  this.pendingLevel = 0\n\n  // Stores { start: end } pairs. Useful for backtrack\n  // optimization of pairs parse (emphasis, strikes).\n  this.cache = {}\n\n  // List of emphasis-like delimiters for current tag\n  this.delimiters = []\n\n  // Stack of delimiter lists for upper level tags\n  this._prev_delimiters = []\n\n  // backtick length => last seen position\n  this.backticks = {}\n  this.backticksScanned = false\n\n  // Counter used to disable inline linkify-it execution\n  // inside <a> and markdown links\n  this.linkLevel = 0\n}\n\n// Flush pending text\n//\nStateInline.prototype.pushPending = function () {\n  const token = new Token('text', '', 0)\n  token.content = this.pending\n  token.level = this.pendingLevel\n  this.tokens.push(token)\n  this.pending = ''\n  return token\n}\n\n// Push new token to \"stream\".\n// If pending text exists - flush it as text token\n//\nStateInline.prototype.push = function (type, tag, nesting) {\n  if (this.pending) {\n    this.pushPending()\n  }\n\n  const token = new Token(type, tag, nesting)\n  let token_meta = null\n\n  if (nesting < 0) {\n    // closing tag\n    this.level--\n    this.delimiters = this._prev_delimiters.pop()\n  }\n\n  token.level = this.level\n\n  if (nesting > 0) {\n    // opening tag\n    this.level++\n    this._prev_delimiters.push(this.delimiters)\n    this.delimiters = []\n    token_meta = { delimiters: this.delimiters }\n  }\n\n  this.pendingLevel = this.level\n  this.tokens.push(token)\n  this.tokens_meta.push(token_meta)\n  return token\n}\n\n// Scan a sequence of emphasis-like markers, and determine whether\n// it can start an emphasis sequence or end an emphasis sequence.\n//\n//  - start - position to scan from (it should point at a valid marker);\n//  - canSplitWord - determine if these markers can be found inside a word\n//\nStateInline.prototype.scanDelims = function (start, canSplitWord) {\n  const max = this.posMax\n  const marker = this.src.charCodeAt(start)\n\n  // Astral characters below are combined manually, because .codePointAt()\n  // does not guarantee numeric type output. And we don't wish JIT cache issues.\n  // The broken surrogate pairs are evaluated as U+FFFD to prevent possible\n  // crashes.\n\n  let lastChar\n  if (start === 0) {\n    // treat beginning of the line as a whitespace\n    lastChar = 0x20\n  } else if (start === 1) {\n    lastChar = this.src.charCodeAt(0)\n    if ((lastChar & 0xF800) === 0xD800) { lastChar = 0xFFFD }\n  } else {\n    lastChar = this.src.charCodeAt(start - 1)\n    if ((lastChar & 0xFC00) === 0xDC00) {\n      // low surrogate => add high one, replace broken pair with U+FFFD\n      const highSurr = this.src.charCodeAt(start - 2)\n      lastChar = (highSurr & 0xFC00) === 0xD800\n        ? 0x10000 + ((highSurr - 0xD800) << 10) + (lastChar - 0xDC00)\n        : 0xFFFD\n    } else if ((lastChar & 0xFC00) === 0xD800) {\n      lastChar = 0xFFFD\n    }\n  }\n\n  let pos = start\n  while (pos < max && this.src.charCodeAt(pos) === marker) { pos++ }\n\n  const count = pos - start\n\n  // treat end of the line as a whitespace\n  let nextChar = pos < max ? this.src.charCodeAt(pos) : 0x20\n  if ((nextChar & 0xFC00) === 0xD800) {\n    // high surrogate => add low one, replace broken pair with U+FFFD\n    const lowSurr = this.src.charCodeAt(pos + 1)\n    nextChar = (lowSurr & 0xFC00) === 0xDC00\n      ? 0x10000 + ((nextChar - 0xD800) << 10) + (lowSurr - 0xDC00)\n      : 0xFFFD\n  } else if ((nextChar & 0xFC00) === 0xDC00) {\n    nextChar = 0xFFFD\n  }\n\n  const isLastPunctChar = isMdAsciiPunct(lastChar) || isPunctCharCode(lastChar)\n  const isNextPunctChar = isMdAsciiPunct(nextChar) || isPunctCharCode(nextChar)\n\n  const isLastWhiteSpace = isWhiteSpace(lastChar)\n  const isNextWhiteSpace = isWhiteSpace(nextChar)\n\n  const left_flanking =\n    !isNextWhiteSpace && (!isNextPunctChar || isLastWhiteSpace || isLastPunctChar)\n  const right_flanking =\n    !isLastWhiteSpace && (!isLastPunctChar || isNextWhiteSpace || isNextPunctChar)\n\n  const can_open  = left_flanking  && (canSplitWord || !right_flanking || isLastPunctChar)\n  const can_close = right_flanking && (canSplitWord || !left_flanking  || isNextPunctChar)\n\n  return { can_open, can_close, length: count }\n}\n\n// re-export Token class to use in block rules\nStateInline.prototype.Token = Token\n\nexport default StateInline\n","// Skip text characters for text token, place those to pending buffer\n// and increment current pos\n\n// Rule to skip pure text\n// '{}$%@~+=:' reserved for extentions\n\n// !, \", #, $, %, &, ', (, ), *, +, ,, -, ., /, :, ;, <, =, >, ?, @, [, \\, ], ^, _, `, {, |, }, or ~\n\n// !!!! Don't confuse with \"Markdown ASCII Punctuation\" chars\n// http://spec.commonmark.org/0.15/#ascii-punctuation-character\nfunction isTerminatorChar (ch) {\n  switch (ch) {\n    case 0x0A/* \\n */:\n    case 0x21/* ! */:\n    case 0x23/* # */:\n    case 0x24/* $ */:\n    case 0x25/* % */:\n    case 0x26/* & */:\n    case 0x2A/* * */:\n    case 0x2B/* + */:\n    case 0x2D/* - */:\n    case 0x3A/* : */:\n    case 0x3C/* < */:\n    case 0x3D/* = */:\n    case 0x3E/* > */:\n    case 0x40/* @ */:\n    case 0x5B/* [ */:\n    case 0x5C/* \\ */:\n    case 0x5D/* ] */:\n    case 0x5E/* ^ */:\n    case 0x5F/* _ */:\n    case 0x60/* ` */:\n    case 0x7B/* { */:\n    case 0x7D/* } */:\n    case 0x7E/* ~ */:\n      return true\n    default:\n      return false\n  }\n}\n\nexport default function text (state, silent) {\n  let pos = state.pos\n\n  while (pos < state.posMax && !isTerminatorChar(state.src.charCodeAt(pos))) {\n    pos++\n  }\n\n  if (pos === state.pos) { return false }\n\n  if (!silent) { state.pending += state.src.slice(state.pos, pos) }\n\n  state.pos = pos\n\n  return true\n}\n\n// Alternative implementation, for memory.\n//\n// It costs 10% of performance, but allows extend terminators list, if place it\n// to `ParserInline` property. Probably, will switch to it sometime, such\n// flexibility required.\n\n/*\nvar TERMINATOR_RE = /[\\n!#$%&*+\\-:<=>@[\\\\\\]^_`{}~]/;\n\nmodule.exports = function text(state, silent) {\n  var pos = state.pos,\n      idx = state.src.slice(pos).search(TERMINATOR_RE);\n\n  // first char is terminator -> empty text\n  if (idx === 0) { return false; }\n\n  // no terminator -> text till end of string\n  if (idx < 0) {\n    if (!silent) { state.pending += state.src.slice(pos); }\n    state.pos = state.src.length;\n    return true;\n  }\n\n  if (!silent) { state.pending += state.src.slice(pos, pos + idx); }\n\n  state.pos += idx;\n\n  return true;\n}; */\n","// Process links like https://example.org/\n\n// RFC3986: scheme = ALPHA *( ALPHA / DIGIT / \"+\" / \"-\" / \".\" )\nconst SCHEME_RE = /(?:^|[^a-z0-9.+-])([a-z][a-z0-9.+-]*)$/i\n\nexport default function linkify (state, silent) {\n  if (!state.md.options.linkify) return false\n  if (state.linkLevel > 0) return false\n\n  const pos = state.pos\n  const max = state.posMax\n\n  if (pos + 3 > max) return false\n  if (state.src.charCodeAt(pos) !== 0x3A/* : */) return false\n  if (state.src.charCodeAt(pos + 1) !== 0x2F/* / */) return false\n  if (state.src.charCodeAt(pos + 2) !== 0x2F/* / */) return false\n\n  const match = state.pending.match(SCHEME_RE)\n  if (!match) return false\n\n  const proto = match[1]\n\n  const link = state.md.linkify.matchAtStart(state.src.slice(pos - proto.length))\n  if (!link) return false\n\n  let url = link.url\n\n  // invalid link, but still detected by linkify somehow;\n  // need to check to prevent infinite loop below\n  if (url.length <= proto.length) return false\n\n  // disallow '*' at the end of the link (conflicts with emphasis)\n  // do manual backsearch to avoid perf issues with regex /\\*+$/ on \"****...****a\".\n  let urlEnd = url.length\n  while (urlEnd > 0 && url.charCodeAt(urlEnd - 1) === 0x2A/* * */) {\n    urlEnd--\n  }\n  if (urlEnd !== url.length) {\n    url = url.slice(0, urlEnd)\n  }\n\n  const fullUrl = state.md.normalizeLink(url)\n  if (!state.md.validateLink(fullUrl)) return false\n\n  if (!silent) {\n    state.pending = state.pending.slice(0, -proto.length)\n\n    const token_o = state.push('link_open', 'a', 1)\n    token_o.attrs = [['href', fullUrl]]\n    token_o.markup = 'linkify'\n    token_o.info = 'auto'\n\n    const token_t = state.push('text', '', 0)\n    token_t.content = state.md.normalizeLinkText(url)\n\n    const token_c = state.push('link_close', 'a', -1)\n    token_c.markup = 'linkify'\n    token_c.info = 'auto'\n  }\n\n  state.pos += url.length - proto.length\n  return true\n}\n","// Process escaped chars and hardbreaks\n\nimport { isSpace } from '../common/utils.mjs'\n\nconst ESCAPED = []\n\nfor (let i = 0; i < 256; i++) { ESCAPED.push(0) }\n\n'\\\\!\"#$%&\\'()*+,./:;<=>?@[]^_`{|}~-'\n  .split('').forEach(function (ch) { ESCAPED[ch.charCodeAt(0)] = 1 })\n\nexport default function escape (state, silent) {\n  let pos = state.pos\n  const max = state.posMax\n\n  if (state.src.charCodeAt(pos) !== 0x5C/* \\ */) return false\n  pos++\n\n  // '\\' at the end of the inline block\n  if (pos >= max) return false\n\n  let ch1 = state.src.charCodeAt(pos)\n\n  if (ch1 === 0x0A) {\n    if (!silent) {\n      state.push('hardbreak', 'br', 0)\n    }\n\n    pos++\n    // skip leading whitespaces from next line\n    while (pos < max) {\n      ch1 = state.src.charCodeAt(pos)\n      if (!isSpace(ch1)) break\n      pos++\n    }\n\n    state.pos = pos\n    return true\n  }\n\n  let escapedStr = state.src[pos]\n\n  if (ch1 >= 0xD800 && ch1 <= 0xDBFF && pos + 1 < max) {\n    const ch2 = state.src.charCodeAt(pos + 1)\n\n    if (ch2 >= 0xDC00 && ch2 <= 0xDFFF) {\n      escapedStr += state.src[pos + 1]\n      pos++\n    }\n  }\n\n  const origStr = '\\\\' + escapedStr\n\n  if (!silent) {\n    const token = state.push('text_special', '', 0)\n\n    if (ch1 < 256 && ESCAPED[ch1] !== 0) {\n      token.content = escapedStr\n    } else {\n      token.content = origStr\n    }\n\n    token.markup = origStr\n    token.info   = 'escape'\n  }\n\n  state.pos = pos + 1\n  return true\n}\n","// ~~strike through~~\n//\n\n// Insert each marker as a separate text token, and add it to delimiter list\n//\nfunction strikethrough_tokenize (state, silent) {\n  const start = state.pos\n  const marker = state.src.charCodeAt(start)\n\n  if (silent) { return false }\n\n  if (marker !== 0x7E/* ~ */) { return false }\n\n  const scanned = state.scanDelims(state.pos, true)\n  let len = scanned.length\n  const ch = String.fromCharCode(marker)\n\n  if (len < 2) { return false }\n\n  let token\n\n  if (len % 2) {\n    token         = state.push('text', '', 0)\n    token.content = ch\n    len--\n  }\n\n  for (let i = 0; i < len; i += 2) {\n    token         = state.push('text', '', 0)\n    token.content = ch + ch\n\n    state.delimiters.push({\n      marker,\n      length: 0,     // disable \"rule of 3\" length checks meant for emphasis\n      token: state.tokens.length - 1,\n      end: -1,\n      open: scanned.can_open,\n      close: scanned.can_close\n    })\n  }\n\n  state.pos += scanned.length\n\n  return true\n}\n\nfunction postProcess (state, delimiters) {\n  let token\n  const loneMarkers = []\n  const max = delimiters.length\n\n  for (let i = 0; i < max; i++) {\n    const startDelim = delimiters[i]\n\n    if (startDelim.marker !== 0x7E/* ~ */) {\n      continue\n    }\n\n    if (startDelim.end === -1) {\n      continue\n    }\n\n    const endDelim = delimiters[startDelim.end]\n\n    token         = state.tokens[startDelim.token]\n    token.type    = 's_open'\n    token.tag     = 's'\n    token.nesting = 1\n    token.markup  = '~~'\n    token.content = ''\n\n    token         = state.tokens[endDelim.token]\n    token.type    = 's_close'\n    token.tag     = 's'\n    token.nesting = -1\n    token.markup  = '~~'\n    token.content = ''\n\n    if (state.tokens[endDelim.token - 1].type === 'text' &&\n        state.tokens[endDelim.token - 1].content === '~') {\n      loneMarkers.push(endDelim.token - 1)\n    }\n  }\n\n  // If a marker sequence has an odd number of characters, it's splitted\n  // like this: `~~~~~` -> `~` + `~~` + `~~`, leaving one marker at the\n  // start of the sequence.\n  //\n  // So, we have to move all those markers after subsequent s_close tags.\n  //\n  while (loneMarkers.length) {\n    const i = loneMarkers.pop()\n    let j = i + 1\n\n    while (j < state.tokens.length && state.tokens[j].type === 's_close') {\n      j++\n    }\n\n    j--\n\n    if (i !== j) {\n      token = state.tokens[j]\n      state.tokens[j] = state.tokens[i]\n      state.tokens[i] = token\n    }\n  }\n}\n\n// Walk through delimiter list and replace text tokens with tags\n//\nfunction strikethrough_postProcess (state) {\n  const tokens_meta = state.tokens_meta\n  const max = state.tokens_meta.length\n\n  postProcess(state, state.delimiters)\n\n  for (let curr = 0; curr < max; curr++) {\n    if (tokens_meta[curr] && tokens_meta[curr].delimiters) {\n      postProcess(state, tokens_meta[curr].delimiters)\n    }\n  }\n}\n\nexport default {\n  tokenize: strikethrough_tokenize,\n  postProcess: strikethrough_postProcess\n}\n","// Process *this* and _that_\n//\n\n// Insert each marker as a separate text token, and add it to delimiter list\n//\nfunction emphasis_tokenize (state, silent) {\n  const start = state.pos\n  const marker = state.src.charCodeAt(start)\n\n  if (silent) { return false }\n\n  if (marker !== 0x5F /* _ */ && marker !== 0x2A /* * */) { return false }\n\n  const scanned = state.scanDelims(state.pos, marker === 0x2A)\n\n  for (let i = 0; i < scanned.length; i++) {\n    const token = state.push('text', '', 0)\n    token.content = String.fromCharCode(marker)\n\n    state.delimiters.push({\n      // Char code of the starting marker (number).\n      //\n      marker,\n\n      // Total length of these series of delimiters.\n      //\n      length: scanned.length,\n\n      // A position of the token this delimiter corresponds to.\n      //\n      token: state.tokens.length - 1,\n\n      // If this delimiter is matched as a valid opener, `end` will be\n      // equal to its position, otherwise it's `-1`.\n      //\n      end: -1,\n\n      // Boolean flags that determine if this delimiter could open or close\n      // an emphasis.\n      //\n      open: scanned.can_open,\n      close: scanned.can_close\n    })\n  }\n\n  state.pos += scanned.length\n\n  return true\n}\n\nfunction postProcess (state, delimiters) {\n  const max = delimiters.length\n\n  for (let i = max - 1; i >= 0; i--) {\n    const startDelim = delimiters[i]\n\n    if (startDelim.marker !== 0x5F/* _ */ && startDelim.marker !== 0x2A/* * */) {\n      continue\n    }\n\n    // Process only opening markers\n    if (startDelim.end === -1) {\n      continue\n    }\n\n    const endDelim = delimiters[startDelim.end]\n\n    // If the previous delimiter has the same marker and is adjacent to this one,\n    // merge those into one strong delimiter.\n    //\n    // `<em><em>whatever</em></em>` -> `<strong>whatever</strong>`\n    //\n    const isStrong = i > 0 &&\n               delimiters[i - 1].end === startDelim.end + 1 &&\n               // check that first two markers match and adjacent\n               delimiters[i - 1].marker === startDelim.marker &&\n               delimiters[i - 1].token === startDelim.token - 1 &&\n               // check that last two markers are adjacent (we can safely assume they match)\n               delimiters[startDelim.end + 1].token === endDelim.token + 1\n\n    const ch = String.fromCharCode(startDelim.marker)\n\n    const token_o   = state.tokens[startDelim.token]\n    token_o.type    = isStrong ? 'strong_open' : 'em_open'\n    token_o.tag     = isStrong ? 'strong' : 'em'\n    token_o.nesting = 1\n    token_o.markup  = isStrong ? ch + ch : ch\n    token_o.content = ''\n\n    const token_c   = state.tokens[endDelim.token]\n    token_c.type    = isStrong ? 'strong_close' : 'em_close'\n    token_c.tag     = isStrong ? 'strong' : 'em'\n    token_c.nesting = -1\n    token_c.markup  = isStrong ? ch + ch : ch\n    token_c.content = ''\n\n    if (isStrong) {\n      state.tokens[delimiters[i - 1].token].content = ''\n      state.tokens[delimiters[startDelim.end + 1].token].content = ''\n      i--\n    }\n  }\n}\n\n// Walk through delimiter list and replace text tokens with tags\n//\nfunction emphasis_post_process (state) {\n  const tokens_meta = state.tokens_meta\n  const max = state.tokens_meta.length\n\n  postProcess(state, state.delimiters)\n\n  for (let curr = 0; curr < max; curr++) {\n    if (tokens_meta[curr] && tokens_meta[curr].delimiters) {\n      postProcess(state, tokens_meta[curr].delimiters)\n    }\n  }\n}\n\nexport default {\n  tokenize: emphasis_tokenize,\n  postProcess: emphasis_post_process\n}\n","// Process autolinks '<protocol:...>'\n\n/* eslint max-len:0 */\nconst EMAIL_RE    = /^([a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*)$/\n/* eslint-disable-next-line no-control-regex */\nconst AUTOLINK_RE = /^([a-zA-Z][a-zA-Z0-9+.-]{1,31}):([^<>\\x00-\\x20]*)$/\n\nexport default function autolink (state, silent) {\n  let pos = state.pos\n\n  if (state.src.charCodeAt(pos) !== 0x3C/* < */) { return false }\n\n  const start = state.pos\n  const max = state.posMax\n\n  for (;;) {\n    if (++pos >= max) return false\n\n    const ch = state.src.charCodeAt(pos)\n\n    if (ch === 0x3C /* < */) return false\n    if (ch === 0x3E /* > */) break\n  }\n\n  const url = state.src.slice(start + 1, pos)\n\n  if (AUTOLINK_RE.test(url)) {\n    const fullUrl = state.md.normalizeLink(url)\n    if (!state.md.validateLink(fullUrl)) { return false }\n\n    if (!silent) {\n      const token_o   = state.push('link_open', 'a', 1)\n      token_o.attrs   = [['href', fullUrl]]\n      token_o.markup  = 'autolink'\n      token_o.info    = 'auto'\n\n      const token_t   = state.push('text', '', 0)\n      token_t.content = state.md.normalizeLinkText(url)\n\n      const token_c   = state.push('link_close', 'a', -1)\n      token_c.markup  = 'autolink'\n      token_c.info    = 'auto'\n    }\n\n    state.pos += url.length + 2\n    return true\n  }\n\n  if (EMAIL_RE.test(url)) {\n    const fullUrl = state.md.normalizeLink('mailto:' + url)\n    if (!state.md.validateLink(fullUrl)) { return false }\n\n    if (!silent) {\n      const token_o   = state.push('link_open', 'a', 1)\n      token_o.attrs   = [['href', fullUrl]]\n      token_o.markup  = 'autolink'\n      token_o.info    = 'auto'\n\n      const token_t   = state.push('text', '', 0)\n      token_t.content = state.md.normalizeLinkText(url)\n\n      const token_c   = state.push('link_close', 'a', -1)\n      token_c.markup  = 'autolink'\n      token_c.info    = 'auto'\n    }\n\n    state.pos += url.length + 2\n    return true\n  }\n\n  return false\n}\n","// Process html entity - &#123;, &#xAF;, &quot;, ...\n\nimport { decodeHTMLStrict } from 'entities'\nimport { isValidEntityCode, fromCodePoint } from '../common/utils.mjs'\n\nconst DIGITAL_RE = /^&#((?:x[a-f0-9]{1,6}|[0-9]{1,7}));/i\nconst NAMED_RE   = /^&([a-z][a-z0-9]{1,31});/i\n\nexport default function entity (state, silent) {\n  const pos = state.pos\n  const max = state.posMax\n\n  if (state.src.charCodeAt(pos) !== 0x26/* & */) return false\n\n  if (pos + 1 >= max) return false\n\n  const ch = state.src.charCodeAt(pos + 1)\n\n  if (ch === 0x23 /* # */) {\n    const match = state.src.slice(pos).match(DIGITAL_RE)\n    if (match) {\n      if (!silent) {\n        const code = match[1][0].toLowerCase() === 'x' ? parseInt(match[1].slice(1), 16) : parseInt(match[1], 10)\n\n        const token   = state.push('text_special', '', 0)\n        token.content = isValidEntityCode(code) ? fromCodePoint(code) : fromCodePoint(0xFFFD)\n        token.markup  = match[0]\n        token.info    = 'entity'\n      }\n      state.pos += match[0].length\n      return true\n    }\n  } else {\n    const match = state.src.slice(pos).match(NAMED_RE)\n    if (match) {\n      const decoded = decodeHTMLStrict(match[0])\n      if (decoded !== match[0]) {\n        if (!silent) {\n          const token   = state.push('text_special', '', 0)\n          token.content = decoded\n          token.markup  = match[0]\n          token.info    = 'entity'\n        }\n        state.pos += match[0].length\n        return true\n      }\n    }\n  }\n\n  return false\n}\n","// For each opening emphasis-like marker find a matching closing one\n//\n\nfunction processDelimiters (delimiters) {\n  const openersBottom = {}\n  const max = delimiters.length\n\n  if (!max) return\n\n  // headerIdx is the first delimiter of the current (where closer is) delimiter run\n  let headerIdx = 0\n  let lastTokenIdx = -2 // needs any value lower than -1\n  const jumps = []\n\n  for (let closerIdx = 0; closerIdx < max; closerIdx++) {\n    const closer = delimiters[closerIdx]\n\n    jumps.push(0)\n\n    // markers belong to same delimiter run if:\n    //  - they have adjacent tokens\n    //  - AND markers are the same\n    //\n    if (delimiters[headerIdx].marker !== closer.marker || lastTokenIdx !== closer.token - 1) {\n      headerIdx = closerIdx\n    }\n\n    lastTokenIdx = closer.token\n\n    // Length is only used for emphasis-specific \"rule of 3\",\n    // if it's not defined (in strikethrough or 3rd party plugins),\n    // we can default it to 0 to disable those checks.\n    //\n    closer.length = closer.length || 0\n\n    if (!closer.close) continue\n\n    // Previously calculated lower bounds (previous fails)\n    // for each marker, each delimiter length modulo 3,\n    // and for whether this closer can be an opener;\n    // https://github.com/commonmark/cmark/commit/34250e12ccebdc6372b8b49c44fab57c72443460\n    /* eslint-disable-next-line no-prototype-builtins */\n    if (!openersBottom.hasOwnProperty(closer.marker)) {\n      openersBottom[closer.marker] = [-1, -1, -1, -1, -1, -1]\n    }\n\n    const minOpenerIdx = openersBottom[closer.marker][(closer.open ? 3 : 0) + (closer.length % 3)]\n\n    let openerIdx = headerIdx - jumps[headerIdx] - 1\n\n    let newMinOpenerIdx = openerIdx\n\n    for (; openerIdx > minOpenerIdx; openerIdx -= jumps[openerIdx] + 1) {\n      const opener = delimiters[openerIdx]\n\n      if (opener.marker !== closer.marker) continue\n\n      if (opener.open && opener.end < 0) {\n        let isOddMatch = false\n\n        // from spec:\n        //\n        // If one of the delimiters can both open and close emphasis, then the\n        // sum of the lengths of the delimiter runs containing the opening and\n        // closing delimiters must not be a multiple of 3 unless both lengths\n        // are multiples of 3.\n        //\n        if (opener.close || closer.open) {\n          if ((opener.length + closer.length) % 3 === 0) {\n            if (opener.length % 3 !== 0 || closer.length % 3 !== 0) {\n              isOddMatch = true\n            }\n          }\n        }\n\n        if (!isOddMatch) {\n          // If previous delimiter cannot be an opener, we can safely skip\n          // the entire sequence in future checks. This is required to make\n          // sure algorithm has linear complexity (see *_*_*_*_*_... case).\n          //\n          const lastJump = openerIdx > 0 && !delimiters[openerIdx - 1].open\n            ? jumps[openerIdx - 1] + 1\n            : 0\n\n          jumps[closerIdx] = closerIdx - openerIdx + lastJump\n          jumps[openerIdx] = lastJump\n\n          closer.open  = false\n          opener.end   = closerIdx\n          opener.close = false\n          newMinOpenerIdx = -1\n          // treat next token as start of run,\n          // it optimizes skips in **<...>**a**<...>** pathological case\n          lastTokenIdx = -2\n          break\n        }\n      }\n    }\n\n    if (newMinOpenerIdx !== -1) {\n      // If match for this delimiter run failed, we want to set lower bound for\n      // future lookups. This is required to make sure algorithm has linear\n      // complexity.\n      //\n      // See details here:\n      // https://github.com/commonmark/cmark/issues/178#issuecomment-270417442\n      //\n      openersBottom[closer.marker][(closer.open ? 3 : 0) + ((closer.length || 0) % 3)] = newMinOpenerIdx\n    }\n  }\n}\n\nexport default function link_pairs (state) {\n  const tokens_meta = state.tokens_meta\n  const max = state.tokens_meta.length\n\n  processDelimiters(state.delimiters)\n\n  for (let curr = 0; curr < max; curr++) {\n    if (tokens_meta[curr] && tokens_meta[curr].delimiters) {\n      processDelimiters(tokens_meta[curr].delimiters)\n    }\n  }\n}\n","/** internal\n * class ParserInline\n *\n * Tokenizes paragraph content.\n **/\n\nimport Ruler from './ruler.mjs'\nimport StateInline from './rules_inline/state_inline.mjs'\n\nimport r_text from './rules_inline/text.mjs'\nimport r_linkify from './rules_inline/linkify.mjs'\nimport r_newline from './rules_inline/newline.mjs'\nimport r_escape from './rules_inline/escape.mjs'\nimport r_backticks from './rules_inline/backticks.mjs'\nimport r_strikethrough from './rules_inline/strikethrough.mjs'\nimport r_emphasis from './rules_inline/emphasis.mjs'\nimport r_link from './rules_inline/link.mjs'\nimport r_image from './rules_inline/image.mjs'\nimport r_autolink from './rules_inline/autolink.mjs'\nimport r_html_inline from './rules_inline/html_inline.mjs'\nimport r_entity from './rules_inline/entity.mjs'\n\nimport r_balance_pairs from './rules_inline/balance_pairs.mjs'\nimport r_fragments_join from './rules_inline/fragments_join.mjs'\n\n// Parser rules\n\nconst _rules = [\n  ['text',            r_text],\n  ['linkify',         r_linkify],\n  ['newline',         r_newline],\n  ['escape',          r_escape],\n  ['backticks',       r_backticks],\n  ['strikethrough',   r_strikethrough.tokenize],\n  ['emphasis',        r_emphasis.tokenize],\n  ['link',            r_link],\n  ['image',           r_image],\n  ['autolink',        r_autolink],\n  ['html_inline',     r_html_inline],\n  ['entity',          r_entity]\n]\n\n// `rule2` ruleset was created specifically for emphasis/strikethrough\n// post-processing and may be changed in the future.\n//\n// Don't use this for anything except pairs (plugins working with `balance_pairs`).\n//\nconst _rules2 = [\n  ['balance_pairs',   r_balance_pairs],\n  ['strikethrough',   r_strikethrough.postProcess],\n  ['emphasis',        r_emphasis.postProcess],\n  // rules for pairs separate '**' into its own text tokens, which may be left unused,\n  // rule below merges unused segments back with the rest of the text\n  ['fragments_join',  r_fragments_join]\n]\n\n/**\n * new ParserInline()\n **/\nfunction ParserInline () {\n  /**\n   * ParserInline#ruler -> Ruler\n   *\n   * [[Ruler]] instance. Keep configuration of inline rules.\n   **/\n  this.ruler = new Ruler()\n\n  for (let i = 0; i < _rules.length; i++) {\n    this.ruler.push(_rules[i][0], _rules[i][1])\n  }\n\n  /**\n   * ParserInline#ruler2 -> Ruler\n   *\n   * [[Ruler]] instance. Second ruler used for post-processing\n   * (e.g. in emphasis-like rules).\n   **/\n  this.ruler2 = new Ruler()\n\n  for (let i = 0; i < _rules2.length; i++) {\n    this.ruler2.push(_rules2[i][0], _rules2[i][1])\n  }\n}\n\n// Skip single token by running all rules in validation mode;\n// returns `true` if any rule reported success\n//\nParserInline.prototype.skipToken = function (state) {\n  const pos = state.pos\n  const rules = this.ruler.getRules('')\n  const len = rules.length\n  const maxNesting = state.md.options.maxNesting\n  const cache = state.cache\n\n  if (typeof cache[pos] !== 'undefined') {\n    state.pos = cache[pos]\n    return\n  }\n\n  let ok = false\n\n  if (state.level < maxNesting) {\n    for (let i = 0; i < len; i++) {\n      // Increment state.level and decrement it later to limit recursion.\n      // It's harmless to do here, because no tokens are created. But ideally,\n      // we'd need a separate private state variable for this purpose.\n      //\n      state.level++\n      ok = rules[i](state, true)\n      state.level--\n\n      if (ok) {\n        if (pos >= state.pos) { throw new Error(\"inline rule didn't increment state.pos\") }\n        break\n      }\n    }\n  } else {\n    // Too much nesting, just skip until the end of the paragraph.\n    //\n    // NOTE: this will cause links to behave incorrectly in the following case,\n    //       when an amount of `[` is exactly equal to `maxNesting + 1`:\n    //\n    //       [[[[[[[[[[[[[[[[[[[[[foo]()\n    //\n    // TODO: remove this workaround when CM standard will allow nested links\n    //       (we can replace it by preventing links from being parsed in\n    //       validation mode)\n    //\n    state.pos = state.posMax\n  }\n\n  if (!ok) { state.pos++ }\n  cache[pos] = state.pos\n}\n\n// Generate tokens for input range\n//\nParserInline.prototype.tokenize = function (state) {\n  const rules = this.ruler.getRules('')\n  const len = rules.length\n  const end = state.posMax\n  const maxNesting = state.md.options.maxNesting\n\n  while (state.pos < end) {\n    // Try all possible rules.\n    // On success, rule should:\n    //\n    // - update `state.pos`\n    // - update `state.tokens`\n    // - return true\n    const prevPos = state.pos\n    let ok = false\n\n    if (state.level < maxNesting) {\n      for (let i = 0; i < len; i++) {\n        ok = rules[i](state, false)\n        if (ok) {\n          if (prevPos >= state.pos) { throw new Error(\"inline rule didn't increment state.pos\") }\n          break\n        }\n      }\n    }\n\n    if (ok) {\n      if (state.pos >= end) { break }\n      continue\n    }\n\n    state.pending += state.src[state.pos++]\n  }\n\n  if (state.pending) {\n    state.pushPending()\n  }\n}\n\n/**\n * ParserInline.parse(str, md, env, outTokens)\n *\n * Process input string and push inline tokens into `outTokens`\n **/\nParserInline.prototype.parse = function (str, md, env, outTokens) {\n  const state = new this.State(str, md, env, outTokens)\n\n  this.tokenize(state)\n\n  const rules = this.ruler2.getRules('')\n  const len = rules.length\n\n  for (let i = 0; i < len; i++) {\n    rules[i](state)\n  }\n}\n\nParserInline.prototype.State = StateInline\n\nexport default ParserInline\n","// Proceess '\\n'\n\nimport { isSpace } from '../common/utils.mjs'\n\nexport default function newline (state, silent) {\n  let pos = state.pos\n\n  if (state.src.charCodeAt(pos) !== 0x0A/* \\n */) { return false }\n\n  const pmax = state.pending.length - 1\n  const max = state.posMax\n\n  // '  \\n' -> hardbreak\n  // Lookup in pending chars is bad practice! Don't copy to other rules!\n  // Pending string is stored in concat mode, indexed lookups will cause\n  // convertion to flat mode.\n  if (!silent) {\n    if (pmax >= 0 && state.pending.charCodeAt(pmax) === 0x20) {\n      if (pmax >= 1 && state.pending.charCodeAt(pmax - 1) === 0x20) {\n        // Find whitespaces tail of pending chars.\n        let ws = pmax - 1\n        while (ws >= 1 && state.pending.charCodeAt(ws - 1) === 0x20) ws--\n\n        state.pending = state.pending.slice(0, ws)\n        state.push('hardbreak', 'br', 0)\n      } else {\n        state.pending = state.pending.slice(0, -1)\n        state.push('softbreak', 'br', 0)\n      }\n    } else {\n      state.push('softbreak', 'br', 0)\n    }\n  }\n\n  pos++\n\n  // skip heading spaces for next line\n  while (pos < max && isSpace(state.src.charCodeAt(pos))) { pos++ }\n\n  state.pos = pos\n  return true\n}\n","// Parse backticks\n\nexport default function backtick (state, silent) {\n  let pos = state.pos\n  const ch = state.src.charCodeAt(pos)\n\n  if (ch !== 0x60/* ` */) { return false }\n\n  const start = pos\n  pos++\n  const max = state.posMax\n\n  // scan marker length\n  while (pos < max && state.src.charCodeAt(pos) === 0x60/* ` */) { pos++ }\n\n  const marker = state.src.slice(start, pos)\n  const openerLength = marker.length\n\n  if (state.backticksScanned && (state.backticks[openerLength] || 0) <= start) {\n    if (!silent) state.pending += marker\n    state.pos += openerLength\n    return true\n  }\n\n  let matchEnd = pos\n  let matchStart\n\n  // Nothing found in the cache, scan until the end of the line (or until marker is found)\n  while ((matchStart = state.src.indexOf('`', matchEnd)) !== -1) {\n    matchEnd = matchStart + 1\n\n    // scan marker length\n    while (matchEnd < max && state.src.charCodeAt(matchEnd) === 0x60/* ` */) { matchEnd++ }\n\n    const closerLength = matchEnd - matchStart\n\n    if (closerLength === openerLength) {\n      // Found matching closer length.\n      if (!silent) {\n        const token = state.push('code_inline', 'code', 0)\n        token.markup = marker\n        token.content = state.src.slice(pos, matchStart)\n          .replace(/\\n/g, ' ')\n          .replace(/^ (.+) $/, '$1')\n      }\n      state.pos = matchEnd\n      return true\n    }\n\n    // Some different length found, put it in cache as upper limit of where closer can be found\n    state.backticks[closerLength] = matchStart\n  }\n\n  // Scanned through the end, didn't find anything\n  state.backticksScanned = true\n\n  if (!silent) state.pending += marker\n  state.pos += openerLength\n  return true\n}\n","// Process [link](<to> \"stuff\")\n\nimport { normalizeReference, isSpace } from '../common/utils.mjs'\n\nexport default function link (state, silent) {\n  let code, label, res, ref\n  let href = ''\n  let title = ''\n  let start = state.pos\n  let parseReference = true\n\n  if (state.src.charCodeAt(state.pos) !== 0x5B/* [ */) { return false }\n\n  const oldPos = state.pos\n  const max = state.posMax\n  const labelStart = state.pos + 1\n  const labelEnd = state.md.helpers.parseLinkLabel(state, state.pos, true)\n\n  // parser failed to find ']', so it's not a valid link\n  if (labelEnd < 0) { return false }\n\n  let pos = labelEnd + 1\n  if (pos < max && state.src.charCodeAt(pos) === 0x28/* ( */) {\n    //\n    // Inline link\n    //\n\n    // might have found a valid shortcut link, disable reference parsing\n    parseReference = false\n\n    // [link](  <href>  \"title\"  )\n    //        ^^ skipping these spaces\n    pos++\n    for (; pos < max; pos++) {\n      code = state.src.charCodeAt(pos)\n      if (!isSpace(code) && code !== 0x0A) { break }\n    }\n    if (pos >= max) { return false }\n\n    // [link](  <href>  \"title\"  )\n    //          ^^^^^^ parsing link destination\n    start = pos\n    res = state.md.helpers.parseLinkDestination(state.src, pos, state.posMax)\n    if (res.ok) {\n      href = state.md.normalizeLink(res.str)\n      if (state.md.validateLink(href)) {\n        pos = res.pos\n      } else {\n        href = ''\n      }\n\n      // [link](  <href>  \"title\"  )\n      //                ^^ skipping these spaces\n      start = pos\n      for (; pos < max; pos++) {\n        code = state.src.charCodeAt(pos)\n        if (!isSpace(code) && code !== 0x0A) { break }\n      }\n\n      // [link](  <href>  \"title\"  )\n      //                  ^^^^^^^ parsing link title\n      res = state.md.helpers.parseLinkTitle(state.src, pos, state.posMax)\n      if (pos < max && start !== pos && res.ok) {\n        title = res.str\n        pos = res.pos\n\n        // [link](  <href>  \"title\"  )\n        //                         ^^ skipping these spaces\n        for (; pos < max; pos++) {\n          code = state.src.charCodeAt(pos)\n          if (!isSpace(code) && code !== 0x0A) { break }\n        }\n      }\n    }\n\n    if (pos >= max || state.src.charCodeAt(pos) !== 0x29/* ) */) {\n      // parsing a valid shortcut link failed, fallback to reference\n      parseReference = true\n    }\n    pos++\n  }\n\n  if (parseReference) {\n    //\n    // Link reference\n    //\n    if (typeof state.env.references === 'undefined') { return false }\n\n    if (pos < max && state.src.charCodeAt(pos) === 0x5B/* [ */) {\n      start = pos + 1\n      pos = state.md.helpers.parseLinkLabel(state, pos)\n      if (pos >= 0) {\n        label = state.src.slice(start, pos++)\n      } else {\n        pos = labelEnd + 1\n      }\n    } else {\n      pos = labelEnd + 1\n    }\n\n    // covers label === '' and label === undefined\n    // (collapsed reference link and shortcut reference link respectively)\n    if (!label) { label = state.src.slice(labelStart, labelEnd) }\n\n    ref = state.env.references[normalizeReference(label)]\n    if (!ref) {\n      state.pos = oldPos\n      return false\n    }\n    href = ref.href\n    title = ref.title\n  }\n\n  //\n  // We found the end of the link, and know for a fact it's a valid link;\n  // so all that's left to do is to call tokenizer.\n  //\n  if (!silent) {\n    state.pos = labelStart\n    state.posMax = labelEnd\n\n    const token_o = state.push('link_open', 'a', 1)\n    const attrs = [['href', href]]\n    token_o.attrs  = attrs\n    if (title) {\n      attrs.push(['title', title])\n    }\n\n    state.linkLevel++\n    state.md.inline.tokenize(state)\n    state.linkLevel--\n\n    state.push('link_close', 'a', -1)\n  }\n\n  state.pos = pos\n  state.posMax = max\n  return true\n}\n","// Process ![image](<src> \"title\")\n\nimport { normalizeReference, isSpace } from '../common/utils.mjs'\n\nexport default function image (state, silent) {\n  let code, content, label, pos, ref, res, title, start\n  let href = ''\n  const oldPos = state.pos\n  const max = state.posMax\n\n  if (state.src.charCodeAt(state.pos) !== 0x21/* ! */) { return false }\n  if (state.src.charCodeAt(state.pos + 1) !== 0x5B/* [ */) { return false }\n\n  const labelStart = state.pos + 2\n  const labelEnd = state.md.helpers.parseLinkLabel(state, state.pos + 1, false)\n\n  // parser failed to find ']', so it's not a valid link\n  if (labelEnd < 0) { return false }\n\n  pos = labelEnd + 1\n  if (pos < max && state.src.charCodeAt(pos) === 0x28/* ( */) {\n    //\n    // Inline link\n    //\n\n    // [link](  <href>  \"title\"  )\n    //        ^^ skipping these spaces\n    pos++\n    for (; pos < max; pos++) {\n      code = state.src.charCodeAt(pos)\n      if (!isSpace(code) && code !== 0x0A) { break }\n    }\n    if (pos >= max) { return false }\n\n    // [link](  <href>  \"title\"  )\n    //          ^^^^^^ parsing link destination\n    start = pos\n    res = state.md.helpers.parseLinkDestination(state.src, pos, state.posMax)\n    if (res.ok) {\n      href = state.md.normalizeLink(res.str)\n      if (state.md.validateLink(href)) {\n        pos = res.pos\n      } else {\n        href = ''\n      }\n    }\n\n    // [link](  <href>  \"title\"  )\n    //                ^^ skipping these spaces\n    start = pos\n    for (; pos < max; pos++) {\n      code = state.src.charCodeAt(pos)\n      if (!isSpace(code) && code !== 0x0A) { break }\n    }\n\n    // [link](  <href>  \"title\"  )\n    //                  ^^^^^^^ parsing link title\n    res = state.md.helpers.parseLinkTitle(state.src, pos, state.posMax)\n    if (pos < max && start !== pos && res.ok) {\n      title = res.str\n      pos = res.pos\n\n      // [link](  <href>  \"title\"  )\n      //                         ^^ skipping these spaces\n      for (; pos < max; pos++) {\n        code = state.src.charCodeAt(pos)\n        if (!isSpace(code) && code !== 0x0A) { break }\n      }\n    } else {\n      title = ''\n    }\n\n    if (pos >= max || state.src.charCodeAt(pos) !== 0x29/* ) */) {\n      state.pos = oldPos\n      return false\n    }\n    pos++\n  } else {\n    //\n    // Link reference\n    //\n    if (typeof state.env.references === 'undefined') { return false }\n\n    if (pos < max && state.src.charCodeAt(pos) === 0x5B/* [ */) {\n      start = pos + 1\n      pos = state.md.helpers.parseLinkLabel(state, pos)\n      if (pos >= 0) {\n        label = state.src.slice(start, pos++)\n      } else {\n        pos = labelEnd + 1\n      }\n    } else {\n      pos = labelEnd + 1\n    }\n\n    // covers label === '' and label === undefined\n    // (collapsed reference link and shortcut reference link respectively)\n    if (!label) { label = state.src.slice(labelStart, labelEnd) }\n\n    ref = state.env.references[normalizeReference(label)]\n    if (!ref) {\n      state.pos = oldPos\n      return false\n    }\n    href = ref.href\n    title = ref.title\n  }\n\n  //\n  // We found the end of the link, and know for a fact it's a valid link;\n  // so all that's left to do is to call tokenizer.\n  //\n  if (!silent) {\n    content = state.src.slice(labelStart, labelEnd)\n\n    const tokens = []\n    state.md.inline.parse(\n      content,\n      state.md,\n      state.env,\n      tokens\n    )\n\n    const token = state.push('image', 'img', 0)\n    const attrs = [['src', href], ['alt', '']]\n    token.attrs = attrs\n    token.children = tokens\n    token.content = content\n\n    if (title) {\n      attrs.push(['title', title])\n    }\n  }\n\n  state.pos = pos\n  state.posMax = max\n  return true\n}\n","// Process html tags\n\nimport { HTML_TAG_RE } from '../common/html_re.mjs'\n\nfunction isLinkOpen (str) {\n  return /^<a[>\\s]/i.test(str)\n}\nfunction isLinkClose (str) {\n  return /^<\\/a\\s*>/i.test(str)\n}\n\nfunction isLetter (ch) {\n  /* eslint no-bitwise:0 */\n  const lc = ch | 0x20 // to lower case\n  return (lc >= 0x61/* a */) && (lc <= 0x7a/* z */)\n}\n\nexport default function html_inline (state, silent) {\n  if (!state.md.options.html) { return false }\n\n  // Check start\n  const max = state.posMax\n  const pos = state.pos\n  if (state.src.charCodeAt(pos) !== 0x3C/* < */ ||\n      pos + 2 >= max) {\n    return false\n  }\n\n  // Quick fail on second char\n  const ch = state.src.charCodeAt(pos + 1)\n  if (ch !== 0x21/* ! */ &&\n      ch !== 0x3F/* ? */ &&\n      ch !== 0x2F/* / */ &&\n      !isLetter(ch)) {\n    return false\n  }\n\n  const match = state.src.slice(pos).match(HTML_TAG_RE)\n  if (!match) { return false }\n\n  if (!silent) {\n    const token = state.push('html_inline', '', 0)\n    token.content = match[0]\n\n    if (isLinkOpen(token.content))  state.linkLevel++\n    if (isLinkClose(token.content)) state.linkLevel--\n  }\n  state.pos += match[0].length\n  return true\n}\n","// Clean up tokens after emphasis and strikethrough postprocessing:\n// merge adjacent text nodes into one and re-calculate all token levels\n//\n// This is necessary because initially emphasis delimiter markers (*, _, ~)\n// are treated as their own separate text tokens. Then emphasis rule either\n// leaves them as text (needed to merge with adjacent text) or turns them\n// into opening/closing tags (which messes up levels inside).\n//\n\nexport default function fragments_join (state) {\n  let curr, last\n  let level = 0\n  const tokens = state.tokens\n  const max = state.tokens.length\n\n  for (curr = last = 0; curr < max; curr++) {\n    // re-calculate levels after emphasis/strikethrough turns some text nodes\n    // into opening/closing tags\n    if (tokens[curr].nesting < 0) level-- // closing tag\n    tokens[curr].level = level\n    if (tokens[curr].nesting > 0) level++ // opening tag\n\n    if (tokens[curr].type === 'text' &&\n        curr + 1 < max &&\n        tokens[curr + 1].type === 'text') {\n      // collapse two adjacent text nodes\n      tokens[curr + 1].content = tokens[curr].content + tokens[curr + 1].content\n    } else {\n      if (curr !== last) { tokens[last] = tokens[curr] }\n\n      last++\n    }\n  }\n\n  if (curr !== last) {\n    tokens.length = last\n  }\n}\n","// Main parser class\n\nimport * as utils from './common/utils.mjs'\nimport * as helpers from './helpers/index.mjs'\nimport Renderer from './renderer.mjs'\nimport ParserCore from './parser_core.mjs'\nimport ParserBlock from './parser_block.mjs'\nimport ParserInline from './parser_inline.mjs'\nimport LinkifyIt from 'linkify-it'\nimport * as mdurl from 'mdurl'\nimport punycode from 'punycode.js'\n\nimport cfg_default from './presets/default.mjs'\nimport cfg_zero from './presets/zero.mjs'\nimport cfg_commonmark from './presets/commonmark.mjs'\n\nconst config = {\n  default: cfg_default,\n  zero: cfg_zero,\n  commonmark: cfg_commonmark\n}\n\n//\n// This validator can prohibit more than really needed to prevent XSS. It's a\n// tradeoff to keep code simple and to be secure by default.\n//\n// If you need different setup - override validator method as you wish. Or\n// replace it with dummy function and use external sanitizer.\n//\n\nconst BAD_PROTO_RE = /^(vbscript|javascript|file|data):/\nconst GOOD_DATA_RE = /^data:image\\/(gif|png|jpeg|webp);/\n\nfunction validateLink (url) {\n  // url should be normalized at this point, and existing entities are decoded\n  const str = url.trim().toLowerCase()\n\n  return BAD_PROTO_RE.test(str) ? GOOD_DATA_RE.test(str) : true\n}\n\nconst RECODE_HOSTNAME_FOR = ['http:', 'https:', 'mailto:']\n\nfunction normalizeLink (url) {\n  const parsed = mdurl.parse(url, true)\n\n  if (parsed.hostname) {\n    // Encode hostnames in urls like:\n    // `http://host/`, `https://host/`, `mailto:user@host`, `//host/`\n    //\n    // We don't encode unknown schemas, because it's likely that we encode\n    // something we shouldn't (e.g. `skype:name` treated as `skype:host`)\n    //\n    if (!parsed.protocol || RECODE_HOSTNAME_FOR.indexOf(parsed.protocol) >= 0) {\n      try {\n        parsed.hostname = punycode.toASCII(parsed.hostname)\n      } catch (er) { /**/ }\n    }\n  }\n\n  return mdurl.encode(mdurl.format(parsed))\n}\n\nfunction normalizeLinkText (url) {\n  const parsed = mdurl.parse(url, true)\n\n  if (parsed.hostname) {\n    // Encode hostnames in urls like:\n    // `http://host/`, `https://host/`, `mailto:user@host`, `//host/`\n    //\n    // We don't encode unknown schemas, because it's likely that we encode\n    // something we shouldn't (e.g. `skype:name` treated as `skype:host`)\n    //\n    if (!parsed.protocol || RECODE_HOSTNAME_FOR.indexOf(parsed.protocol) >= 0) {\n      try {\n        parsed.hostname = punycode.toUnicode(parsed.hostname)\n      } catch (er) { /**/ }\n    }\n  }\n\n  // add '%' to exclude list because of https://github.com/markdown-it/markdown-it/issues/720\n  return mdurl.decode(mdurl.format(parsed), mdurl.decode.defaultChars + '%')\n}\n\n/**\n * class MarkdownIt\n *\n * Main parser/renderer class.\n *\n * ##### Usage\n *\n * ```javascript\n * // node.js, \"classic\" way:\n * var MarkdownIt = require('markdown-it'),\n *     md = new MarkdownIt();\n * var result = md.render('# markdown-it rulezz!');\n *\n * // node.js, the same, but with sugar:\n * var md = require('markdown-it')();\n * var result = md.render('# markdown-it rulezz!');\n *\n * // browser without AMD, added to \"window\" on script load\n * // Note, there are no dash.\n * var md = window.markdownit();\n * var result = md.render('# markdown-it rulezz!');\n * ```\n *\n * Single line rendering, without paragraph wrap:\n *\n * ```javascript\n * var md = require('markdown-it')();\n * var result = md.renderInline('__markdown-it__ rulezz!');\n * ```\n **/\n\n/**\n * new MarkdownIt([presetName, options])\n * - presetName (String): optional, `commonmark` / `zero`\n * - options (Object)\n *\n * Creates parser instanse with given config. Can be called without `new`.\n *\n * ##### presetName\n *\n * MarkdownIt provides named presets as a convenience to quickly\n * enable/disable active syntax rules and options for common use cases.\n *\n * - [\"commonmark\"](https://github.com/markdown-it/markdown-it/blob/master/lib/presets/commonmark.mjs) -\n *   configures parser to strict [CommonMark](http://commonmark.org/) mode.\n * - [default](https://github.com/markdown-it/markdown-it/blob/master/lib/presets/default.mjs) -\n *   similar to GFM, used when no preset name given. Enables all available rules,\n *   but still without html, typographer & autolinker.\n * - [\"zero\"](https://github.com/markdown-it/markdown-it/blob/master/lib/presets/zero.mjs) -\n *   all rules disabled. Useful to quickly setup your config via `.enable()`.\n *   For example, when you need only `bold` and `italic` markup and nothing else.\n *\n * ##### options:\n *\n * - __html__ - `false`. Set `true` to enable HTML tags in source. Be careful!\n *   That's not safe! You may need external sanitizer to protect output from XSS.\n *   It's better to extend features via plugins, instead of enabling HTML.\n * - __xhtmlOut__ - `false`. Set `true` to add '/' when closing single tags\n *   (`<br />`). This is needed only for full CommonMark compatibility. In real\n *   world you will need HTML output.\n * - __breaks__ - `false`. Set `true` to convert `\\n` in paragraphs into `<br>`.\n * - __langPrefix__ - `language-`. CSS language class prefix for fenced blocks.\n *   Can be useful for external highlighters.\n * - __linkify__ - `false`. Set `true` to autoconvert URL-like text to links.\n * - __typographer__  - `false`. Set `true` to enable [some language-neutral\n *   replacement](https://github.com/markdown-it/markdown-it/blob/master/lib/rules_core/replacements.mjs) +\n *   quotes beautification (smartquotes).\n * - __quotes__ - `“”‘’`, String or Array. Double + single quotes replacement\n *   pairs, when typographer enabled and smartquotes on. For example, you can\n *   use `'«»„“'` for Russian, `'„“‚‘'` for German, and\n *   `['«\\xA0', '\\xA0»', '‹\\xA0', '\\xA0›']` for French (including nbsp).\n * - __highlight__ - `null`. Highlighter function for fenced code blocks.\n *   Highlighter `function (str, lang)` should return escaped HTML. It can also\n *   return empty string if the source was not changed and should be escaped\n *   externaly. If result starts with <pre... internal wrapper is skipped.\n *\n * ##### Example\n *\n * ```javascript\n * // commonmark mode\n * var md = require('markdown-it')('commonmark');\n *\n * // default mode\n * var md = require('markdown-it')();\n *\n * // enable everything\n * var md = require('markdown-it')({\n *   html: true,\n *   linkify: true,\n *   typographer: true\n * });\n * ```\n *\n * ##### Syntax highlighting\n *\n * ```js\n * var hljs = require('highlight.js') // https://highlightjs.org/\n *\n * var md = require('markdown-it')({\n *   highlight: function (str, lang) {\n *     if (lang && hljs.getLanguage(lang)) {\n *       try {\n *         return hljs.highlight(str, { language: lang, ignoreIllegals: true }).value;\n *       } catch (__) {}\n *     }\n *\n *     return ''; // use external default escaping\n *   }\n * });\n * ```\n *\n * Or with full wrapper override (if you need assign class to `<pre>` or `<code>`):\n *\n * ```javascript\n * var hljs = require('highlight.js') // https://highlightjs.org/\n *\n * // Actual default values\n * var md = require('markdown-it')({\n *   highlight: function (str, lang) {\n *     if (lang && hljs.getLanguage(lang)) {\n *       try {\n *         return '<pre><code class=\"hljs\">' +\n *                hljs.highlight(str, { language: lang, ignoreIllegals: true }).value +\n *                '</code></pre>';\n *       } catch (__) {}\n *     }\n *\n *     return '<pre><code class=\"hljs\">' + md.utils.escapeHtml(str) + '</code></pre>';\n *   }\n * });\n * ```\n *\n **/\nfunction MarkdownIt (presetName, options) {\n  if (!(this instanceof MarkdownIt)) {\n    return new MarkdownIt(presetName, options)\n  }\n\n  if (!options) {\n    if (!utils.isString(presetName)) {\n      options = presetName || {}\n      presetName = 'default'\n    }\n  }\n\n  /**\n   * MarkdownIt#inline -> ParserInline\n   *\n   * Instance of [[ParserInline]]. You may need it to add new rules when\n   * writing plugins. For simple rules control use [[MarkdownIt.disable]] and\n   * [[MarkdownIt.enable]].\n   **/\n  this.inline = new ParserInline()\n\n  /**\n   * MarkdownIt#block -> ParserBlock\n   *\n   * Instance of [[ParserBlock]]. You may need it to add new rules when\n   * writing plugins. For simple rules control use [[MarkdownIt.disable]] and\n   * [[MarkdownIt.enable]].\n   **/\n  this.block = new ParserBlock()\n\n  /**\n   * MarkdownIt#core -> Core\n   *\n   * Instance of [[Core]] chain executor. You may need it to add new rules when\n   * writing plugins. For simple rules control use [[MarkdownIt.disable]] and\n   * [[MarkdownIt.enable]].\n   **/\n  this.core = new ParserCore()\n\n  /**\n   * MarkdownIt#renderer -> Renderer\n   *\n   * Instance of [[Renderer]]. Use it to modify output look. Or to add rendering\n   * rules for new token types, generated by plugins.\n   *\n   * ##### Example\n   *\n   * ```javascript\n   * var md = require('markdown-it')();\n   *\n   * function myToken(tokens, idx, options, env, self) {\n   *   //...\n   *   return result;\n   * };\n   *\n   * md.renderer.rules['my_token'] = myToken\n   * ```\n   *\n   * See [[Renderer]] docs and [source code](https://github.com/markdown-it/markdown-it/blob/master/lib/renderer.mjs).\n   **/\n  this.renderer = new Renderer()\n\n  /**\n   * MarkdownIt#linkify -> LinkifyIt\n   *\n   * [linkify-it](https://github.com/markdown-it/linkify-it) instance.\n   * Used by [linkify](https://github.com/markdown-it/markdown-it/blob/master/lib/rules_core/linkify.mjs)\n   * rule.\n   **/\n  this.linkify = new LinkifyIt()\n\n  /**\n   * MarkdownIt#validateLink(url) -> Boolean\n   *\n   * Link validation function. CommonMark allows too much in links. By default\n   * we disable `javascript:`, `vbscript:`, `file:` schemas, and almost all `data:...` schemas\n   * except some embedded image types.\n   *\n   * You can change this behaviour:\n   *\n   * ```javascript\n   * var md = require('markdown-it')();\n   * // enable everything\n   * md.validateLink = function () { return true; }\n   * ```\n   **/\n  this.validateLink = validateLink\n\n  /**\n   * MarkdownIt#normalizeLink(url) -> String\n   *\n   * Function used to encode link url to a machine-readable format,\n   * which includes url-encoding, punycode, etc.\n   **/\n  this.normalizeLink = normalizeLink\n\n  /**\n   * MarkdownIt#normalizeLinkText(url) -> String\n   *\n   * Function used to decode link url to a human-readable format`\n   **/\n  this.normalizeLinkText = normalizeLinkText\n\n  // Expose utils & helpers for easy acces from plugins\n\n  /**\n   * MarkdownIt#utils -> utils\n   *\n   * Assorted utility functions, useful to write plugins. See details\n   * [here](https://github.com/markdown-it/markdown-it/blob/master/lib/common/utils.mjs).\n   **/\n  this.utils = utils\n\n  /**\n   * MarkdownIt#helpers -> helpers\n   *\n   * Link components parser functions, useful to write plugins. See details\n   * [here](https://github.com/markdown-it/markdown-it/blob/master/lib/helpers).\n   **/\n  this.helpers = utils.assign({}, helpers)\n\n  this.options = {}\n  this.configure(presetName)\n\n  if (options) { this.set(options) }\n}\n\n/** chainable\n * MarkdownIt.set(options)\n *\n * Set parser options (in the same format as in constructor). Probably, you\n * will never need it, but you can change options after constructor call.\n *\n * ##### Example\n *\n * ```javascript\n * var md = require('markdown-it')()\n *             .set({ html: true, breaks: true })\n *             .set({ typographer: true });\n * ```\n *\n * __Note:__ To achieve the best possible performance, don't modify a\n * `markdown-it` instance options on the fly. If you need multiple configurations\n * it's best to create multiple instances and initialize each with separate\n * config.\n **/\nMarkdownIt.prototype.set = function (options) {\n  utils.assign(this.options, options)\n  return this\n}\n\n/** chainable, internal\n * MarkdownIt.configure(presets)\n *\n * Batch load of all options and compenent settings. This is internal method,\n * and you probably will not need it. But if you will - see available presets\n * and data structure [here](https://github.com/markdown-it/markdown-it/tree/master/lib/presets)\n *\n * We strongly recommend to use presets instead of direct config loads. That\n * will give better compatibility with next versions.\n **/\nMarkdownIt.prototype.configure = function (presets) {\n  const self = this\n\n  if (utils.isString(presets)) {\n    const presetName = presets\n    presets = config[presetName]\n    if (!presets) { throw new Error('Wrong `markdown-it` preset \"' + presetName + '\", check name') }\n  }\n\n  if (!presets) { throw new Error('Wrong `markdown-it` preset, can\\'t be empty') }\n\n  if (presets.options) { self.set(presets.options) }\n\n  if (presets.components) {\n    Object.keys(presets.components).forEach(function (name) {\n      if (presets.components[name].rules) {\n        self[name].ruler.enableOnly(presets.components[name].rules)\n      }\n      if (presets.components[name].rules2) {\n        self[name].ruler2.enableOnly(presets.components[name].rules2)\n      }\n    })\n  }\n  return this\n}\n\n/** chainable\n * MarkdownIt.enable(list, ignoreInvalid)\n * - list (String|Array): rule name or list of rule names to enable\n * - ignoreInvalid (Boolean): set `true` to ignore errors when rule not found.\n *\n * Enable list or rules. It will automatically find appropriate components,\n * containing rules with given names. If rule not found, and `ignoreInvalid`\n * not set - throws exception.\n *\n * ##### Example\n *\n * ```javascript\n * var md = require('markdown-it')()\n *             .enable(['sub', 'sup'])\n *             .disable('smartquotes');\n * ```\n **/\nMarkdownIt.prototype.enable = function (list, ignoreInvalid) {\n  let result = []\n\n  if (!Array.isArray(list)) { list = [list] }\n\n  ['core', 'block', 'inline'].forEach(function (chain) {\n    result = result.concat(this[chain].ruler.enable(list, true))\n  }, this)\n\n  result = result.concat(this.inline.ruler2.enable(list, true))\n\n  const missed = list.filter(function (name) { return result.indexOf(name) < 0 })\n\n  if (missed.length && !ignoreInvalid) {\n    throw new Error('MarkdownIt. Failed to enable unknown rule(s): ' + missed)\n  }\n\n  return this\n}\n\n/** chainable\n * MarkdownIt.disable(list, ignoreInvalid)\n * - list (String|Array): rule name or list of rule names to disable.\n * - ignoreInvalid (Boolean): set `true` to ignore errors when rule not found.\n *\n * The same as [[MarkdownIt.enable]], but turn specified rules off.\n **/\nMarkdownIt.prototype.disable = function (list, ignoreInvalid) {\n  let result = []\n\n  if (!Array.isArray(list)) { list = [list] }\n\n  ['core', 'block', 'inline'].forEach(function (chain) {\n    result = result.concat(this[chain].ruler.disable(list, true))\n  }, this)\n\n  result = result.concat(this.inline.ruler2.disable(list, true))\n\n  const missed = list.filter(function (name) { return result.indexOf(name) < 0 })\n\n  if (missed.length && !ignoreInvalid) {\n    throw new Error('MarkdownIt. Failed to disable unknown rule(s): ' + missed)\n  }\n  return this\n}\n\n/** chainable\n * MarkdownIt.use(plugin, params)\n *\n * Load specified plugin with given params into current parser instance.\n * It's just a sugar to call `plugin(md, params)` with curring.\n *\n * ##### Example\n *\n * ```javascript\n * var iterator = require('markdown-it-for-inline');\n * var md = require('markdown-it')()\n *             .use(iterator, 'foo_replace', 'text', function (tokens, idx) {\n *               tokens[idx].content = tokens[idx].content.replace(/foo/g, 'bar');\n *             });\n * ```\n **/\nMarkdownIt.prototype.use = function (plugin /*, params, ... */) {\n  const args = [this].concat(Array.prototype.slice.call(arguments, 1))\n  plugin.apply(plugin, args)\n  return this\n}\n\n/** internal\n * MarkdownIt.parse(src, env) -> Array\n * - src (String): source string\n * - env (Object): environment sandbox\n *\n * Parse input string and return list of block tokens (special token type\n * \"inline\" will contain list of inline tokens). You should not call this\n * method directly, until you write custom renderer (for example, to produce\n * AST).\n *\n * `env` is used to pass data between \"distributed\" rules and return additional\n * metadata like reference info, needed for the renderer. It also can be used to\n * inject data in specific cases. Usually, you will be ok to pass `{}`,\n * and then pass updated object to renderer.\n **/\nMarkdownIt.prototype.parse = function (src, env) {\n  if (typeof src !== 'string') {\n    throw new Error('Input data should be a String')\n  }\n\n  const state = new this.core.State(src, this, env)\n\n  this.core.process(state)\n\n  return state.tokens\n}\n\n/**\n * MarkdownIt.render(src [, env]) -> String\n * - src (String): source string\n * - env (Object): environment sandbox\n *\n * Render markdown string into html. It does all magic for you :).\n *\n * `env` can be used to inject additional metadata (`{}` by default).\n * But you will not need it with high probability. See also comment\n * in [[MarkdownIt.parse]].\n **/\nMarkdownIt.prototype.render = function (src, env) {\n  env = env || {}\n\n  return this.renderer.render(this.parse(src, env), this.options, env)\n}\n\n/** internal\n * MarkdownIt.parseInline(src, env) -> Array\n * - src (String): source string\n * - env (Object): environment sandbox\n *\n * The same as [[MarkdownIt.parse]] but skip all block rules. It returns the\n * block tokens list with the single `inline` element, containing parsed inline\n * tokens in `children` property. Also updates `env` object.\n **/\nMarkdownIt.prototype.parseInline = function (src, env) {\n  const state = new this.core.State(src, this, env)\n\n  state.inlineMode = true\n  this.core.process(state)\n\n  return state.tokens\n}\n\n/**\n * MarkdownIt.renderInline(src [, env]) -> String\n * - src (String): source string\n * - env (Object): environment sandbox\n *\n * Similar to [[MarkdownIt.render]] but for single paragraph content. Result\n * will NOT be wrapped into `<p>` tags.\n **/\nMarkdownIt.prototype.renderInline = function (src, env) {\n  env = env || {}\n\n  return this.renderer.render(this.parseInline(src, env), this.options, env)\n}\n\nexport default MarkdownIt\n","// markdown-it default options\n\nexport default {\n  options: {\n    // Enable HTML tags in source\n    html: false,\n\n    // Use '/' to close single tags (<br />)\n    xhtmlOut: false,\n\n    // Convert '\\n' in paragraphs into <br>\n    breaks: false,\n\n    // CSS language prefix for fenced blocks\n    langPrefix: 'language-',\n\n    // autoconvert URL-like texts to links\n    linkify: false,\n\n    // Enable some language-neutral replacements + quotes beautification\n    typographer: false,\n\n    // Double + single quotes replacement pairs, when typographer enabled,\n    // and smartquotes on. Could be either a String or an Array.\n    //\n    // For example, you can use '«»„“' for Russian, '„“‚‘' for German,\n    // and ['«\\xA0', '\\xA0»', '‹\\xA0', '\\xA0›'] for French (including nbsp).\n    quotes: '\\u201c\\u201d\\u2018\\u2019', /* “”‘’ */\n\n    // Highlighter function. Should return escaped HTML,\n    // or '' if the source string is not changed and should be escaped externaly.\n    // If result starts with <pre... internal wrapper is skipped.\n    //\n    // function (/*str, lang*/) { return ''; }\n    //\n    highlight: null,\n\n    // Internal protection, recursion limit\n    maxNesting: 100\n  },\n\n  components: {\n    core: {},\n    block: {},\n    inline: {}\n  }\n}\n","// \"Zero\" preset, with nothing enabled. Useful for manual configuring of simple\n// modes. For example, to parse bold/italic only.\n\nexport default {\n  options: {\n    // Enable HTML tags in source\n    html: false,\n\n    // Use '/' to close single tags (<br />)\n    xhtmlOut: false,\n\n    // Convert '\\n' in paragraphs into <br>\n    breaks: false,\n\n    // CSS language prefix for fenced blocks\n    langPrefix: 'language-',\n\n    // autoconvert URL-like texts to links\n    linkify: false,\n\n    // Enable some language-neutral replacements + quotes beautification\n    typographer: false,\n\n    // Double + single quotes replacement pairs, when typographer enabled,\n    // and smartquotes on. Could be either a String or an Array.\n    //\n    // For example, you can use '«»„“' for Russian, '„“‚‘' for German,\n    // and ['«\\xA0', '\\xA0»', '‹\\xA0', '\\xA0›'] for French (including nbsp).\n    quotes: '\\u201c\\u201d\\u2018\\u2019', /* “”‘’ */\n\n    // Highlighter function. Should return escaped HTML,\n    // or '' if the source string is not changed and should be escaped externaly.\n    // If result starts with <pre... internal wrapper is skipped.\n    //\n    // function (/*str, lang*/) { return ''; }\n    //\n    highlight: null,\n\n    // Internal protection, recursion limit\n    maxNesting: 20\n  },\n\n  components: {\n\n    core: {\n      rules: [\n        'normalize',\n        'block',\n        'inline',\n        'text_join'\n      ]\n    },\n\n    block: {\n      rules: [\n        'paragraph'\n      ]\n    },\n\n    inline: {\n      rules: [\n        'text'\n      ],\n      rules2: [\n        'balance_pairs',\n        'fragments_join'\n      ]\n    }\n  }\n}\n","// Commonmark default options\n\nexport default {\n  options: {\n    // Enable HTML tags in source\n    html: true,\n\n    // Use '/' to close single tags (<br />)\n    xhtmlOut: true,\n\n    // Convert '\\n' in paragraphs into <br>\n    breaks: false,\n\n    // CSS language prefix for fenced blocks\n    langPrefix: 'language-',\n\n    // autoconvert URL-like texts to links\n    linkify: false,\n\n    // Enable some language-neutral replacements + quotes beautification\n    typographer: false,\n\n    // Double + single quotes replacement pairs, when typographer enabled,\n    // and smartquotes on. Could be either a String or an Array.\n    //\n    // For example, you can use '«»„“' for Russian, '„“‚‘' for German,\n    // and ['«\\xA0', '\\xA0»', '‹\\xA0', '\\xA0›'] for French (including nbsp).\n    quotes: '\\u201c\\u201d\\u2018\\u2019', /* “”‘’ */\n\n    // Highlighter function. Should return escaped HTML,\n    // or '' if the source string is not changed and should be escaped externaly.\n    // If result starts with <pre... internal wrapper is skipped.\n    //\n    // function (/*str, lang*/) { return ''; }\n    //\n    highlight: null,\n\n    // Internal protection, recursion limit\n    maxNesting: 20\n  },\n\n  components: {\n\n    core: {\n      rules: [\n        'normalize',\n        'block',\n        'inline',\n        'text_join'\n      ]\n    },\n\n    block: {\n      rules: [\n        'blockquote',\n        'code',\n        'fence',\n        'heading',\n        'hr',\n        'html_block',\n        'lheading',\n        'list',\n        'reference',\n        'paragraph'\n      ]\n    },\n\n    inline: {\n      rules: [\n        'autolink',\n        'backticks',\n        'emphasis',\n        'entity',\n        'escape',\n        'html_inline',\n        'image',\n        'link',\n        'newline',\n        'text'\n      ],\n      rules2: [\n        'balance_pairs',\n        'emphasis',\n        'fragments_join'\n      ]\n    }\n  }\n}\n"]}