[
  {
    "path": ".devcontainer/devcontainer.json",
    "content": "// For format details, see https://aka.ms/devcontainer.json. For config options, see the\n// README at: https://github.com/devcontainers/templates/tree/main/src/javascript-node\n{\n\t\"name\": \"marked\",\n\t// We're using node 14 for development, to keep close to the engine compatibility that marked.js uses.\n\t\"image\": \"mcr.microsoft.com/devcontainers/javascript-node:0-14\",\n\t\"postCreateCommand\": \"npm install\",\n\n\t// Configure tool-specific properties.\n\t\"customizations\": {\n\t\t// Configure properties specific to VS Code.\n\t\t\"vscode\": {\n\t\t\t\"extensions\": [\n\t\t\t\t\"dbaeumeur.vscode-eslint\"\n\t\t\t]\n\t\t}\n\t}\n}\n"
  },
  {
    "path": ".editorconfig",
    "content": "root = true\n\n[*.{json,js}]\ncharset = utf-8\nend_of_line = lf\ninsert_final_newline = true\nindent_style = space\nindent_size = 2\n\n[*.md, !test/*.md]\ncharset = utf-8\nend_of_line = lf\ninsert_final_newline = true\ntrim_trailing_whitespace = true\nindent_style = tab\nindent_size = 4"
  },
  {
    "path": ".gitattributes",
    "content": "* eol=lf\ntest/*         linguist-vendored\nlib/*          linguist-generated\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/Bug_report.md",
    "content": "---\nname: Bug report\nabout: Marked says it does this thing but does not\n\n---\n**Marked version:**\n\n**Describe the bug**\nA clear and concise description of what the bug is.\n\n**To Reproduce**\nSteps to reproduce the behavior:\n\n<!-- If possible, use the Marked Demo permalink and compare to the CommonMark Dingus permalink to demonstrate the bug -->\n<!--\n1. [Marked Demo](https://marked.js.org/demo/)\n2. [CommonMark Demo](https://spec.commonmark.org/dingus/)\n-->\n\n<!-- If you need a specific version and options to reproduce the bug, use the following template -->\n<!--\n1. Install marked `npm install --save marked@0.3.19` with the version you are using\n2. Run marked with input string and options such as `marked('hello *world*', {gfm: true})`\n3. Actual output (or error) is...\n-->\n\n**Expected behavior**\nA clear and concise description of what you expected to happen.\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/Feature_request.md",
    "content": "---\nname: Feature request\nabout: Marked doesn't do this thing and I think it should\n\n---\n\n**Describe the feature**\nA clear and concise description of what you would like.\n\n**Why is this feature necessary?**\nA clear and concise description of why.\n\n**Describe alternatives you've considered**\nA clear and concise description of any alternative solutions or features you've considered.\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/Proposal.md",
    "content": "---\nname: Proposal\nabout: Marked doesn't do this thing and I think it should\n\n---\n\n**What pain point are you perceiving?.**\nA clear and concise description of what the problem is. Ex. I'm always frustrated when [...]\n\n**Describe the solution you'd like**\nA clear and concise description of what you want to happen.\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE.md",
    "content": "**Marked version:**\n\n**Markdown flavor:** Markdown.pl|CommonMark|GitHub Flavored Markdown|n/a\n\n<!-- The NPM version or commit hash having the issue -->\n\n<!--\n\n\tIf submitting something other than a defect with Marked itself, please use the following:\n\n**Proposal type:** new feature | project operations | other\n\n## What pain point are you perceiving?\n\n## What solution are you suggesting?\n\n-->\n\n## Expectation\n\n**CommonMark Demo:** [demo](https://spec.commonmark.org/dingus/)\n<!-- You can replace the link above with a permalink from: https://spec.commonmark.org/dingus/ -->\n\n<!-- Describe the output you are expecting from marked -->\n\n## Result\n\n**Marked Demo:** [demo](https://marked.js.org/demo/)\n<!-- You can replace the link above with a permalink from: https://marked.js.org/demo/ -->\n\n<!-- Describe the output you received from marked -->\n\n## What was attempted\n\n<!-- Describe what code combination got you there -->\n\n<!--\n\tIf error is thrown add the following:\n\n## Call stack & console log\n\n-->\n"
  },
  {
    "path": ".github/PULL_REQUEST_TEMPLATE/badges.md",
    "content": "**@mention the contributor:**\n\n## Recommendation to:\n\n- [ ] Change user group\n- [ ] Add a badge\n- [ ] Remove a badge\n\n<!--\n\n\tExplain your reasoning behind tagging that person.\n\n\tPreferably by citing objective examples, like PRs, Issues, and so on.\n\n-->\n\n## As the one mentioned, I would like to:\n\n- [ ] accept the recommendation; or,\n- [ ] graciously decline; or,\n- [ ] dispute the recommendation\n\nwithin 30 days, if you have not indicated which option you are taking one of the following will happen:\n\n1. If adding a badge, we will assume you are graciously declining.\n2. If removing a badge, we will assume you do not want to dispute the recommendation; therefore, the badge will be removed.\n\n<!--\n\n\tWhy would someone not accept a badge? Loads of reasons depending on the circumstances.\n\n\t1. If you're a committer and someone puts a badge for you on having decision making authority in an area, do you really a) think you earned it and b) think you can do that *and* all the other stuff you got going as a committer, admin, or publisher (not to even mention your outside life)? Maybe not. And that's okay. Thank them for the recognition, explain you aren't able to take more on at the moment. It's cool to get recognized though.\n\t2. Maybe you don't feel you actually earned it yet. I remember being in an interview once. The interviewer asked me to give an example of going above and beyond the call of duty. I said, \"That's hard. Because what you consider going above and beyond may be what I consider to be 'just rising to'. If we're in battle and you get wounded and I pull you out of the frey before heading back into it, I don't consider that going above and beyond; I consider that rising to.\"\n\n\tWhy would someone remove their own badge? Loads of reasons...\n\n\t1. Maybe you got a lot going on right now and want to broadcast to the Marked community that, \"Hey, I don't want to say I'm going to do this unless I can really commit to it right now in a way that serves the project well.\" That's awesome! That takes courage! Because a) saying \"no\" is hard for most humans (\"people pleasers\") and b) the alternative, well, for those of us here since about October of 2017 (and prior), we know what the alternative can look like.\n\t2. Maybe you just think you've done all you can to help and learned all you can from the experience. Again, very awesome and courageous. It takes courage to know when to walk away on your own accord.\n\n\tWhy would you want to remove someone's badge? Loads of reasons...\n\n\t1. Maybe they have decision making authority on something. You asked for their advice. And, you ended up waiting almost a month before receiving a response.\n\t2. Maybe it was relevant at the time (Master of Marked, for example) but you think they've lost their former level of skill (fell out of practice, for example). They could always get it back.\n\t3. Maybe to signal to them that, \"Hey, you seem to have forgotten about us. Are you still around (or alive)?\"\n\n\tAnyway, you get the idea. This isn't about good or bad...it's just about giving the community a simple game mechanic by which to publicly say, \"Thank you\" or \"Here's what my status is\" in the community or \"Hey, I think something's wrong here\" in a civil manner.\n\n-->\n\nNote: All committers must approve via review before merging, the disapproving committer can simply close the PR.\n"
  },
  {
    "path": ".github/PULL_REQUEST_TEMPLATE.md",
    "content": "\n<!--\n\n\tIf badging PR, add ?template=badges.md to the PR url to use the badges PR template.\n\n\tOtherwise, you are stating this PR fixes an issue that has been submitted; or,\n\tdescribes the issue or proposal under consideration and contains the project-related code to implement.\n\n-->\n\n**Marked version:**\n\n<!-- The NPM version or commit hash having the issue -->\n\n**Markdown flavor:** Markdown.pl|CommonMark|GitHub Flavored Markdown|n/a\n\n## Description\n\n- Fixes #### (if fixing a known issue; otherwise, describe issue using the following format)\n\n<!--\n\n\tIf no issue exists that you're aware of. The maintainers should be able to figure out if it's a duplicate.\n\n## Expectation\n\nDescribe the output you are expecting from marked\n\n## Result\n\nDescribe the output you received from marked\n\n## What was attempted\n\nDescribe what code combination got you there\n\n-->\n\n## Contributor\n\n- [ ] Test(s) exist to ensure functionality and minimize regression (if no tests added, list tests covering this PR); or,\n- [ ] no tests required for this PR.\n- [ ] If submitting new feature, it has been documented in the appropriate places.\n\n## Committer\n\nIn most cases, this should be a different person than the contributor.\n\n- [ ] CI is green (no forced merge required).\n- [ ] Squash and Merge PR following [conventional commit guidelines](https://www.conventionalcommits.org/).\n"
  },
  {
    "path": ".github/dependabot.yml",
    "content": "version: 2\nupdates:\n  - package-ecosystem: \"github-actions\"\n    directory: \"/\"\n    schedule:\n      interval: \"weekly\"\n  - package-ecosystem: \"npm\"\n    versioning-strategy: \"increase\"\n    directory: \"/\"\n    schedule:\n      interval: \"weekly\"\n"
  },
  {
    "path": ".github/workflows/tests.yml",
    "content": "name: \"Tests\"\non:\n  pull_request:\n  push:\n    branches:\n      - master\n\npermissions:\n  contents: read\n\njobs:\n  UnitTests:\n    strategy:\n      matrix:\n        # lowest version here should also be in `engines` field\n        node_version: [20, \"lts/*\", \"latest\"]\n    runs-on: ubuntu-latest\n    steps:\n      - name: Checkout Code\n        uses: actions/checkout@v6\n      - name: Install Node\n        uses: actions/setup-node@v6\n        with:\n          node-version: ${{ matrix.node_version }}\n          check-latest: true\n      - name: Install Dependencies\n        run: npm ci\n      - name: Build 🗜️\n        run: npm run build\n      - name: Run Unit Tests 👩🏽‍💻\n        run: npm run test:unit\n      - name: Run Spec Tests 👩🏽‍💻\n        run: npm run test:specs\n      - name: Run CJS Tests 👩🏽‍💻\n        run: npm run test:cjs\n\n  OtherTests:\n    runs-on: ubuntu-latest\n    steps:\n      - name: Checkout Code\n        uses: actions/checkout@v6\n      - name: Install Node\n        uses: actions/setup-node@v6\n        with:\n          node-version: \"lts/*\"\n      - name: Install Dependencies\n        run: npm ci\n      - name: Build 🗜️\n        run: npm run build\n      - name: Run UMD Tests 👩🏽‍💻\n        run: npm run test:umd\n      - name: Run Types Tests 👩🏽‍💻\n        run: npm run test:types\n      - name: Lint ✨\n        run: npm run test:lint\n\n  Release:\n    permissions:\n      contents: write # to be able to publish a GitHub release\n      # issues: write # to be able to comment on released issues\n      # pull-requests: write # to be able to comment on released pull requests\n      id-token: write # to enable use of OIDC for trusted publishing and npm provenance\n    needs: [UnitTests, OtherTests]\n    if: |\n      github.ref == 'refs/heads/master' &&\n      github.event.repository.fork == false\n    runs-on: ubuntu-latest\n    steps:\n      - name: Checkout Code\n        uses: actions/checkout@v6\n      - name: Install Node\n        uses: actions/setup-node@v6\n        with:\n          node-version: \"lts/*\"\n      - name: Install Dependencies\n        run: npm ci\n      - name: Build 🗜️\n        env:\n          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}\n        run: |\n          export SEMANTIC_RELEASE_NEXT_VERSION=$(npx semantic-release --no-ci --dry-run | grep -oP 'The next release version is \\K[0-9]+\\.[0-9]+\\.[0-9]+')\n          echo \"Next Version: $SEMANTIC_RELEASE_NEXT_VERSION\"\n          npm run build\n          if ! git diff --quiet; then\n            git config --global user.email \"<>\"\n            git config --global user.name \"MarkedJS bot\"\n            git commit -am \"🗜️ build v$SEMANTIC_RELEASE_NEXT_VERSION [skip ci]\"\n          fi\n      - name: Release 🎉\n        env:\n          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}\n        run: npx semantic-release\n"
  },
  {
    "path": ".gitignore",
    "content": ".DS_Store\n.vercel\n.vscode\nnode_modules/\ntest/compiled_tests\npublic\nlib\ndocs/LICENSE.md\nvuln.js\nman/marked.1\ntest.js\n"
  },
  {
    "path": ".releaserc.json",
    "content": "{\n  \"plugins\": [\n    \"@semantic-release/commit-analyzer\",\n    \"@semantic-release/release-notes-generator\",\n    \"@semantic-release/npm\",\n    \"@semantic-release/github\",\n    \"@semantic-release/git\"\n  ]\n}\n"
  },
  {
    "path": "CHANGELOG.md",
    "content": "see https://github.com/markedjs/marked/releases\n"
  },
  {
    "path": "LICENSE.md",
    "content": "# License information\n\n## Contribution License Agreement\n\nIf you contribute code to this project, you are implicitly allowing your code\nto be distributed under the MIT license. You are also implicitly verifying that\nall code is your original work. `</legalese>`\n\n## Marked\n\nCopyright (c) 2018+, MarkedJS (https://github.com/markedjs/)\nCopyright (c) 2011-2018, Christopher Jeffrey (https://github.com/chjj/)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n## Markdown\n\nCopyright © 2004, John Gruber\nhttp://daringfireball.net/\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:\n\n* Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.\n* Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.\n* Neither the name “Markdown” nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.\n\nThis software is provided by the copyright holders and contributors “as is” and any express or implied warranties, including, but not limited to, the implied warranties of merchantability and fitness for a particular purpose are disclaimed. In no event shall the copyright owner or contributors be liable for any direct, indirect, incidental, special, exemplary, or consequential damages (including, but not limited to, procurement of substitute goods or services; loss of use, data, or profits; or business interruption) however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence or otherwise) arising in any way out of the use of this software, even if advised of the possibility of such damage.\n"
  },
  {
    "path": "README.md",
    "content": "<a href=\"https://marked.js.org\">\n  <img width=\"60px\" height=\"60px\" src=\"https://marked.js.org/img/logo-black.svg\" align=\"right\" />\n</a>\n\n# Marked\n\n[![npm](https://badgen.net/npm/v/marked)](https://www.npmjs.com/package/marked)\n[![install size](https://badgen.net/packagephobia/install/marked)](https://packagephobia.now.sh/result?p=marked)\n[![downloads](https://badgen.net/npm/dt/marked)](https://www.npmjs.com/package/marked)\n[![github actions](https://github.com/markedjs/marked/workflows/Tests/badge.svg)](https://github.com/markedjs/marked/actions)\n[![snyk](https://snyk.io/test/npm/marked/badge.svg)](https://snyk.io/test/npm/marked)\n\n- ⚡ built for speed\n- ⬇️ low-level compiler for parsing markdown without caching or blocking for long periods of time\n- ⚖️ light-weight while implementing all markdown features from the supported flavors & specifications\n- 🌐 works in a browser, on a server, or from a command line interface (CLI)\n\n## Demo\n\nCheck out the [demo page](https://marked.js.org/demo/) to see Marked in action ⛹️\n\n## Docs\n\nOur [documentation pages](https://marked.js.org) are also rendered using marked 💯\n\nAlso read about:\n\n* [Options](https://marked.js.org/using_advanced)\n* [Extensibility](https://marked.js.org/using_pro)\n\n## Compatibility\n\n**Node.js:** Only [current and LTS](https://nodejs.org/en/about/releases/) Node.js versions are supported. End of life Node.js versions may become incompatible with Marked at any point in time.\n\n**Browser:** [Baseline Widely Available](https://developer.mozilla.org/en-US/docs/Glossary/Baseline/Compatibility)\n\n## Installation\n\n**CLI:**\n\n```sh\nnpm install -g marked\n```\n\n**In-browser:**\n\n```sh\nnpm install marked\n```\n\n## Usage\n\n### Warning: 🚨 Marked does not [sanitize](https://marked.js.org/using_advanced#options) the output HTML. Please use a sanitize library, like [DOMPurify](https://github.com/cure53/DOMPurify) (recommended), [sanitize-html](https://github.com/apostrophecms/sanitize-html) or [insane](https://github.com/bevacqua/insane) on the *output* HTML! 🚨\n\n```\nDOMPurify.sanitize(marked.parse(`<img src=\"x\" onerror=\"alert('not happening')\">`));\n```\n\n**CLI**\n\n``` bash\n# Example with stdin input\n$ marked -o hello.html\nhello world\n^D\n$ cat hello.html\n<p>hello world</p>\n```\n\n```bash\n# Print all options\n$ marked --help\n```\n\n**Browser**\n\n```html\n<!doctype html>\n<html>\n<head>\n  <meta charset=\"utf-8\"/>\n  <title>Marked in the browser</title>\n</head>\n<body>\n  <div id=\"content\"></div>\n  <script src=\"https://cdn.jsdelivr.net/npm/marked/lib/marked.umd.js\"></script>\n  <script>\n    document.getElementById('content').innerHTML =\n      marked.parse('# Marked in the browser\\n\\nRendered by **marked**.');\n  </script>\n</body>\n</html>\n```\nor import esm module\n\n```html\n<script type=\"module\">\n  import { marked } from \"https://cdn.jsdelivr.net/npm/marked/lib/marked.esm.js\";\n  document.getElementById('content').innerHTML =\n    marked.parse('# Marked in the browser\\n\\nRendered by **marked**.');\n</script>\n```\n\n## License\n\nCopyright (c) 2018+, MarkedJS. (MIT License)\nCopyright (c) 2011-2018, Christopher Jeffrey. (MIT License)\n"
  },
  {
    "path": "SECURITY.md",
    "content": "# Security Policy\n\nThe only completely secure system is the one that doesn't exist in the first place.\nHaving said that, we take the security of Marked very seriously.\n\n## Reporting a Vulnerability\n\nPlease disclose potential security issues by email to the project [committers](https://marked.js.org/authors) as well as the [listed owners within NPM](https://docs.npmjs.com/cli/owner).\nWe will provide an initial assessment of security reports within 48 hours and should apply patches within 2 weeks\n(also, feel free to contribute a fix for the issue).\n\n"
  },
  {
    "path": "api/dingus.js",
    "content": "import { marked } from '../lib/marked.esm.js';\nimport pkg from '../package.json' with { type: 'json' };\n\nconst version = pkg.version;\nconst name = 'Marked';\n\nexport default function dingus(req, res) {\n  if (req.method !== 'GET') {\n    return res.status(405).json({\n      error: {\n        code: 'method_not_allowed',\n        message: 'Only GET requests are supported for this endpoint.',\n      },\n    });\n  }\n  const { text = '' } = req.query;\n  const html = marked(text);\n  res.json({ name, version, html });\n}\n"
  },
  {
    "path": "bin/main.js",
    "content": "#!/usr/bin/env node\n\n/**\n * Marked CLI\n * Copyright (c) 2018+, MarkedJS. (MIT License)\n * Copyright (c) 2011-2018, Christopher Jeffrey. (MIT License)\n */\n\nimport { promises } from 'node:fs';\nimport { dirname, resolve } from 'node:path';\nimport { homedir } from 'node:os';\nimport { createRequire } from 'node:module';\nimport { marked } from '../lib/marked.esm.js';\n\nconst { access, readFile, writeFile } = promises;\nconst require = createRequire(import.meta.url);\n\n/**\n * @param {Process} nodeProcess inject process so it can be mocked in tests.\n */\nexport async function main(nodeProcess) {\n  /**\n   * Man Page\n   */\n  async function help() {\n    const { spawn } = await import('child_process');\n    const { fileURLToPath } = await import('url');\n\n    const options = {\n      cwd: nodeProcess.cwd(),\n      env: nodeProcess.env,\n      stdio: 'inherit',\n    };\n\n    const __dirname = dirname(fileURLToPath(import.meta.url));\n    const helpText = await readFile(resolve(__dirname, '../man/marked.1.md'), 'utf8');\n\n    await new Promise(res => {\n      const manProcess = spawn('man', [resolve(__dirname, '../man/marked.1')], options);\n      nodeProcess.on('SIGINT', () => {\n        manProcess.kill('SIGINT');\n      });\n\n      manProcess.on('error', () => {\n        console.log(helpText);\n      })\n        .on('close', res);\n    });\n  }\n\n  async function version() {\n    const pkg = require('../package.json');\n    console.log(pkg.version);\n  }\n\n  /**\n   * Main\n   */\n  async function start(argv) {\n    const files = [];\n    const options = {};\n    let input;\n    let output;\n    let string;\n    let arg;\n    let tokens;\n    let config;\n    let opt;\n    let noclobber;\n\n    function getArg() {\n      let arg = argv.shift();\n\n      if (arg.indexOf('--') === 0) {\n        // e.g. --opt\n        arg = arg.split('=');\n        if (arg.length > 1) {\n          // e.g. --opt=val\n          argv.unshift(arg.slice(1).join('='));\n        }\n        arg = arg[0];\n      } else if (arg[0] === '-') {\n        if (arg.length > 2) {\n          // e.g. -abc\n          argv = arg.substring(1).split('').map(function(ch) {\n            return '-' + ch;\n          }).concat(argv);\n          arg = argv.shift();\n        } else {\n          // e.g. -a\n        }\n      } else {\n        // e.g. foo\n      }\n\n      return arg;\n    }\n\n    while (argv.length) {\n      arg = getArg();\n      switch (arg) {\n        case '-o':\n        case '--output':\n          output = argv.shift();\n          break;\n        case '-i':\n        case '--input':\n          input = argv.shift();\n          break;\n        case '-s':\n        case '--string':\n          string = argv.shift();\n          break;\n        case '-t':\n        case '--tokens':\n          tokens = true;\n          break;\n        case '-c':\n        case '--config':\n          config = argv.shift();\n          break;\n        case '-n':\n        case '--no-clobber':\n          noclobber = true;\n          break;\n        case '-h':\n        case '--help':\n          return await help();\n        case '-v':\n        case '--version':\n          return await version();\n        default:\n          if (arg.indexOf('--') === 0) {\n            opt = camelize(arg.replace(/^--(no-)?/, ''));\n            if (!(opt in marked.defaults)) {\n              continue;\n            }\n            if (arg.indexOf('--no-') === 0) {\n              options[opt] = typeof marked.defaults[opt] !== 'boolean'\n                ? null\n                : false;\n            } else {\n              options[opt] = typeof marked.defaults[opt] !== 'boolean'\n                ? argv.shift()\n                : true;\n            }\n          } else {\n            files.push(arg);\n          }\n          break;\n      }\n    }\n\n    async function getData() {\n      if (!input) {\n        if (files.length <= 2) {\n          if (string) {\n            return string;\n          }\n          return await getStdin();\n        }\n        input = files.pop();\n      }\n      return await readFile(input, 'utf8');\n    }\n\n    function resolveFile(file) {\n      return resolve(file.replace(/^~/, homedir));\n    }\n\n    function fileExists(file) {\n      return access(resolveFile(file)).then(() => true, () => false);\n    }\n\n    async function runConfig(file) {\n      const configFile = resolveFile(file);\n      let markedConfig;\n      try {\n        // try require for json\n        markedConfig = require(configFile);\n      } catch(err) {\n        if (err.code !== 'ERR_REQUIRE_ESM') {\n          throw err;\n        }\n        // must import esm\n        markedConfig = await import('file:///' + configFile);\n      }\n\n      if (markedConfig.default) {\n        markedConfig = markedConfig.default;\n      }\n\n      if (typeof markedConfig === 'function') {\n        markedConfig(marked);\n      } else {\n        marked.use(markedConfig);\n      }\n    }\n\n    const data = await getData();\n\n    if (config) {\n      if (!await fileExists(config)) {\n        throw Error(`Cannot load config file '${config}'`);\n      }\n\n      await runConfig(config);\n    } else {\n      const defaultConfig = [\n        '~/.marked.json',\n        '~/.marked.js',\n        '~/.marked/index.js',\n      ];\n\n      for (const configFile of defaultConfig) {\n        if (await fileExists(configFile)) {\n          await runConfig(configFile);\n          break;\n        }\n      }\n    }\n\n    const html = tokens\n      ? JSON.stringify(marked.lexer(data, options), null, 2)\n      : await marked.parse(data, options);\n\n    if (output) {\n      if (noclobber && await fileExists(output)) {\n        throw Error('marked: output file \\'' + output + '\\' already exists, disable the \\'-n\\' / \\'--no-clobber\\' flag to overwrite\\n');\n      }\n      return await writeFile(output, html);\n    }\n\n    nodeProcess.stdout.write(html + '\\n');\n  }\n\n  /**\n   * Helpers\n   */\n  function getStdin() {\n    return new Promise((resolve, reject) => {\n      const stdin = nodeProcess.stdin;\n      let buff = '';\n\n      stdin.setEncoding('utf8');\n\n      stdin.on('data', function(data) {\n        buff += data;\n      });\n\n      stdin.on('error', function(err) {\n        reject(err);\n      });\n\n      stdin.on('end', function() {\n        resolve(buff);\n      });\n\n      stdin.resume();\n    });\n  }\n\n  /**\n   * @param {string} text\n   */\n  function camelize(text) {\n    return text.replace(/(\\w)-(\\w)/g, function(_, a, b) {\n      return a + b.toUpperCase();\n    });\n  }\n\n  try {\n    await start(nodeProcess.argv.slice());\n    nodeProcess.exit(0);\n  } catch(err) {\n    if (err.code === 'ENOENT') {\n      nodeProcess.stderr.write('marked: ' + err.path + ': No such file or directory');\n    } else {\n      nodeProcess.stderr.write(err.message);\n    }\n    return nodeProcess.exit(1);\n  }\n}\n"
  },
  {
    "path": "bin/marked.js",
    "content": "#!/usr/bin/env node\n\n/**\n * Marked CLI\n * Copyright (c) 2018+, MarkedJS. (MIT License)\n * Copyright (c) 2011-2018, Christopher Jeffrey. (MIT License)\n */\n\nimport { main } from './main.js';\n\n/**\n * Expose / Entry Point\n */\n\nprocess.title = 'marked';\nmain(process);\n"
  },
  {
    "path": "docs/.eslintrc.json",
    "content": "{\n  \"extends\": \"standard\",\n  \"parserOptions\": {\n    \"ecmaVersion\": 2015,\n    \"sourceType\": \"script\"\n  },\n  \"rules\": {\n    \"semi\": [\"error\", \"always\"],\n    \"indent\": [\"error\", 2, {\n      \"SwitchCase\": 1,\n      \"VariableDeclarator\": { \"var\": 2 },\n      \"outerIIFEBody\": 0\n    }],\n    \"operator-linebreak\": [\"error\", \"before\", { \"overrides\": { \"=\": \"after\" } }],\n    \"space-before-function-paren\": [\"error\", \"never\"],\n    \"no-cond-assign\": \"off\",\n    \"no-useless-escape\": \"off\",\n    \"one-var\": \"off\",\n    \"no-control-regex\": \"off\",\n    \"no-prototype-builtins\": \"off\",\n\n    \"prefer-const\": \"error\",\n    \"no-var\": \"error\"\n  },\n  \"env\": {\n    \"node\": true,\n    \"browser\": true,\n    \"amd\": true\n  }\n}\n"
  },
  {
    "path": "docs/AUTHORS.md",
    "content": "# Authors\n\nMarked takes an encompassing approach to its community. As such, you can think of these as [concentric circles](https://medium.com/the-node-js-collection/healthy-open-source-967fa8be7951), where each group encompasses the following groups.\n\n<table>\n  <tbody>\n  \t<tr>\n      <td align=\"center\" valign=\"top\" style=\"width:32%\">\n        <a href=\"https://github.com/chjj\">\n          <img width=\"100\" height=\"100\" src=\"https://github.com/chjj.png?s=150\">\n        </a>\n        <br>\n        <a href=\"https://github.com/chjj\">Christopher Jeffrey</a>\n        <div>Original Author</div>\n        <small>Started the fire</small>\n      </td>\n      <td align=\"center\" valign=\"top\" style=\"width:32%\">\n        <a href=\"https://github.com/joshbruce\">\n          <img width=\"100\" height=\"100\" src=\"https://github.com/joshbruce.png?s=150\">\n        </a>\n        <br>\n        <a href=\"https://joshbruce.com\">Josh Bruce</a>\n        <div>Publisher</div>\n        <small>Release Wrangler; Humaning Helper; Heckler of Hypertext</small>\n      </td>\n      <td align=\"center\" valign=\"top\" style=\"width:32%\">\n        <a href=\"https://github.com/styfle\">\n          <img width=\"100\" height=\"100\" src=\"https://github.com/styfle.png?s=150\">\n        </a>\n        <br>\n        <a href=\"https://www.ceriously.com\">Steven</a>\n        <div>Publisher</div>\n        <small>Release Wrangler; Dr. Docs; Open source, of course; GitHub Guru; Humaning Helper</small>\n      </td>\n    </tr>\n  \t<tr>\n      <td align=\"center\" valign=\"top\">\n        <a href=\"https://github.com/davisjam\">\n          <img width=\"100\" height=\"100\" src=\"https://github.com/davisjam.png?s=150\">\n        </a>\n        <br>\n        <a href=\"https://github.com/davisjam\">Jamie Davis</a>\n        <div>Committer</div>\n        <small>Seeker of Security</small>\n      </td>\n      <td align=\"center\" valign=\"top\">\n        <a href=\"https://github.com/UziTech\">\n          <img width=\"100\" height=\"100\" src=\"https://github.com/UziTech.png?s=150\">\n        </a>\n        <br>\n        <a href=\"https://tony.brix.ninja\">Tony Brix</a>\n        <div>Publisher</div>\n        <small>Release Wrangler; Titan of the test harness; Dr. DevOps</small>\n      </td>\n      <td align=\"center\" valign=\"top\">\n        <a href=\"https://github.com/calculuschild\">\n          <img width=\"100\" height=\"100\" src=\"https://github.com/calculuschild.png?s=150\">\n        </a>\n        <br>\n        <a href=\"https://github.com/calculuschild\">Trevor Buckner</a>\n        <div>Committer</div>\n        <small>Master of Marked</small>\n      </td>\n    </tr>\n  </tbody>\n</table>\n\n## Contributors\n\n<table>\n  <tbody>\n    <tr>\n      <td align=\"center\" valign=\"top\">\n        <a href=\"https://github.com/intcreator\">\n          <img width=\"100\" height=\"100\" src=\"https://github.com/intcreator.png?s=150\">\n        </a>\n        <br>\n        <a href=\"https://github.com/intcreator\">Brandon der Blätter</a>\n        <div>Contributor</div>\n        <small>Curious Contributor</small>\n      </td>\n      <td align=\"center\" valign=\"top\">\n        <a href=\"https://github.com/carlosvalle\">\n          <img width=\"100\" height=\"100\" src=\"https://github.com/carlosvalle.png?s=150\">\n        </a>\n        <br>\n        <a href=\"https://github.com/carlosvalle\">Carlos Valle</a>\n        <div>Contributor</div>\n        <small>Maker of the Marked mark from 2018 to present</small>\n      </td>\n      <td align=\"center\" width=\"20%\" valign=\"top\">\n        <a href=\"https://github.com/Feder1co5oave\">\n          <img width=\"100\" height=\"100\" src=\"https://github.com/Feder1co5oave.png?s=150\">\n        </a>\n        <br>\n        <a href=\"https://github.com/Feder1co5oave\">Federico Soave</a>\n        <div>Contributor</div>\n        <small>Regent of the Regex; Master of Marked</small>\n      </td>\n      <td align=\"center\" valign=\"top\">\n        <a href=\"https://github.com/karenyavine\">\n          <img width=\"100\" height=\"100\" src=\"https://github.com/karenyavine.png?s=150\">\n        </a>\n        <br>\n        <a href=\"https://github.com/karenyavine\">Karen Yavine</a>\n        <div>Contributor</div>\n        <small>Snyk's Security Saint</small>\n      </td>\n     </tr>\n     <tr>\n      <td align=\"center\" valign=\"top\">\n        <a href=\"https://github.com/KostyaTretyak\">\n          <img width=\"100\" height=\"100\" src=\"https://github.com/KostyaTretyak.png?s=150\">\n        </a>\n        <br>\n        <a href=\"https://github.com/KostyaTretyak\">Костя Третяк</a>\n        <div>Contributor</div>\n        <small></small>\n      </td>\n      <td align=\"center\" width=\"20%\" valign=\"top\">\n        <a href=\"https://github.com/tomtheisen\">\n          <img width=\"100\" height=\"100\" src=\"https://github.com/tomtheisen.png?s=150\">\n        </a>\n        <br>\n        <a href=\"https://github.com/tomtheisen\">Tom Theisen</a>\n        <div>Contributor</div>\n        <small>Defibrillator</small>\n      </td>\n      <td align=\"center\" width=\"20%\" valign=\"top\">\n        <a href=\"https://github.com/mccraveiro\">\n          <img width=\"100\" height=\"100\" src=\"https://github.com/mccraveiro.png?s=150\">\n        </a>\n        <br>\n        <a href=\"https://github.com/mccraveiro\">Mateus Craveiro</a>\n        <div>Contributor</div>\n        <small>Defibrillator</small>\n      </td>\n      <td align=\"center\" width=\"20%\" valign=\"top\">\n      </td>\n     </tr>\n  </tbody>\n</table>\n\n## Publishers\n\nPublishers are admins who also have the responsibility, privilege, and burden of publishing the new releases to NPM and performing outreach and external stakeholder communications. Further, when things go pear-shaped, they're the ones taking most of the heat. Finally, when things go well, they're the primary ones praising the contributors who made it possible.\n\n(In other words, while Admins are focused primarily on the internal workings of the project, Publishers are focused on internal *and* external concerns.)\n\n**Should not exceed 2:** Having more people with the authority to publish a release can quickly turn into a consensus seeking nightmare (design by committee). Having only one is preferred (Directly Responsible Individual); however, given the nature of the project and its history, having an immediate fallback, and a potential deep fallback (Original author) is probably a good idea.\n\n[Details on badges](#badges)\n\n## Admins\n\nAdmins are committers who also have the responsibility, privilege, and burden of selecting committers and making sure the project itself runs smoothly, which includes community maintenance, governance, dispute resolution, and so on. (Letting the contributors easily enter into, and work within, the project to begin contributing, with as little friction as possible.)\n\n**Should not exceed 3:** When there are too many people with the ability to resolve disputes, the dispute itself can quickly turn into a dispute amongst the admins themselves; therefore, we want this group to be small enough to commit to action and large enough to not put too much burden on one person. (Should ensure faster resolution and responsiveness.)\n\nTo be listed: Admins are usually selected from the pool of committers (or they volunteer, using the same process) who demonstrate good understanding of the marked culture, operations, and do their best to help new contributors get up to speed on how to contribute effectively to the project.\n\nTo be removed: You can remove yourself through the [GitHub UI](https://help.github.com/articles/removing-yourself-from-a-collaborator-s-repository/).\n\n[Details on badges](#badges)\n\n## Committers\n\nCommitters are contributors who also have the responsibility, privilege, some might even say burden of being able to review and merge contributions (just usually not their own).\n\nA note on \"decision making authority\". This is related to submitting PRs and the [advice process](https://reinventingorganizationswiki.com/en/theory/decision-making/). The person marked as having decision making authority over a certain area should be sought for advice in that area before committing to a course of action.\n\n**Should not exceed 5:** For larger PRs affecting more of the codebase and, most likely, review by more people, we try to keep this pool small and responsive and let those with decision making authority have final say without negative repercussions from the other committers.\n\nTo be listed: Committers are usually selected (or they volunteer, using the same process) from contributors who enter the discussions regarding the future direction of Marked (maybe even doing informal reviews of contributions despite not being able to merge them yourself).\n\nTo be removed: You can remove yourself through the [GitHub UI](https://help.github.com/articles/removing-yourself-from-a-collaborator-s-repository/).\n\nA note on volunteering:\n\n1. Please do not volunteer unless you believe you can demonstrate to your peers you can do the work required.\n2. Please do not overcommit yourself; we count on those committed to the project to be responsive. Really consider, with all you have going on, whether you able to really commit to it.\n3. Don't let the previous frighten you away, it can always be changed later by you or your peers.\n\n[Details on badges](#badges)\n\n## Contributors\n\nContributors are users who submit a [PR](https://github.com/markedjs/marked/pulls), [Issue](https://github.com/markedjs/marked/issues), or collaborate in making Marked a better product and experience for all the users.\n\nTo be listed: make a contribution and, if it has significant impact, the committers may be able to add you here.\n\nTo be removed: please let us know or submit a PR.\n\n[Details on badges](#badges)\n\n## Users\n\nUsers are anyone using Marked in some fashion, without them, there's no reason for us to exist.\n\n|Individual or Organization |Website                 |Project                              |Submitted by                                        |\n|:--------------------------|:-----------------------|:------------------------------------|:---------------------------------------------------|\n|MarkedJS                   |https://marked.js.org   |https://github.com/markedjs/marked   |The marked committers                               |\n\nTo be listed: All fields are optional. Contact any of the committers or, more timely, submit a pull request with the following (using the first row as an example):\n\n- **Individual or Organization:** The name you would like associated with the record.\n- **Website:** A URL to a standalone website for the project.\n- **Project:** A URL for the repository of the project using marked.\n- **Submitted by:** The name and optional honorifics for the person adding the listing.\n\nTo be removed: Same as above. Only instead of requesting addition request deletion or delete the row yourself.\n\n<h2 id=\"badges\">Badges</h2>\n\nBadges? You don't *need* no stinkin' badges.\n\nMovie references aside. (It was either that or, \"Let's play a game\", but that would have been creepy&hellip;that's why it will most likely come later.)\n\nBadges? If you *want* 'em, we got 'em, and here's how you get 'em (and&hellip;dramatic pause&hellip;why not two dramatic pauses for emphasis?&hellip; how they can be taken away).\n\n- [ ] Add the appropriate badge to the desired contributor in the desired column of this page, even if they're not listed here yet.\n- [ ] Submit a PR (we're big on PRs around here, if you haven't noticed, help us help you).\n- [ ] Follow the instructions for submitting a badge PR. (There are more details to find within. Come on. Everybody likes surprises, right? No? Actually, we just try to put documentation where it belongs, closer to the code and part of the sequence of events.)\n\n### Badges at play:\n\n<dl>\n\t<dt>Curious Contributor</dt>\n\t<dd>A contributor with less than one year on this page who is actively engaged in submitting PRs, Issues, making recommendations, sharing thoughts&hellip;without being too annoying about it (let's be clear, submitting 100 Issues recommending the Marked Committers send everyone candy is trying for the badge, not honestly earning it).</dd>\n\t<dt>Dr. DevOps</dt>\n\t<dd>\n\t\t<p>Someone who understands and contributes to improving the developer experience and flow of Marked into the world.</p>\n\t\t<blockquote>\n\t\t\t\"The main characteristic of the DevOps movement is to strongly advocate automation and monitoring at all steps of software construction, from integration, testing, releasing to deployment and infrastructure management. DevOps aims at shorter development cycles, increased deployment frequency, more dependable releases, in close alignment with business objectives.\" ~ <a href=\"https://www.wikipedia.org/wiki/DevOps\">Wikipedia</a>\n\t\t</blockquote>\n\t</dd>\n  <dt>Dr. Docs</dt>\n  <dd>Someone who has contributed a great deal to the creation and maintenance of the non-code areas of marked.</dd>\n\t<dt>Eye for the CLI</dt>\n\t<dd>At this point? Pretty much anyone who can update that `man` file to the current Marked version without regression in the CLI tool itself.</dd>\n\t<dt>GitHub Guru</dt>\n\t<dd>Someone who always seems to be able to tell you easier ways to do things with GitHub.</dd>\n\t<dt>Humaning Helper</dt>\n\t<dd>Someone who goes out of their way to help contributors feel welcomed and valued. Further, someone who takes the extra steps(s) necessary to help new contributors get up to speed. Finally, they maintain composure even in times of disagreement and dispute resolution.</dd>\n\t<dt>Heckler of Hypertext</dt>\n\t<dd>Someone who demonstrates an esoteric level of knowledge when it comes to HTML. In other words, someone who says things like, \"Did you know most Markdown flavors don't have a way to render a description list (`dl`)? All the more reason Markdown `!==` HTML.\"</dd>\n\t<dt>Markdown Maestro</dt>\n\t<dd>You know that person who knows about way too many different flavors of Markdown? The one who maybe seems a little too obsessed with the possibilities of Markdown beyond HTML? Come on. You know who they are. Or, at least you could, if you give them this badge.</dd>\n\t<dt>Master of Marked</dt>\n\t<dd>Someone who demonstrates they know the ins and outs of the codebase for Marked.</dd>\n\t<dt>Open source, of course</dt>\n\t<dd>Someone who advocates for and has a proven understanding of how to operate within open source communities.</dd>\n\t<dt>Regent of the Regex</dt>\n\t<dd><p>Can you demonstrate you understand the following without Google and Stackoverflow?</p>\n\t\t<p><code>/^( *)(bull) [\\s\\S]+?(?:hr|def|\\n{2,}(?! )(?!\\1bull )\\n*|\\s*$)/</code></p>\n\t\t<p>Because this author can't yet. That's who gets these.</p>\n\t</dd>\n\t<dt>Seeker of Security</dt>\n\t<dd>Someone who has demonstrated a high degree of expertise or authority when it comes to software security.</dd>\n\t<dt>Titan of the Test Harness</dt>\n\t<dd>Someone who demonstrates high-levels of understanding regarding Marked's test harness.</dd>\n\t<dt>Totally Tron</dt>\n\t<dd>Someone who demonstrates they are willing and able to \"fight for the users\", both developers dependent on marked to do their jobs as well as end-users interacting with the output (particularly in the realm of those with the disabilities).</dd>\n</dl>\n\n### Special badges that come with the job:\n\n<dl>\n\t<dt>Defibrillator</dt>\n\t<dd>A contributor who stepped up to help bring Marked back to life by contributing solutions to help Marked pass when compared against the CommonMark and GitHub Flavored Markdown specifications.</dd>\n\t<dt>Maker of the Marked mark</dt>\n\t<dd>This badge is given to the person or organization credited with creating the logo (or logotype) used in Marked communications for a given period of time. **Maker of the Marked mark from 2017 to present**, for example.</dd>\n\t<dt>Release Wrangler</dt>\n\t<dd>This is a badge given to all Publishers.</dd>\n\t<dt>Snyk's Security Saint</dt>\n\t<dd>This is a badge given to whomever primarily reaches out from Snyk to let us know about security issues.</dd>\n</dl>\n"
  },
  {
    "path": "docs/CODE_OF_CONDUCT.md",
    "content": "# Contributor Covenant Code of Conduct\n\n## Our Pledge\n\nIn the interest of fostering an open and welcoming environment, we as\ncontributors and maintainers pledge to making participation in our project and\nour community a harassment-free experience for everyone, regardless of age, body\nsize, disability, ethnicity, gender identity and expression, level of experience,\nnationality, personal appearance, race, religion, or sexual identity and\norientation.\n\n## Our Standards\n\nExamples of behavior that contributes to creating a positive environment\ninclude:\n\n* Using welcoming and inclusive language\n* Being respectful of differing viewpoints and experiences\n* Gracefully accepting constructive criticism\n* Focusing on what is best for the community\n* Showing empathy towards other community members\n\nExamples of unacceptable behavior by participants include:\n\n* The use of sexualized language or imagery and unwelcome sexual attention or\nadvances\n* Trolling, insulting/derogatory comments, and personal or political attacks\n* Public or private harassment\n* Publishing others' private information, such as a physical or electronic\n  address, without explicit permission\n* Other conduct which could reasonably be considered inappropriate in a\n  professional setting\n\n## Our Responsibilities\n\nProject maintainers are responsible for clarifying the standards of acceptable\nbehavior and are expected to take appropriate and fair corrective action in\nresponse to any instances of unacceptable behavior.\n\nProject maintainers have the right and responsibility to remove, edit, or\nreject comments, commits, code, wiki edits, issues, and other contributions\nthat are not aligned to this Code of Conduct, or to block temporarily or\npermanently any contributor for other behaviors that they deem inappropriate,\nthreatening, offensive, or harmful.\n\n## Scope\n\nThis Code of Conduct applies both within project spaces and in public spaces\nwhen an individual is representing the project or its community. Examples of\nrepresenting a project or community include using an official project e-mail\naddress, posting via an official social media account, or acting as an appointed\nrepresentative at an online or offline event. Representation of a project may be\nfurther defined and clarified by project maintainers.\n\n## Enforcement\n\nInstances of abusive, harassing, or otherwise unacceptable behavior may be\nreported by contacting the project team by submitting a PR with changes to the [AUTHORS](/authors) page (or emailing josh@8fold.com). All\ncomplaints will be reviewed and investigated and will result in a response that\nis deemed necessary and appropriate to the circumstances. The project team is\nobligated to maintain confidentiality with regard to the reporter of an incident.\nFurther details of specific enforcement policies may be posted separately.\n\nProject maintainers who do not follow or enforce the Code of Conduct in good\nfaith may face temporary or permanent repercussions as determined by other\nmembers of the project's leadership.\n\n## Attribution\n\nThis Code of Conduct is adapted from the [Contributor Covenant][homepage],\nversion [1.4][version].\n\n[homepage]: https://www.contributor-covenant.org/\n[version]: https://www.contributor-covenant.org/version/1/4/code-of-conduct.html\n"
  },
  {
    "path": "docs/CONTRIBUTING.md",
    "content": "# Contributing to Marked\n\n- [ ] Fork `markedjs/marked`.\n- [ ] Clone the library locally using GitHub Desktop or the command line.\n- [ ] Make sure you are on the `master` branch.\n- [ ] Be sure to run `npm install` or `npm update`.\n- [ ] Create a branch.\n- [ ] Update code in `src` folder. (`lib` folder is for auto compiled code)\n- [ ] Run `npm run test:all`, fix any broken things (for linting, you can run `npm run lint` to have the linter fix them for you).\n- [ ] Run `npm run build:reset` to remove changes to compiled files.\n- [ ] Submit a Pull Request.\n\n<h2 id=\"design-principles\">Design principles</h2>\n\nMarked tends to favor following the SOLID set of software design and development principles; mainly the [single responsibility](https://en.wikipedia.org/wiki/Single_responsibility_principle) and [open/closed principles](https://en.wikipedia.org/wiki/Open/closed_principle):\n\n- **Single responsibility:** Marked, and the components of Marked, have the single responsibility of converting Markdown strings into HTML.\n- **Open/closed:** Marked favors giving developers the means to easily extend the library and its components over changing Marked's behavior through configuration options.\n\n<h2 id=\"priorities\">Priorities</h2>\n\nWe think we have our priorities sorted to build quality in.\n\nThe following table lists the ticket type labels we use when there is work to be done on the code either through an Issue or a PR; in priority order.\n\n|Ticket type label                  |Description                                                                                                                                                                         |\n|:----------------------------------|:-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n|L0 - security                      |A security vulnerability within the Marked library is discovered.                                                                                                                   |\n|L1 - broken                        |Valid usage results in incorrect output compared to [supported specifications](/#specifications) OR causes marked to crash AND there is no known workaround for the issue. |\n|L2 - annoying                      |Similar to L1 - broken only there is a known workaround available for the issue.                                                                                                   |\n|RR - refactor and re-engineer      |Results in an improvement to developers using Marked (improved readability) or end-users (faster performance) or both.                                                              |\n|NFS - new feature (spec related)   |A capability Marked does not currently provide but is in one of the [supported specifications](/#specifications)                                                           |\n|NFU - new feature (user requested) |A capability Marked does not currently provide but has been requested by users of Marked.                                                                                           |\n|NFE - new feature (should be an extension) |A capability Marked does not currently provide and is not part of a spec.                                                                                           |\n\n<h2 id=\"test-early-often-and-everything\">Test early, often, and everything</h2>\n\nWe try to write test cases to validate output (writing tests based on the [supported specifications](/#specifications)) and minimize regression (writing tests for issues fixed). Therefore, if you would like to contribute, some things you should know regarding the test harness.\n\n|Location              |Description                                                                                                    |\n|:---------------------|:--------------------------------------------------------------------------------------------------------------|\n|/test/specs/commonmark|Tests for [CommonMark](https://spec.commonmark.org/current/) compliance                                        |\n|/test/specs/gfm       |Tests for [GFM](https://github.github.com/gfm/) compliance                                                     |\n|/test/specs/new       |Tests not related to the original `markdown.pl`.                                                               |\n|/test/specs/original  |Tests validating against the original `markdown.pl`.                                                           |\n|/test/specs/redos     |Tests for [ReDOS](https://www.owasp.org/index.php/Regular_expression_Denial_of_Service_-_ReDoS) vulnerabilities|\n\nIf your test uses features or options, assuming `gfm` is set to `false`, for example, you can add [front-matter](https://www.npmjs.com/package/front-matter) to the top of\nyour `.md` file\n\n``` yml\n---\ngfm: false\n---\n```\n\n## Submitting PRs and Issues\n\nMarked provides templates for submitting both pull requests and issues. When you begin creating a new PR or issue, you will see instructions on using the template.\n\nThe PR templates include checklists for both the submitter and the reviewer, which, in most cases, will not be the same person.\n\n## Scripts\n\nWhen it comes to NPM commands, we try to use the native scripts provided by the NPM framework.\n\nTo run the tests:\n\n``` bash\nnpm test\n```\n\nTo test whether you are using the standard syntax rules for the project:\n\n```bash\nnpm run test:lint\n```\n\nTo see time comparisons between Marked and other popular Markdown libraries:\n\n```bash\nnpm run bench\n```\n\nTo see the compiled rules from `src/rules.js`:\n\n```bash\nnpm run rules\n```\n\nYou can specify one or more `rule path`s to only show certain rules:\n\n```bash\nnpm run rules -- block.gfm.item inline.pedantic.br\n\n{\n  block: {\n    gfm: {\n      item: /^( *)((?:[*+-]|\\\\d{1,9}\\\\.)) ?[^\\\\n]*(?:\\\\n(?!\\\\1(?:[*+-]|\\\\d{1,9}\\\\.) ?)[^\\\\n]*)*/gm\n    }\n  },\n  inline: {\n    pedantic: {\n      br: /^( {2,}|\\\\\\\\)\\\\n(?!\\\\s*$)/\n    }\n  }\n}\n```\n\nTo check for (and fix) standardized syntax (lint):\n\n```bash\nnpm run lint\n```\n\nTo build your own es5, esm, and minified versions of Marked:\n\n```bash\nnpm run build\n```\n"
  },
  {
    "path": "docs/INDEX.md",
    "content": "Marked is\n\n1. built for speed.<sup>*</sup>\n2. a low-level markdown compiler for parsing markdown without caching or blocking for long periods of time.<sup>**</sup>\n3. light-weight while implementing all markdown features from the supported flavors & specifications.<sup>***</sup>\n4. available as a command line interface (CLI) and running in client- or server-side JavaScript projects.\n\n<p><small><sup>*</sup> Still working on metrics for comparative analysis and definition.</small><br>\n<small><sup>**</sup> As few dependencies as possible.</small><br>\n<small><sup>***</sup> Strict compliance could result in slower processing when running comparative benchmarking.</small></p>\n\n\n<h2 id=\"demo\">Demo</h2>\n\nCheckout the [demo page](./demo/) to see marked in action ⛹️\n\nThese documentation pages are also rendered using marked 💯\n\n\n<h2 id=\"installation\">Installation</h2>\n\n**CLI:** `npm install -g marked`\n\n**In-browser:**\n```\nnpm install marked\n```\n<h2 id=\"usage\">Usage</h2>\n\n### Warning: 🚨 Marked does not [sanitize](/using_advanced#options) the output HTML. If you are processing potentially unsafe strings, it's important to filter for possible XSS attacks. Some filtering options include [DOMPurify](https://github.com/cure53/DOMPurify) (recommended), [js-xss](https://github.com/leizongmin/js-xss), [sanitize-html](https://github.com/apostrophecms/sanitize-html) and [insane](https://github.com/bevacqua/insane) on the *output* HTML! 🚨\n\n```\nDOMPurify.sanitize(marked.parse(`<img src=\"x\" onerror=\"alert('not happening')\">`));\n```\n\n**⚠️ Input: special ZERO WIDTH unicode characters (for example `\\uFEFF`) might interfere with parsing. Some text editors add them at the start of the file (see: [#2139](https://github.com/markedjs/marked/issues/2139)).**\n\n```js\n// remove the most common zerowidth characters from the start of the file\nmarked.parse(\n  contents.replace(/^[\\u200B\\u200C\\u200D\\u200E\\u200F\\uFEFF]/,\"\")\n)\n```\n\n**CLI**\n\n``` bash\n# Example with stdin input\n$ marked -o hello.html\nhello world\n^D\n$ cat hello.html\n<p>hello world</p>\n```\n\n``` bash\n# Example with string input\n$ marked -s \"*hello world*\"\n<p><em>hello world</em></p>\n```\n\n```bash\n# Example with file input\n\necho \"**bold text example**\" > readme.md\n\n$ marked -i readme.md -o readme.html\n$ cat readme.html\n<p><strong>bold text example</strong></p>\n```\n\n```bash\n# Print all options\n$ marked --help\n```\n\n*CLI Config*\n\nA config file can be used to configure the marked cli.\n\nIf it is a `.json` file it should be a JSON object that will be passed to marked as options.\n\nIf `.js` is used it should have a default export of a marked options object or a function that takes `marked` as a parameter.\nIt can use the `marked` parameter to install extensions using `marked.use`.\n\nBy default the marked cli will look for a config file in your home directory in the following order.\n\n- `~/.marked.json`\n- `~/.marked.js`\n- `~/.marked/index.js`\n\n```bash\n# Example with custom config\n\necho '{ \"breaks\": true }' > config.json\n\n$ marked -s 'line1\\nline2' -c config.json\n<p>line1<br>line2</p>\n```\n\n**Browser**\n\n```html\n<!doctype html>\n<html>\n<head>\n  <meta charset=\"utf-8\"/>\n  <title>Marked in the browser</title>\n</head>\n<body>\n  <div id=\"content\"></div>\n  <script src=\"https://cdn.jsdelivr.net/npm/marked/lib/marked.umd.js\"></script>\n  <script>\n    document.getElementById('content').innerHTML =\n      marked.parse('# Marked in browser\\n\\nRendered by **marked**.');\n  </script>\n</body>\n</html>\n```\nor import esm module\n\n```html\n<script type=\"module\">\n  import { marked } from \"https://cdn.jsdelivr.net/npm/marked/lib/marked.esm.js\";\n  document.getElementById('content').innerHTML =\n    marked.parse('# Marked in the browser\\n\\nRendered by **marked**.');\n</script>\n```\n\n**Node.js**\n\n```js\nimport { marked } from 'marked';\n// or const { marked } = require('marked');\n\nconst html = marked.parse('# Marked in Node.js\\n\\nRendered by **marked**.');\n```\n\n\nMarked offers [advanced configurations](/using_advanced) and [extensibility](/using_pro) as well.\n\n<h2 id=\"specifications\">Supported Markdown specifications</h2>\n\nWe actively support the features of the following [Markdown flavors](https://github.com/commonmark/CommonMark/wiki/Markdown-Flavors).\n\n<!--{{test-results-table}}-->\n\nBy supporting the above Markdown flavors, it's possible that Marked can help you use other flavors as well; however, these are not actively supported by the community.\n\n<h2 id=\"tools\">List of Tools Using Marked</h2>\n\nWe actively support the usability of Marked in super-fast markdown transformation, some of Tools using `Marked` for single-page creations are\n\n| Tools                                                               |                  Description                                               |\n| :-----------------------------------------------------------------  | :------------------------------------------------------------------------  |\n| [zero-md](https://zerodevx.github.io/zero-md/)                      | A native markdown-to-html web component to load and display an external MD file.It uses Marked for super-fast markdown transformation. |\n| [texme](https://github.com/susam/texme)                             | TeXMe is a lightweight JavaScript utility to create self-rendering Markdown + LaTeX documents.             |\n| [StrapDown.js](https://naereen.github.io/StrapDown.js/)             | StrapDown.js is an awesome on-the-fly Markdown to HTML text processor.                |\n| [raito](https://raito.arnaud.at/)             | Mini Markdown Wiki/CMS in 8kb of JavaScript.                |\n| [Homebrewery](https://homebrewery.naturalcrit.com/)             | The Homebrewery is a tool for making authentic looking D&D content using Markdown. It is distributed under the terms of the MIT.             |\n| [marked_reader](https://github.com/CNOCTAVE/marked_reader)          | marked_reader is an open source Markdown reader packed by Electron. |\n\n<h2 id=\"security\">Security</h2>\n\nThe only completely secure system is the one that doesn't exist in the first place. Having said that, we take the security of Marked very seriously.\n\nTherefore, please disclose potential security issues by email to the project [committers](/authors) as well as the [listed owners within NPM](https://docs.npmjs.com/cli/owner). We will provide an initial assessment of security reports within 48 hours and should apply patches within 2 weeks (also, feel free to contribute a fix for the issue).\n"
  },
  {
    "path": "docs/PUBLISHING.md",
    "content": "# Releasing Marked\n\nMarked uses [semantic-release](https://github.com/semantic-release/semantic-release) to release new versions. All PRs should use the \"Squash and merge\" strategy and the commit message should follow the [conventional commit guidelines](https://www.conventionalcommits.org/).\n\n## Overall strategy\n\n**Master is always shippable:** We try to merge PRs in such a way that `master` is the only branch to really be concerned about *and* `master` can always be released. This allows smoother flow between new features, bug fixes, and so on.\n\n## Versioning\n\nWe follow [semantic versioning](https://semver.org) where the following sequence is true `[major].[minor].[patch]`:\n\n1. **Major:** There is at least one change to the public API or a break from the [CommonMark](https://spec.commonmark.org/current/) or [GFM](https://github.github.com/gfm/) spec. Only [current and LTS](https://nodejs.org/en/about/releases/) Node.js versions are supported at any point in time.  A drop in support for a Node.js version may not result in a semver major bump to Marked.\n2. **Minor:** There is at least one new feature added to the public API.\n3. **Patch:** Changes that move Marked closer to spec compliance or change a public API that does not break backwards compatibility.\n"
  },
  {
    "path": "docs/USING_ADVANCED.md",
    "content": "<h2 id=\"instance\">Marked instance</h2>\n\nBy default, Marked stores options and extensions in the global scope. That means changing the options in one script will also change the options in another script since they share the same instance.\n\nIf you don't want to mutate global scope, you can create a new instance of Marked to ensure options and extensions are locally scoped.\n\n```js\nimport { Marked } from 'marked';\nconst marked = new Marked([options, extension, ...]);\n```\n\n|Argument |Type    |Notes                                                                  |\n|:--------|:-------|:----------------------------------------------------------------------|\n| options |`object`|The same arguments that can be passed to [`marked.use`](/using_pro#use)|\n\nBe careful: marked.use(...) should not be used in a loop or function. It should only be used directly after new Marked is created or marked is imported.\n\n## The `parse` function\n\n```js\nimport { marked } from 'marked';\nmarked.parse(markdownString [,options])\n```\n\n|Argument                      |Type    |Notes                                                           |\n|:-----------------------------|:-------|:---------------------------------------------------------------|\n|markdownString                |`string`|String of markdown source to be compiled.                       |\n|<a href=\"#options\">options</a>|`object`|Hash of options. Can also use `marked.use` to set global options|\n\n### Alternative using reference\n\n```js\n// Create reference instance\nimport { marked } from 'marked';\n\n// Set options\nmarked.use({\n  async: true,\n  pedantic: false,\n  gfm: true,\n});\n\n// Compile\nconsole.log(marked.parse(markdownString));\n```\n\n<h2 id=\"options\">Options</h2>\n\n|Member      |Type      |Default  |Since    |Notes         |\n|:-----------|:---------|:--------|:--------|:-------------|\n|async       |`boolean` |`false`  |4.1.0    |If true, `walkTokens` functions can be async and `marked.parse` will return a promise that resolves when all walk tokens functions resolve.|\n|breaks      |`boolean` |`false`  |v0.2.7   |If true, add `<br>` on a single line break (copies GitHub behavior on comments, but not on rendered markdown files). Requires `gfm` be `true`.|\n|gfm         |`boolean` |`true`   |v0.2.1   |If true, use approved [GitHub Flavored Markdown (GFM) specification](https://github.github.com/gfm/).|\n|pedantic    |`boolean` |`false`  |v0.2.1   |If true, conform to the original `markdown.pl` as much as possible. Don't fix original markdown bugs or behavior. Turns off and overrides `gfm`.|\n|renderer    |`object`  |`new Renderer()`|v0.3.0|An object containing functions to render tokens to HTML. See [extensibility](/using_pro) for more details.|\n|silent      |`boolean` |`false`  |v0.2.7   |If true, the parser does not throw any exception or log any warning. Any error will be returned as a string.|\n|tokenizer    |`object`  |`new Tokenizer()`|v1.0.0|An object containing functions to create tokens from markdown. See [extensibility](/using_pro) for more details.|\n|walkTokens   |`function`  |`null`|v1.1.0|A function which is called for every token. See [extensibility](/using_pro) for more details.|\n\n## Old Options\n\n|Member      |Type      |Default  |Since    |Notes         |\n|:-----------|:---------|:--------|:--------|:-------------|\n|smartLists (**removed**)| `boolean` | `false` |v0.2.8 | Removed in v3.0.0. |\n|baseUrl (**removed**)|`string`  |`null`   |v0.3.9    |Removed in v8.0.0 use [`marked-base-url`](https://www.npmjs.com/package/marked-base-url) to prefix url for any relative link. |\n|headerIds (**removed**)|`boolean` |`true`   |v0.4.0   |Removed in v8.0.0 use [`marked-gfm-heading-id`](https://www.npmjs.com/package/marked-gfm-heading-id) to include an `id` attribute when emitting headings (h1, h2, h3, etc).|\n|headerPrefix (**removed**)|`string`  |`''`     |v0.3.0   |Removed in v8.0.0 use [`marked-gfm-heading-id`](https://www.npmjs.com/package/marked-gfm-heading-id) to add a string to prefix the `id` attribute when emitting headings (h1, h2, h3, etc).|\n|highlight (**removed**)|`function`|`null`   |v0.3.0   |Removed in v8.0.0 use [`marked-highlight`](https://www.npmjs.com/package/marked-highlight) to add highlighting to code blocks. |\n|langPrefix  (**removed**)|`string`  |`'language-'`|v0.3.0|Removed in v8.0.0 use [`marked-highlight`](https://www.npmjs.com/package/marked-highlight) to prefix the className in a `<code>` block. Useful for syntax highlighting.|\n|mangle (**removed**)|`boolean` |`true`   |v0.3.4   |Removed in v8.0.0 use [`marked-mangle`](https://www.npmjs.com/package/marked-mangle) to mangle email addresses.|\n|sanitize (**removed**)|`boolean` |`false`  |v0.2.1   |Removed in v8.0.0 use a sanitize library, like [DOMPurify](https://github.com/cure53/DOMPurify) (recommended), [sanitize-html](https://github.com/apostrophecms/sanitize-html) or [insane](https://github.com/bevacqua/insane) on the output HTML! |\n|sanitizer  (**removed**)|`function`|`null`   |v0.3.4   |Removed in v8.0.0 use a sanitize library, like [DOMPurify](https://github.com/cure53/DOMPurify) (recommended), [sanitize-html](https://github.com/apostrophecms/sanitize-html) or [insane](https://github.com/bevacqua/insane) on the output HTML!|\n|smartypants (**removed**)|`boolean` |`false`  |v0.2.9   |Removed in v8.0.0 use [`marked-smartypants`](https://www.npmjs.com/package/marked-smartypants) to use \"smart\" typographic punctuation for things like quotes and dashes.|\n|xhtml (**removed**)|`boolean` |`false`  |v0.3.2   |Removed in v8.0.0 use [`marked-xhtml`](https://www.npmjs.com/package/marked-xhtml) to emit self-closing HTML tags for void elements (&lt;br/&gt;, &lt;img/&gt;, etc.) with a \"/\" as required by XHTML.|\n\n<h2 id=\"extensions\">Known Extensions</h2>\n\nMarked can be extended using [custom extensions](/using_pro#extensions). This is a list of extensions that can be used with `marked.use(extension)`.\n\n<!-- Keep this list ordered alphabetically by name -->\n\n|Name|Package Name|Description|\n|:---|:-----------|:----------|\n|[ABCjs](https://www.npmjs.com/package/marked-abc)|[`abcjs`](https://www.npmjs.com/package/marked-abc)|[ABCjs](https://www.abcjs.net/) sheet music rendering|\n|[Admonition](https://www.npmjs.com/package/marked-admonition-extension)|[`marked-admonition-extension`](https://www.npmjs.com/package/marked-admonition-extension)| Admonition extension |\n|[Alert](https://github.com/bent10/marked-extensions/tree/main/packages/alert)|[`marked-alert`](https://www.npmjs.com/package/marked-alert)|Enables [GFM alerts](https://github.com/orgs/community/discussions/16925)|\n|[Base URL](https://github.com/markedjs/marked-base-url)|[`marked-base-url`](https://www.npmjs.com/package/marked-base-url)|Prefix relative urls with a base URL|\n|[Bidi](https://github.com/markedjs/marked-bidi)|[`marked-bidi`](https://www.npmjs.com/package/marked-bidi)|Add Bidirectional text support to the HTML|\n|[CJK Breaks](https://github.com/chirsz-ever/marked-cjk-breaks)|[`marked-cjk-breaks`](https://www.npmjs.com/package/marked-cjk-breaks)|Suppress soft linebreaks between east asian characters|\n|[Code Format](https://github.com/bent10/marked-extensions/tree/main/packages/code-format)|[`marked-code-format`](https://www.npmjs.com/package/marked-code-format)|Formatting code blocks using Prettier|\n|[Code JSX Renderer](https://github.com/bent10/marked-extensions/tree/main/packages/code-jsx-renderer)|[`marked-code-jsx-renderer`](https://www.npmjs.com/package/marked-code-jsx-renderer)|Render JSX code blocks using a custom renderer and components|\n|[Code Preview](https://github.com/bent10/marked-extensions/tree/main/packages/code-preview)|[`marked-code-preview`](https://www.npmjs.com/package/marked-code-preview)|Transform code blocks into code previews|\n|[Custom Heading ID](https://github.com/markedjs/marked-custom-heading-id)|[`marked-custom-heading-id`](https://www.npmjs.com/package/marked-custom-heading-id)|Specify a custom heading id in headings with the [Markdown Extended Syntax](https://www.markdownguide.org/extended-syntax/#heading-ids) `# heading {#custom-id}`|\n|[Directive](https://github.com/bent10/marked-extensions/tree/main/packages/directive)|[`marked-directive`](https://www.npmjs.com/package/marked-directive)|Supports [directives syntax](https://talk.commonmark.org/t/generic-directives-plugins-syntax/444)|\n|[Emoji](https://github.com/UziTech/marked-emoji)|[`marked-emoji`](https://www.npmjs.com/package/marked-emoji)|Add emoji support like on GitHub|\n|[Extended Tables](https://github.com/calculuschild/marked-extended-tables)|[`marked-extended-tables`](https://www.npmjs.com/package/marked-extended-tables)|Extends the standard Github-Flavored tables to support advanced features: Column Spanning, Row Spanning, Multi-row headers|\n|[Footnote](https://github.com/bent10/marked-extensions/tree/main/packages/footnote)|[`marked-footnote`](https://www.npmjs.com/package/marked-footnote)|Enables [GFM footnotes](https://docs.github.com/en/get-started/writing-on-github/getting-started-with-writing-and-formatting-on-github/basic-writing-and-formatting-syntax#footnotes)|\n|[GFM Heading ID](https://github.com/markedjs/marked-gfm-heading-id)|[`marked-gfm-heading-id`](https://www.npmjs.com/package/marked-gfm-heading-id)|Use [`github-slugger`](https://github.com/Flet/github-slugger) to create the heading IDs and allow a custom prefix|\n|[Highlight](https://github.com/markedjs/marked-highlight)|[`marked-highlight`](https://www.npmjs.com/package/marked-highlight)|Highlight code blocks|\n|[HTML Renderer](https://github.com/UziTech/marked-html-renderer)|[`marked-html-renderer`](https://www.npmjs.com/package/marked-html-renderer)|Output HTML Elements instead of a string|\n|[Jira Renderer](https://github.com/mrmarble/marked-jira)|[`marked-jira`](https://www.npmjs.com/package/marked-jira)|Output Jira compatible format|\n|[Katex Code](https://github.com/UziTech/marked-katex-extension)|[`marked-katex-extension`](https://www.npmjs.com/package/marked-katex-extension)|Render [katex](https://katex.org/) code|\n|[LinkifyIt](https://github.com/UziTech/marked-linkify-it)|[`marked-linkify-it`](https://www.npmjs.com/package/marked-linkify-it)|Use [linkify-it](https://github.com/markdown-it/linkify-it) for urls|\n|[Mangle](https://github.com/markedjs/marked-mangle)|[`marked-mangle`](https://www.npmjs.com/package/marked-mangle)|Mangle mailto links with HTML character references|\n|[Marked Responsive Images](https://github.com/ELowry/MarkedResponsiveImages)|[`marked-responsive-images`](https://www.npmjs.com/package/marked-responsive-images)|Generate responsive (`srcset`) images based on structured filenames|\n|[Misskey-flavored Markdown](https://akkoma.dev/sfr/marked-mfm)|[`marked-mfm`](https://www.npmjs.com/package/marked-mfm)|Custom extension for [Misskey-flavored Markdown](https://github.com/misskey-dev/mfm.js/blob/develop/docs/syntax.md)|\n|[More Lists](https://github.com/jasny/marked-more-lists)|[`marked-more-lists`](https://www.npmjs.com/package/marked-more-lists)|Support for alphabetical and roman numeral ordered lists|\n|[Plaintify](https://github.com/bent10/marked-extensions/tree/main/packages/plaintify)|[`marked-plaintify`](https://www.npmjs.com/package/marked-plaintify)|Converts Markdown to Plaintext|\n|[Shiki](https://github.com/bent10/marked-extensions/tree/main/packages/shiki)|[`marked-shiki`](https://www.npmjs.com/package/marked-shiki)|Integrating [Shiki](https://shiki.style/) syntax highlighting|\n|[Sequential Hooks](https://github.com/bent10/marked-extensions/tree/main/packages/sequential-hooks)|[`marked-sequential-hooks`](https://www.npmjs.com/package/marked-sequential-hooks)|Enables the sequential preprocessing and post-processing within [sequential hooks](https://github.com/bent10/marked-extensions#sequential-hooks)|\n|[Smartypants](https://github.com/markedjs/marked-smartypants)|[`marked-smartypants`](https://www.npmjs.com/package/marked-smartypants)|Use [smartypants](https://www.npmjs.com/package/smartypants) to use \"smart\" typographic punctuation for things like quotes and dashes|\n|[Smartypants lite](https://github.com/calculuschild/marked-smartypants-lite)|[`marked-smartypants-lite`](https://www.npmjs.com/package/marked-smartypants-lite)|A faster lighter version of marked-smartypants that doesn't use any external dependencies to create \"smart\" typographic punctuation for things like quotes and dashes|\n|[Token Position](https://github.com/UziTech/marked-token-position)|[`marked-token-position`](https://www.npmjs.com/package/marked-token-position)|Adds a `position` field to each token with `start` and `end` properties containing `line`, `column`, and `offset`|\n|[Typograf](https://github.com/laidrivm/marked-typograf)|[`marked-typograf`](https://www.npmjs.com/package/marked-typograf)|Use [typograf](https://www.npmjs.com/package/typograf) as a more powerful and extendable alternative to Smartypants for creating “smart” typographic punctuation, such as quotes and dashes|\n|[XHTML](https://github.com/markedjs/marked-xhtml)|[`marked-xhtml`](https://www.npmjs.com/package/marked-xhtml)|Emit self-closing HTML tags for void elements (&lt;br/&gt;, &lt;img/&gt;, etc.) with a \"/\" as required by XHTML|\n\n<h2 id=\"user-examples\">User Examples</h2>\n\n<details>\n\n<summary>Marked can render on-page content as markdown in the browser.</summary>\n\n```html\n<!DOCTYPE html>\n<html>\n <head>\n   <!-- Suggested stylesheet -->\n   <link rel=\"stylesheet\" \n    href=\"https://cdnjs.cloudflare.com/ajax/libs/github-markdown-css/5.8.1/github-markdown.min.css\"\n    crossorigin=\"anonymous\" referrerpolicy=\"no-referrer\" />\n\n   <title>Marked for the full page</title>\n </head>\n\n <body> \n  <textarea id=\"markdown-source\" style=\"display: none;\">\n# Title\n\nLots of text using **markdown syntax.**\n  </textarea>\n  <div id=\"content\" class=\"markdown-body\"></div>\n  \n  <script src=\"https://cdn.jsdelivr.net/npm/marked/lib/marked.umd.js\"></script>\n  <script>\n    const source = document.getElementById('markdown-source').value;\n    \n    // Parse the markdown and render it into the content div.\n    document.getElementById('content').innerHTML = marked.parse(source);\n  </script>\n </body>\n</html>\n```\n</details>\n\n<h2 id=\"inline\">Inline Markdown</h2>\n\nYou can parse inline markdown by running markdown through `marked.parseInline`.\n\n```js\nconst blockHtml = marked.parse('**strong** _em_');\nconsole.log(blockHtml); // '<p><strong>strong</strong> <em>em</em></p>'\n\nconst inlineHtml = marked.parseInline('**strong** _em_');\nconsole.log(inlineHtml); // '<strong>strong</strong> <em>em</em>'\n```\n\n<h2 id=\"highlight\">Highlighting</h2>\n\nUse [`marked-highlight`](https://www.npmjs.com/package/marked-highlight) to highlight code blocks.\n\n<h2 id=\"workers\">Workers</h2>\n\nTo prevent ReDoS attacks you can run marked on a worker and terminate it when parsing takes longer than usual.\n\nMarked can be run in a [worker thread](https://nodejs.org/api/worker_threads.html) on a node server, or a [web worker](https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API) in a browser.\n\n### Node Worker Thread\n\n```js\n// markedWorker.js\n\nimport { marked } from 'marked';\nimport { parentPort } from 'worker_threads';\n\nparentPort.on('message', (markdownString) => {\n  parentPort.postMessage(marked.parse(markdownString));\n});\n```\n\n```js\n// index.js\n\nimport { Worker } from 'worker_threads';\nconst markedWorker = new Worker('./markedWorker.js');\n\nconst markedTimeout = setTimeout(() => {\n  markedWorker.terminate();\n  throw new Error('Marked took too long!');\n}, timeoutLimit);\n\nmarkedWorker.on('message', (html) => {\n  clearTimeout(markedTimeout);\n  console.log(html);\n  markedWorker.terminate();\n});\n\nmarkedWorker.postMessage(markdownString);\n```\n\n### Web Worker\n\n> **NOTE**: Web Workers send the payload from `postMessage` in an object with the payload in a `.data` property\n\n```js\n// markedWorker.js\n\nimportScripts('path/to/marked.umd.js');\n\nonmessage = (e) => {\n  const markdownString = e.data\n  postMessage(marked.parse(markdownString));\n};\n```\n\n```js\n// script.js\n\nconst markedWorker = new Worker('./markedWorker.js');\n\nconst markedTimeout = setTimeout(() => {\n  markedWorker.terminate();\n  throw new Error('Marked took too long!');\n}, timeoutLimit);\n\nmarkedWorker.onmessage = (e) => {\n  clearTimeout(markedTimeout);\n  const html = e.data;\n  console.log(html);\n  markedWorker.terminate();\n};\n\nmarkedWorker.postMessage(markdownString);\n```\n\n<h2 id=\"cli-extensions\">CLI Extensions</h2>\n\nYou can use extensions in the CLI by creating a new CLI that imports marked and the marked binary.\n\n```js\n// file: myMarked\n#!/usr/bin/node\n\nimport { marked } from 'marked';\nimport customHeadingId from 'marked-custom-heading-id';\n\nmarked.use(customHeadingId());\n\nimport 'marked/bin/marked';\n```\n\n```sh\n$ ./myMarked -s \"# heading {#custom-id}\"\n<h1 id=\"custom-id\">heading</h1>\n```\n"
  },
  {
    "path": "docs/USING_PRO.md",
    "content": "## Extending Marked\n\nTo champion the single-responsibility and open/closed principles, we have tried to make it relatively painless to extend Marked. If you are looking to add custom functionality, this is the place to start.\n\n<h2 id=\"terminology\">Terminology Note</h2>\n\nBefore diving in, it's important to understand the terminology used in this documentation:\n\n| Term | TypeScript Type | Description |\n|------|----------------|-------------|\n| **Marked Extension** | `MarkedExtension` | The configuration object passed to `marked.use()`. Can contain options, hooks, renderer overrides, tokenizer overrides, and custom extensions. |\n| **Custom Extension** | `TokenizerAndRendererExtension` | Objects within the `extensions` array that define custom tokenizers and renderers for new syntax. |\n\nIn other words, a **Marked Extension** is the top-level plugin configuration, while **Custom Extensions** are the individual tokenizer/renderer definitions for custom syntax within that configuration.\n\n```js\n// Marked Extension (MarkedExtension)\nmarked.use({\n  gfm: true,\n  breaks: false,\n  renderer: { /* renderer overrides */ },\n  tokenizer: { /* tokenizer overrides */ },\n  // Custom Extensions (TokenizerAndRendererExtension[])\n  extensions: [\n    { name: 'myCustomSyntax', level: 'block', tokenizer: fn, renderer: fn }\n  ]\n});\n```\n\n<h2 id=\"use\">marked.use()</h2>\n\n`marked.use(extension)` is the recommended way to extend Marked. The `extension` object can contain any [option](/using_advanced#options) available in Marked:\n\n\n```js\nimport { marked } from 'marked';\n\nmarked.use({\n  pedantic: false,\n  gfm: true,\n  breaks: false\n});\n```\n\nYou can also supply multiple `extension` objects at once.\n\n```js\nmarked.use(myExtension, extension2, extension3);\n\n\\\\ EQUIVALENT TO:\n\nmarked.use(myExtension);\nmarked.use(extension2);\nmarked.use(extension3);\n```\n\nAll options will overwrite those previously set, except for the following options which will be merged with the existing framework and can be used to change or extend the functionality of Marked: `renderer`, `tokenizer`, `hooks`, `walkTokens`, and `extensions`.\n\n* The `renderer`, `tokenizer`, and `hooks` options are objects with functions that will be merged into the built-in `renderer` and `tokenizer` respectively.\n\n* The `walkTokens` option is a function that will be called to post-process every token before rendering.\n\n* The `extensions` option is an array of objects that can contain additional custom `renderer` and `tokenizer` steps that will execute before any of the default parsing logic occurs.\n\nImportantly, ensure that the extensions are only added to `marked` once (ie in the global scope of a regular JavaScript or TypeScript module). If they are added in a function that is called repeatedly, or in the JS for an HTML component in a library such as Svelte, your extensions will be added repeatedly, eventually causing a recursion error. If you cannot prevent the code from being run repeatedly, you should create a [Marked instance](/using_advanced#instance) so that your extensions are stored independently from the global instance Marked provides.\n\n***\n\n<h2>The Marked Pipeline</h2>\n\nBefore building your custom extensions, it is important to understand the components that Marked uses to translate from Markdown to HTML:\n\n1) The user supplies Marked with an input string to be translated.\n2) The `lexer` feeds segments of the input text string into each `tokenizer`, and from their output, generates a series of tokens in a nested tree structure.\n3) Each `tokenizer` receives a segment of Markdown text and, if it matches a particular pattern, generates a token object containing any relevant information.\n4) The `walkTokens` function will traverse every token in the tree and perform any final adjustments to the token contents.\n4) The `parser` traverses the token tree and feeds each token into the appropriate `renderer`, and concatenates their outputs into the final HTML result.\n5) Each `renderer` receives a token and manipulates its contents to generate a segment of HTML.\n\nMarked provides methods for directly overriding the `renderer` and `tokenizer` for any existing token type, as well as inserting additional custom `renderer` and `tokenizer` functions to handle entirely custom syntax. For example, using `marked.use({renderer})` would modify a renderer, whereas `marked.use({extensions: [{renderer}]})` would add a new renderer. See the [custom extensions example](#custom-extensions-example) for insight on how to execute this.\n\n***\n\n<h2 id=\"renderer\">The Renderer : <code>renderer</code></h2>\n\nThe renderer defines the HTML output of a given token. If you supply a `renderer` in the options object passed to `marked.use()`, any functions in the object will override the default handling of that token type.\n\nCalling `marked.use()` to override the same function multiple times will give priority to the version that was assigned *last*. Overriding functions can return `false` to fall back to the previous override in the sequence, or resume default behavior if all overrides return `false`. Returning any other value (including nothing) will prevent fallback behavior.\n\n**Example:** Overriding output of the default `heading` token by adding an embedded anchor tag like on GitHub.\n\n```js\n// Create reference instance\nimport { marked } from 'marked';\n\n// Override function\nconst renderer = {\n  heading({ tokens, depth }) {\n    const text = this.parser.parseInline(tokens);\n    const escapedText = text.toLowerCase().replace(/[^\\w]+/g, '-');\n\n    return `\n            <h${depth}>\n              <a name=\"${escapedText}\" class=\"anchor\" href=\"#${escapedText}\">\n                <span class=\"header-link\"></span>\n              </a>\n              ${text}\n            </h${depth}>`;\n  }\n};\n\nmarked.use({ renderer });\n\n// Run marked\nconsole.log(marked.parse('# heading+'));\n```\n\n**Output:**\n\n```html\n<h1>\n  <a name=\"heading-\" class=\"anchor\" href=\"#heading-\">\n    <span class=\"header-link\"></span>\n  </a>\n  heading+\n</h1>\n```\n**Note:** Calling `marked.use()` in the following way will avoid overriding the `heading` token output but create a new `heading` renderer in the process.\n\n```js\nmarked.use({\n extensions: [{\n    name: 'heading',\n    renderer(token) {\n      return /* ... */\n    }\n  }]\n})\n```\n\n### Block-level renderer methods\n\n- <code>**space**(token: *Tokens.Space*): *string*</code>\n- <code>**code**(token: *Tokens.Code*): *string*</code>\n- <code>**blockquote**(token: *Tokens.Blockquote*): *string*</code>\n- <code>**html**(token: *Tokens.HTML | Tokens.Tag*): *string*</code>\n- <code>**heading**(token: *Tokens.Heading*): *string*</code>\n- <code>**hr**(token: *Tokens.Hr*): *string*</code>\n- <code>**list**(token: *Tokens.List*): *string*</code>\n- <code>**listitem**(token: *Tokens.ListItem*): *string*</code>\n- <code>**checkbox**(token: *Tokens.Checkbox*): *string*</code>\n- <code>**paragraph**(token: *Tokens.Paragraph*): *string*</code>\n- <code>**table**(token: *Tokens.Table*): *string*</code>\n- <code>**tablerow**(token: *Tokens.TableRow*): *string*</code>\n- <code>**tablecell**(token: *Tokens.TableCell*): *string*</code>\n\n### Inline-level renderer methods\n\n- <code>**strong**(token: *Tokens.Strong*): *string*</code>\n- <code>**em**(token: *Tokens.Em*): *string*</code>\n- <code>**codespan**(token: *Tokens.Codespan*): *string*</code>\n- <code>**br**(token: *Tokens.Br*): *string*</code>\n- <code>**del**(token: *Tokens.Del*): *string*</code>\n- <code>**link**(token: *Tokens.Link*): *string*</code>\n- <code>**image**(token: *Tokens.Image*): *string*</code>\n- <code>**text**(token: *Tokens.Text | Tokens.Escape | Tokens.Tag*): *string*</code>\n\nThe Tokens.* properties can be found [here](https://github.com/markedjs/marked/blob/master/src/Tokens.ts).\n\n***\n\n<h2 id=\"tokenizer\">The Tokenizer : <code>tokenizer</code></h2>\n\nThe tokenizer defines how to turn markdown text into tokens. If you supply a `tokenizer` object to the Marked options, it will be merged with the built-in tokenizer and any functions inside will override the default handling of that token type.\n\nCalling `marked.use()` to override the same function multiple times will give priority to the version that was assigned *last*. Overriding functions can return `false` to fall back to the previous override in the sequence, or resume default behavior if all overrides return `false`. Returning any other value (including nothing) will prevent fallback behavior.\n\n**Example:** Overriding default `codespan` tokenizer to include LaTeX.\n\n```js\n// Create reference instance\nimport { marked } from 'marked';\n\n// Override function\nconst tokenizer = {\n  codespan(src) {\n    const match = src.match(/^\\$+([^\\$\\n]+?)\\$+/);\n    if (match) {\n      return {\n        type: 'codespan',\n        raw: match[0],\n        text: match[1].trim()\n      };\n    }\n\n    // return false to use original codespan tokenizer\n    return false;\n  }\n};\n\nmarked.use({ tokenizer });\n\n// Run marked\nconsole.log(marked.parse('$ latex code $\\n\\n` other code `'));\n```\n\n**Output:**\n\n```html\n<p><code>latex code</code></p>\n<p><code>other code</code></p>\n```\n**NOTE**: This does not fully support latex, see issue [#1948](https://github.com/markedjs/marked/issues/1948).\n\n### Block level tokenizer methods\n\n- <code>**space**(src: *string*): *Tokens.Space*</code>\n- <code>**code**(src: *string*): *Tokens.Code*</code>\n- <code>**fences**(src: *string*): *Tokens.Code*</code>\n- <code>**heading**(src: *string*): *Tokens.Heading*</code>\n- <code>**hr**(src: *string*): *Tokens.Hr*</code>\n- <code>**blockquote**(src: *string*): *Tokens.Blockquote*</code>\n- <code>**list**(src: *string*): *Tokens.List*</code>\n- <code>**html**(src: *string*): *Tokens.HTML*</code>\n- <code>**def**(src: *string*): *Tokens.Def*</code>\n- <code>**table**(src: *string*): *Tokens.Table*</code>\n- <code>**lheading**(src: *string*): *Tokens.Heading*</code>\n- <code>**paragraph**(src: *string*): *Tokens.Paragraph*</code>\n- <code>**text**(src: *string*): *Tokens.Text*</code>\n\n### Inline level tokenizer methods\n\n- <code>**escape**(src: *string*): *Tokens.Escape*</code>\n- <code>**tag**(src: *string*): *Tokens.Tag*</code>\n- <code>**link**(src: *string*): *Tokens.Link | Tokens.Image*</code>\n- <code>**reflink**(src: *string*, links: *object*): *Tokens.Link | Tokens.Image | Tokens.Text*</code>\n- <code>**emStrong**(src: *string*, maskedSrc: *string*, prevChar: *string*): *Tokens.Em | Tokens.Strong*</code>\n- <code>**codespan**(src: *string*): *Tokens.Codespan*</code>\n- <code>**br**(src: *string*): *Tokens.Br*</code>\n- <code>**del**(src: *string*): *Tokens.Del*</code>\n- <code>**autolink**(src: *string*): *Tokens.Link*</code>\n- <code>**url**(src: *string*): *Tokens.Link*</code>\n- <code>**inlineText**(src: *string*): *Tokens.Text*</code>\n\nThe Tokens.* properties can be found [here](https://github.com/markedjs/marked/blob/master/src/Tokens.ts).\n\n***\n\n<h2 id=\"walk-tokens\">Walk Tokens : <code>walkTokens</code></h2>\n\nThe walkTokens function gets called with every token. Child tokens are called before moving on to sibling tokens. Each token is passed by reference so updates are persisted when passed to the parser. When [`async`](#async) mode is enabled, the return value is awaited. Otherwise the return value is ignored.\n\n`marked.use()` can be called multiple times with different `walkTokens` functions. Each function will be called in order, starting with the function that was assigned *last*.\n\n**Example:** Overriding heading tokens to start at h2.\n\n```js\nimport { marked } from 'marked';\n\n// Override function\nconst walkTokens = (token) => {\n  if (token.type === 'heading') {\n    token.depth += 1;\n  }\n};\n\nmarked.use({ walkTokens });\n\n// Run marked\nconsole.log(marked.parse('# heading 2\\n\\n## heading 3'));\n```\n\n**Output:**\n\n```html\n<h2 id=\"heading-2\">heading 2</h2>\n<h3 id=\"heading-3\">heading 3</h3>\n```\n\n***\n\n<h2 id=\"hooks\">Hooks : <code>hooks</code></h2>\n\nHooks are methods that hook into some part of marked. The following hooks are available:\n\n| signature | description |\n|-----------|-------------|\n| `preprocess(markdown: string): string` | Process markdown before sending it to marked. |\n| `postprocess(html: string): string` | Process html after marked has finished parsing. |\n| `processAllTokens(tokens: Token[]): Token[]` | Process all tokens before walk tokens. |\n| `emStrongMask(src: string): string` | Mask part of the content that should not be interpreted as Markdown em/strong delimiters. |\n| `provideLexer(): (src: string, options?: MarkedOptions) => Token[]` | Provide function to tokenize markdown. |\n| `provideParser(): (tokens: Token[], options?: MarkedOptions) => string` | Provide function to parse tokens. |\n\n`marked.use()` can be called multiple times with different `hooks` functions. Each function will be called in order, starting with the function that was assigned *last*.\n\n**Example:** Set options based on [front-matter](https://www.npmjs.com/package/front-matter)\n\n```js\nimport { marked } from 'marked';\nimport fm from 'front-matter';\n\n// Override function\nfunction preprocess(markdown) {\n  const { attributes, body } = fm(markdown);\n  for (const prop in attributes) {\n    if (prop in this.options) {\n    this.options[prop] = attributes[prop];\n    }\n  }\n  return body;\n}\n\nmarked.use({ hooks: { preprocess } });\n\n// Run marked\nconsole.log(marked.parse(`\n---\nbreaks: true\n---\n\nline1\nline2\n`.trim()));\n```\n\n**Output:**\n\n```html\n<p>line1<br>line2</p>\n```\n\n**Example:** Sanitize HTML with [isomorphic-dompurify](https://www.npmjs.com/package/isomorphic-dompurify)\n\n```js\nimport { marked } from 'marked';\nimport DOMPurify from 'isomorphic-dompurify';\n\n// Override function\nfunction postprocess(html) {\n  return DOMPurify.sanitize(html);\n}\n\nmarked.use({ hooks: { postprocess } });\n\n// Run marked\nconsole.log(marked.parse(`\n<img src=x onerror=alert(1)//>\n`));\n```\n\n**Output:**\n\n```html\n<img src=\"x\">\n```\n\n**Example:** Save reflinks for chunked rendering\n\n```js\nimport { marked, Lexer } from 'marked';\n\nlet refLinks = {};\n\n// Override function\nfunction processAllTokens(tokens) {\n  refLinks = tokens.links;\n  return tokens;\n}\n\nfunction provideLexer(src, options) {\n  return (src, options) => {\n    const lexer = new Lexer(options);\n    lexer.tokens.links = refLinks;\n    return this.block ? lexer.lex(src) : lexer.inlineTokens(src);\n  };\n}\n\nmarked.use({ hooks: { processAllTokens, provideLexer } });\n\n// Parse reflinks separately from markdown that uses them\nmarked.parse(`\n[test]: http://example.com\n`);\n\nconsole.log(marked.parse(`\n[test link][test]\n`));\n```\n\n**Output:**\n\n```html\n<p><a href=\"http://example.com\">test link</a></p>\n```\n\n**Example:** Mask underline characters inside Mathjax content delimited by `$`\n\n```js\nimport { marked } from 'marked';\n\n// Override function\nfunction emStrongMask(src) {\n  return src.replace(/\\$([^$]+)\\$/g, (match) => `[${'a'.repeat(match.length - 2)}]`);\n}\n\nmarked.use({ hooks: { emStrongMask } });\n\nconsole.log(marked.parse(`_The formula is $a_ b=c_ d$._`));\n```\n\n**Output:**\n\n```html\n<p><em>The formula is $a_ b=c_ d$.</em></p>\n```\n\n***\n\n<h2 id=\"extensions\">Custom Extensions : <code>extensions</code></h2>\n\nYou may supply an `extensions` array to the `options` object. This array can contain any number of `extension` objects, using the following properties:\n\n<dl>\n<dt><code><strong>name</strong></code></dt>\n<dd>A string used to identify the token that will be handled by this extension.\n\nIf the name matches an existing extension name, or an existing method in the tokenizer/renderer methods listed above, they will override the previously assigned behavior, with priority on the extension that was assigned **last**. An extension can return `false` to fall back to the previous behavior.</dd>\n\n<dt><code><strong>level</strong></code></dt>\n<dd>A string to determine when to run the extension tokenizer. Must be equal to 'block' or 'inline'.\n\nA **block-level** extension will be handled before any of the block-level tokenizer methods listed above, and generally consists of 'container-type' text (paragraphs, tables, blockquotes, etc.).\n\nAn **inline-level** extension will be handled inside each block-level token, before any of the inline-level tokenizer methods listed above. These generally consist of 'style-type' text (italics, bold, etc.).</dd>\n\n<dt><code><strong>start</strong>(<i>string</i> src)</code></dt>\n<dd>A function that returns the index of the next potential start of the custom token.\n\nThe index can be the result of a <code>src.match().index</code>, or even a simple <code>src.indexOf()</code>. Marked will use this function to ensure that it does not skip over any text that should be part of the custom token.</dd>\n\n<dt><code><strong>tokenizer</strong>(<i>string</i> src, <i>array</i> tokens)</code></dt>\n<dd>A function that reads string of Markdown text and returns a generated token. The token pattern should be found at the beginning of the <code>src</code> string. Accordingly, if using a Regular Expression to detect a token, it should be anchored to the string start (`^`). The <code>tokens</code> parameter contains the array of tokens that have been generated by the lexer up to that point, and can be used to access the previous token, for instance.\n\nThe return value should be an object with the following parameters:\n\n<dl>\n<dt><code><strong>type</strong></code></dt>\n<dd>A string that matches the <code>name</code> parameter of the extension.</dd>\n\n<dt><code><strong>raw</strong></code></dt>\n<dd>A string containing all of the text that this token consumes from the source.</dd>\n\n<dt><code><strong>tokens</strong> [optional]</code></dt>\n<dd>An array of child tokens that will be traversed by the <code>walkTokens</code> function by default.</dd>\n</dl>\n\nThe returned token can also contain any other custom parameters of your choice that your custom `renderer` might need to access.\n\nThe tokenizer function has access to the lexer in the `this` object, which can be used if any internal section of the string needs to be parsed further, such as in handling any inline syntax on the text within a block token. The key functions that may be useful include:\n\n<dl>\n<dt><code><strong>this.lexer.blockTokens</strong>(<i>string</i> text, <i>array</i> tokens)</code></dt>\n<dd>This runs the block tokenizer functions (including any block-level extensions) on the provided text, and appends any resulting tokens onto the <code>tokens</code> array. The <code>tokens</code> array is also returned by the function. You might use this, for example, if your extension creates a \"container\"-type token (such as a blockquote) that can potentially include other block-level tokens inside.</dd>\n\n<dt><code><strong>this.lexer.inline</strong>(<i>string</i> text, <i>array</i> tokens)</code></dt>\n<dd>Parsing of inline-level tokens only occurs after all block-level tokens have been generated. This function adds <code>text</code> and <code>tokens</code> to a queue to be processed using inline-level tokenizers (including any inline-level extensions) at that later step. Tokens will be generated using the provided <code>text</code>, and any resulting tokens will be appended to the <code>tokens</code> array. Note that this function does **NOT** return anything since the inline processing cannot happen until the block-level processing is complete.</dd>\n\n<dt><code><strong>this.lexer.inlineTokens</strong>(<i>string</i> text, <i>array</i> tokens)</code></dt>\n<dd>Sometimes an inline-level token contains further nested inline tokens (such as a <pre><code>**strong**</code></pre> token inside of a <pre><code>### Heading</code></pre>). This runs the inline tokenizer functions (including any inline-level extensions) on the provided text, and appends any resulting tokens onto the <code>tokens</code> array. The <code>tokens</code> array is also returned by the function.</dd>\n</dl>\n</dd>\n\n<dt><code><strong>renderer</strong>(<i>object</i> token)</code></dt>\n<dd>A function that reads a token and returns the generated HTML output string.\n\nThe renderer function has access to the parser in the `this` object, which can be used if any part of the token needs needs to be parsed further, such as any child tokens. The key functions that may be useful include:\n\n<dl>\n<dt><code><strong>this.parser.parse</strong>(<i>array</i> tokens)</code></dt>\n<dd>Runs the block renderer functions (including any extensions) on the provided array of tokens, and returns the resulting HTML string output. This is used to generate the HTML from any child block-level tokens, for example if your extension is a \"container\"-type token (such as a blockquote) that can potentially include other block-level tokens inside.</dd>\n\n<dt><code><strong>this.parser.parseInline</strong>(<i>array</i> tokens)</code></dt>\n<dd>Runs the inline renderer functions (including any extensions) on the provided array of tokens, and returns the resulting HTML string output. This is used to generate the HTML from any child inline-level tokens.</dd>\n</dl>\n</dd>\n\n<dt><code><strong>childTokens</strong> [optional]</code></dt>\n<dd>An array of strings that match the names of any token parameters that should be traversed by the <code>walkTokens</code> functions. For instance, if you want to use a second custom parameter to contain child tokens in addition to <code>tokens</code>, it could be listed here. If <code>childTokens</code> is provided, the <code>tokens</code> array will not be walked by default unless it is also included in the <code>childTokens</code> array.</dd>\n</dl>\n\n> Note: If you would like to release an extension as an npm package you may use the [Marked Extension Template](https://github.com/markedjs/marked-extension-template) which includes all of the things you need to get started. Feel free to create an issue in that [repo](https://github.com/markedjs/marked-extension-template) if you need help.\n\n**Example:** <a name=\"custom-extensions-example\"></a>Add a custom syntax to generate `<dl>` description lists.\n\n``` js\nconst descriptionList = {\n  name: 'descriptionList',\n  level: 'block',                                     // Is this a block-level or inline-level tokenizer?\n  start(src) { return src.match(/:[^:\\n]/)?.index; }, // Hint to Marked.js to stop and check for a match\n  tokenizer(src, tokens) {\n    const rule = /^(?::[^:\\n]+:[^:\\n]*(?:\\n|$))+/;    // Regex for the complete token, anchor to string start\n    const match = rule.exec(src);\n    if (match) {\n      const token = {                                 // Token to generate\n        type: 'descriptionList',                      // Should match \"name\" above\n        raw: match[0],                                // Text to consume from the source\n        text: match[0].trim(),                        // Additional custom properties\n        tokens: []                                    // Array where child inline tokens will be generated\n      };\n      this.lexer.inline(token.text, token.tokens);    // Queue this data to be processed for inline tokens\n      return token;\n    }\n  },\n  renderer(token) {\n    return `<dl>${this.parser.parseInline(token.tokens)}\\n</dl>`; // parseInline to turn child tokens into HTML\n  }\n};\n\nconst description = {\n  name: 'description',\n  level: 'inline',                                 // Is this a block-level or inline-level tokenizer?\n  start(src) { return src.match(/:/)?.index; },    // Hint to Marked.js to stop and check for a match\n  tokenizer(src, tokens) {\n    const rule = /^:([^:\\n]+):([^:\\n]*)(?:\\n|$)/;  // Regex for the complete token, anchor to string start\n    const match = rule.exec(src);\n    if (match) {\n      return {                                         // Token to generate\n        type: 'description',                           // Should match \"name\" above\n        raw: match[0],                                 // Text to consume from the source\n        dt: this.lexer.inlineTokens(match[1].trim()),  // Additional custom properties, including\n        dd: this.lexer.inlineTokens(match[2].trim())   //   any further-nested inline tokens\n      };\n    }\n  },\n  renderer(token) {\n    return `\\n<dt>${this.parser.parseInline(token.dt)}</dt><dd>${this.parser.parseInline(token.dd)}</dd>`;\n  },\n  childTokens: ['dt', 'dd'],                 // Any child tokens to be visited by walkTokens\n};\n\nfunction walkTokens(token) {                        // Post-processing on the completed token tree\n  if (token.type === 'strong') {\n    token.text += ' walked';\n    token.tokens = this.Lexer.lexInline(token.text)\n  }\n}\nmarked.use({ extensions: [descriptionList, description], walkTokens });\n\n// EQUIVALENT TO:\n\nmarked.use({ extensions: [descriptionList] });\nmarked.use({ extensions: [description]     });\nmarked.use({ walkTokens })\n\nconsole.log(marked.parse('A Description List:\\n'\n                 + ':   Topic 1   :  Description 1\\n'\n                 + ': **Topic 2** : *Description 2*'));\n```\n\n**Output**\n\n``` bash\n<p>A Description List:</p>\n<dl>\n<dt>Topic 1</dt><dd>Description 1</dd>\n<dt><strong>Topic 2 walked</strong></dt><dd><em>Description 2</em></dd>\n</dl>\n```\n\n***\n\n<h2 id=\"async\">Async Marked : <code>async</code></h2>\n\nMarked will return a promise if the `async` option is true. The `async` option will tell marked to await any `walkTokens` functions before parsing the tokens and returning an HTML string.\n\nSimple Example:\n\n```js\nconst walkTokens = async (token) => {\n  if (token.type === 'link') {\n    try {\n      await fetch(token.href);\n    } catch (ex) {\n      token.title = 'invalid';\n    }\n  }\n};\n\nmarked.use({ walkTokens, async: true });\n\nconst markdown = `\n[valid link](https://example.com)\n\n[invalid link](https://invalidurl.com)\n`;\n\nconst html = await marked.parse(markdown);\n```\n\nCustom Extension Example:\n\n```js\nconst importUrl = {\n  extensions: [{\n    name: 'importUrl',\n    level: 'block',\n    start(src) { return src.indexOf('\\n:'); },\n    tokenizer(src) {\n      const rule = /^:(https?:\\/\\/.+?):/;\n      const match = rule.exec(src);\n      if (match) {\n        return {\n          type: 'importUrl',\n          raw: match[0],\n          url: match[1],\n          html: '' // will be replaced in walkTokens\n        };\n      }\n    },\n    renderer(token) {\n      return token.html;\n    }\n  }],\n  async: true, // needed to tell marked to return a promise\n  async walkTokens(token) {\n    if (token.type === 'importUrl') {\n      const res = await fetch(token.url);\n      token.html = await res.text();\n    }\n  }\n};\n\nmarked.use(importUrl);\n\nconst markdown = `\n# example.com\n\n:https://example.com:\n`;\n\nconst html = await marked.parse(markdown);\n```\n\n<h2 id=\"lexer\">The Lexer</h2>\n\nThe lexer takes a markdown string and calls the tokenizer functions.\n\n\n<h2 id=\"parser\">The Parser</h2>\n\nThe parser takes tokens as input and calls the renderer functions.\n\n<h2 id=\"extend\">Access to Lexer and Parser</h2>\n\nYou also have direct access to the lexer and parser if you so desire. The lexer and parser options are the same as passed to `marked.setOptions()` except they have to be full options objects, they don't get merged with the current or default options.\n\n``` js\nconst tokens = marked.lexer(markdown, options);\nconsole.log(marked.parser(tokens, options));\n```\n\n``` js\nconst lexer = new marked.Lexer(options);\nconst tokens = lexer.lex(markdown);\nconsole.log(tokens);\nconsole.log(lexer.tokenizer.rules.block); // block level rules used\nconsole.log(lexer.tokenizer.rules.inline); // inline level rules used\nconsole.log(marked.Lexer.rules.block); // all block level rules\nconsole.log(marked.Lexer.rules.inline); // all inline level rules\n```\n\nNote that the lexer can be used in two different ways:\n\n- `marked.lexer()`: this method tokenizes a string and returns its tokens. Subsequent calls to `lexer()` ignore any previous calls.\n- `new marked.Lexer().lex()`: this instance tokenizes a string and returns its tokens along with any previous tokens. Subsequent calls to `lex()` accumulate tokens.\n\n``` bash\n$ node\n> require('marked').lexer('> I am using marked.')\n[\n  {\n    type: \"blockquote\",\n    raw: \"> I am using marked.\",\n    tokens: [\n      {\n        type: \"paragraph\",\n        raw: \"I am using marked.\",\n        text: \"I am using marked.\",\n        tokens: [\n          {\n            type: \"text\",\n            raw: \"I am using marked.\",\n            text: \"I am using marked.\"\n          }\n        ]\n      }\n    ]\n  },\n  links: {}\n]\n```\n\nThe Lexer builds an array of tokens, which will be passed to the Parser.\nThe Parser processes each token in the token array:\n\n``` js\nimport { marked } from 'marked';\n\nconst md = `\n  # heading\n\n  [link][1]\n\n  [1]: #heading \"heading\"\n`;\n\nconst tokens = marked.lexer(md);\nconsole.log(tokens);\n\nconst html = marked.parser(tokens);\nconsole.log(html);\n```\n\n``` bash\n[\n  {\n    type: \"heading\",\n    raw: \"  # heading\\n\\n\",\n    depth: 1,\n    text: \"heading\",\n    tokens: [\n      {\n        type: \"text\",\n        raw: \"heading\",\n        text: \"heading\"\n      }\n    ]\n  },\n  {\n    type: \"paragraph\",\n    raw: \"  [link][1]\",\n    text: \"  [link][1]\",\n    tokens: [\n      {\n        type: \"text\",\n        raw: \"  \",\n        text: \"  \"\n      },\n      {\n        type: \"link\",\n        raw: \"[link][1]\",\n        text: \"link\",\n        href: \"#heading\",\n        title: \"heading\",\n        tokens: [\n          {\n            type: \"text\",\n            raw: \"link\",\n            text: \"link\"\n          }\n        ]\n      }\n    ]\n  },\n  {\n    type: \"space\",\n    raw: \"\\n\\n\"\n  },\n  links: {\n    \"1\": {\n      href: \"#heading\",\n      title: \"heading\"\n    }\n  }\n]\n<h1 id=\"heading\">heading</h1>\n<p>  <a href=\"#heading\" title=\"heading\">link</a></p>\n```\n"
  },
  {
    "path": "docs/_document.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"utf-8\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n    <title><!--{{title}}-->Marked Documentation</title>\n\n    <!-- Prevent dark mode flash by applying theme before first paint -->\n    <script>\n      (function () {\n        try {\n          var STORAGE_KEY = \"theme-preference\";\n          var LEGACY_KEY = \"theme\";\n          var stored = localStorage.getItem(STORAGE_KEY) || localStorage.getItem(LEGACY_KEY);\n          var preference = stored === \"dark\" || stored === \"light\" || stored === \"system\" ? stored : \"system\";\n          var prefersDark =\n            window.matchMedia &&\n            window.matchMedia(\"(prefers-color-scheme: dark)\").matches;\n          var shouldUseDark = prefersDark;\n\n          if (preference === \"dark\") {\n            shouldUseDark = true;\n          } else if (preference === \"light\") {\n            shouldUseDark = false;\n          }\n\n          if (shouldUseDark) {\n            document.documentElement.classList.add(\"dark\");\n          } else {\n            document.documentElement.classList.remove(\"dark\");\n          }\n\n          document.documentElement.setAttribute(\"data-theme-preference\", preference);\n          document.documentElement.setAttribute(\n            \"data-theme\",\n            shouldUseDark ? \"dark\" : \"light\",\n          );\n\n          localStorage.setItem(STORAGE_KEY, preference);\n          if (preference === \"system\") {\n            localStorage.removeItem(LEGACY_KEY);\n          } else {\n            localStorage.setItem(LEGACY_KEY, preference);\n          }\n        } catch (e) {}\n      })();\n    </script>\n\n    <script src=\"https://cdn.tailwindcss.com?plugins=forms,typography\"></script>\n    <link\n      href=\"https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap\"\n      rel=\"stylesheet\"\n    />\n    <link\n      href=\"https://fonts.googleapis.com/icon?family=Material+Icons\"\n      rel=\"stylesheet\"\n    />\n\n    <link rel=\"stylesheet\" href=\"/css/style.css\" type=\"text/css\" />\n    <link rel=\"stylesheet\" href=\"/css/shared.css\" type=\"text/css\" />\n    <link rel=\"stylesheet\" href=\"/css/hljs-github.css\" type=\"text/css\" />\n\n    <script>\n      // Tailwind configuration embedded directly\n      tailwind.config = {\n        darkMode: \"class\",\n        theme: {\n          extend: {\n            colors: {\n              primary: \"#3B82F6\",\n              \"background-light\": \"#FFFFFF\",\n              \"background-dark\": \"#111827\",\n              \"text-light\": \"#1F2937\",\n              \"text-dark\": \"#F9FAFB\",\n              \"subtle-light\": \"#6B7280\",\n              \"subtle-dark\": \"#9CA3AF\",\n              \"border-light\": \"#E5E7EB\",\n              \"border-dark\": \"#374151\",\n              \"code-bg-light\": \"#F3F4F6\",\n              \"code-bg-dark\": \"#1F2937\",\n            },\n            fontFamily: {\n              sans: [\"Inter\", \"sans-serif\"],\n            },\n            borderRadius: {\n              DEFAULT: \"0.5rem\",\n            },\n            // Add typography styles for dark mode\n            typography: ({ theme }) => ({\n              dark: {\n                css: {\n                  \"--tw-prose-body\": theme(\"colors.gray[300]\"),\n                  \"--tw-prose-headings\": theme(\"colors.gray[100]\"),\n                  \"--tw-prose-lead\": theme(\"colors.gray[400]\"),\n                  \"--tw-prose-links\": theme(\"colors.blue[400]\"),\n                  \"--tw-prose-bold\": theme(\"colors.white\"),\n                  \"--tw-prose-counters\": theme(\"colors.gray[400]\"),\n                  \"--tw-prose-bullets\": theme(\"colors.gray[500]\"),\n                  \"--tw-prose-hr\": theme(\"colors.gray[700]\"),\n                  \"--tw-prose-quotes\": theme(\"colors.gray[200]\"),\n                  \"--tw-prose-quote-borders\": theme(\"colors.gray[600]\"),\n                  \"--tw-prose-captions\": theme(\"colors.gray[400]\"),\n                  \"--tw-prose-code\": theme(\"colors.gray[200]\"),\n                  \"--tw-prose-pre-code\": theme(\"colors.gray[200]\"),\n                  \"--tw-prose-pre-bg\": theme(\"colors.code-bg-dark\"),\n                  \"--tw-prose-th-borders\": theme(\"colors.gray[600]\"),\n                  \"--tw-prose-td-borders\": theme(\"colors.gray[700]\"),\n                },\n              },\n            }),\n          },\n        },\n      };\n    </script>\n  </head>\n\n  <body\n    class=\"bg-background-light dark:bg-background-dark font-sans text-text-light dark:text-text-dark\"\n  >\n    <!-- Mobile Menu Toggle Button -->\n    <button\n      id=\"mobile-menu-toggle\"\n      class=\"mobile-menu-toggle\"\n      aria-label=\"Toggle navigation menu\"\n      aria-expanded=\"false\"\n    >\n      <span class=\"material-icons\">menu</span>\n    </button>\n\n    <!-- Mobile Overlay -->\n    <div id=\"mobile-overlay\" class=\"mobile-overlay\"></div>\n\n    <a\n      href=\"https://github.com/markedjs/marked\"\n      class=\"github-corner\"\n      aria-label=\"View source on Github\"\n    >\n      <svg width=\"80\" height=\"80\" viewBox=\"0 0 250 250\">\n        <path d=\"M0,0 L115,115 L130,115 L142,142 L250,250 L250,0 Z\"></path>\n        <path\n          d=\"M128.3,109.0 C113.8,99.7 119.0,89.6 119.0,89.6 C122.0,82.7 120.5,78.6 120.5,78.6 C119.2,72.0 123.4,76.3 123.4,76.3 C127.3,80.9 125.5,87.3 125.5,87.3 C122.9,97.6 130.6,101.9 134.4,103.2\"\n          fill=\"currentColor\"\n          style=\"transform-origin: 130px 106px\"\n          class=\"octo-arm\"\n        ></path>\n        <path\n          d=\"M115.0,115.0 C114.9,115.1 118.7,116.5 119.8,115.4 L133.7,101.6 C136.9,99.2 139.9,98.4 142.2,98.6 C133.8,88.0 127.5,74.4 143.8,58.0 C148.5,53.4 154.0,51.2 159.7,51.0 C160.3,49.4 163.2,43.6 171.4,40.1 C171.4,40.1 176.1,42.5 178.8,56.2 C183.1,58.6 187.2,61.8 190.9,65.4 C194.5,69.0 197.7,73.2 200.1,77.6 C213.8,80.2 216.3,84.9 216.3,84.9 C212.7,93.1 206.9,96.0 205.4,96.6 C205.1,102.4 203.0,107.8 198.3,112.5 C181.9,128.9 168.3,122.5 157.7,114.1 C157.9,116.9 156.7,120.9 152.7,124.9 L141.0,136.5 C139.8,137.7 141.6,141.9 141.8,141.8 Z\"\n          fill=\"currentColor\"\n          class=\"octo-body\"\n        ></path>\n      </svg>\n    </a>\n\n    <div class=\"flex min-h-screen\">\n      <aside\n        id=\"sidebar\"\n        class=\"sidebar w-64 fixed top-0 scroll-hidden left-0 h-full border-r border-border-light dark:border-border-dark bg-background-light dark:bg-background-dark z-40\"\n      >\n        <div class=\"flex justify-center items-center mb-12 mt-8 px-8\">\n          <a href=\"/\" class=\"flex items-center\">\n            <img\n              alt=\"logo\"\n              src=\"/img/logo-black.svg\"\n              class=\"bg-gray-100 rounded\"\n              height=\"50px\"\n              width=\"50px\"\n            />\n          </a>\n        </div>\n        <nav class=\"flex flex-col space-y-6 w-52 pl-4 pt-2\">\n          <div>\n            <h3\n              class=\"font-semibold text-sm mb-3 text-subtle-light dark:text-subtle-dark uppercase tracking-wider\"\n            >\n              <a\n                class=\"block hover:text-primary dark:hover:text-primary\"\n                href=\"/\"\n                >Getting Started</a\n              >\n            </h3>\n            <ul\n              class=\"space-y-2 text-sm text-subtle-light dark:text-subtle-dark\"\n            >\n              <li>\n                <a\n                  class=\"block hover:text-primary dark:hover:text-primary\"\n                  href=\"/#demo\"\n                  >Demo</a\n                >\n              </li>\n              <li>\n                <a\n                  class=\"block hover:text-primary dark:hover:text-primary\"\n                  href=\"/#installation\"\n                  >Installation</a\n                >\n              </li>\n              <li>\n                <a\n                  class=\"block hover:text-primary dark:hover:text-primary\"\n                  href=\"/#usage\"\n                  >Usage</a\n                >\n              </li>\n              <li>\n                <a\n                  class=\"block hover:text-primary dark:hover:text-primary\"\n                  href=\"/#specifications\"\n                  >Specs</a\n                >\n              </li>\n              <li>\n                <a\n                  class=\"block hover:text-primary dark:hover:text-primary\"\n                  href=\"/#tools\"\n                  >Tools</a\n                >\n              </li>\n              <li>\n                <a\n                  class=\"block hover:text-primary dark:hover:text-primary\"\n                  href=\"/#security\"\n                  >Security</a\n                >\n              </li>\n            </ul>\n          </div>\n          <div>\n            <h3\n              class=\"font-semibold text-sm mb-3 text-subtle-light dark:text-subtle-dark uppercase tracking-wider\"\n            >\n              <a\n                class=\"block hover:text-primary dark:hover:text-primary\"\n                href=\"/using_advanced\"\n                >Advanced Usage</a\n              >\n            </h3>\n            <ul\n              class=\"space-y-2 text-sm text-subtle-light dark:text-subtle-dark\"\n            >\n              <li>\n                <a\n                  class=\"block hover:text-primary dark:hover:text-primary\"\n                  href=\"/using_advanced#instance\"\n                  >Instance</a\n                >\n              </li>\n              <li>\n                <a\n                  class=\"block hover:text-primary dark:hover:text-primary\"\n                  href=\"/using_advanced#options\"\n                  >Options</a\n                >\n              </li>\n              <li>\n                <a\n                  class=\"block hover:text-primary dark:hover:text-primary\"\n                  href=\"/using_advanced#extensions\"\n                  >Known Extensions</a\n                >\n              </li>\n              <li>\n                <a\n                  class=\"block hover:text-primary dark:hover:text-primary\"\n                  href=\"/using_advanced#user-examples\"\n                  >User Examples</a\n                >\n              </li>\n              <li>\n                <a\n                  class=\"block hover:text-primary dark:hover:text-primary\"\n                  href=\"/using_advanced#inline\"\n                  >Inline Markdown</a\n                >\n              </li>\n              <li>\n                <a\n                  class=\"block hover:text-primary dark:hover:text-primary\"\n                  href=\"/using_advanced#highlight\"\n                  >Highlighting</a\n                >\n              </li>\n              <li>\n                <a\n                  class=\"block hover:text-primary dark:hover:text-primary\"\n                  href=\"/using_advanced#workers\"\n                  >Workers</a\n                >\n              </li>\n              <li>\n                <a\n                  class=\"block hover:text-primary dark:hover:text-primary\"\n                  href=\"/using_advanced#cli-extensions\"\n                  >CLI Extensions</a\n                >\n              </li>\n            </ul>\n          </div>\n          <div>\n            <h3\n              class=\"font-semibold text-sm mb-3 text-subtle-light dark:text-subtle-dark uppercase tracking-wider\"\n            >\n              <a\n                class=\"block hover:text-primary dark:hover:text-primary\"\n                href=\"/using_pro\"\n                >Extensibility</a\n              >\n            </h3>\n            <ul\n              class=\"space-y-2 text-sm text-subtle-light dark:text-subtle-dark\"\n            >\n              <li>\n                <a\n                  class=\"block hover:text-primary dark:hover:text-primary\"\n                  href=\"/using_pro#use\"\n                  >marked.use()</a\n                >\n              </li>\n              <li>\n                <a\n                  class=\"block hover:text-primary dark:hover:text-primary\"\n                  href=\"/using_pro#renderer\"\n                  >Renderer</a\n                >\n              </li>\n              <li>\n                <a\n                  class=\"block hover:text-primary dark:hover:text-primary\"\n                  href=\"/using_pro#tokenizer\"\n                  >Tokenizer</a\n                >\n              </li>\n              <li>\n                <a\n                  class=\"block hover:text-primary dark:hover:text-primary\"\n                  href=\"/using_pro#walk-tokens\"\n                  >Walk Tokens</a\n                >\n              </li>\n              <li>\n                <a\n                  class=\"block hover:text-primary dark:hover:text-primary\"\n                  href=\"/using_pro#hooks\"\n                  >Hooks</a\n                >\n              </li>\n              <li>\n                <a\n                  class=\"block hover:text-primary dark:hover:text-primary\"\n                  href=\"/using_pro#extensions\"\n                  >Custom Extensions</a\n                >\n              </li>\n              <li>\n                <a\n                  class=\"block hover:text-primary dark:hover:text-primary\"\n                  href=\"/using_pro#async\"\n                  >Async Marked</a\n                >\n              </li>\n              <li>\n                <a\n                  class=\"block hover:text-primary dark:hover:text-primary\"\n                  href=\"/using_pro#lexer\"\n                  >Lexer</a\n                >\n              </li>\n              <li>\n                <a\n                  class=\"block hover:text-primary dark:hover:text-primary\"\n                  href=\"/using_pro#parser\"\n                  >Parser</a\n                >\n              </li>\n            </ul>\n          </div>\n          <div>\n            <h3\n              class=\"font-semibold text-sm mb-3 text-subtle-light dark:text-subtle-dark uppercase tracking-wider\"\n            >\n              <a\n                class=\"block hover:text-primary dark:hover:text-primary\"\n                href=\"/contributing\"\n                >Contributing</a\n              >\n            </h3>\n            <ul\n              class=\"space-y-2 text-sm text-subtle-light dark:text-subtle-dark\"\n            >\n              <li>\n                <a\n                  class=\"block hover:text-primary dark:hover:text-primary\"\n                  href=\"/contributing#design-principles\"\n                  >Design Principles</a\n                >\n              </li>\n              <li>\n                <a\n                  class=\"block hover:text-primary dark:hover:text-primary\"\n                  href=\"/contributing#priorities\"\n                  >Priorities</a\n                >\n              </li>\n              <li>\n                <a\n                  class=\"block hover:text-primary dark:hover:text-primary\"\n                  href=\"/contributing#test-early-often-and-everything\"\n                  >Testing</a\n                >\n              </li>\n            </ul>\n          </div>\n          <ul\n            class=\"space-y-2 text-sm pt-6 border-t border-border-light dark:border-border-dark text-subtle-light dark:text-subtle-dark\"\n          >\n            <li>\n              <a\n                class=\"block hover:text-primary dark:hover:text-primary\"\n                href=\"/code_of_conduct\"\n                >Code of Conduct</a\n              >\n            </li>\n            <li>\n              <a\n                class=\"block hover:text-primary dark:hover:text-primary\"\n                href=\"/authors\"\n                >Authors</a\n              >\n            </li>\n            <li>\n              <a\n                class=\"block hover:text-primary dark:hover:text-primary\"\n                href=\"/publishing\"\n                >Publishing</a\n              >\n            </li>\n            <li>\n              <a\n                class=\"block hover:text-primary dark:hover:text-primary\"\n                href=\"/license\"\n                >License</a\n              >\n            </li>\n          </ul>\n        </nav>\n      </aside>\n\n      <main class=\"main-content flex-1 ml-64 px-12 py-8\">\n        <div class=\"max-w-5xl mx-auto\">\n          <div class=\"flex justify-between items-center mb-16\">\n            <h1 class=\"text-5xl font-bold text-text-light dark:text-text-dark\">\n              Marked Documentation\n            </h1>\n            <button\n              id=\"theme-toggle\"\n              data-theme-mode=\"system\"\n              aria-label=\"Switch theme\"\n              class=\"flex items-center gap-2 px-4 py-2 rounded-lg text-subtle-light dark:text-subtle-dark hover:bg-gray-100 dark:hover:bg-gray-800 transition-colors\"\n            >\n              <span class=\"material-icons\" data-theme-icon>brightness_auto</span>\n              <span class=\"text-sm font-medium\" data-theme-text>System</span>\n            </button>\n          </div>\n\n          <article\n            id=\"content\"\n            class=\"prose prose-lg max-w-none dark:prose-dark\"\n          >\n            <!--{{content}}-->\n          </article>\n        </div>\n      </main>\n    </div>\n\n    <script src=\"/js/index.js\"></script>\n  </body>\n</html>\n"
  },
  {
    "path": "docs/broken.md",
    "content": "# Markdown is broken\n\nI have a lot of scraps of markdown engine oddities that I've collected over the\nyears. What you see below is slightly messy, but it's what I've managed to\ncobble together to illustrate the differences between markdown engines, and\nwhy, if there ever is a markdown specification, it has to be absolutely\nthorough. There are a lot more of these little differences I have documented\nelsewhere. I know I will find them lingering on my disk one day, but until\nthen, I'll continue to add whatever strange nonsensical things I find.\n\nSome of these examples may only mention a particular engine compared to marked.\nHowever, the examples with markdown.pl could easily be swapped out for\ndiscount, upskirt, or markdown.js, and you would very easily see even more\ninconsistencies.\n\nA lot of this was written when I was very unsatisfied with the inconsistencies\nbetween markdown engines. Please excuse the frustration noticeable in my\nwriting.\n\n## Examples of markdown's \"stupid\" list parsing\n\n```\n$ markdown.pl\n\n  * item1\n\n    * item2\n\n  text\n^D\n<ul>\n<li><p>item1</p>\n\n<ul>\n<li>item2</li>\n</ul>\n\n<p><p>text</p></li>\n</ul></p>\n```\n\n\n```\n$ marked\n  * item1\n\n    * item2\n\n  text\n^D\n<ul>\n<li><p>item1</p>\n<ul>\n<li>item2</li>\n</ul>\n<p>text</p>\n</li>\n</ul>\n```\n\nWhich looks correct to you?\n\n- - -\n\n```\n$ markdown.pl\n* hello\n  > world\n^D\n<p><ul>\n<li>hello</p>\n\n<blockquote>\n  <p>world</li>\n</ul></p>\n</blockquote>\n```\n\n```\n$ marked\n* hello\n  > world\n^D\n<ul>\n<li>hello<blockquote>\n<p>world</p>\n</blockquote>\n</li>\n</ul>\n```\n\nAgain, which looks correct to you?\n\n- - -\n\nEXAMPLE:\n\n```\n$ markdown.pl\n* hello\n  * world\n    * hi\n          code\n^D\n<ul>\n<li>hello\n<ul>\n<li>world</li>\n<li>hi\n  code</li>\n</ul></li>\n</ul>\n```\n\nThe code isn't a code block even though it's after the bullet margin. I know,\nlets give it two more spaces, effectively making it 8 spaces past the bullet.\n\n```\n$ markdown.pl\n* hello\n  * world\n    * hi\n            code\n^D\n<ul>\n<li>hello\n<ul>\n<li>world</li>\n<li>hi\n    code</li>\n</ul></li>\n</ul>\n```\n\nAnd, it's still not a code block. Did you also notice that the 3rd item isn't\neven its own list? Markdown screws that up too because of its indentation\nunaware parsing.\n\n- - -\n\nLet's look at some more examples of markdown's list parsing:\n\n```\n$ markdown.pl\n\n  * item1\n\n    * item2\n\n  text\n^D\n<ul>\n<li><p>item1</p>\n\n<ul>\n<li>item2</li>\n</ul>\n\n<p><p>text</p></li>\n</ul></p>\n```\n\nMisnested tags.\n\n\n```\n$ marked\n  * item1\n\n    * item2\n\n  text\n^D\n<ul>\n<li><p>item1</p>\n<ul>\n<li>item2</li>\n</ul>\n<p>text</p>\n</li>\n</ul>\n```\n\nWhich looks correct to you?\n\n- - -\n\n```\n$ markdown.pl\n* hello\n  > world\n^D\n<p><ul>\n<li>hello</p>\n\n<blockquote>\n  <p>world</li>\n</ul></p>\n</blockquote>\n```\n\nMore misnested tags.\n\n\n```\n$ marked\n* hello\n  > world\n^D\n<ul>\n<li>hello<blockquote>\n<p>world</p>\n</blockquote>\n</li>\n</ul>\n```\n\nAgain, which looks correct to you?\n\n- - -\n\n# Why quality matters - Part 2\n\n``` bash\n$ markdown.pl\n* hello\n  > world\n^D\n<p><ul>\n<li>hello</p>\n\n<blockquote>\n  <p>world</li>\n</ul></p>\n</blockquote>\n```\n\n``` bash\n$ sundown # upskirt\n* hello\n  > world\n^D\n<ul>\n<li>hello\n&gt; world</li>\n</ul>\n```\n\n``` bash\n$ marked\n* hello\n  > world\n^D\n<ul><li>hello <blockquote><p>world</p></blockquote></li></ul>\n```\n\nWhich looks correct to you?\n\n- - -\n\nSee: https://github.com/evilstreak/markdown-js/issues/23\n\n``` bash\n$ markdown.pl # upskirt/markdown.js/discount\n* hello\n      var a = 1;\n* world\n^D\n<ul>\n<li>hello\nvar a = 1;</li>\n<li>world</li>\n</ul>\n```\n\n``` bash\n$ marked\n* hello\n      var a = 1;\n* world\n^D\n<ul><li>hello\n<pre>code>var a = 1;</code></pre></li>\n<li>world</li></ul>\n```\n\nWhich looks more reasonable? Why shouldn't code blocks be able to appear in\nlist items in a sane way?\n\n- - -\n\n``` bash\n$ markdown.js\n<div>hello</div>\n\n<span>hello</span>\n^D\n<p>&lt;div&gt;hello&lt;/div&gt;</p>\n\n<p>&lt;span&gt;hello&lt;/span&gt;</p>\n```\n\n``` bash\n$ marked\n<div>hello</div>\n\n<span>hello</span>\n^D\n<div>hello</div>\n\n\n<p><span>hello</span>\n</p>\n```\n\n- - -\n\nSee: https://github.com/evilstreak/markdown-js/issues/27\n\n``` bash\n$ markdown.js\n[![an image](/image)](/link)\n^D\n<p><a href=\"/image)](/link\">![an image</a></p>\n```\n\n``` bash\n$ marked\n[![an image](/image)](/link)\n^D\n<p><a href=\"/link\"><img src=\"/image\" alt=\"an image\"></a>\n</p>\n```\n\n- - -\n\nSee: https://github.com/evilstreak/markdown-js/issues/24\n\n``` bash\n$ markdown.js\n> a\n\n> b\n\n> c\n^D\n<blockquote><p>a</p><p>bundefined&gt; c</p></blockquote>\n```\n\n``` bash\n$ marked\n> a\n\n> b\n\n> c\n^D\n<blockquote><p>a\n\n</p></blockquote>\n<blockquote><p>b\n\n</p></blockquote>\n<blockquote><p>c\n</p></blockquote>\n```\n\n- - -\n\n``` bash\n$ markdown.pl\n* hello\n  * world\n    how\n\n    are\n    you\n\n  * today\n* hi\n^D\n<ul>\n<li><p>hello</p>\n\n<ul>\n<li>world\nhow</li>\n</ul>\n\n<p>are\nyou</p>\n\n<ul>\n<li>today</li>\n</ul></li>\n<li>hi</li>\n</ul>\n```\n\n``` bash\n$ marked\n* hello\n  * world\n    how\n\n    are\n    you\n\n  * today\n* hi\n^D\n<ul>\n<li><p>hello</p>\n<ul>\n<li><p>world\nhow</p>\n<p>are\nyou</p>\n</li>\n<li><p>today</p>\n</li>\n</ul>\n</li>\n<li>hi</li>\n</ul>\n```\n"
  },
  {
    "path": "docs/build.js",
    "content": "/* global marked */\nimport '../lib/marked.umd.js';\nimport { promises } from 'fs';\nimport { join, dirname, parse, format } from 'path';\nimport { fileURLToPath } from 'url';\nimport { markedHighlight } from 'marked-highlight';\nimport { HighlightJS } from 'highlight.js';\nimport titleize from 'titleize';\nimport { getTests } from '@markedjs/testutils';\n\nconst { mkdir, rm, readdir, stat, readFile, writeFile, copyFile } = promises;\nconst { highlight, highlightAuto } = HighlightJS;\nconst cwd = process.cwd();\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\nconst inputDir = join(cwd, 'docs');\nconst outputDir = join(cwd, 'public');\nconst templateFile = join(inputDir, '_document.html');\nconst isUppercase = str => /[A-Z_]+/.test(str);\nconst getTitle = str => str === 'INDEX' ? '' : titleize(str.replace(/_/g, ' ')) + ' - ';\nfunction convertTestsToTable(name, tests) {\n  let total = 0;\n  let passing = 0;\n  let table = '\\n| Section | Passing | Percent |\\n';\n  table += '|:--------|:--------|--------:|\\n';\n  for (const [key, value] of Object.entries(tests)) {\n    total += value.total;\n    passing += value.pass;\n    table += ` | ${key}`;\n    table += ` | ${(value.pass)} of ${(value.total)}`;\n    table += ` | ${((value.pass) / value.total * 100).toFixed()}%`;\n    table += ' |\\n';\n  }\n  return `\\n<details name=\"markdown-spec\">\n  <summary>${name} (${(passing / total * 100).toFixed()}%)</summary>\n  ${table}\n</details>\\n`;\n}\n\nconst markedInstance = new marked.Marked(markedHighlight((code, language) => {\n  if (!language) {\n    return highlightAuto(code).value;\n  }\n  return highlight(code, { language }).value;\n}));\n\nasync function init() {\n  console.log('Cleaning up output directory ' + outputDir);\n  await rm(outputDir, { force: true, recursive: true });\n  await mkdir(outputDir);\n  await mkdir(join(outputDir, 'lib'));\n  console.log(`Copying file ${join(inputDir, 'LICENSE.md')}`);\n  await copyFile(join(cwd, 'LICENSE.md'), join(inputDir, 'LICENSE.md'));\n  console.log(`Copying file ${join(outputDir, 'lib/marked.umd.js')}`);\n  await copyFile(join(cwd, 'lib/marked.umd.js'), join(outputDir, 'lib/marked.umd.js'));\n  console.log(`Copying file ${join(outputDir, 'lib/marked.umd.js.map')}`);\n  await copyFile(join(cwd, 'lib/marked.umd.js.map'), join(outputDir, 'lib/marked.umd.js.map'));\n  console.log(`Copying file ${join(outputDir, 'lib/marked.esm.js')}`);\n  await copyFile(join(cwd, 'lib/marked.esm.js'), join(outputDir, 'lib/marked.esm.js'));\n  console.log(`Copying file ${join(outputDir, 'lib/marked.esm.js.map')}`);\n  await copyFile(join(cwd, 'lib/marked.esm.js.map'), join(outputDir, 'lib/marked.esm.js.map'));\n  const tmpl = await readFile(templateFile, 'utf8');\n  console.log('Building markdown...');\n  const [original, commonmark, gfm] = await getTests([\n    join(__dirname, '../test/specs/original'),\n    join(__dirname, '../test/specs/commonmark'),\n    join(__dirname, '../test/specs/gfm'),\n  ]);\n  const testResultsTable =\n    convertTestsToTable('Markdown 1.0', original)\n    + convertTestsToTable('CommonMark 0.31', commonmark)\n    + convertTestsToTable('GitHub Flavored Markdown 0.29', gfm);\n  await build(inputDir, tmpl, testResultsTable);\n  console.log('Build complete!');\n}\n\nconst ignoredFiles = [\n  join(cwd, 'docs', 'build.js'),\n  join(cwd, 'docs', '.eslintrc.json'),\n  join(cwd, 'docs', '_document.html'),\n];\n\nasync function build(currentDir, tmpl, testResultsTable) {\n  const files = await readdir(currentDir);\n  for (const file of files) {\n    const filename = join(currentDir, file);\n    if (ignoredFiles.includes(filename)) {\n      continue;\n    }\n    const stats = await stat(filename);\n    const { mode } = stats;\n    if (stats.isDirectory()) {\n      await build(filename, tmpl);\n    } else {\n      let html = await readFile(filename, 'utf8');\n      const parsed = parse(filename);\n      if (parsed.ext === '.md' && isUppercase(parsed.name)) {\n        const mdHtml = markedInstance.parse(\n          html.replace('<!--{{test-results-table}}-->', testResultsTable),\n        );\n        html = tmpl\n          .replace('<!--{{title}}-->', getTitle(parsed.name))\n          .replace('<!--{{content}}-->', mdHtml);\n        parsed.ext = '.html';\n        parsed.name = parsed.name.toLowerCase();\n        delete parsed.base;\n      }\n      parsed.dir = parsed.dir.replace(inputDir, outputDir);\n      const outfile = format(parsed);\n      await mkdir(dirname(outfile), { recursive: true });\n      console.log('Writing file ' + outfile);\n      await writeFile(outfile, html, { mode });\n    }\n  }\n}\n\ninit().catch(console.error);\n"
  },
  {
    "path": "docs/css/hljs-github-dark.css",
    "content": "/*!\n  Theme: GitHub Dark\n  Description: Dark theme for syntax highlighting\n  Based on GitHub's dark theme colors\n*/\n\n/* Dark theme syntax highlighting - Manual dark mode */\n[data-theme=\"dark\"] .hljs {\n  color: #e6edf3;\n  background: #262c36;\n}\n\n[data-theme=\"dark\"] .hljs-doctag,\n[data-theme=\"dark\"] .hljs-keyword,\n[data-theme=\"dark\"] .hljs-meta .hljs-keyword,\n[data-theme=\"dark\"] .hljs-template-tag,\n[data-theme=\"dark\"] .hljs-template-variable,\n[data-theme=\"dark\"] .hljs-type,\n[data-theme=\"dark\"] .hljs-variable.language_ {\n  color: #ff7b72;\n}\n\n[data-theme=\"dark\"] .hljs-title,\n[data-theme=\"dark\"] .hljs-title.class_,\n[data-theme=\"dark\"] .hljs-title.class_.inherited__,\n[data-theme=\"dark\"] .hljs-title.function_ {\n  color: #d2a8ff;\n}\n\n[data-theme=\"dark\"] .hljs-attr,\n[data-theme=\"dark\"] .hljs-attribute,\n[data-theme=\"dark\"] .hljs-literal,\n[data-theme=\"dark\"] .hljs-meta,\n[data-theme=\"dark\"] .hljs-number,\n[data-theme=\"dark\"] .hljs-operator,\n[data-theme=\"dark\"] .hljs-variable,\n[data-theme=\"dark\"] .hljs-selector-attr,\n[data-theme=\"dark\"] .hljs-selector-class,\n[data-theme=\"dark\"] .hljs-selector-id {\n  color: #79c0ff;\n}\n\n[data-theme=\"dark\"] .hljs-regexp,\n[data-theme=\"dark\"] .hljs-string {\n  color: #a5d6ff;\n}\n\n[data-theme=\"dark\"] .hljs-built_in,\n[data-theme=\"dark\"] .hljs-symbol {\n  color: #ffa657;\n}\n\n[data-theme=\"dark\"] .hljs-comment,\n[data-theme=\"dark\"] .hljs-code,\n[data-theme=\"dark\"] .hljs-formula {\n  color: #8b949e;\n}\n\n[data-theme=\"dark\"] .hljs-name,\n[data-theme=\"dark\"] .hljs-quote,\n[data-theme=\"dark\"] .hljs-selector-tag,\n[data-theme=\"dark\"] .hljs-selector-pseudo {\n  color: #7ee787;\n}\n\n[data-theme=\"dark\"] .hljs-subst {\n  color: #e6edf3;\n}\n\n[data-theme=\"dark\"] .hljs-section {\n  color: #1f6feb;\n  font-weight: bold;\n}\n\n[data-theme=\"dark\"] .hljs-bullet {\n  color: #f2cc60;\n}\n\n[data-theme=\"dark\"] .hljs-emphasis {\n  color: #e6edf3;\n  font-style: italic;\n}\n\n[data-theme=\"dark\"] .hljs-strong {\n  color: #e6edf3;\n  font-weight: bold;\n}\n\n[data-theme=\"dark\"] .hljs-addition {\n  color: #aff5b4;\n  background-color: #033a16;\n}\n\n[data-theme=\"dark\"] .hljs-deletion {\n  color: #ffdcd7;\n  background-color: #67060c;\n}\n\n/* Dark theme syntax highlighting - System preference auto mode */\n@media (prefers-color-scheme: dark) {\n  :root:not([data-theme=\"light\"]) .hljs {\n    color: #e6edf3;\n    background: #262c36;\n  }\n\n  :root:not([data-theme=\"light\"]) .hljs-doctag,\n  :root:not([data-theme=\"light\"]) .hljs-keyword,\n  :root:not([data-theme=\"light\"]) .hljs-meta .hljs-keyword,\n  :root:not([data-theme=\"light\"]) .hljs-template-tag,\n  :root:not([data-theme=\"light\"]) .hljs-template-variable,\n  :root:not([data-theme=\"light\"]) .hljs-type,\n  :root:not([data-theme=\"light\"]) .hljs-variable.language_ {\n    color: #ff7b72;\n  }\n\n  :root:not([data-theme=\"light\"]) .hljs-title,\n  :root:not([data-theme=\"light\"]) .hljs-title.class_,\n  :root:not([data-theme=\"light\"]) .hljs-title.class_.inherited__,\n  :root:not([data-theme=\"light\"]) .hljs-title.function_ {\n    color: #d2a8ff;\n  }\n\n  :root:not([data-theme=\"light\"]) .hljs-attr,\n  :root:not([data-theme=\"light\"]) .hljs-attribute,\n  :root:not([data-theme=\"light\"]) .hljs-literal,\n  :root:not([data-theme=\"light\"]) .hljs-meta,\n  :root:not([data-theme=\"light\"]) .hljs-number,\n  :root:not([data-theme=\"light\"]) .hljs-operator,\n  :root:not([data-theme=\"light\"]) .hljs-variable,\n  :root:not([data-theme=\"light\"]) .hljs-selector-attr,\n  :root:not([data-theme=\"light\"]) .hljs-selector-class,\n  :root:not([data-theme=\"light\"]) .hljs-selector-id {\n    color: #79c0ff;\n  }\n\n  :root:not([data-theme=\"light\"]) .hljs-regexp,\n  :root:not([data-theme=\"light\"]) .hljs-string {\n    color: #a5d6ff;\n  }\n\n  :root:not([data-theme=\"light\"]) .hljs-built_in,\n  :root:not([data-theme=\"light\"]) .hljs-symbol {\n    color: #ffa657;\n  }\n\n  :root:not([data-theme=\"light\"]) .hljs-comment,\n  :root:not([data-theme=\"light\"]) .hljs-code,\n  :root:not([data-theme=\"light\"]) .hljs-formula {\n    color: #8b949e;\n  }\n\n  :root:not([data-theme=\"light\"]) .hljs-name,\n  :root:not([data-theme=\"light\"]) .hljs-quote,\n  :root:not([data-theme=\"light\"]) .hljs-selector-tag,\n  :root:not([data-theme=\"light\"]) .hljs-selector-pseudo {\n    color: #7ee787;\n  }\n\n  :root:not([data-theme=\"light\"]) .hljs-subst {\n    color: #e6edf3;\n  }\n\n  :root:not([data-theme=\"light\"]) .hljs-section {\n    color: #1f6feb;\n    font-weight: bold;\n  }\n\n  :root:not([data-theme=\"light\"]) .hljs-bullet {\n    color: #f2cc60;\n  }\n\n  :root:not([data-theme=\"light\"]) .hljs-emphasis {\n    color: #e6edf3;\n    font-style: italic;\n  }\n\n  :root:not([data-theme=\"light\"]) .hljs-strong {\n    color: #e6edf3;\n    font-weight: bold;\n  }\n\n  :root:not([data-theme=\"light\"]) .hljs-addition {\n    color: #aff5b4;\n    background-color: #033a16;\n  }\n\n  :root:not([data-theme=\"light\"]) .hljs-deletion {\n    color: #ffdcd7;\n    background-color: #67060c;\n  }\n}"
  },
  {
    "path": "docs/css/hljs-github.css",
    "content": "/*!\n  Theme: GitHub (Adapted for dynamic light/dark mode)\n*/\n\n.hljs {\n  color: var(--text-color);\n  background: var(--background-color);\n}\n\n.hljs-doctag,\n.hljs-keyword,\n.hljs-meta .hljs-keyword,\n.hljs-template-tag,\n.hljs-template-variable,\n.hljs-type,\n.hljs-variable.language_ {\n  color: #d73a49;\n}\n\n.hljs-title,\n.hljs-title.class_,\n.hljs-title.class_.inherited__,\n.hljs-title.function_ {\n  color: #6f42c1;\n}\n\n.hljs-attr,\n.hljs-attribute,\n.hljs-literal,\n.hljs-meta,\n.hljs-number,\n.hljs-operator,\n.hljs-variable,\n.hljs-selector-attr,\n.hljs-selector-class,\n.hljs-selector-id {\n  color: #005cc5;\n}\n\n.hljs-regexp,\n.hljs-string,\n.hljs-meta .hljs-string {\n  color: #032f62;\n}\n\n.hljs-built_in,\n.hljs-symbol {\n  color: #e36209;\n}\n\n.hljs-comment,\n.hljs-code,\n.hljs-formula {\n  color: var(--subtle-text-color);\n}\n\n.hljs-name,\n.hljs-quote,\n.hljs-selector-tag,\n.hljs-selector-pseudo {\n  color: #22863a;\n}\n\n.hljs-subst {\n  color: var(--text-color);\n}\n\n.hljs-section {\n  color: #005cc5;\n  font-weight: bold;\n}\n\n.hljs-bullet {\n  color: #735c0f;\n}\n\n.hljs-emphasis {\n  color: var(--text-color);\n  font-style: italic;\n}\n\n.hljs-strong {\n  color: var(--text-color);\n  font-weight: bold;\n}\n\n.hljs-addition {\n  color: #22863a;\n  background-color: #f0fff4;\n}\n\n.hljs-deletion {\n  color: #b31d28;\n  background-color: #ffeef0;\n}\n\n/*!\n  Theme: GitHub Dark\n  Description: Dark theme as seen on github.com\n*/\n\n.dark .hljs {\n  color: #c9d1d9;\n}\n\n.dark .hljs-doctag,\n.dark .hljs-keyword,\n.dark .hljs-meta .hljs-keyword,\n.dark .hljs-template-tag,\n.dark .hljs-template-variable,\n.dark .hljs-type,\n.dark .hljs-variable.language_ {\n  color: #ff7b72;\n}\n\n.dark .hljs-title,\n.dark .hljs-title.class_,\n.dark .hljs-title.class_.inherited__,\n.dark .hljs-title.function_ {\n  color: #d2a8ff;\n}\n\n.dark .hljs-attr,\n.dark .hljs-attribute,\n.dark .hljs-literal,\n.dark .hljs-meta,\n.dark .hljs-number,\n.dark .hljs-operator,\n.dark .hljs-variable,\n.dark .hljs-selector-attr,\n.dark .hljs-selector-class,\n.dark .hljs-selector-id {\n  color: #79c0ff; /* This is the light blue for variables */\n}\n\n.dark .hljs-regexp,\n.dark .hljs-string,\n.dark .hljs-meta .hljs-string {\n  color: #a5d6ff; /* This is the light blue for strings */\n}\n\n.dark .hljs-built_in,\n.dark .hljs-symbol {\n  color: #ffa657;\n}\n\n.dark .hljs-comment,\n.dark .hljs-code,\n.dark .heading.local .hljs-formula {\n  color: #8b949e;\n}\n\n.dark .hljs-name,\n.dark .hljs-quote,\n.dark .hljs-selector-tag,\n.dark .s.h.s .hljs-selector-pseudo {\n  color: #7ee787;\n}\n\n.dark .hljs-subst {\n  color: #c9d1d9;\n}\n\n.dark .hljs-section {\n  color: #1f6feb;\n  font-weight: bold;\n}\n\n.dark .hljs-bullet {\n  color: #f2cc60;\n}\n\n.dark .hljs-emphasis {\n  color: #c9d1d9;\n  font-style: italic;\n}\n\n.dark .hljs-strong {\n  color: #c9d1d9;\n  font-weight: bold;\n}\n\n.dark .hljs-addition {\n  color: #aff5b4;\n  background-color: #033a16;\n}\n\n.dark .hljs-deletion {\n  color: #ffdcd7;\n  background-color: #67060c;\n}"
  },
  {
    "path": "docs/css/shared.css",
    "content": "a.github-corner {\n\tposition: fixed !important;\n\ttop: 0;\n\tright: 0;\n\tborder: 0;\n\tz-index: 9999 !important;\n\tdisplay: block;\n}\n\n/*\n  FIX: Explicitly apply light mode styles ONLY when .dark is NOT present.\n  This prevents the light mode rule from conflicting with the dark mode rule.\n*/\nhtml:not(.dark) a.github-corner svg {\n\tfill: #0d1117 !important; /* Dark triangle */\n\tcolor: #f0f6fc !important; /* White octocat */\n}\n\n/*\n  FIX: Increased specificity for the dark mode rule.\n*/\nhtml.dark a.github-corner svg {\n\tfill: #f0f6fc !important; /* White triangle */\n\tcolor: #0d1117 !important; /* Dark octocat */\n}\n\na.github-corner:hover .octo-arm {\n\tanimation: octocat-wave 560ms ease-in-out;\n}\n\n@keyframes octocat-wave {\n\t0%, 100% { transform: rotate(0); }\n\t20%, 60% { transform: rotate(-25deg); }\n\t40%, 80% { transform: rotate(10deg); }\n}\n\n/* Mobile: Hide GitHub corner on small screens */\n@media (max-width: 768px) {\n\ta.github-corner {\n\t\tdisplay: none;\n\t}\n}"
  },
  {
    "path": "docs/css/style.css",
    "content": "/*\n  This file contains custom styles and CSS variables that supplement Tailwind CSS.\n*/\n\n/* Define color scheme variables based on the Tailwind config */\n@layer utilities {\n  .scroll-hidden {\n    overflow-y: auto;\n    -ms-overflow-style: none;  /* IE and Edge */\n    scrollbar-width: none;  /* Firefox */\n  }\n\n  .scroll-hidden::-webkit-scrollbar {\n    display: none; /* Chrome, Safari, Opera */\n  }\n}\n\n/* Improved section spacing */\n.prose h2 {\n    margin-top: 3rem;\n    margin-bottom: 1.5rem;\n}\n\n.prose h3 {\n    margin-top: 2.5rem;\n    margin-bottom: 1.25rem;\n}\n\n.prose p {\n    margin-bottom: 1.25rem;\n    line-height: 1.75;\n}\n\n.prose ul, .prose ol {\n    margin-top: 1.25rem;\n    margin-bottom: 1.25rem;\n}\n\n.prose pre {\n    margin-top: 1.5rem;\n    margin-bottom: 1.5rem;\n}\n:root {\n    --primary-color: #3B82F6;\n    --background-color: #FFFFFF;\n    --text-color: #1F2937;\n    --subtle-text-color: #6B7280;\n    --border-color: #E5E7EB;\n    --code-bg-color: #F3F4F6;\n}\n\n.dark {\n    --background-color: #111827;\n    --text-color: #F9FAFB;\n    --subtle-text-color: #9CA3AF;\n    --border-color: #374151;\n    --code-bg-color: #1F2937;\n}\n\n/* Custom styles for the warning box */\n.alert-warning {\n    background-color: #FEF2F2;\n    border-left: 4px solid #EF4444;\n    color: #B91C1C;\n    padding: 1rem;\n    border-radius: 0 0.5rem 0.5rem 0;\n    margin: 1.5rem 0;\n}\n\n.dark .alert-warning {\n    background-color: #2c1d1d;\n    border-left-color: #F87171;\n    color: #FCA5A5;\n}\n\n.alert-warning a {\n    text-decoration: underline;\n    font-weight: 500;\n}\n\n/* --- Add this to the end of docs/css/style.css --- */\n/* --- Add this to the end of docs/css/style.css --- */\n\n/* This sets the background color for all code blocks\n  and lets height be dynamic.\n*/\n\npre {\n    height: auto;\n    align-items: center;\n}\n\n.prose pre {\n  background-color: #D1D5DB; /* Your light mode bg-gray-300 */\n  color:black;\n}\n\n.dark .prose pre {\n  background-color: #1F2937; /* Your dark mode dark:bg-gray-800 */\n  color: white;\n}\n\n/* This fixes a conflict where the <code> tag\n  itself has a background, hiding the <pre> background.\n*/\n.prose pre code.hljs {\n  background-color: transparent !important;\n}\n\n/* ============================================\n   MOBILE RESPONSIVE STYLES\n   ============================================ */\n\n/* Mobile Menu Toggle Button */\n.mobile-menu-toggle {\n  display: none; /* Hidden on desktop by default */\n  position: fixed;\n  top: 16px;\n  left: 16px;\n  z-index: 9998;\n  width: 48px;\n  height: 48px;\n  border: none;\n  border-radius: 8px;\n  background-color: var(--background-color);\n  color: var(--text-color);\n  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);\n  cursor: pointer;\n  transition: background-color 0.3s ease, transform 0.2s ease;\n  align-items: center;\n  justify-content: center;\n}\n\n.mobile-menu-toggle:hover {\n  background-color: var(--code-bg-color);\n  transform: scale(1.05);\n}\n\n.mobile-menu-toggle:active {\n  transform: scale(0.95);\n}\n\n.dark .mobile-menu-toggle {\n  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.3);\n}\n\n/* Mobile Overlay */\n.mobile-overlay {\n  display: none;\n  position: fixed;\n  top: 0;\n  left: 0;\n  right: 0;\n  bottom: 0;\n  background-color: rgba(0, 0, 0, 0.5);\n  z-index: 39;\n  opacity: 0;\n  transition: opacity 0.3s ease;\n}\n\n.mobile-overlay.active {\n  opacity: 1;\n}\n\n/* Mobile Styles - Changed breakpoint from 768px to 1024px */\n@media (max-width: 1024px) {\n  /* Show mobile menu button */\n  .mobile-menu-toggle {\n    display: flex;\n  }\n\n  /* Hide sidebar by default on mobile */\n  .sidebar {\n    transform: translateX(-100%);\n    transition: transform 0.3s ease;\n  }\n\n  /* Show sidebar when menu is open */\n  .sidebar.mobile-open {\n    transform: translateX(0);\n  }\n\n  /* Show overlay when menu is open */\n  .mobile-overlay.active {\n    display: block;\n  }\n\n  /* Adjust main content for mobile */\n  .main-content {\n    margin-left: 0 !important;\n    padding: 80px 20px 20px 20px !important;\n    width: 100%;\n  }\n\n  /* Adjust theme toggle button position on mobile */\n  #theme-toggle {\n    position: fixed;\n    top: 16px;\n    right: 16px;\n    z-index: 9998;\n    box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);\n    background-color: var(--background-color);\n  }\n\n  .dark #theme-toggle {\n    box-shadow: 0 2px 8px rgba(0, 0, 0, 0.3);\n  }\n\n  /* Adjust GitHub corner for mobile */\n  .github-corner {\n    display: none;\n  }\n\n  /* Make sidebar full height on mobile */\n  .sidebar {\n    width: 280px;\n    max-width: 85vw;\n  }\n\n  /* Adjust heading sizes for mobile */\n  .main-content h1 {\n    font-size: 2rem !important;\n  }\n\n  /* Adjust prose max-width for mobile */\n  .prose {\n    max-width: 100% !important;\n  }\n\n  /* Make tables scrollable on mobile */\n  .prose table {\n    display: block;\n    overflow-x: auto;\n    white-space: nowrap;\n  }\n\n  /* Adjust code blocks for mobile */\n  .prose pre {\n    font-size: 0.875rem;\n    padding: 1rem;\n  }\n}\n\n/* Prevent body scroll when mobile menu is open */\nbody.mobile-menu-open {\n  overflow: hidden;\n}\n\n@media (max-width: 1024px) {\n  body.mobile-menu-open {\n    overflow: hidden;\n  }\n}\n"
  },
  {
    "path": "docs/demo/demo.css",
    "content": "html, body {\n\tmargin: 0;\n\tpadding: 0;\n\tfont-family: \"Inter\", \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n\tcolor: var(--text-color);\n\tbackground-color: var(--background-color);\n\theight: 100%;\n\toverflow: auto;\n\ttransition: background-color 0.3s ease, color 0.3s ease;\n}\n\ntextarea {\n\tfont-family: Menlo, Monaco, Consolas, \"Courier New\", monospace;\n\tfont-size: 12px;\n\tresize: none;\n}\n\nheader {\n\tpadding: 16px 24px;\n\tdisplay: flex;\n\talign-items: center;\n\theight: 68px;\n\tbox-sizing: border-box;\n\tborder-bottom: 1px solid var(--border-color);\n\tgap: 16px;\n}\n\nheader .logo-link {\n\tdisplay: flex;\n\talign-items: center;\n}\n\nheader h1 {\n\tmargin: 0;\n\tfont-size: 24px;\n\tfont-weight: 700;\n\tcolor: inherit;\n}\n\n.other-demos {\n\tmargin-left: auto;\n\tdisplay: flex;\n\talign-items: center;\n\tgap: 8px;\n\tfont-size: 14px;\n}\n\n\n.other-demos a {\n\tcolor: var(--subtle-text-color);\n\ttext-decoration: none;\n\ttransition: color 0.2s ease;\n}\n\n.other-demos a:hover {\n\tcolor: #3B82F6;\n}\n\n.other-demos .separator {\n\tcolor: var(--subtle-text-color);\n}\n\n\n.theme-toggle {\n\tmargin-left: 16px;\n\tdisplay: flex;\n\talign-items: center;\n\tgap: 8px;\n\tpadding: 8px 16px;\n\tborder: none;\n\tborder-radius: 8px;\n\tbackground-color: transparent;\n\tcolor: var(--subtle-text-color);\n\tcursor: pointer;\n\tfont-family: inherit;\n\tfont-size: 14px;\n\tfont-weight: 500;\n\ttransition: background-color 0.2s ease, color 0.2s ease;\n}\n\n.theme-toggle:hover {\n\tbackground-color: var(--code-bg-color);\n\tcolor: var(--text-color);\n}\n\n.theme-toggle .material-icons {\n\tfont-size: 20px;\n}\n\n.containers {\n\tdisplay: flex;\n\theight: calc(100vh - 68px);\n\tgap: 12px;\n\tpadding: 12px;\n\tbox-sizing: border-box;\n}\n\n.container {\n\tflex-basis: 50%;\n\tdisplay: flex;\n\tflex-direction: column;\n\theight: 100%;\n\tbox-sizing: border-box;\n}\n\n\n.label {\n\tpadding: 8px 12px;\n\tbackground-color: var(--code-bg-color);\n\tborder: 1px solid var(--border-color);\n\tborder-radius: 8px 8px 0 0;\n\tfont-size: 14px;\n\tfont-weight: 500;\n\tdisplay: flex;\n\talign-items: center;\n\tgap: 8px;\n\tcolor: var(--text-color);\n}\n\n\n.label select,\n.label button {\n\tpadding: 4px 8px;\n\tborder-radius: 4px;\n\tborder: 1px solid var(--border-color);\n\tbackground-color: var(--background-color);\n\tcolor: var(--text-color);\n\tfont-size: 13px;\n\tcursor: pointer;\n\ttransition: border-color 0.2s ease;\n}\n\n.label select:hover,\n.label button:hover {\n\tborder-color: #3B82F6;\n}\n\n.label a {\n\tcolor: #3B82F6;\n\ttext-decoration: none;\n}\n\n.label a:hover {\n\ttext-decoration: underline;\n}\n\n\n.pane, .inputPane {\n\tpadding: 12px;\n\tborder: 1px solid var(--border-color);\n\tborder-top: none;\n\tborder-radius: 0 0 8px 8px;\n\toverflow: auto;\n\tflex-grow: 1;\n\tflex-shrink: 1;\n\tbackground-color: var(--background-color);\n\tcolor: var(--text-color);\n\ttransition: background-color 0.3s ease, border-color 0.3s ease;\n}\n\n#preview {\n\tdisplay: flex;\n}\n\n#preview iframe {\n\tflex-grow: 1;\n\tborder-radius: 0 0 8px 8px;\n}\n\n#main {\n\tdisplay: none;\n}\n\n#loading {\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: center;\n\theight: 100vh;\n\tfont-size: 18px;\n\tcolor: var(--subtle-text-color);\n}\n\n.error {\n\tborder-color: #EF4444 !important;\n\tbackground-color: #FEF2F2 !important;\n}\n\n.loadingError {\n\tbackground-color: #FEF2F2;\n\tfont-weight: 600;\n\tcolor: #DC2626;\n\ttext-align: center;\n\tpadding: 16px;\n\tborder-radius: 8px;\n\tmargin: 20px;\n}\n\n#responseTime {\n\tdisplay: inline-block;\n\tfont-weight: 600;\n\tcolor: #3B82F6;\n}\n\n\n/* Dark mode specific overrides */\nhtml.dark .error {\n\tbackground-color: #2c1d1d !important;\n\tborder-color: #F87171 !important;\n\tcolor: #FCA5A5;\n}\n\nhtml.dark .loadingError {\n\tbackground-color: #2c1d1d;\n\tcolor: #FCA5A5;\n}\n\nhtml.dark #loading {\n\tcolor: #9CA3AF;\n}\n"
  },
  {
    "path": "docs/demo/demo.js",
    "content": "onunhandledrejection = (e) => {\n  throw e.reason;\n};\n\nconst $loadingElem = document.querySelector('#loading');\nconst $mainElem = document.querySelector('#main');\nconst $markdownElem = document.querySelector('#markdown');\nconst $markedVerElem = document.querySelector('#markedVersion');\nconst $optionsElem = document.querySelector('#options');\nconst $outputTypeElem = document.querySelector('#outputType');\nconst $inputTypeElem = document.querySelector('#inputType');\nconst $responseTimeElem = document.querySelector('#responseTime');\nconst $previewElem = document.querySelector('#preview');\nconst $previewIframe = document.querySelector('#preview iframe');\nconst $permalinkElem = document.querySelector('#permalink');\nconst $clearElem = document.querySelector('#clear');\nconst $htmlElem = document.querySelector('#html');\nconst $lexerElem = document.querySelector('#lexer');\nconst $panes = document.querySelectorAll('.pane');\nconst $inputPanes = document.querySelectorAll('.inputPane');\nlet lastInput = '';\nlet inputDirty = true;\nlet $activeOutputElem = null;\nlet latestVersion = 'master';\nconst search = searchToObject();\nconst markedVersions = {\n  master: '../',\n};\nlet delayTime = 1;\nlet checkChangeTimeout = null;\nlet markedWorker;\n\n$previewIframe.addEventListener('load', handleIframeLoad);\n\n$outputTypeElem.addEventListener('change', handleOutputChange, false);\n\n$inputTypeElem.addEventListener('change', handleInputChange, false);\n\n$markedVerElem.addEventListener('change', handleVersionChange, false);\n\n$markdownElem.addEventListener('change', handleInput, false);\n$markdownElem.addEventListener('keyup', handleInput, false);\n$markdownElem.addEventListener('keypress', handleInput, false);\n$markdownElem.addEventListener('keydown', handleInput, false);\n\n$optionsElem.addEventListener('change', handleInput, false);\n$optionsElem.addEventListener('keyup', handleInput, false);\n$optionsElem.addEventListener('keypress', handleInput, false);\n$optionsElem.addEventListener('keydown', handleInput, false);\n\n$clearElem.addEventListener('click', handleClearClick, false);\n\n// --- Theme Toggle Setup ---\nconst $themeToggle = document.getElementById('theme-toggle');\nconst $themeToggleIcon = $themeToggle ? $themeToggle.querySelector('[data-theme-icon]') : null;\nconst $themeToggleText = $themeToggle ? $themeToggle.querySelector('[data-theme-text]') : null;\n\nconst THEME_STORAGE_KEY = 'theme-preference';\nconst LEGACY_STORAGE_KEY = 'theme';\nconst THEME_ORDER = ['system', 'light', 'dark'];\nconst TOGGLE_UI = {\n  system: { icon: 'brightness_auto', text: 'System' },\n  light: { icon: 'light_mode', text: 'Light' },\n  dark: { icon: 'dark_mode', text: 'Dark' },\n};\n\nfunction applyTheme(theme) {\n  if (theme === 'dark') {\n    document.documentElement.classList.add('dark');\n  } else {\n    document.documentElement.classList.remove('dark');\n  }\n  document.documentElement.setAttribute('data-theme', theme);\n\n  try {\n    if ($previewIframe && $previewIframe.contentDocument) {\n      if (theme === 'dark') {\n        $previewIframe.contentDocument.documentElement.classList.add('dark');\n      } else {\n        $previewIframe.contentDocument.documentElement.classList.remove('dark');\n      }\n    }\n  } catch {\n    // Ignore cross-origin errors\n  }\n}\n\nfunction getSystemTheme() {\n  if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) {\n    return 'dark';\n  }\n  return 'light';\n}\n\nfunction sanitisePreference(value) {\n  return THEME_ORDER.includes(value) ? value : null;\n}\n\nfunction readStoredPreference() {\n  try {\n    const stored = sanitisePreference(localStorage.getItem(THEME_STORAGE_KEY));\n    if (stored) {\n      return stored;\n    }\n    return sanitisePreference(localStorage.getItem(LEGACY_STORAGE_KEY));\n  } catch {\n    return null;\n  }\n}\n\nfunction writeStoredPreference(preference) {\n  try {\n    localStorage.setItem(THEME_STORAGE_KEY, preference);\n    if (preference === 'light' || preference === 'dark') {\n      localStorage.setItem(LEGACY_STORAGE_KEY, preference);\n    } else {\n      localStorage.removeItem(LEGACY_STORAGE_KEY);\n    }\n  } catch {\n    // Storage might be unavailable; ignore\n  }\n}\n\nfunction getEffectiveTheme(preference) {\n  return preference === 'system' ? getSystemTheme() : preference;\n}\n\nfunction updateToggle(preference) {\n  if (!$themeToggle) {\n    return;\n  }\n  const details = TOGGLE_UI[preference] || TOGGLE_UI.system;\n  if ($themeToggleIcon) {\n    $themeToggleIcon.textContent = details.icon;\n  }\n  if ($themeToggleText) {\n    $themeToggleText.textContent = details.text;\n  }\n  $themeToggle.setAttribute('data-theme-mode', preference);\n  const label = `Switch theme (current: ${details.text})`;\n  $themeToggle.setAttribute('aria-label', label);\n  $themeToggle.title = label;\n}\n\nlet currentPreference = readStoredPreference() || 'system';\n\nfunction applyPreference(preference, persist) {\n  currentPreference = preference;\n  const effectiveTheme = getEffectiveTheme(preference);\n  applyTheme(effectiveTheme);\n  document.documentElement.setAttribute('data-theme-preference', preference);\n  updateToggle(preference);\n  if (persist) {\n    writeStoredPreference(preference);\n  }\n}\n\napplyPreference(currentPreference, true);\n\nif ($themeToggle) {\n  $themeToggle.addEventListener('click', function() {\n    const index = THEME_ORDER.indexOf(currentPreference);\n    const nextIndex = (index + 1) % THEME_ORDER.length;\n    const nextPreference = THEME_ORDER[nextIndex];\n    applyPreference(nextPreference, true);\n  });\n}\n\nconst systemMatcher = window.matchMedia ? window.matchMedia('(prefers-color-scheme: dark)') : null;\nif (systemMatcher) {\n  const handleSystemChange = function() {\n    if (currentPreference === 'system') {\n      applyPreference('system', false);\n    }\n  };\n\n  if (typeof systemMatcher.addEventListener === 'function') {\n    systemMatcher.addEventListener('change', handleSystemChange);\n  } else if (typeof systemMatcher.addListener === 'function') {\n    systemMatcher.addListener(handleSystemChange);\n  }\n}\n\nPromise.all([\n  setInitialQuickref(),\n  setInitialOutputType(),\n  setInitialText(),\n  setInitialVersion().then(setInitialOptions),\n])\n  .then(() => {\n    handleInputChange();\n    handleOutputChange();\n    checkForChanges();\n    setScrollPercent(0);\n    $loadingElem.style.display = 'none';\n    $mainElem.style.display = 'block';\n  })\n  .catch(() => {\n    $loadingElem.classList.add('loadingError');\n    $loadingElem.textContent =\n      'Failed to load marked. Refresh the page to try again.';\n  });\n\nfunction setInitialText() {\n  if ('text' in search) {\n    $markdownElem.value = search.text;\n  } else {\n    return fetch('./initial.md')\n      .then((res) => res.text())\n      .then((text) => {\n        if ($markdownElem.value === '') {\n          $markdownElem.value = text;\n        }\n      });\n  }\n}\n\nfunction setInitialQuickref() {\n  return fetch('./quickref.md')\n    .then((res) => res.text())\n    .then((text) => {\n      document.querySelector('#quickref').value = text;\n    });\n}\n\nfunction setInitialVersion() {\n  return fetch('https://data.jsdelivr.com/v1/package/npm/marked')\n    .then((res) => res.json())\n    .then((json) => {\n      for (const ver of json.versions) {\n        markedVersions[ver] = 'https://cdn.jsdelivr.net/npm/marked@' + ver;\n        const opt = document.createElement('option');\n        opt.textContent = ver;\n        opt.value = ver;\n        $markedVerElem.appendChild(opt);\n      }\n\n      if (location.host === 'marked.js.org') {\n        latestVersion = json.tags.latest;\n      } else {\n        $markedVerElem.querySelector('option[value=\"master\"]').textContent =\n          'This Build';\n      }\n\n      if (search.version && markedVersions[search.version]) {\n        $markedVerElem.value = search.version;\n        return;\n      }\n\n      $markedVerElem.value = latestVersion;\n    })\n    .then(updateVersion);\n}\n\nfunction setInitialOptions() {\n  if ('options' in search) {\n    $optionsElem.value = search.options;\n  } else {\n    return setDefaultOptions();\n  }\n}\n\nfunction setInitialOutputType() {\n  if (search.outputType) {\n    $outputTypeElem.value = search.outputType;\n  }\n}\n\nfunction handleIframeLoad() {\n  lastInput = '';\n  inputDirty = true;\n\n  // Apply current theme to the iframe\n  try {\n    const currentTheme = document.documentElement.classList.contains('dark')\n      ? 'dark'\n      : 'light';\n    if ($previewIframe && $previewIframe.contentDocument) {\n      if (currentTheme === 'dark') {\n        $previewIframe.contentDocument.documentElement.classList.add('dark');\n      } else {\n        $previewIframe.contentDocument.documentElement.classList.remove('dark');\n      }\n    }\n  } catch {\n    // Ignore cross-origin errors\n  }\n}\n\nfunction handleInput() {\n  inputDirty = true;\n}\n\nfunction handleVersionChange() {\n  updateVersion();\n}\n\nfunction handleClearClick() {\n  $markdownElem.value = '';\n  $markedVerElem.value = latestVersion;\n  updateVersion();\n  setDefaultOptions();\n}\n\nfunction handleInputChange() {\n  handleChange($inputPanes, $inputTypeElem.value);\n}\n\nfunction handleOutputChange() {\n  $activeOutputElem = handleChange($panes, $outputTypeElem.value);\n  updateLink();\n}\n\nfunction handleChange(panes, visiblePane) {\n  let active = null;\n  for (let i = 0; i < panes.length; i++) {\n    if (panes[i].id === visiblePane) {\n      panes[i].style.display = '';\n      active = panes[i];\n    } else {\n      panes[i].style.display = 'none';\n    }\n  }\n  return active;\n}\n\nfunction setDefaultOptions() {\n  return messageWorker({\n    task: 'defaults',\n    version: markedVersions[$markedVerElem.value],\n  });\n}\n\nfunction setOptions(opts) {\n  $optionsElem.value = JSON.stringify(\n    opts,\n    (key, value) => {\n      if (value !== null\n        && typeof value === 'object'\n        && Object.getPrototypeOf(value) !== Object.prototype\n      ) {\n        return undefined;\n      }\n      return value;\n    },\n    ' ',\n  );\n}\n\nfunction searchToObject() {\n  // modified from https://stackoverflow.com/a/7090123/806777\n  const pairs = location.search.slice(1).split('&');\n  const obj = {};\n\n  for (let i = 0; i < pairs.length; i++) {\n    if (pairs[i] === '') {\n      continue;\n    }\n\n    const pair = pairs[i].split('=');\n\n    obj[decodeURIComponent(pair.shift())] = decodeURIComponent(pair.join('='));\n  }\n\n  return obj;\n}\n\nfunction getScrollSize() {\n  if (!$activeOutputElem) {\n    return 0;\n  }\n\n  const e = $activeOutputElem;\n\n  return e.scrollHeight - e.clientHeight;\n}\n\nfunction getScrollPercent() {\n  if (!$activeOutputElem) {\n    return 1;\n  }\n\n  const size = getScrollSize();\n\n  if (size <= 0) {\n    return 1;\n  }\n\n  return $activeOutputElem.scrollTop / size;\n}\n\nfunction setScrollPercent(percent) {\n  if ($activeOutputElem) {\n    $activeOutputElem.scrollTop = percent * getScrollSize();\n  }\n}\n\nfunction updateLink() {\n  let outputType = '';\n  if ($outputTypeElem.value !== 'preview') {\n    outputType = 'outputType='\n      + $outputTypeElem.value\n      + '&';\n  }\n\n  $permalinkElem.href = '?'\n    + outputType\n    + 'text='\n    + encodeURIComponent($markdownElem.value)\n    + '&options='\n    + encodeURIComponent($optionsElem.value)\n    + '&version='\n    + encodeURIComponent($markedVerElem.value);\n  history.replaceState('', document.title, $permalinkElem.href);\n}\n\nfunction updateVersion() {\n  handleInput();\n}\n\nfunction checkForChanges() {\n  if (inputDirty && $markedVerElem.value !== 'pr') {\n    inputDirty = false;\n\n    updateLink();\n\n    let options = {};\n    const optionsString = $optionsElem.value || '{}';\n    try {\n      const newOptions = JSON.parse(optionsString);\n      options = newOptions;\n      $optionsElem.classList.remove('error');\n    } catch {\n      $optionsElem.classList.add('error');\n    }\n\n    const version = markedVersions[$markedVerElem.value];\n    const markdown = $markdownElem.value;\n    const hash = version + markdown + optionsString;\n    if (lastInput !== hash) {\n      lastInput = hash;\n      delayTime = 100;\n      messageWorker({\n        task: 'parse',\n        version,\n        markdown,\n        options,\n      });\n    }\n  }\n  checkChangeTimeout = window.setTimeout(checkForChanges, delayTime);\n}\n\nfunction setResponseTime(ms) {\n  let amount = ms;\n  let suffix = 'ms';\n  if (ms > 1000 * 60 * 60) {\n    amount = 'Too Long';\n    suffix = '';\n  } else if (ms > 1000 * 60) {\n    amount = '>'\n      + Math.floor(ms / (1000 * 60));\n    suffix = 'm';\n  } else if (ms > 1000) {\n    amount = '>'\n      + Math.floor(ms / 1000);\n    suffix = 's';\n  }\n  $responseTimeElem.textContent = amount + suffix;\n  $responseTimeElem.animate(\n    [{ transform: 'scale(1.2)' }, { transform: 'scale(1)' }],\n    200,\n  );\n}\n\nfunction setParsed(parsed, lexed) {\n  try {\n    $previewIframe.contentDocument.body.innerHTML = parsed;\n  } catch {}\n  $htmlElem.value = parsed;\n  $lexerElem.value = lexed;\n}\n\nconst workerPromises = {};\nfunction messageWorker(message) {\n  if (!markedWorker || markedWorker.working) {\n    if (markedWorker) {\n      clearTimeout(markedWorker.timeout);\n      markedWorker.terminate();\n    }\n    markedWorker = new Worker('worker.js');\n    markedWorker.onmessage = (e) => {\n      clearTimeout(markedWorker.timeout);\n      markedWorker.working = false;\n      switch (e.data.task) {\n        case 'defaults': {\n          setOptions(e.data.defaults);\n          break;\n        }\n        case 'parse': {\n          $previewElem.classList.remove('error');\n          $htmlElem.classList.remove('error');\n          $lexerElem.classList.remove('error');\n          const scrollPercent = getScrollPercent();\n          setParsed(e.data.parsed, e.data.lexed);\n          setScrollPercent(scrollPercent);\n          setResponseTime(e.data.time);\n          break;\n        }\n      }\n      clearTimeout(checkChangeTimeout);\n      delayTime = 10;\n      checkForChanges();\n      workerPromises[e.data.id]();\n      delete workerPromises[e.data.id];\n    };\n    markedWorker.onerror = markedWorker.onmessageerror = (err) => {\n      clearTimeout(markedWorker.timeout);\n      let error = 'There was an error in the Worker';\n      if (err) {\n        if (err.message) {\n          error = err.message;\n        } else {\n          error = err;\n        }\n      }\n      error = error.replace(/^Uncaught Error: /, '');\n      $previewElem.classList.add('error');\n      $htmlElem.classList.add('error');\n      $lexerElem.classList.add('error');\n      setParsed(error, error);\n      setScrollPercent(0);\n    };\n  }\n  if (message.task !== 'defaults') {\n    markedWorker.working = true;\n    workerTimeout(0);\n  }\n  return new Promise((resolve) => {\n    message.id = uniqueWorkerMessageId();\n    workerPromises[message.id] = resolve;\n    markedWorker.postMessage(message);\n  });\n}\n\nfunction uniqueWorkerMessageId() {\n  let id;\n  do {\n    id = Math.random().toString(36);\n  } while (id in workerPromises);\n  return id;\n}\n\nfunction workerTimeout(seconds) {\n  markedWorker.timeout = setTimeout(() => {\n    seconds++;\n    markedWorker.onerror(\n      'Marked has taken longer than '\n        + seconds\n        + ' second'\n        + (seconds > 1 ? 's' : '')\n        + ' to respond...',\n    );\n    workerTimeout(seconds);\n  }, 1000);\n}\n"
  },
  {
    "path": "docs/demo/index.html",
    "content": "<!doctype html>\n<html lang=\"en\">\n\n  <head>\n    <title>Marked Demo</title>\n    <meta charset=\"utf-8\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n    \n    <!-- Prevent dark mode flash by applying theme before first paint -->\n    <script>\n      (function () {\n        try {\n          var STORAGE_KEY = \"theme-preference\";\n          var LEGACY_KEY = \"theme\";\n          var stored = localStorage.getItem(STORAGE_KEY) || localStorage.getItem(LEGACY_KEY);\n          var preference = stored === \"dark\" || stored === \"light\" || stored === \"system\" ? stored : \"system\";\n          var prefersDark =\n            window.matchMedia &&\n            window.matchMedia(\"(prefers-color-scheme: dark)\").matches;\n          var shouldUseDark = prefersDark;\n\n          if (preference === \"dark\") {\n            shouldUseDark = true;\n          } else if (preference === \"light\") {\n            shouldUseDark = false;\n          }\n\n          if (shouldUseDark) {\n            document.documentElement.classList.add(\"dark\");\n          } else {\n            document.documentElement.classList.remove(\"dark\");\n          }\n\n          document.documentElement.setAttribute(\"data-theme-preference\", preference);\n          document.documentElement.setAttribute(\n            \"data-theme\",\n            shouldUseDark ? \"dark\" : \"light\",\n          );\n\n          localStorage.setItem(STORAGE_KEY, preference);\n          if (preference === \"system\") {\n            localStorage.removeItem(LEGACY_KEY);\n          } else {\n            localStorage.setItem(LEGACY_KEY, preference);\n          }\n        } catch (e) {}\n      })();\n    </script>\n    \n    <link rel=\"stylesheet\" href=\"./demo.css\" type=\"text/css\" />\n    <link rel=\"stylesheet\" href=\"../css/shared.css\" type=\"text/css\" />\n    <link rel=\"stylesheet\" href=\"../css/style.css\" type=\"text/css\" />\n    <link rel=\"stylesheet\" href=\"../css/hljs-github.css\" type=\"text/css\" />\n    <link rel=\"stylesheet\" href=\"../css/hljs-github-dark.css\" type=\"text/css\" />\n    <link\n      href=\"https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap\"\n      rel=\"stylesheet\"\n    />\n    <link\n      href=\"https://fonts.googleapis.com/icon?family=Material+Icons\"\n      rel=\"stylesheet\"\n    />\n  </head>\n\n  <body>\n    <a href=\"https://github.com/markedjs/marked\" class=\"github-corner\" aria-label=\"View source on Github\">\n      <svg width=\"80\" height=\"80\" viewBox=\"0 0 250 250\" aria-hidden=\"true\">\n          <path d=\"M0,0 L115,115 L130,115 L142,142 L250,250 L250,0 Z\"></path>\n          <path d=\"M128.3,109.0 C113.8,99.7 119.0,89.6 119.0,89.6 C122.0,82.7 120.5,78.6 120.5,78.6 C119.2,72.0 123.4,76.3 123.4,76.3 C127.3,80.9 125.5,87.3 125.5,87.3 C122.9,97.6 130.6,101.9 134.4,103.2\" fill=\"currentColor\" style=\"transform-origin: 130px 106px;\" class=\"octo-arm\"></path>\n          <path d=\"M115.0,115.0 C114.9,115.1 118.7,116.5 119.8,115.4 L133.7,101.6 C136.9,99.2 139.9,98.4 142.2,98.6 C133.8,88.0 127.5,74.4 143.8,58.0 C148.5,53.4 154.0,51.2 159.7,51.0 C160.3,49.4 163.2,43.6 171.4,40.1 C171.4,40.1 176.1,42.5 178.8,56.2 C183.1,58.6 187.2,61.8 190.9,65.4 C194.5,69.0 197.7,73.2 200.1,77.6 C213.8,80.2 216.3,84.9 216.3,84.9 C212.7,93.1 206.9,96.0 205.4,96.6 C205.1,102.4 203.0,107.8 198.3,112.5 C181.9,128.9 168.3,122.5 157.7,114.1 C157.9,116.9 156.7,120.9 152.7,124.9 L141.0,136.5 C139.8,137.7 141.6,141.9 141.8,141.8 Z\" fill=\"currentColor\" class=\"octo-body\"></path>\n      </svg>\n    </a>\n\n    <header>\n      <a href=\"../\" class=\"logo-link\">\n        <img src=\"../img/logo-black.svg\" height=\"50px\" width=\"50px\" alt=\"Marked Logo\" />\n      </a>\n      <h1>Marked Demo</h1>\n      <div class=\"other-demos\">\n        <a href=\"https://spec.commonmark.org/dingus/\">CommonMark Demo</a>\n        <span class=\"separator\">·</span>\n        <a href=\"https://daringfireball.net/projects/markdown/dingus\">Daring Fireball Demo</a>\n      </div>\n      <button id=\"theme-toggle\" class=\"theme-toggle\" data-theme-mode=\"system\" aria-label=\"Switch theme\">\n        <span class=\"material-icons\" data-theme-icon>brightness_auto</span>\n        <span class=\"text\" data-theme-text>System</span>\n      </button>\n    </header>\n\n    <div id=\"loading\">Loading...</div>\n    <div id=\"main\">\n      <div class=\"containers\">\n        <div class=\"container\">\n          <div class=\"label\">\n            <span>Input</span> ·\n            <a id=\"permalink\">Permalink</a> ·\n            <span>Version: </span>\n            <select id=\"markedVersion\">\n              <option value=\"master\"selected>master</option>\n            </select> ·\n            <button id=\"clear\">Clear</button>\n            <select id=\"inputType\">\n              <option value=\"markdown\">Markdown</option>\n              <option value=\"options\">Options</option>\n            </select>\n          </div>\n          <textarea id=\"markdown\" class=\"inputPane\"></textarea>\n          <textarea id=\"options\" class=\"inputPane\" placeholder=\"Options (as JSON)\"></textarea>\n        </div>\n\n        <div class=\"container\">\n          <div class=\"label\">\n            <select id=\"outputType\">\n              <option value=\"preview\">Preview</option>\n              <option value=\"html\">HTML Source</option>\n              <option value=\"lexer\">Lexer Data</option>\n              <option value=\"quickref\">Quick Reference</option>\n            </select> ·\n            Response Time:\n            <span id=\"responseTime\"></span>\n          </div>\n\n          <div id=\"preview\" class=\"pane\">\n            <noscript>\n              <h2>You'll need to enable Javascript to use this tool.</h2>\n            </noscript>\n            <iframe src=\"./preview.html\" frameborder=\"0\" sandbox=\"allow-same-origin allow-top-navigation-by-user-activation\"></iframe>\n          </div>\n\n          <textarea id=\"html\" class=\"pane\" readonly=\"readonly\"></textarea>\n\n          <textarea id=\"lexer\" class=\"pane\" readonly=\"readonly\"></textarea>\n\n          <textarea id=\"quickref\" class=\"pane\" readonly=\"readonly\"></textarea>\n        </div>\n      </div>\n    </div>\n    <script src=\"../js/index.js\"></script>\n    <script src=\"./demo.js\" type=\"module\"></script>\n  </body>\n\n</html>\n"
  },
  {
    "path": "docs/demo/initial.md",
    "content": "Marked - Markdown Parser\n========================\n\n[Marked] lets you convert [Markdown] into HTML.  Markdown is a simple text format whose goal is to be very easy to read and write, even when not converted to HTML.  This demo page will let you type anything you like and see how it gets converted.  Live.  No more waiting around.\n\nHow To Use The Demo\n-------------------\n\n1. Type in stuff on the left.\n2. See the live updates on the right.\n\nThat's it.  Pretty simple.  There's also a drop-down option above to switch between various views:\n\n- **Preview:**  A live display of the generated HTML as it would render in a browser.\n- **HTML Source:**  The generated HTML before your browser makes it pretty.\n- **Lexer Data:**  What [marked] uses internally, in case you like gory stuff like this.\n- **Quick Reference:**  A brief run-down of how to format things using markdown.\n\nWhy Markdown?\n-------------\n\nIt's easy.  It's not overly bloated, unlike HTML.  Also, as the creator of [markdown] says,\n\n> The overriding design goal for Markdown's\n> formatting syntax is to make it as readable\n> as possible. The idea is that a\n> Markdown-formatted document should be\n> publishable as-is, as plain text, without\n> looking like it's been marked up with tags\n> or formatting instructions.\n\nReady to start writing?  Either start changing stuff on the left or\n[clear everything](/demo/?text=) with a simple click.\n\n[Marked]: https://github.com/markedjs/marked/\n[Markdown]: http://daringfireball.net/projects/markdown/\n"
  },
  {
    "path": "docs/demo/preview.html",
    "content": "\n<!doctype html>\n<html lang=\"en\">\n<head>\n  <meta charset=\"utf-8\">\n  <title>marked.js preview</title>\n   <script>\n      (function () {\n        try {\n          var STORAGE_KEY = \"theme-preference\";\n          var LEGACY_KEY = \"theme\";\n          var stored = localStorage.getItem(STORAGE_KEY) || localStorage.getItem(LEGACY_KEY);\n          var preference = stored === \"dark\" || stored === \"light\" || stored === \"system\" ? stored : \"system\";\n          var prefersDark =\n            window.matchMedia &&\n            window.matchMedia(\"(prefers-color-scheme: dark)\").matches;\n          var shouldUseDark = prefersDark;\n\n          if (preference === \"dark\") {\n            shouldUseDark = true;\n          } else if (preference === \"light\") {\n            shouldUseDark = false;\n          }\n\n          if (shouldUseDark) {\n            document.documentElement.classList.add(\"dark\");\n          } else {\n            document.documentElement.classList.remove(\"dark\");\n          }\n\n          document.documentElement.setAttribute(\"data-theme-preference\", preference);\n          document.documentElement.setAttribute(\n            \"data-theme\",\n            shouldUseDark ? \"dark\" : \"light\",\n          );\n\n          localStorage.setItem(STORAGE_KEY, preference);\n          if (preference === \"system\") {\n            localStorage.removeItem(LEGACY_KEY);\n          } else {\n            localStorage.setItem(LEGACY_KEY, preference);\n          }\n        } catch (e) {}\n      })();\n    </script>\n  <link rel=\"stylesheet\" href=\"./demo.css\" />\n  <link rel=\"stylesheet\" href=\"../css/style.css\" />\n  <link rel=\"stylesheet\" href=\"../css/hljs-github.css\" />\n  <link rel=\"stylesheet\" href=\"../css/hljs-github-dark.css\" />\n  <base target=\"_parent\">\n  <style>\n    html, body {\n      margin: 0;\n      padding: 0;\n      background: #FFFFFF;\n      color: #1F2937;\n      font-family: \"Inter\", \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n      line-height: 1.6;\n      transition: background-color 0.3s ease, color 0.3s ease;\n    }\n\n    html.dark, html.dark body {\n      background: #1F2937;\n      color: #F9FAFB;\n    }\n\n    /* Ensure links are visible in dark mode */\n    html.dark a {\n      color: #60A5FA;\n    }\n\n    html.dark a:hover {\n      color: #93C5FD;\n    }\n\n    /* Code blocks in dark mode */\n    html.dark pre {\n      background-color: #111827 !important;\n      color: #F9FAFB;\n    }\n\n    html.dark code {\n      background-color: #111827;\n      color: #F9FAFB;\n    }\n\n    /* Tables in dark mode */\n    html.dark table {\n      border-color: #374151;\n    }\n\n    html.dark th,\n    html.dark td {\n      border-color: #374151;\n    }\n  </style>\n</head>\n<body>\n</body>\n</html>\n"
  },
  {
    "path": "docs/demo/quickref.md",
    "content": "Markdown Quick Reference\n========================\n\nThis guide is a very brief overview, with examples, of the syntax that [Markdown] supports. It is itself written in Markdown and you can copy the samples over to the left-hand pane for experimentation. It's shown as *text* and not *rendered HTML*.\n\n[Markdown]: http://daringfireball.net/projects/markdown/\n\n\nSimple Text Formatting\n======================\n\nFirst thing is first. You can use *stars* or _underscores_ for italics. **Double stars** and __double underscores__ for bold. ***Three together*** for ___both___.\n\nParagraphs are pretty easy too. Just have a blank line between chunks of text.\n\n> This chunk of text is in a block quote. Its multiple lines will all be\n> indented a bit from the rest of the text.\n>\n> > Multiple levels of block quotes also work.\n\nSometimes you want to include code, such as when you are explaining how `<h1>` HTML tags work, or maybe you are a programmer and you are discussing `someMethod()`.\n\nIf you want to include code and have new\nlines preserved, indent the line with a tab\nor at least four spaces:\n\n    Extra spaces work here too.\n    This is also called preformatted text and it is useful for showing examples.\n    The text will stay as text, so any *markdown* or <u>HTML</u> you add will\n    not show up formatted. This way you can show markdown examples in a\n    markdown document.\n\n>     You can also use preformatted text with your blockquotes\n>     as long as you add at least five spaces.\n\n\nHeadings\n========\n\nThere are a couple of ways to make headings. Using three or more equals signs on a line under a heading makes it into an \"h1\" style. Three or more hyphens under a line makes it \"h2\" (slightly smaller). You can also use multiple pound symbols (`#`) before and after a heading. Pounds after the title are ignored. Here are some examples:\n\nThis is H1\n==========\n\nThis is H2\n----------\n\n# This is H1\n## This is H2\n### This is H3 with some extra pounds ###\n#### You get the idea ####\n##### I don't need extra pounds at the end\n###### H6 is the max\n\n\nLinks\n=====\n\nLet's link to a few sites. First, let's use the bare URL, like <https://www.github.com>. Great for text, but ugly for HTML.\nNext is an inline link to [Google](https://www.google.com). A little nicer.\nThis is a reference-style link to [Wikipedia] [1].\nLastly, here's a pretty link to [Yahoo]. The reference-style and pretty links both automatically use the links defined below, but they could be defined *anywhere* in the markdown and are removed from the HTML. The names are also case insensitive, so you can use [YaHoO] and have it link properly.\n\n[1]: https://www.wikipedia.org\n[Yahoo]: https://www.yahoo.com\n\nTitle attributes may be added to links by adding text after a link.\nThis is the [inline link](https://www.bing.com \"Bing\") with a \"Bing\" title.\nYou can also go to [W3C] [2] and maybe visit a [friend].\n\n[2]: https://w3c.org (The W3C puts out specs for web-based things)\n[Friend]: https://facebook.com \"Facebook!\"\n\nEmail addresses in plain text are not linked: test@example.com.\nEmail addresses wrapped in angle brackets are linked: <test@example.com>.\nThey are also obfuscated so that email harvesting spam robots hopefully won't get them.\n\n\nLists\n=====\n\n* This is a bulleted list\n* Great for shopping lists\n- You can also use hyphens\n+ Or plus symbols\n\nThe above is an \"unordered\" list. Now, on for a bit of order.\n\n1. Numbered lists are also easy\n2. Just start with a number\n3738762. However, the actual number doesn't matter when converted to HTML.\n1. This will still show up as 4.\n\nYou might want a few advanced lists:\n\n- This top-level list is wrapped in paragraph tags\n- This generates an extra space between each top-level item.\n\n- You do it by adding a blank line\n\n- This nested list also has blank lines between the list items.\n\n- How to create nested lists\n  1. Start your regular list\n  2. Indent nested lists with two spaces\n  3. Further nesting means you should indent with two more spaces\n    * This line is indented with four spaces.\n\n- List items can be quite lengthy. You can keep typing and either continue\nthem on the next line with no indentation.\n\n- Alternately, if that looks ugly, you can also\n  indent the next line a bit for a prettier look.\n\n- You can put large blocks of text in your list by just indenting with two spaces.\n\n  This is formatted the same as code, but you can inspect the HTML\n  and find that it's just wrapped in a `<p>` tag and *won't* be shown\n  as preformatted text.\n\n  You can keep adding more and more paragraphs to a single\n  list item by adding the traditional blank line and then keep\n  on indenting the paragraphs with two spaces.\n\n  You really only need to indent the first line,\nbut that looks ugly.\n\n- Lists support blockquotes\n\n  > Just like this example here. By the way, you can\n  > nest lists inside blockquotes!\n  > - Fantastic!\n\n- Lists support preformatted text\n\n      You just need to indent an additional four spaces.\n\n\nEven More\n=========\n\nHorizontal Rule\n---------------\n\nIf you need a horizontal rule you just need to put at least three hyphens, asterisks, or underscores on a line by themselves. You can also even put spaces between the characters.\n\n---\n****************************\n_ _ _ _ _ _ _\n\nThose three all produced horizontal lines. Keep in mind that three hyphens under any text turns that text into a heading, so add a blank like if you use hyphens.\n\nImages\n------\n\nImages work exactly like links, but they have exclamation points in front. They work with references and titles too.\n\n![Google Logo](https://www.google.com/images/errors/logo_sm.gif) and ![Happy].\n\n[Happy]: https://wpclipart.com/smiley/happy/simple_colors/smiley_face_simple_green_small.png (\"Smiley face\")\n\n\nInline HTML\n-----------\n\nIf markdown is too limiting, you can just insert your own <strike>crazy</strike> HTML. Span-level HTML <u>can *still* use markdown</u>. Block level elements must be separated from text by a blank line and must not have any spaces before the opening and closing HTML.\n\n<div style='font-family: \"Comic Sans MS\", \"Comic Sans\", cursive;'>\nIt is a pity, but markdown does **not** work in here for most markdown parsers.\n[Marked] handles it pretty well.\n</div>\n"
  },
  {
    "path": "docs/demo/worker.js",
    "content": "const versionCache = {};\nlet currentVersion;\n\nonunhandledrejection = (e) => {\n  throw e.reason;\n};\n\nonmessage = function(e) {\n  if (e.data.version === currentVersion) {\n    parse(e);\n  } else {\n    loadVersion(e.data.version).then(() => {\n      parse(e);\n    });\n  }\n};\n\nfunction getDefaults() {\n  const marked = versionCache[currentVersion];\n  let defaults = {};\n  if (typeof marked.getDefaults === 'function') {\n    defaults = marked.getDefaults();\n    delete defaults.renderer;\n  } else if ('defaults' in marked) {\n    for (const prop in marked.defaults) {\n      if (prop !== 'renderer') {\n        defaults[prop] = marked.defaults[prop];\n      }\n    }\n  }\n  return defaults;\n}\n\nfunction mergeOptions(options) {\n  const defaults = getDefaults();\n  const opts = {};\n  const invalidOptions = [\n    'renderer',\n    'tokenizer',\n    'walkTokens',\n    'extensions',\n    'highlight',\n    'sanitizer',\n  ];\n  for (const prop in defaults) {\n    opts[prop] = invalidOptions.includes(prop) || !(prop in options)\n      ? defaults[prop]\n      : options[prop];\n  }\n  return opts;\n}\n\nfunction parse(e) {\n  switch (e.data.task) {\n    case 'defaults': {\n      postMessage({\n        id: e.data.id,\n        task: e.data.task,\n        defaults: getDefaults(),\n      });\n      break;\n    }\n    case 'parse': {\n      const marked = versionCache[currentVersion];\n      // marked 0.0.1 had tokens array as the second parameter of lexer and no options\n      const options = currentVersion.endsWith('@0.0.1') ? [] : mergeOptions(e.data.options);\n      const startTime = new Date();\n      const lexed = marked.lexer(e.data.markdown, options);\n      const lexedList = jsonString(lexed);\n      const parsed = marked.parser(lexed, options);\n      const endTime = new Date();\n      postMessage({\n        id: e.data.id,\n        task: e.data.task,\n        lexed: lexedList,\n        parsed,\n        time: endTime - startTime,\n      });\n      break;\n    }\n  }\n}\n\nfunction jsonString(input, level) {\n  level = level || 0;\n  if (Array.isArray(input)) {\n    if (input.length === 0) {\n      return '[]';\n    }\n    const items = [];\n    let i;\n    if (!Array.isArray(input[0]) && typeof input[0] === 'object' && input[0] !== null) {\n      for (i = 0; i < input.length; i++) {\n        items.push(' '.repeat(2 * level) + jsonString(input[i], level + 1));\n      }\n      return '[\\n' + items.join('\\n') + '\\n]';\n    }\n    for (i = 0; i < input.length; i++) {\n      items.push(jsonString(input[i], level));\n    }\n    return '[' + items.join(', ') + ']';\n  } else if (typeof input === 'object' && input !== null) {\n    const props = [];\n    for (const prop in input) {\n      props.push(prop + ':' + jsonString(input[prop], level));\n    }\n    return '{' + props.join(', ') + '}';\n  } else {\n    return JSON.stringify(input);\n  }\n}\n\nfunction fetchMarked(file) {\n  return () =>\n    fetch(file)\n      .then((res) => res.text())\n      .then((text) => {\n        const g = globalThis || global;\n        g.module = { };\n        try {\n          // eslint-disable-next-line no-new-func\n          Function(text)();\n        } catch {\n          throw new Error(`Cannot find ${file}`);\n        }\n        const marked = g.marked || g.module.exports;\n        return marked;\n      });\n}\n\nfunction loadVersion(ver) {\n  let promise;\n  if (versionCache[ver]) {\n    promise = Promise.resolve();\n  } else {\n    promise = import(ver + '/lib/marked.esm.js')\n      .catch(fetchMarked(ver + '/marked.min.js'))\n      .catch(fetchMarked(ver + '/lib/marked.umd.js'))\n      .catch(fetchMarked(ver + '/lib/marked.js'))\n      .then((marked) => {\n        if (!marked) {\n          throw Error('No marked');\n        } else if (marked.marked) {\n          versionCache[ver] = marked.marked;\n        } else if (marked.default) {\n          versionCache[ver] = marked.default;\n        } else if (marked.lexer && marked.parser) {\n          versionCache[ver] = marked;\n        } else {\n          throw new Error('Cannot find marked');\n        }\n      });\n  }\n  return promise.then(() => {\n    currentVersion = ver;\n  }).catch((err) => {\n    console.error(err);\n    throw new Error('Cannot load that version of marked');\n  });\n}\n"
  },
  {
    "path": "docs/js/index.js",
    "content": "document.addEventListener('DOMContentLoaded', function() {\n  // --- Theme Toggling ---\n  const themeToggle = document.getElementById('theme-toggle');\n  const themeToggleIcon = themeToggle ? themeToggle.querySelector('[data-theme-icon]') : null;\n  const themeToggleText = themeToggle ? themeToggle.querySelector('[data-theme-text]') : null;\n\n  const THEME_STORAGE_KEY = 'theme-preference';\n  const LEGACY_STORAGE_KEY = 'theme';\n  const THEME_ORDER = ['system', 'light', 'dark'];\n  const TOGGLE_UI = {\n    system: { icon: 'brightness_auto', text: 'System' },\n    light: { icon: 'light_mode', text: 'Light' },\n    dark: { icon: 'dark_mode', text: 'Dark' },\n  };\n\n  function applyTheme(theme) {\n    if (theme === 'dark') {\n      document.documentElement.classList.add('dark');\n    } else {\n      document.documentElement.classList.remove('dark');\n    }\n    document.documentElement.setAttribute('data-theme', theme);\n  }\n\n  function getSystemTheme() {\n    if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) {\n      return 'dark';\n    }\n    return 'light';\n  }\n\n  function sanitisePreference(value) {\n    return THEME_ORDER.includes(value) ? value : null;\n  }\n\n  function readStoredPreference() {\n    try {\n      const stored = sanitisePreference(localStorage.getItem(THEME_STORAGE_KEY));\n      if (stored) {\n        return stored;\n      }\n      return sanitisePreference(localStorage.getItem(LEGACY_STORAGE_KEY));\n    } catch {\n      return null;\n    }\n  }\n\n  function writeStoredPreference(preference) {\n    try {\n      localStorage.setItem(THEME_STORAGE_KEY, preference);\n      if (preference === 'light' || preference === 'dark') {\n        localStorage.setItem(LEGACY_STORAGE_KEY, preference);\n      } else {\n        localStorage.removeItem(LEGACY_STORAGE_KEY);\n      }\n    } catch {\n      // Storage might be unavailable; ignore\n    }\n  }\n\n  function getEffectiveTheme(preference) {\n    return preference === 'system' ? getSystemTheme() : preference;\n  }\n\n  function updateToggle(preference) {\n    if (!themeToggle) {\n      return;\n    }\n    const details = TOGGLE_UI[preference] || TOGGLE_UI.system;\n    if (themeToggleIcon) {\n      themeToggleIcon.textContent = details.icon;\n    }\n    if (themeToggleText) {\n      themeToggleText.textContent = details.text;\n    }\n    themeToggle.setAttribute('data-theme-mode', preference);\n    const label = `Switch theme (current: ${details.text})`;\n    themeToggle.setAttribute('aria-label', label);\n    themeToggle.title = label;\n  }\n\n  let currentPreference = readStoredPreference() || 'system';\n\n  function applyPreference(preference, persist) {\n    currentPreference = preference;\n    const effectiveTheme = getEffectiveTheme(preference);\n    applyTheme(effectiveTheme);\n    document.documentElement.setAttribute('data-theme-preference', preference);\n    updateToggle(preference);\n    if (persist) {\n      writeStoredPreference(preference);\n    }\n  }\n\n  applyPreference(currentPreference, true);\n\n  if (themeToggle) {\n    themeToggle.addEventListener('click', function() {\n      const index = THEME_ORDER.indexOf(currentPreference);\n      const nextIndex = index === -1 ? 0 : (index + 1) % THEME_ORDER.length;\n      const nextPreference = THEME_ORDER[nextIndex];\n      applyPreference(nextPreference, true);\n    });\n  }\n\n  const systemMatcher = window.matchMedia ? window.matchMedia('(prefers-color-scheme: dark)') : null;\n  if (systemMatcher) {\n    const handleSystemChange = function() {\n      if (currentPreference === 'system') {\n        applyPreference('system', false);\n      }\n    };\n\n    if (typeof systemMatcher.addEventListener === 'function') {\n      systemMatcher.addEventListener('change', handleSystemChange);\n    } else if (typeof systemMatcher.addListener === 'function') {\n      systemMatcher.addListener(handleSystemChange);\n    }\n  }\n\n  // --- Copy-to-Clipboard Button ---\n  const allPres = document.querySelectorAll('pre');\n  allPres.forEach(function(pre) {\n    let timeout = null;\n\n    const copyButton = document.createElement('button');\n    copyButton.className =\n      'absolute top-2 right-2 p-2 rounded-md bg-gray-200 dark:bg-gray-700 text-gray-600 dark:text-gray-300 opacity-0 group-hover:opacity-100 transition-opacity';\n    copyButton.innerHTML =\n      '<span class=\"material-icons text-sm\">content_copy</span>';\n    copyButton.setAttribute('aria-label', 'Copy to clipboard');\n\n    pre.classList.add('group', 'relative'); // Add group for hover effect\n    pre.appendChild(copyButton);\n\n    copyButton.onclick = function() {\n      // Exclude the button's own text from being copied\n      const code = pre.querySelector('code').innerText;\n      navigator.clipboard.writeText(code);\n\n      copyButton.innerHTML = '<span class=\"material-icons text-sm\">done</span>';\n\n      clearTimeout(timeout);\n      timeout = setTimeout(function() {\n        copyButton.innerHTML =\n          '<span class=\"material-icons text-sm\">content_copy</span>';\n      }, 2000);\n    };\n  });\n\n  // --- LEGACY URL Redirect ---\n  const match = /#\\/(.+)\\\\.md(.*)/g.exec(window.location.hash);\n  if (match && match[1]) {\n    const pageName = match[1].toLowerCase();\n    const sectionName = match[2];\n    window.location.href = '/' + pageName + sectionName;\n  }\n\n  // --- Mobile Menu Toggle ---\n  const mobileMenuToggle = document.getElementById('mobile-menu-toggle');\n  const sidebar = document.getElementById('sidebar');\n  const mobileOverlay = document.getElementById('mobile-overlay');\n  const body = document.body;\n\n  function openMobileMenu() {\n    sidebar.classList.add('mobile-open');\n    mobileOverlay.classList.add('active');\n    body.classList.add('mobile-menu-open');\n    mobileMenuToggle.setAttribute('aria-expanded', 'true');\n  }\n\n  function closeMobileMenu() {\n    sidebar.classList.remove('mobile-open');\n    mobileOverlay.classList.remove('active');\n    body.classList.remove('mobile-menu-open');\n    mobileMenuToggle.setAttribute('aria-expanded', 'false');\n  }\n\n  if (mobileMenuToggle) {\n    mobileMenuToggle.addEventListener('click', function() {\n      const isOpen = sidebar.classList.contains('mobile-open');\n      if (isOpen) {\n        closeMobileMenu();\n      } else {\n        openMobileMenu();\n      }\n    });\n  }\n\n  if (mobileOverlay) {\n    mobileOverlay.addEventListener('click', closeMobileMenu);\n  }\n\n  // Close mobile menu when clicking a navigation link\n  if (sidebar) {\n    const sidebarLinks = sidebar.querySelectorAll('a');\n    sidebarLinks.forEach(function(link) {\n      link.addEventListener('click', function() {\n        // Only close on mobile/tablet (up to 1024px)\n        if (window.innerWidth <= 1024) {\n          closeMobileMenu();\n        }\n      });\n    });\n  }\n\n  // Close mobile menu on window resize to desktop size\n  window.addEventListener('resize', function() {\n    if (window.innerWidth > 1024) {\n      closeMobileMenu();\n    }\n  });\n});\n"
  },
  {
    "path": "esbuild.config.js",
    "content": "import * as esbuild from 'esbuild';\nimport { umdWrapper } from 'esbuild-plugin-umd-wrapper';\nimport fs from 'fs';\n\nconst version = process.env.SEMANTIC_RELEASE_NEXT_VERSION || JSON.parse(fs.readFileSync('./package.json')).version;\n\nconsole.log('building version:', version);\n\nconst banner = `/**\n * marked v${version} - a markdown parser\n * Copyright (c) 2018-${new Date().getFullYear()}, MarkedJS. (MIT License)\n * Copyright (c) 2011-2018, Christopher Jeffrey. (MIT License)\n * https://github.com/markedjs/marked\n */\n\n/**\n * DO NOT EDIT THIS FILE\n * The code in this file is generated from files in ./src/\n */\n`;\n\nfunction config(options) {\n  return {\n    entryPoints: ['src/marked.ts'],\n    banner: {\n      js: banner,\n    },\n    sourcemap: true,\n    bundle: true,\n    minify: true,\n    ...(options.format === 'umd'\n      ? {\n        plugins: [umdWrapper({\n          libraryName: 'marked',\n        })],\n      }\n      : {}),\n    ...options,\n  };\n}\n\nawait esbuild.build(config({\n  format: 'esm',\n  outfile: 'lib/marked.esm.js',\n}));\n\nawait esbuild.build(config({\n  format: 'umd',\n  outfile: 'lib/marked.umd.js',\n}));\n"
  },
  {
    "path": "eslint.config.js",
    "content": "import markedEslintConfig from '@markedjs/eslint-config';\n\nexport default [\n  {\n    ignores: ['**/lib', '**/public', 'test.js', 'vuln.js'],\n  },\n  ...markedEslintConfig,\n];\n"
  },
  {
    "path": "man/marked.1.md",
    "content": "# marked(1) -- a javascript markdown parser\n\n## SYNOPSIS\n\n`marked` [`-o` <output file>] [`-i` <input file>] [`-s` <markdown string>] [`-c` <config file>] [`--help`] [`--version`] [`--tokens`] [`--no-clobber`] [`--pedantic`] [`--gfm`] [`--breaks`] [`--no-etc...`] [`--silent`] [filename]\n\n## DESCRIPTION\n\nmarked is a full-featured javascript markdown parser, built for speed.\nIt also includes multiple GFM features.\n\n## EXAMPLES\n\n```sh\ncat in.md | marked > out.html\n```\n\n```sh\necho \"hello *world*\" | marked\n```\n\n```sh\nmarked -o out.html -i in.md --gfm\n```\n\n```sh\nmarked --output=\"hello world.html\" -i in.md --no-breaks\n```\n\n## OPTIONS\n\n* -o, --output [output file]\nSpecify file output. If none is specified, write to stdout.\n\n* -i, --input [input file]\nSpecify file input, otherwise use last argument as input file.\nIf no input file is specified, read from stdin.\n\n* -s, --string [markdown string]\nSpecify string input instead of a file.\n\n* -c, --config [config file]\nSpecify config file to use instead of the default `~/.marked.json` or `~/.marked.js` or `~/.marked/index.js`.\n\n* -t, --tokens\nOutput a token list instead of html.\n\n* -n, --no-clobber\nDo not overwrite `output` if it exists.\n\n* --pedantic\nConform to obscure parts of markdown.pl as much as possible.\nDon't fix original markdown bugs.\n\n* --gfm\nEnable github flavored markdown.\n\n* --breaks\nEnable GFM line breaks. Only works with the gfm option.\n\n* --no-breaks, -no-etc...\nThe inverse of any of the marked options above.\n\n* --silent\nSilence error output.\n\n* -h, --help\nDisplay help information.\n\n## CONFIGURATION\n\nFor configuring and running programmatically.\n\nExample\n\n```js\nimport { Marked } from 'marked';\nconst marked = new Marked({ gfm: true });\nmarked.parse('*foo*');\n```\n\n## BUGS\n\nPlease report any bugs to <https://github.com/markedjs/marked>.\n\n## LICENSE\n\nCopyright (c) 2018+, MarkedJS. (MIT License)\nCopyright (c) 2011-2018, Christopher Jeffrey. (MIT License)\n\n## SEE ALSO\n\nmarkdown(1), nodejs(1)\n"
  },
  {
    "path": "package.json",
    "content": "{\n  \"name\": \"marked\",\n  \"description\": \"A markdown parser built for speed\",\n  \"author\": \"Christopher Jeffrey\",\n  \"version\": \"17.0.4\",\n  \"type\": \"module\",\n  \"main\": \"./lib/marked.esm.js\",\n  \"module\": \"./lib/marked.esm.js\",\n  \"browser\": \"./lib/marked.umd.js\",\n  \"types\": \"./lib/marked.d.ts\",\n  \"bin\": {\n    \"marked\": \"bin/marked.js\"\n  },\n  \"man\": \"./man/marked.1\",\n  \"files\": [\n    \"bin/\",\n    \"lib/\",\n    \"man/\"\n  ],\n  \"exports\": {\n    \".\": {\n      \"types\": \"./lib/marked.d.ts\",\n      \"default\": \"./lib/marked.esm.js\"\n    },\n    \"./bin/marked\": \"./bin/marked.js\",\n    \"./package.json\": \"./package.json\"\n  },\n  \"publishConfig\": {\n    \"provenance\": true\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git://github.com/markedjs/marked.git\"\n  },\n  \"homepage\": \"https://marked.js.org\",\n  \"bugs\": {\n    \"url\": \"http://github.com/markedjs/marked/issues\"\n  },\n  \"license\": \"MIT\",\n  \"keywords\": [\n    \"markdown\",\n    \"markup\",\n    \"html\"\n  ],\n  \"tags\": [\n    \"markdown\",\n    \"markup\",\n    \"html\"\n  ],\n  \"devDependencies\": {\n    \"@arethetypeswrong/cli\": \"^0.18.2\",\n    \"@markedjs/eslint-config\": \"^1.0.14\",\n    \"@markedjs/testutils\": \"17.0.1-2\",\n    \"@semantic-release/commit-analyzer\": \"^13.0.1\",\n    \"@semantic-release/git\": \"^10.0.1\",\n    \"@semantic-release/github\": \"^12.0.6\",\n    \"@semantic-release/npm\": \"^13.1.5\",\n    \"@semantic-release/release-notes-generator\": \"^14.1.0\",\n    \"cheerio\": \"1.2.0\",\n    \"commonmark\": \"0.31.2\",\n    \"cross-env\": \"^10.1.0\",\n    \"dts-bundle-generator\": \"^9.5.1\",\n    \"esbuild\": \"^0.27.4\",\n    \"esbuild-plugin-umd-wrapper\": \"^3.0.0\",\n    \"eslint\": \"^10.0.3\",\n    \"highlight.js\": \"^11.11.1\",\n    \"markdown-it\": \"14.1.1\",\n    \"marked-highlight\": \"^2.2.3\",\n    \"marked-man\": \"^2.1.0\",\n    \"recheck\": \"^4.5.0\",\n    \"rimraf\": \"^6.1.3\",\n    \"semantic-release\": \"^25.0.3\",\n    \"titleize\": \"^4.0.0\",\n    \"tslib\": \"^2.8.1\",\n    \"typescript\": \"5.9.3\"\n  },\n  \"scripts\": {\n    \"bench\": \"npm run build && node test/bench.js\",\n    \"build\": \"npm run build:esbuild && npm run build:types && npm run build:man\",\n    \"build:docs\": \"npm run build && node docs/build.js\",\n    \"build:esbuild\": \"node esbuild.config.js\",\n    \"build:man\": \"marked-man man/marked.1.md > man/marked.1\",\n    \"build:reset\": \"rimraf ./lib ./public\",\n    \"build:types\": \"tsc && dts-bundle-generator --export-referenced-types --project tsconfig.json -o lib/marked.d.ts src/marked.ts\",\n    \"lint\": \"eslint --fix\",\n    \"rules\": \"node test/rules.js\",\n    \"test\": \"npm run build:reset && npm run build:docs && npm run test:specs && npm run test:unit && npm run test:umd && npm run test:cjs && npm run test:types && npm run test:lint\",\n    \"test:cjs\": \"node test/cjs-test.cjs\",\n    \"test:lint\": \"eslint\",\n    \"test:only\": \"npm run build && npm run test:specs:only && npm run test:unit:only\",\n    \"test:redos\": \"node test/recheck.ts > vuln.js\",\n    \"test:specs:only\": \"node --test --test-only --test-reporter=spec test/run-spec-tests.js\",\n    \"test:specs\": \"node --test --test-reporter=spec test/run-spec-tests.js\",\n    \"test:types\": \"tsc --project tsconfig-type-test.json && attw -P --entrypoints . --profile esm-only\",\n    \"test:umd\": \"node test/umd-test.js\",\n    \"test:unit:only\": \"node --test --test-only --test-reporter=spec test/unit/*.test.js\",\n    \"test:unit\": \"node --test --test-reporter=spec test/unit/*.test.js\",\n    \"test:update\": \"node test/update-specs.js\"\n  },\n  \"engines\": {\n    \"node\": \">= 20\"\n  }\n}\n"
  },
  {
    "path": "src/Hooks.ts",
    "content": "import { _defaults } from './defaults.ts';\nimport { _Lexer } from './Lexer.ts';\nimport { _Parser } from './Parser.ts';\nimport type { MarkedOptions } from './MarkedOptions.ts';\nimport type { Token, TokensList } from './Tokens.ts';\n\nexport class _Hooks<ParserOutput = string, RendererOutput = string> {\n  options: MarkedOptions<ParserOutput, RendererOutput>;\n  block?: boolean;\n\n  constructor(options?: MarkedOptions<ParserOutput, RendererOutput>) {\n    this.options = options || _defaults;\n  }\n\n  static passThroughHooks = new Set([\n    'preprocess',\n    'postprocess',\n    'processAllTokens',\n    'emStrongMask',\n  ]);\n\n  static passThroughHooksRespectAsync = new Set([\n    'preprocess',\n    'postprocess',\n    'processAllTokens',\n  ]);\n\n  /**\n   * Process markdown before marked\n   */\n  preprocess(markdown: string) {\n    return markdown;\n  }\n\n  /**\n   * Process HTML after marked is finished\n   */\n  postprocess(html: ParserOutput) {\n    return html;\n  }\n\n  /**\n   * Process all tokens before walk tokens\n   */\n  processAllTokens(tokens: Token[] | TokensList) {\n    return tokens;\n  }\n\n  /**\n   * Mask contents that should not be interpreted as em/strong delimiters\n   */\n  emStrongMask(src: string) {\n    return src;\n  }\n\n  /**\n   * Provide function to tokenize markdown\n   */\n  provideLexer() {\n    return this.block ? _Lexer.lex : _Lexer.lexInline;\n  }\n\n  /**\n   * Provide function to parse tokens\n   */\n  provideParser() {\n    return this.block ? _Parser.parse<ParserOutput, RendererOutput> : _Parser.parseInline<ParserOutput, RendererOutput>;\n  }\n}\n"
  },
  {
    "path": "src/Instance.ts",
    "content": "import { _getDefaults } from './defaults.ts';\nimport { _Lexer } from './Lexer.ts';\nimport { _Parser } from './Parser.ts';\nimport { _Hooks } from './Hooks.ts';\nimport { _Renderer } from './Renderer.ts';\nimport { _Tokenizer } from './Tokenizer.ts';\nimport { _TextRenderer } from './TextRenderer.ts';\nimport { escapeHtmlEntities } from './helpers.ts';\nimport type { MarkedExtension, MarkedOptions } from './MarkedOptions.ts';\nimport type { Token, Tokens, TokensList } from './Tokens.ts';\n\nexport type MaybePromise = void | Promise<void>;\n\ntype UnknownFunction = (...args: unknown[]) => unknown;\ntype GenericRendererFunction = (...args: unknown[]) => string | false;\n\nexport class Marked<ParserOutput = string, RendererOutput = string> {\n  defaults = _getDefaults<ParserOutput, RendererOutput>();\n  options = this.setOptions;\n\n  parse = this.parseMarkdown(true);\n  parseInline = this.parseMarkdown(false);\n\n  Parser = _Parser<ParserOutput, RendererOutput>;\n  Renderer = _Renderer<ParserOutput, RendererOutput>;\n  TextRenderer = _TextRenderer<RendererOutput>;\n  Lexer = _Lexer;\n  Tokenizer = _Tokenizer<ParserOutput, RendererOutput>;\n  Hooks = _Hooks<ParserOutput, RendererOutput>;\n\n  constructor(...args: MarkedExtension<ParserOutput, RendererOutput>[]) {\n    this.use(...args);\n  }\n\n  /**\n   * Run callback for every token\n   */\n  walkTokens(tokens: Token[] | TokensList, callback: (token: Token) => MaybePromise | MaybePromise[]) {\n    let values: MaybePromise[] = [];\n    for (const token of tokens) {\n      values = values.concat(callback.call(this, token));\n      switch (token.type) {\n        case 'table': {\n          const tableToken = token as Tokens.Table;\n          for (const cell of tableToken.header) {\n            values = values.concat(this.walkTokens(cell.tokens, callback));\n          }\n          for (const row of tableToken.rows) {\n            for (const cell of row) {\n              values = values.concat(this.walkTokens(cell.tokens, callback));\n            }\n          }\n          break;\n        }\n        case 'list': {\n          const listToken = token as Tokens.List;\n          values = values.concat(this.walkTokens(listToken.items, callback));\n          break;\n        }\n        default: {\n          const genericToken = token as Tokens.Generic;\n          if (this.defaults.extensions?.childTokens?.[genericToken.type]) {\n            this.defaults.extensions.childTokens[genericToken.type].forEach((childTokens) => {\n              const tokens = genericToken[childTokens].flat(Infinity) as Token[] | TokensList;\n              values = values.concat(this.walkTokens(tokens, callback));\n            });\n          } else if (genericToken.tokens) {\n            values = values.concat(this.walkTokens(genericToken.tokens, callback));\n          }\n        }\n      }\n    }\n    return values;\n  }\n\n  use(...args: MarkedExtension<ParserOutput, RendererOutput>[]) {\n    const extensions: MarkedOptions<ParserOutput, RendererOutput>['extensions'] = this.defaults.extensions || { renderers: {}, childTokens: {} };\n\n    args.forEach((pack) => {\n      // copy options to new object\n      const opts = { ...pack } as MarkedOptions<ParserOutput, RendererOutput>;\n\n      // set async to true if it was set to true before\n      opts.async = this.defaults.async || opts.async || false;\n\n      // ==-- Parse \"addon\" extensions --== //\n      if (pack.extensions) {\n        pack.extensions.forEach((ext) => {\n          if (!ext.name) {\n            throw new Error('extension name required');\n          }\n          if ('renderer' in ext) { // Renderer extensions\n            const prevRenderer = extensions.renderers[ext.name];\n            if (prevRenderer) {\n              // Replace extension with func to run new extension but fall back if false\n              extensions.renderers[ext.name] = function(...args) {\n                let ret = ext.renderer.apply(this, args);\n                if (ret === false) {\n                  ret = prevRenderer.apply(this, args);\n                }\n                return ret;\n              };\n            } else {\n              extensions.renderers[ext.name] = ext.renderer;\n            }\n          }\n          if ('tokenizer' in ext) { // Tokenizer Extensions\n            if (!ext.level || (ext.level !== 'block' && ext.level !== 'inline')) {\n              throw new Error(\"extension level must be 'block' or 'inline'\");\n            }\n            const extLevel = extensions[ext.level];\n            if (extLevel) {\n              extLevel.unshift(ext.tokenizer);\n            } else {\n              extensions[ext.level] = [ext.tokenizer];\n            }\n            if (ext.start) { // Function to check for start of token\n              if (ext.level === 'block') {\n                if (extensions.startBlock) {\n                  extensions.startBlock.push(ext.start);\n                } else {\n                  extensions.startBlock = [ext.start];\n                }\n              } else if (ext.level === 'inline') {\n                if (extensions.startInline) {\n                  extensions.startInline.push(ext.start);\n                } else {\n                  extensions.startInline = [ext.start];\n                }\n              }\n            }\n          }\n          if ('childTokens' in ext && ext.childTokens) { // Child tokens to be visited by walkTokens\n            extensions.childTokens[ext.name] = ext.childTokens;\n          }\n        });\n        opts.extensions = extensions;\n      }\n\n      // ==-- Parse \"overwrite\" extensions --== //\n      if (pack.renderer) {\n        const renderer = this.defaults.renderer || new _Renderer<ParserOutput, RendererOutput>(this.defaults);\n        for (const prop in pack.renderer) {\n          if (!(prop in renderer)) {\n            throw new Error(`renderer '${prop}' does not exist`);\n          }\n          if (['options', 'parser'].includes(prop)) {\n            // ignore options property\n            continue;\n          }\n          const rendererProp = prop as Exclude<keyof _Renderer<ParserOutput, RendererOutput>, 'options' | 'parser'>;\n          const rendererFunc = pack.renderer[rendererProp] as GenericRendererFunction;\n          const prevRenderer = renderer[rendererProp] as GenericRendererFunction;\n          // Replace renderer with func to run extension, but fall back if false\n          renderer[rendererProp] = (...args: unknown[]) => {\n            let ret = rendererFunc.apply(renderer, args);\n            if (ret === false) {\n              ret = prevRenderer.apply(renderer, args);\n            }\n            return (ret || '') as RendererOutput;\n          };\n        }\n        opts.renderer = renderer;\n      }\n      if (pack.tokenizer) {\n        const tokenizer = this.defaults.tokenizer || new _Tokenizer<ParserOutput, RendererOutput>(this.defaults);\n        for (const prop in pack.tokenizer) {\n          if (!(prop in tokenizer)) {\n            throw new Error(`tokenizer '${prop}' does not exist`);\n          }\n          if (['options', 'rules', 'lexer'].includes(prop)) {\n            // ignore options, rules, and lexer properties\n            continue;\n          }\n          const tokenizerProp = prop as Exclude<keyof _Tokenizer<ParserOutput, RendererOutput>, 'options' | 'rules' | 'lexer'>;\n          const tokenizerFunc = pack.tokenizer[tokenizerProp] as UnknownFunction;\n          const prevTokenizer = tokenizer[tokenizerProp] as UnknownFunction;\n          // Replace tokenizer with func to run extension, but fall back if false\n          // @ts-expect-error cannot type tokenizer function dynamically\n          tokenizer[tokenizerProp] = (...args: unknown[]) => {\n            let ret = tokenizerFunc.apply(tokenizer, args);\n            if (ret === false) {\n              ret = prevTokenizer.apply(tokenizer, args);\n            }\n            return ret;\n          };\n        }\n        opts.tokenizer = tokenizer;\n      }\n\n      // ==-- Parse Hooks extensions --== //\n      if (pack.hooks) {\n        const hooks = this.defaults.hooks || new _Hooks<ParserOutput, RendererOutput>();\n        for (const prop in pack.hooks) {\n          if (!(prop in hooks)) {\n            throw new Error(`hook '${prop}' does not exist`);\n          }\n          if (['options', 'block'].includes(prop)) {\n            // ignore options and block properties\n            continue;\n          }\n          const hooksProp = prop as Exclude<keyof _Hooks<ParserOutput, RendererOutput>, 'options' | 'block'>;\n          const hooksFunc = pack.hooks[hooksProp] as UnknownFunction;\n          const prevHook = hooks[hooksProp] as UnknownFunction;\n          if (_Hooks.passThroughHooks.has(prop)) {\n            // @ts-expect-error cannot type hook function dynamically\n            hooks[hooksProp] = (arg: unknown) => {\n              if (this.defaults.async && _Hooks.passThroughHooksRespectAsync.has(prop)) {\n                return (async() => {\n                  const ret = await hooksFunc.call(hooks, arg);\n                  return prevHook.call(hooks, ret);\n                })();\n              }\n\n              const ret = hooksFunc.call(hooks, arg);\n              return prevHook.call(hooks, ret);\n            };\n          } else {\n            // @ts-expect-error cannot type hook function dynamically\n            hooks[hooksProp] = (...args: unknown[]) => {\n              if (this.defaults.async) {\n                return (async() => {\n                  let ret = await hooksFunc.apply(hooks, args);\n                  if (ret === false) {\n                    ret = await prevHook.apply(hooks, args);\n                  }\n                  return ret;\n                })();\n              }\n\n              let ret = hooksFunc.apply(hooks, args);\n              if (ret === false) {\n                ret = prevHook.apply(hooks, args);\n              }\n              return ret;\n            };\n          }\n        }\n        opts.hooks = hooks;\n      }\n\n      // ==-- Parse WalkTokens extensions --== //\n      if (pack.walkTokens) {\n        const walkTokens = this.defaults.walkTokens;\n        const packWalktokens = pack.walkTokens;\n        opts.walkTokens = function(token) {\n          let values: MaybePromise[] = [];\n          values.push(packWalktokens.call(this, token));\n          if (walkTokens) {\n            values = values.concat(walkTokens.call(this, token));\n          }\n          return values;\n        };\n      }\n\n      this.defaults = { ...this.defaults, ...opts };\n    });\n\n    return this;\n  }\n\n  setOptions(opt: MarkedOptions<ParserOutput, RendererOutput>) {\n    this.defaults = { ...this.defaults, ...opt };\n    return this;\n  }\n\n  lexer(src: string, options?: MarkedOptions<ParserOutput, RendererOutput>) {\n    return _Lexer.lex(src, options ?? this.defaults);\n  }\n\n  parser(tokens: Token[], options?: MarkedOptions<ParserOutput, RendererOutput>) {\n    return _Parser.parse<ParserOutput, RendererOutput>(tokens, options ?? this.defaults);\n  }\n\n  private parseMarkdown(blockType: boolean) {\n    type overloadedParse = {\n      (src: string, options: MarkedOptions<ParserOutput, RendererOutput> & { async: true }): Promise<ParserOutput>;\n      (src: string, options: MarkedOptions<ParserOutput, RendererOutput> & { async: false }): ParserOutput;\n      (src: string, options?: MarkedOptions<ParserOutput, RendererOutput> | null): ParserOutput | Promise<ParserOutput>;\n    };\n\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    const parse: overloadedParse = (src: string, options?: MarkedOptions<ParserOutput, RendererOutput> | null): any => {\n      const origOpt = { ...options };\n      const opt = { ...this.defaults, ...origOpt };\n\n      const throwError = this.onError(!!opt.silent, !!opt.async);\n\n      // throw error if an extension set async to true but parse was called with async: false\n      if (this.defaults.async === true && origOpt.async === false) {\n        return throwError(new Error('marked(): The async option was set to true by an extension. Remove async: false from the parse options object to return a Promise.'));\n      }\n\n      // throw error in case of non string input\n      if (typeof src === 'undefined' || src === null) {\n        return throwError(new Error('marked(): input parameter is undefined or null'));\n      }\n      if (typeof src !== 'string') {\n        return throwError(new Error('marked(): input parameter is of type '\n          + Object.prototype.toString.call(src) + ', string expected'));\n      }\n\n      if (opt.hooks) {\n        opt.hooks.options = opt;\n        opt.hooks.block = blockType;\n      }\n\n      if (opt.async) {\n        return (async() => {\n          const processedSrc = opt.hooks ? await opt.hooks.preprocess(src) : src;\n          const lexer = opt.hooks ? await opt.hooks.provideLexer() : (blockType ? _Lexer.lex : _Lexer.lexInline);\n          const tokens = await lexer(processedSrc, opt);\n          const processedTokens = opt.hooks ? await opt.hooks.processAllTokens(tokens) : tokens;\n          if (opt.walkTokens) {\n            await Promise.all(this.walkTokens(processedTokens, opt.walkTokens));\n          }\n          const parser = opt.hooks ? await opt.hooks.provideParser() : (blockType ? _Parser.parse : _Parser.parseInline);\n          const html = await parser(processedTokens, opt);\n          return opt.hooks ? await opt.hooks.postprocess(html) : html;\n        })().catch(throwError);\n      }\n\n      try {\n        if (opt.hooks) {\n          src = opt.hooks.preprocess(src) as string;\n        }\n        const lexer = opt.hooks ? opt.hooks.provideLexer() : (blockType ? _Lexer.lex : _Lexer.lexInline);\n        let tokens = lexer(src, opt);\n        if (opt.hooks) {\n          tokens = opt.hooks.processAllTokens(tokens);\n        }\n        if (opt.walkTokens) {\n          this.walkTokens(tokens, opt.walkTokens);\n        }\n        const parser = opt.hooks ? opt.hooks.provideParser() : (blockType ? _Parser.parse : _Parser.parseInline);\n        let html = parser(tokens, opt);\n        if (opt.hooks) {\n          html = opt.hooks.postprocess(html);\n        }\n        return html;\n      } catch(e) {\n        return throwError(e as Error);\n      }\n    };\n\n    return parse;\n  }\n\n  private onError(silent: boolean, async: boolean) {\n    return (e: Error): string | Promise<string> => {\n      e.message += '\\nPlease report this to https://github.com/markedjs/marked.';\n\n      if (silent) {\n        const msg = '<p>An error occurred:</p><pre>'\n          + escapeHtmlEntities(e.message + '', true)\n          + '</pre>';\n        if (async) {\n          return Promise.resolve(msg);\n        }\n        return msg;\n      }\n\n      if (async) {\n        return Promise.reject(e);\n      }\n      throw e;\n    };\n  }\n}\n"
  },
  {
    "path": "src/Lexer.ts",
    "content": "import { _Tokenizer } from './Tokenizer.ts';\nimport { _defaults } from './defaults.ts';\nimport { other, block, inline } from './rules.ts';\nimport type { Token, TokensList, Tokens } from './Tokens.ts';\nimport type { MarkedOptions } from './MarkedOptions.ts';\n\n/**\n * Block Lexer\n */\nexport class _Lexer<ParserOutput = string, RendererOutput = string> {\n  tokens: TokensList;\n  options: MarkedOptions<ParserOutput, RendererOutput>;\n  state: {\n    inLink: boolean;\n    inRawBlock: boolean;\n    top: boolean;\n  };\n\n  public inlineQueue: { src: string, tokens: Token[] }[];\n\n  private tokenizer: _Tokenizer<ParserOutput, RendererOutput>;\n\n  constructor(options?: MarkedOptions<ParserOutput, RendererOutput>) {\n    // TokenList cannot be created in one go\n    this.tokens = [] as unknown as TokensList;\n    this.tokens.links = Object.create(null);\n    this.options = options || _defaults;\n    this.options.tokenizer = this.options.tokenizer || new _Tokenizer<ParserOutput, RendererOutput>();\n    this.tokenizer = this.options.tokenizer;\n    this.tokenizer.options = this.options;\n    this.tokenizer.lexer = this;\n    this.inlineQueue = [];\n    this.state = {\n      inLink: false,\n      inRawBlock: false,\n      top: true,\n    };\n\n    const rules = {\n      other,\n      block: block.normal,\n      inline: inline.normal,\n    };\n\n    if (this.options.pedantic) {\n      rules.block = block.pedantic;\n      rules.inline = inline.pedantic;\n    } else if (this.options.gfm) {\n      rules.block = block.gfm;\n      if (this.options.breaks) {\n        rules.inline = inline.breaks;\n      } else {\n        rules.inline = inline.gfm;\n      }\n    }\n    this.tokenizer.rules = rules;\n  }\n\n  /**\n   * Expose Rules\n   */\n  static get rules() {\n    return {\n      block,\n      inline,\n    };\n  }\n\n  /**\n   * Static Lex Method\n   */\n  static lex<ParserOutput = string, RendererOutput = string>(src: string, options?: MarkedOptions<ParserOutput, RendererOutput>) {\n    const lexer = new _Lexer<ParserOutput, RendererOutput>(options);\n    return lexer.lex(src);\n  }\n\n  /**\n   * Static Lex Inline Method\n   */\n  static lexInline<ParserOutput = string, RendererOutput = string>(src: string, options?: MarkedOptions<ParserOutput, RendererOutput>) {\n    const lexer = new _Lexer<ParserOutput, RendererOutput>(options);\n    return lexer.inlineTokens(src);\n  }\n\n  /**\n   * Preprocessing\n   */\n  lex(src: string) {\n    src = src.replace(other.carriageReturn, '\\n');\n\n    this.blockTokens(src, this.tokens);\n\n    for (let i = 0; i < this.inlineQueue.length; i++) {\n      const next = this.inlineQueue[i];\n      this.inlineTokens(next.src, next.tokens);\n    }\n    this.inlineQueue = [];\n\n    return this.tokens;\n  }\n\n  /**\n   * Lexing\n   */\n  blockTokens(src: string, tokens?: Token[], lastParagraphClipped?: boolean): Token[];\n  blockTokens(src: string, tokens?: TokensList, lastParagraphClipped?: boolean): TokensList;\n  blockTokens(src: string, tokens: Token[] = [], lastParagraphClipped = false) {\n    if (this.options.pedantic) {\n      src = src.replace(other.tabCharGlobal, '    ').replace(other.spaceLine, '');\n    }\n\n    while (src) {\n      let token: Tokens.Generic | undefined;\n\n      if (this.options.extensions?.block?.some((extTokenizer) => {\n        if (token = extTokenizer.call({ lexer: this }, src, tokens)) {\n          src = src.substring(token.raw.length);\n          tokens.push(token);\n          return true;\n        }\n        return false;\n      })) {\n        continue;\n      }\n\n      // newline\n      if (token = this.tokenizer.space(src)) {\n        src = src.substring(token.raw.length);\n        const lastToken = tokens.at(-1);\n        if (token.raw.length === 1 && lastToken !== undefined) {\n          // if there's a single \\n as a spacer, it's terminating the last line,\n          // so move it there so that we don't get unnecessary paragraph tags\n          lastToken.raw += '\\n';\n        } else {\n          tokens.push(token);\n        }\n        continue;\n      }\n\n      // code\n      if (token = this.tokenizer.code(src)) {\n        src = src.substring(token.raw.length);\n        const lastToken = tokens.at(-1);\n        // An indented code block cannot interrupt a paragraph.\n        if (lastToken?.type === 'paragraph' || lastToken?.type === 'text') {\n          lastToken.raw += (lastToken.raw.endsWith('\\n') ? '' : '\\n') + token.raw;\n          lastToken.text += '\\n' + token.text;\n          this.inlineQueue.at(-1)!.src = lastToken.text;\n        } else {\n          tokens.push(token);\n        }\n        continue;\n      }\n\n      // fences\n      if (token = this.tokenizer.fences(src)) {\n        src = src.substring(token.raw.length);\n        tokens.push(token);\n        continue;\n      }\n\n      // heading\n      if (token = this.tokenizer.heading(src)) {\n        src = src.substring(token.raw.length);\n        tokens.push(token);\n        continue;\n      }\n\n      // hr\n      if (token = this.tokenizer.hr(src)) {\n        src = src.substring(token.raw.length);\n        tokens.push(token);\n        continue;\n      }\n\n      // blockquote\n      if (token = this.tokenizer.blockquote(src)) {\n        src = src.substring(token.raw.length);\n        tokens.push(token);\n        continue;\n      }\n\n      // list\n      if (token = this.tokenizer.list(src)) {\n        src = src.substring(token.raw.length);\n        tokens.push(token);\n        continue;\n      }\n\n      // html\n      if (token = this.tokenizer.html(src)) {\n        src = src.substring(token.raw.length);\n        tokens.push(token);\n        continue;\n      }\n\n      // def\n      if (token = this.tokenizer.def(src)) {\n        src = src.substring(token.raw.length);\n        const lastToken = tokens.at(-1);\n        if (lastToken?.type === 'paragraph' || lastToken?.type === 'text') {\n          lastToken.raw += (lastToken.raw.endsWith('\\n') ? '' : '\\n') + token.raw;\n          lastToken.text += '\\n' + token.raw;\n          this.inlineQueue.at(-1)!.src = lastToken.text;\n        } else if (!this.tokens.links[token.tag]) {\n          this.tokens.links[token.tag] = {\n            href: token.href,\n            title: token.title,\n          };\n          tokens.push(token);\n        }\n        continue;\n      }\n\n      // table (gfm)\n      if (token = this.tokenizer.table(src)) {\n        src = src.substring(token.raw.length);\n        tokens.push(token);\n        continue;\n      }\n\n      // lheading\n      if (token = this.tokenizer.lheading(src)) {\n        src = src.substring(token.raw.length);\n        tokens.push(token);\n        continue;\n      }\n\n      // top-level paragraph\n      // prevent paragraph consuming extensions by clipping 'src' to extension start\n      let cutSrc = src;\n      if (this.options.extensions?.startBlock) {\n        let startIndex = Infinity;\n        const tempSrc = src.slice(1);\n        let tempStart;\n        this.options.extensions.startBlock.forEach((getStartIndex) => {\n          tempStart = getStartIndex.call({ lexer: this }, tempSrc);\n          if (typeof tempStart === 'number' && tempStart >= 0) {\n            startIndex = Math.min(startIndex, tempStart);\n          }\n        });\n        if (startIndex < Infinity && startIndex >= 0) {\n          cutSrc = src.substring(0, startIndex + 1);\n        }\n      }\n      if (this.state.top && (token = this.tokenizer.paragraph(cutSrc))) {\n        const lastToken = tokens.at(-1);\n        if (lastParagraphClipped && lastToken?.type === 'paragraph') {\n          lastToken.raw += (lastToken.raw.endsWith('\\n') ? '' : '\\n') + token.raw;\n          lastToken.text += '\\n' + token.text;\n          this.inlineQueue.pop();\n          this.inlineQueue.at(-1)!.src = lastToken.text;\n        } else {\n          tokens.push(token);\n        }\n        lastParagraphClipped = cutSrc.length !== src.length;\n        src = src.substring(token.raw.length);\n        continue;\n      }\n\n      // text\n      if (token = this.tokenizer.text(src)) {\n        src = src.substring(token.raw.length);\n        const lastToken = tokens.at(-1);\n        if (lastToken?.type === 'text') {\n          lastToken.raw += (lastToken.raw.endsWith('\\n') ? '' : '\\n') + token.raw;\n          lastToken.text += '\\n' + token.text;\n          this.inlineQueue.pop();\n          this.inlineQueue.at(-1)!.src = lastToken.text;\n        } else {\n          tokens.push(token);\n        }\n        continue;\n      }\n\n      if (src) {\n        const errMsg = 'Infinite loop on byte: ' + src.charCodeAt(0);\n        if (this.options.silent) {\n          console.error(errMsg);\n          break;\n        } else {\n          throw new Error(errMsg);\n        }\n      }\n    }\n\n    this.state.top = true;\n    return tokens;\n  }\n\n  inline(src: string, tokens: Token[] = []) {\n    this.inlineQueue.push({ src, tokens });\n    return tokens;\n  }\n\n  /**\n   * Lexing/Compiling\n   */\n  inlineTokens(src: string, tokens: Token[] = []): Token[] {\n    // String with links masked to avoid interference with em and strong\n    let maskedSrc = src;\n    let match: RegExpExecArray | null = null;\n\n    // Mask out reflinks\n    if (this.tokens.links) {\n      const links = Object.keys(this.tokens.links);\n      if (links.length > 0) {\n        while ((match = this.tokenizer.rules.inline.reflinkSearch.exec(maskedSrc)) != null) {\n          if (links.includes(match[0].slice(match[0].lastIndexOf('[') + 1, -1))) {\n            maskedSrc = maskedSrc.slice(0, match.index)\n              + '[' + 'a'.repeat(match[0].length - 2) + ']'\n              + maskedSrc.slice(this.tokenizer.rules.inline.reflinkSearch.lastIndex);\n          }\n        }\n      }\n    }\n\n    // Mask out escaped characters\n    while ((match = this.tokenizer.rules.inline.anyPunctuation.exec(maskedSrc)) != null) {\n      maskedSrc = maskedSrc.slice(0, match.index) + '++' + maskedSrc.slice(this.tokenizer.rules.inline.anyPunctuation.lastIndex);\n    }\n\n    // Mask out other blocks\n    let offset;\n    while ((match = this.tokenizer.rules.inline.blockSkip.exec(maskedSrc)) != null) {\n      offset = match[2] ? match[2].length : 0;\n      maskedSrc = maskedSrc.slice(0, match.index + offset) + '[' + 'a'.repeat(match[0].length - offset - 2) + ']' + maskedSrc.slice(this.tokenizer.rules.inline.blockSkip.lastIndex);\n    }\n\n    // Mask out blocks from extensions\n    maskedSrc = this.options.hooks?.emStrongMask?.call({ lexer: this }, maskedSrc) ?? maskedSrc;\n\n    let keepPrevChar = false;\n    let prevChar = '';\n    while (src) {\n      if (!keepPrevChar) {\n        prevChar = '';\n      }\n      keepPrevChar = false;\n\n      let token: Tokens.Generic | undefined;\n\n      // extensions\n      if (this.options.extensions?.inline?.some((extTokenizer) => {\n        if (token = extTokenizer.call({ lexer: this }, src, tokens)) {\n          src = src.substring(token.raw.length);\n          tokens.push(token);\n          return true;\n        }\n        return false;\n      })) {\n        continue;\n      }\n\n      // escape\n      if (token = this.tokenizer.escape(src)) {\n        src = src.substring(token.raw.length);\n        tokens.push(token);\n        continue;\n      }\n\n      // tag\n      if (token = this.tokenizer.tag(src)) {\n        src = src.substring(token.raw.length);\n        tokens.push(token);\n        continue;\n      }\n\n      // link\n      if (token = this.tokenizer.link(src)) {\n        src = src.substring(token.raw.length);\n        tokens.push(token);\n        continue;\n      }\n\n      // reflink, nolink\n      if (token = this.tokenizer.reflink(src, this.tokens.links)) {\n        src = src.substring(token.raw.length);\n        const lastToken = tokens.at(-1);\n        if (token.type === 'text' && lastToken?.type === 'text') {\n          lastToken.raw += token.raw;\n          lastToken.text += token.text;\n        } else {\n          tokens.push(token);\n        }\n        continue;\n      }\n\n      // em & strong\n      if (token = this.tokenizer.emStrong(src, maskedSrc, prevChar)) {\n        src = src.substring(token.raw.length);\n        tokens.push(token);\n        continue;\n      }\n\n      // code\n      if (token = this.tokenizer.codespan(src)) {\n        src = src.substring(token.raw.length);\n        tokens.push(token);\n        continue;\n      }\n\n      // br\n      if (token = this.tokenizer.br(src)) {\n        src = src.substring(token.raw.length);\n        tokens.push(token);\n        continue;\n      }\n\n      // del (gfm)\n      if (token = this.tokenizer.del(src, maskedSrc, prevChar)) {\n        src = src.substring(token.raw.length);\n        tokens.push(token);\n        continue;\n      }\n\n      // autolink\n      if (token = this.tokenizer.autolink(src)) {\n        src = src.substring(token.raw.length);\n        tokens.push(token);\n        continue;\n      }\n\n      // url (gfm)\n      if (!this.state.inLink && (token = this.tokenizer.url(src))) {\n        src = src.substring(token.raw.length);\n        tokens.push(token);\n        continue;\n      }\n\n      // text\n      // prevent inlineText consuming extensions by clipping 'src' to extension start\n      let cutSrc = src;\n      if (this.options.extensions?.startInline) {\n        let startIndex = Infinity;\n        const tempSrc = src.slice(1);\n        let tempStart;\n        this.options.extensions.startInline.forEach((getStartIndex) => {\n          tempStart = getStartIndex.call({ lexer: this }, tempSrc);\n          if (typeof tempStart === 'number' && tempStart >= 0) {\n            startIndex = Math.min(startIndex, tempStart);\n          }\n        });\n        if (startIndex < Infinity && startIndex >= 0) {\n          cutSrc = src.substring(0, startIndex + 1);\n        }\n      }\n      if (token = this.tokenizer.inlineText(cutSrc)) {\n        src = src.substring(token.raw.length);\n        if (token.raw.slice(-1) !== '_') { // Track prevChar before string of ____ started\n          prevChar = token.raw.slice(-1);\n        }\n        keepPrevChar = true;\n        const lastToken = tokens.at(-1);\n        if (lastToken?.type === 'text') {\n          lastToken.raw += token.raw;\n          lastToken.text += token.text;\n        } else {\n          tokens.push(token);\n        }\n        continue;\n      }\n\n      if (src) {\n        const errMsg = 'Infinite loop on byte: ' + src.charCodeAt(0);\n        if (this.options.silent) {\n          console.error(errMsg);\n          break;\n        } else {\n          throw new Error(errMsg);\n        }\n      }\n    }\n\n    return tokens;\n  }\n}\n"
  },
  {
    "path": "src/MarkedOptions.ts",
    "content": "import type { Token, Tokens, TokensList } from './Tokens.ts';\nimport type { _Parser } from './Parser.ts';\nimport type { _Lexer } from './Lexer.ts';\nimport type { _Renderer } from './Renderer.ts';\nimport type { _Tokenizer } from './Tokenizer.ts';\nimport type { _Hooks } from './Hooks.ts';\n\nexport interface TokenizerThis {\n  lexer: _Lexer;\n}\n\nexport type TokenizerExtensionFunction = (this: TokenizerThis, src: string, tokens: Token[] | TokensList) => Tokens.Generic | undefined;\n\nexport type TokenizerStartFunction = (this: TokenizerThis, src: string) => number | void;\n\nexport interface TokenizerExtension {\n  name: string;\n  level: 'block' | 'inline';\n  start?: TokenizerStartFunction;\n  tokenizer: TokenizerExtensionFunction;\n  childTokens?: string[];\n}\n\nexport interface RendererThis<ParserOutput = string, RendererOutput = string> {\n  parser: _Parser<ParserOutput, RendererOutput>;\n}\n\nexport type RendererExtensionFunction<ParserOutput = string, RendererOutput = string> = (this: RendererThis<ParserOutput, RendererOutput>, token: Tokens.Generic) => RendererOutput | false | undefined;\n\nexport interface RendererExtension<ParserOutput = string, RendererOutput = string> {\n  name: string;\n  renderer: RendererExtensionFunction<ParserOutput, RendererOutput>;\n}\n\nexport type TokenizerAndRendererExtension<ParserOutput = string, RendererOutput = string> = TokenizerExtension | RendererExtension<ParserOutput, RendererOutput> | (TokenizerExtension & RendererExtension<ParserOutput, RendererOutput>);\n\ntype HooksApi<ParserOutput = string, RendererOutput = string> = Omit<_Hooks<ParserOutput, RendererOutput>, 'constructor' | 'options' | 'block'>;\ntype HooksObject<ParserOutput = string, RendererOutput = string> = {\n  [K in keyof HooksApi<ParserOutput, RendererOutput>]?: (this: _Hooks<ParserOutput, RendererOutput>, ...args: Parameters<HooksApi<ParserOutput, RendererOutput>[K]>) => ReturnType<HooksApi<ParserOutput, RendererOutput>[K]> | Promise<ReturnType<HooksApi<ParserOutput, RendererOutput>[K]>>\n};\n\ntype RendererApi<ParserOutput = string, RendererOutput = string> = Omit<_Renderer<ParserOutput, RendererOutput>, 'constructor' | 'options' | 'parser'>;\ntype RendererObject<ParserOutput = string, RendererOutput = string> = {\n  [K in keyof RendererApi<ParserOutput, RendererOutput>]?: (this: _Renderer<ParserOutput, RendererOutput>, ...args: Parameters<RendererApi<ParserOutput, RendererOutput>[K]>) => ReturnType<RendererApi<ParserOutput, RendererOutput>[K]> | false\n};\n\ntype TokenizerApi<ParserOutput = string, RendererOutput = string> = Omit<_Tokenizer<ParserOutput, RendererOutput>, 'constructor' | 'options' | 'rules' | 'lexer'>;\ntype TokenizerObject<ParserOutput = string, RendererOutput = string> = {\n  [K in keyof TokenizerApi<ParserOutput, RendererOutput>]?: (this: _Tokenizer<ParserOutput, RendererOutput>, ...args: Parameters<TokenizerApi<ParserOutput, RendererOutput>[K]>) => ReturnType<TokenizerApi<ParserOutput, RendererOutput>[K]> | false\n};\n\nexport interface MarkedExtension<ParserOutput = string, RendererOutput = string> {\n  /**\n   * True will tell marked to await any walkTokens functions before parsing the tokens and returning an HTML string.\n   */\n  async?: boolean;\n\n  /**\n   * Enable GFM line breaks. This option requires the gfm option to be true.\n   */\n  breaks?: boolean;\n\n  /**\n   * Add tokenizers and renderers to marked\n   */\n  extensions?:\n    | TokenizerAndRendererExtension<ParserOutput, RendererOutput>[]\n    | null;\n\n  /**\n   * Enable GitHub flavored markdown.\n   */\n  gfm?: boolean;\n\n  /**\n   * Hooks are methods that hook into some part of marked.\n   * preprocess is called to process markdown before sending it to marked.\n   * processAllTokens is called with the TokensList before walkTokens.\n   * postprocess is called to process html after marked has finished parsing.\n   * emStrongMask is called to mask contents that should not be interpreted as em/strong delimiters.\n   * provideLexer is called to provide a function to tokenize markdown.\n   * provideParser is called to provide a function to parse tokens.\n   */\n  hooks?: HooksObject<ParserOutput, RendererOutput> | null;\n\n  /**\n   * Conform to obscure parts of markdown.pl as much as possible. Don't fix any of the original markdown bugs or poor behavior.\n   */\n  pedantic?: boolean;\n\n  /**\n   * Type: object Default: new Renderer()\n   *\n   * An object containing functions to render tokens to HTML.\n   */\n  renderer?: RendererObject<ParserOutput, RendererOutput> | null;\n\n  /**\n   * Shows an HTML error message when rendering fails.\n   */\n  silent?: boolean;\n\n  /**\n   * The tokenizer defines how to turn markdown text into tokens.\n   */\n  tokenizer?: TokenizerObject | null;\n\n  /**\n   * The walkTokens function gets called with every token.\n   * Child tokens are called before moving on to sibling tokens.\n   * Each token is passed by reference so updates are persisted when passed to the parser.\n   * The return value of the function is ignored.\n   */\n  walkTokens?: ((token: Token) => void | Promise<void>) | null;\n}\n\nexport interface MarkedOptions<ParserOutput = string, RendererOutput = string> extends Omit<MarkedExtension<ParserOutput, RendererOutput>, 'hooks' | 'renderer' | 'tokenizer' | 'extensions' | 'walkTokens'> {\n  /**\n   * Hooks are methods that hook into some part of marked.\n   */\n  hooks?: _Hooks<ParserOutput, RendererOutput> | null;\n\n  /**\n   * Type: object Default: new Renderer()\n   *\n   * An object containing functions to render tokens to HTML.\n   */\n  renderer?: _Renderer<ParserOutput, RendererOutput> | null;\n\n  /**\n   * The tokenizer defines how to turn markdown text into tokens.\n   */\n  tokenizer?: _Tokenizer<ParserOutput, RendererOutput> | null;\n\n  /**\n   * Custom extensions\n   */\n  extensions?: null | {\n    renderers: {\n      [name: string]: RendererExtensionFunction<ParserOutput, RendererOutput>;\n    };\n    childTokens: {\n      [name: string]: string[];\n    };\n    inline?: TokenizerExtensionFunction[];\n    block?: TokenizerExtensionFunction[];\n    startInline?: TokenizerStartFunction[];\n    startBlock?: TokenizerStartFunction[];\n  };\n\n  /**\n   * walkTokens function returns array of values for Promise.all\n   */\n  walkTokens?: null | ((token: Token) => void | Promise<void> | (void | Promise<void>)[]);\n}\n"
  },
  {
    "path": "src/Parser.ts",
    "content": "import { _Renderer } from './Renderer.ts';\nimport { _TextRenderer } from './TextRenderer.ts';\nimport { _defaults } from './defaults.ts';\nimport type { MarkedToken, Token, Tokens } from './Tokens.ts';\nimport type { MarkedOptions } from './MarkedOptions.ts';\n\n/**\n * Parsing & Compiling\n */\nexport class _Parser<ParserOutput = string, RendererOutput = string> {\n  options: MarkedOptions<ParserOutput, RendererOutput>;\n  renderer: _Renderer<ParserOutput, RendererOutput>;\n  textRenderer: _TextRenderer<RendererOutput>;\n  constructor(options?: MarkedOptions<ParserOutput, RendererOutput>) {\n    this.options = options || _defaults;\n    this.options.renderer = this.options.renderer || new _Renderer<ParserOutput, RendererOutput>();\n    this.renderer = this.options.renderer;\n    this.renderer.options = this.options;\n    this.renderer.parser = this;\n    this.textRenderer = new _TextRenderer<RendererOutput>();\n  }\n\n  /**\n   * Static Parse Method\n   */\n  static parse<ParserOutput = string, RendererOutput = string>(tokens: Token[], options?: MarkedOptions<ParserOutput, RendererOutput>) {\n    const parser = new _Parser<ParserOutput, RendererOutput>(options);\n    return parser.parse(tokens);\n  }\n\n  /**\n   * Static Parse Inline Method\n   */\n  static parseInline<ParserOutput = string, RendererOutput = string>(tokens: Token[], options?: MarkedOptions<ParserOutput, RendererOutput>) {\n    const parser = new _Parser<ParserOutput, RendererOutput>(options);\n    return parser.parseInline(tokens);\n  }\n\n  /**\n   * Parse Loop\n   */\n  parse(tokens: Token[]): ParserOutput {\n    let out = '';\n\n    for (let i = 0; i < tokens.length; i++) {\n      const anyToken = tokens[i];\n\n      // Run any renderer extensions\n      if (this.options.extensions?.renderers?.[anyToken.type]) {\n        const genericToken = anyToken as Tokens.Generic;\n        const ret = this.options.extensions.renderers[genericToken.type].call({ parser: this }, genericToken);\n        if (ret !== false || !['space', 'hr', 'heading', 'code', 'table', 'blockquote', 'list', 'html', 'def', 'paragraph', 'text'].includes(genericToken.type)) {\n          out += ret || '';\n          continue;\n        }\n      }\n\n      const token = anyToken as MarkedToken;\n\n      switch (token.type) {\n        case 'space': {\n          out += this.renderer.space(token);\n          break;\n        }\n        case 'hr': {\n          out += this.renderer.hr(token);\n          break;\n        }\n        case 'heading': {\n          out += this.renderer.heading(token);\n          break;\n        }\n        case 'code': {\n          out += this.renderer.code(token);\n          break;\n        }\n        case 'table': {\n          out += this.renderer.table(token);\n          break;\n        }\n        case 'blockquote': {\n          out += this.renderer.blockquote(token);\n          break;\n        }\n        case 'list': {\n          out += this.renderer.list(token);\n          break;\n        }\n        case 'checkbox': {\n          out += this.renderer.checkbox(token);\n          break;\n        }\n        case 'html': {\n          out += this.renderer.html(token);\n          break;\n        }\n        case 'def': {\n          out += this.renderer.def(token);\n          break;\n        }\n        case 'paragraph': {\n          out += this.renderer.paragraph(token);\n          break;\n        }\n        case 'text': {\n          out += this.renderer.text(token);\n          break;\n        }\n\n        default: {\n          const errMsg = 'Token with \"' + token.type + '\" type was not found.';\n          if (this.options.silent) {\n            console.error(errMsg);\n            return '' as ParserOutput;\n          } else {\n            throw new Error(errMsg);\n          }\n        }\n      }\n    }\n\n    return out as ParserOutput;\n  }\n\n  /**\n   * Parse Inline Tokens\n   */\n  parseInline(tokens: Token[], renderer: _Renderer<ParserOutput, RendererOutput> | _TextRenderer<RendererOutput> = this.renderer): ParserOutput {\n    let out = '';\n\n    for (let i = 0; i < tokens.length; i++) {\n      const anyToken = tokens[i];\n\n      // Run any renderer extensions\n      if (this.options.extensions?.renderers?.[anyToken.type]) {\n        const ret = this.options.extensions.renderers[anyToken.type].call({ parser: this }, anyToken);\n        if (ret !== false || !['escape', 'html', 'link', 'image', 'strong', 'em', 'codespan', 'br', 'del', 'text'].includes(anyToken.type)) {\n          out += ret || '';\n          continue;\n        }\n      }\n\n      const token = anyToken as MarkedToken;\n\n      switch (token.type) {\n        case 'escape': {\n          out += renderer.text(token);\n          break;\n        }\n        case 'html': {\n          out += renderer.html(token);\n          break;\n        }\n        case 'link': {\n          out += renderer.link(token);\n          break;\n        }\n        case 'image': {\n          out += renderer.image(token);\n          break;\n        }\n        case 'checkbox': {\n          out += renderer.checkbox(token);\n          break;\n        }\n        case 'strong': {\n          out += renderer.strong(token);\n          break;\n        }\n        case 'em': {\n          out += renderer.em(token);\n          break;\n        }\n        case 'codespan': {\n          out += renderer.codespan(token);\n          break;\n        }\n        case 'br': {\n          out += renderer.br(token);\n          break;\n        }\n        case 'del': {\n          out += renderer.del(token);\n          break;\n        }\n        case 'text': {\n          out += renderer.text(token);\n          break;\n        }\n        default: {\n          const errMsg = 'Token with \"' + token.type + '\" type was not found.';\n          if (this.options.silent) {\n            console.error(errMsg);\n            return '' as ParserOutput;\n          } else {\n            throw new Error(errMsg);\n          }\n        }\n      }\n    }\n    return out as ParserOutput;\n  }\n}\n"
  },
  {
    "path": "src/Renderer.ts",
    "content": "import { _defaults } from './defaults.ts';\nimport {\n  cleanUrl,\n  escapeHtmlEntities,\n} from './helpers.ts';\nimport { other } from './rules.ts';\nimport type { MarkedOptions } from './MarkedOptions.ts';\nimport type { Tokens } from './Tokens.ts';\nimport type { _Parser } from './Parser.ts';\n\n/**\n * Renderer\n */\nexport class _Renderer<ParserOutput = string, RendererOutput = string> {\n  options: MarkedOptions<ParserOutput, RendererOutput>;\n  parser!: _Parser<ParserOutput, RendererOutput>; // set by the parser\n  constructor(options?: MarkedOptions<ParserOutput, RendererOutput>) {\n    this.options = options || _defaults;\n  }\n\n  space(token: Tokens.Space): RendererOutput {\n    return '' as RendererOutput;\n  }\n\n  code({ text, lang, escaped }: Tokens.Code): RendererOutput {\n    const langString = (lang || '').match(other.notSpaceStart)?.[0];\n\n    const code = text.replace(other.endingNewline, '') + '\\n';\n\n    if (!langString) {\n      return '<pre><code>'\n        + (escaped ? code : escapeHtmlEntities(code, true))\n        + '</code></pre>\\n' as RendererOutput;\n    }\n\n    return '<pre><code class=\"language-'\n      + escapeHtmlEntities(langString)\n      + '\">'\n      + (escaped ? code : escapeHtmlEntities(code, true))\n      + '</code></pre>\\n' as RendererOutput;\n  }\n\n  blockquote({ tokens }: Tokens.Blockquote): RendererOutput {\n    const body = this.parser.parse(tokens);\n    return `<blockquote>\\n${body}</blockquote>\\n` as RendererOutput;\n  }\n\n  html({ text }: Tokens.HTML | Tokens.Tag): RendererOutput {\n    return text as RendererOutput;\n  }\n\n  def(token: Tokens.Def): RendererOutput {\n    return '' as RendererOutput;\n  }\n\n  heading({ tokens, depth }: Tokens.Heading): RendererOutput {\n    return `<h${depth}>${this.parser.parseInline(tokens)}</h${depth}>\\n` as RendererOutput;\n  }\n\n  hr(token: Tokens.Hr): RendererOutput {\n    return '<hr>\\n' as RendererOutput;\n  }\n\n  list(token: Tokens.List): RendererOutput {\n    const ordered = token.ordered;\n    const start = token.start;\n\n    let body = '';\n    for (let j = 0; j < token.items.length; j++) {\n      const item = token.items[j];\n      body += this.listitem(item);\n    }\n\n    const type = ordered ? 'ol' : 'ul';\n    const startAttr = (ordered && start !== 1) ? (' start=\"' + start + '\"') : '';\n    return '<' + type + startAttr + '>\\n' + body + '</' + type + '>\\n' as RendererOutput;\n  }\n\n  listitem(item: Tokens.ListItem): RendererOutput {\n    return `<li>${this.parser.parse(item.tokens)}</li>\\n` as RendererOutput;\n  }\n\n  checkbox({ checked }: Tokens.Checkbox): RendererOutput {\n    return '<input '\n      + (checked ? 'checked=\"\" ' : '')\n      + 'disabled=\"\" type=\"checkbox\"> ' as RendererOutput;\n  }\n\n  paragraph({ tokens }: Tokens.Paragraph): RendererOutput {\n    return `<p>${this.parser.parseInline(tokens)}</p>\\n` as RendererOutput;\n  }\n\n  table(token: Tokens.Table): RendererOutput {\n    let header = '';\n\n    // header\n    let cell = '';\n    for (let j = 0; j < token.header.length; j++) {\n      cell += this.tablecell(token.header[j]);\n    }\n    header += this.tablerow({ text: cell as ParserOutput });\n\n    let body = '';\n    for (let j = 0; j < token.rows.length; j++) {\n      const row = token.rows[j];\n\n      cell = '';\n      for (let k = 0; k < row.length; k++) {\n        cell += this.tablecell(row[k]);\n      }\n\n      body += this.tablerow({ text: cell as ParserOutput });\n    }\n    if (body) body = `<tbody>${body}</tbody>`;\n\n    return '<table>\\n'\n      + '<thead>\\n'\n      + header\n      + '</thead>\\n'\n      + body\n      + '</table>\\n' as RendererOutput;\n  }\n\n  tablerow({ text }: Tokens.TableRow<ParserOutput>): RendererOutput {\n    return `<tr>\\n${text}</tr>\\n` as RendererOutput;\n  }\n\n  tablecell(token: Tokens.TableCell): RendererOutput {\n    const content = this.parser.parseInline(token.tokens);\n    const type = token.header ? 'th' : 'td';\n    const tag = token.align\n      ? `<${type} align=\"${token.align}\">`\n      : `<${type}>`;\n    return tag + content + `</${type}>\\n` as RendererOutput;\n  }\n\n  /**\n   * span level renderer\n   */\n  strong({ tokens }: Tokens.Strong): RendererOutput {\n    return `<strong>${this.parser.parseInline(tokens)}</strong>` as RendererOutput;\n  }\n\n  em({ tokens }: Tokens.Em): RendererOutput {\n    return `<em>${this.parser.parseInline(tokens)}</em>` as RendererOutput;\n  }\n\n  codespan({ text }: Tokens.Codespan): RendererOutput {\n    return `<code>${escapeHtmlEntities(text, true)}</code>` as RendererOutput;\n  }\n\n  br(token: Tokens.Br): RendererOutput {\n    return '<br>' as RendererOutput;\n  }\n\n  del({ tokens }: Tokens.Del): RendererOutput {\n    return `<del>${this.parser.parseInline(tokens)}</del>` as RendererOutput;\n  }\n\n  link({ href, title, tokens }: Tokens.Link): RendererOutput {\n    const text = this.parser.parseInline(tokens) as string;\n    const cleanHref = cleanUrl(href);\n    if (cleanHref === null) {\n      return text as RendererOutput;\n    }\n    href = cleanHref;\n    let out = '<a href=\"' + href + '\"';\n    if (title) {\n      out += ' title=\"' + (escapeHtmlEntities(title)) + '\"';\n    }\n    out += '>' + text + '</a>';\n    return out as RendererOutput;\n  }\n\n  image({ href, title, text, tokens }: Tokens.Image): RendererOutput {\n    if (tokens) {\n      text = this.parser.parseInline(tokens, this.parser.textRenderer) as string;\n    }\n    const cleanHref = cleanUrl(href);\n    if (cleanHref === null) {\n      return escapeHtmlEntities(text) as RendererOutput;\n    }\n    href = cleanHref;\n\n    let out = `<img src=\"${href}\" alt=\"${escapeHtmlEntities(text)}\"`;\n    if (title) {\n      out += ` title=\"${escapeHtmlEntities(title)}\"`;\n    }\n    out += '>';\n    return out as RendererOutput;\n  }\n\n  text(token: Tokens.Text | Tokens.Escape): RendererOutput {\n    return 'tokens' in token && token.tokens\n      ? this.parser.parseInline(token.tokens) as unknown as RendererOutput\n      : ('escaped' in token && token.escaped ? token.text as RendererOutput : escapeHtmlEntities(token.text) as RendererOutput);\n  }\n}\n"
  },
  {
    "path": "src/TextRenderer.ts",
    "content": "import type { Tokens } from './Tokens.ts';\n\n/**\n * TextRenderer\n * returns only the textual part of the token\n */\nexport class _TextRenderer<RendererOutput = string> {\n  // no need for block level renderers\n  strong({ text }: Tokens.Strong): RendererOutput {\n    return text as RendererOutput;\n  }\n\n  em({ text }: Tokens.Em): RendererOutput {\n    return text as RendererOutput;\n  }\n\n  codespan({ text }: Tokens.Codespan): RendererOutput {\n    return text as RendererOutput;\n  }\n\n  del({ text }: Tokens.Del): RendererOutput {\n    return text as RendererOutput;\n  }\n\n  html({ text }: Tokens.HTML | Tokens.Tag): RendererOutput {\n    return text as RendererOutput;\n  }\n\n  text({ text }: Tokens.Text | Tokens.Escape | Tokens.Tag): RendererOutput {\n    return text as RendererOutput;\n  }\n\n  link({ text }: Tokens.Link): RendererOutput {\n    return '' + text as RendererOutput;\n  }\n\n  image({ text }: Tokens.Image): RendererOutput {\n    return '' + text as RendererOutput;\n  }\n\n  br(): RendererOutput {\n    return '' as RendererOutput;\n  }\n\n  checkbox({ raw }: Tokens.Checkbox): RendererOutput {\n    return raw as RendererOutput;\n  }\n}\n"
  },
  {
    "path": "src/Tokenizer.ts",
    "content": "import { _defaults } from './defaults.ts';\nimport {\n  rtrim,\n  splitCells,\n  findClosingBracket,\n  expandTabs,\n} from './helpers.ts';\nimport type { Rules } from './rules.ts';\nimport type { _Lexer } from './Lexer.ts';\nimport type { Links, Tokens, Token } from './Tokens.ts';\nimport type { MarkedOptions } from './MarkedOptions.ts';\n\nfunction outputLink(cap: string[], link: Pick<Tokens.Link, 'href' | 'title'>, raw: string, lexer: _Lexer, rules: Rules): Tokens.Link | Tokens.Image {\n  const href = link.href;\n  const title = link.title || null;\n  const text = cap[1].replace(rules.other.outputLinkReplace, '$1');\n\n  lexer.state.inLink = true;\n  const token: Tokens.Link | Tokens.Image = {\n    type: cap[0].charAt(0) === '!' ? 'image' : 'link',\n    raw,\n    href,\n    title,\n    text,\n    tokens: lexer.inlineTokens(text),\n  };\n  lexer.state.inLink = false;\n  return token;\n}\n\nfunction indentCodeCompensation(raw: string, text: string, rules: Rules) {\n  const matchIndentToCode = raw.match(rules.other.indentCodeCompensation);\n\n  if (matchIndentToCode === null) {\n    return text;\n  }\n\n  const indentToCode = matchIndentToCode[1];\n\n  return text\n    .split('\\n')\n    .map(node => {\n      const matchIndentInNode = node.match(rules.other.beginningSpace);\n      if (matchIndentInNode === null) {\n        return node;\n      }\n\n      const [indentInNode] = matchIndentInNode;\n\n      if (indentInNode.length >= indentToCode.length) {\n        return node.slice(indentToCode.length);\n      }\n\n      return node;\n    })\n    .join('\\n');\n}\n\n/**\n * Tokenizer\n */\nexport class _Tokenizer<ParserOutput = string, RendererOutput = string> {\n  options: MarkedOptions<ParserOutput, RendererOutput>;\n  rules!: Rules; // set by the lexer\n  lexer!: _Lexer<ParserOutput, RendererOutput>; // set by the lexer\n\n  constructor(options?: MarkedOptions<ParserOutput, RendererOutput>) {\n    this.options = options || _defaults;\n  }\n\n  space(src: string): Tokens.Space | undefined {\n    const cap = this.rules.block.newline.exec(src);\n    if (cap && cap[0].length > 0) {\n      return {\n        type: 'space',\n        raw: cap[0],\n      };\n    }\n  }\n\n  code(src: string): Tokens.Code | undefined {\n    const cap = this.rules.block.code.exec(src);\n    if (cap) {\n      const text = cap[0].replace(this.rules.other.codeRemoveIndent, '');\n      return {\n        type: 'code',\n        raw: cap[0],\n        codeBlockStyle: 'indented',\n        text: !this.options.pedantic\n          ? rtrim(text, '\\n')\n          : text,\n      };\n    }\n  }\n\n  fences(src: string): Tokens.Code | undefined {\n    const cap = this.rules.block.fences.exec(src);\n    if (cap) {\n      const raw = cap[0];\n      const text = indentCodeCompensation(raw, cap[3] || '', this.rules);\n\n      return {\n        type: 'code',\n        raw,\n        lang: cap[2] ? cap[2].trim().replace(this.rules.inline.anyPunctuation, '$1') : cap[2],\n        text,\n      };\n    }\n  }\n\n  heading(src: string): Tokens.Heading | undefined {\n    const cap = this.rules.block.heading.exec(src);\n    if (cap) {\n      let text = cap[2].trim();\n\n      // remove trailing #s\n      if (this.rules.other.endingHash.test(text)) {\n        const trimmed = rtrim(text, '#');\n        if (this.options.pedantic) {\n          text = trimmed.trim();\n        } else if (!trimmed || this.rules.other.endingSpaceChar.test(trimmed)) {\n          // CommonMark requires space before trailing #s\n          text = trimmed.trim();\n        }\n      }\n\n      return {\n        type: 'heading',\n        raw: cap[0],\n        depth: cap[1].length,\n        text,\n        tokens: this.lexer.inline(text),\n      };\n    }\n  }\n\n  hr(src: string): Tokens.Hr | undefined {\n    const cap = this.rules.block.hr.exec(src);\n    if (cap) {\n      return {\n        type: 'hr',\n        raw: rtrim(cap[0], '\\n'),\n      };\n    }\n  }\n\n  blockquote(src: string): Tokens.Blockquote | undefined {\n    const cap = this.rules.block.blockquote.exec(src);\n    if (cap) {\n      let lines = rtrim(cap[0], '\\n').split('\\n');\n      let raw = '';\n      let text = '';\n      const tokens: Token[] = [];\n\n      while (lines.length > 0) {\n        let inBlockquote = false;\n        const currentLines = [];\n\n        let i;\n        for (i = 0; i < lines.length; i++) {\n          // get lines up to a continuation\n          if (this.rules.other.blockquoteStart.test(lines[i])) {\n            currentLines.push(lines[i]);\n            inBlockquote = true;\n          } else if (!inBlockquote) {\n            currentLines.push(lines[i]);\n          } else {\n            break;\n          }\n        }\n        lines = lines.slice(i);\n\n        const currentRaw = currentLines.join('\\n');\n        const currentText = currentRaw\n          // precede setext continuation with 4 spaces so it isn't a setext\n          .replace(this.rules.other.blockquoteSetextReplace, '\\n    $1')\n          .replace(this.rules.other.blockquoteSetextReplace2, '');\n        raw = raw ? `${raw}\\n${currentRaw}` : currentRaw;\n        text = text ? `${text}\\n${currentText}` : currentText;\n\n        // parse blockquote lines as top level tokens\n        // merge paragraphs if this is a continuation\n        const top = this.lexer.state.top;\n        this.lexer.state.top = true;\n        this.lexer.blockTokens(currentText, tokens, true);\n        this.lexer.state.top = top;\n\n        // if there is no continuation then we are done\n        if (lines.length === 0) {\n          break;\n        }\n\n        const lastToken = tokens.at(-1);\n\n        if (lastToken?.type === 'code') {\n          // blockquote continuation cannot be preceded by a code block\n          break;\n        } else if (lastToken?.type === 'blockquote') {\n          // include continuation in nested blockquote\n          const oldToken = lastToken as Tokens.Blockquote;\n          const newText = oldToken.raw + '\\n' + lines.join('\\n');\n          const newToken = this.blockquote(newText)!;\n          tokens[tokens.length - 1] = newToken;\n\n          raw = raw.substring(0, raw.length - oldToken.raw.length) + newToken.raw;\n          text = text.substring(0, text.length - oldToken.text.length) + newToken.text;\n          break;\n        } else if (lastToken?.type === 'list') {\n          // include continuation in nested list\n          const oldToken = lastToken as Tokens.List;\n          const newText = oldToken.raw + '\\n' + lines.join('\\n');\n          const newToken = this.list(newText)!;\n          tokens[tokens.length - 1] = newToken;\n\n          raw = raw.substring(0, raw.length - lastToken.raw.length) + newToken.raw;\n          text = text.substring(0, text.length - oldToken.raw.length) + newToken.raw;\n          lines = newText.substring(tokens.at(-1)!.raw.length).split('\\n');\n          continue;\n        }\n      }\n\n      return {\n        type: 'blockquote',\n        raw,\n        tokens,\n        text,\n      };\n    }\n  }\n\n  list(src: string): Tokens.List | undefined {\n    let cap = this.rules.block.list.exec(src);\n    if (cap) {\n      let bull = cap[1].trim();\n      const isordered = bull.length > 1;\n\n      const list: Tokens.List = {\n        type: 'list',\n        raw: '',\n        ordered: isordered,\n        start: isordered ? +bull.slice(0, -1) : '',\n        loose: false,\n        items: [],\n      };\n\n      bull = isordered ? `\\\\d{1,9}\\\\${bull.slice(-1)}` : `\\\\${bull}`;\n\n      if (this.options.pedantic) {\n        bull = isordered ? bull : '[*+-]';\n      }\n\n      // Get next list item\n      const itemRegex = this.rules.other.listItemRegex(bull);\n      let endsWithBlankLine = false;\n      // Check if current bullet point can start a new List Item\n      while (src) {\n        let endEarly = false;\n        let raw = '';\n        let itemContents = '';\n        if (!(cap = itemRegex.exec(src))) {\n          break;\n        }\n\n        if (this.rules.block.hr.test(src)) { // End list if bullet was actually HR (possibly move into itemRegex?)\n          break;\n        }\n\n        raw = cap[0];\n        src = src.substring(raw.length);\n\n        let line = expandTabs(cap[2].split('\\n', 1)[0], cap[1].length);\n        let nextLine = src.split('\\n', 1)[0];\n        let blankLine = !line.trim();\n\n        let indent = 0;\n        if (this.options.pedantic) {\n          indent = 2;\n          itemContents = line.trimStart();\n        } else if (blankLine) {\n          indent = cap[1].length + 1;\n        } else {\n          indent = line.search(this.rules.other.nonSpaceChar); // Find first non-space char\n          indent = indent > 4 ? 1 : indent; // Treat indented code blocks (> 4 spaces) as having only 1 indent\n          itemContents = line.slice(indent);\n          indent += cap[1].length;\n        }\n\n        if (blankLine && this.rules.other.blankLine.test(nextLine)) { // Items begin with at most one blank line\n          raw += nextLine + '\\n';\n          src = src.substring(nextLine.length + 1);\n          endEarly = true;\n        }\n\n        if (!endEarly) {\n          const nextBulletRegex = this.rules.other.nextBulletRegex(indent);\n          const hrRegex = this.rules.other.hrRegex(indent);\n          const fencesBeginRegex = this.rules.other.fencesBeginRegex(indent);\n          const headingBeginRegex = this.rules.other.headingBeginRegex(indent);\n          const htmlBeginRegex = this.rules.other.htmlBeginRegex(indent);\n          const blockquoteBeginRegex = this.rules.other.blockquoteBeginRegex(indent);\n\n          // Check if following lines should be included in List Item\n          while (src) {\n            const rawLine = src.split('\\n', 1)[0];\n            let nextLineWithoutTabs;\n            nextLine = rawLine;\n\n            // Re-align to follow commonmark nesting rules\n            if (this.options.pedantic) {\n              nextLine = nextLine.replace(this.rules.other.listReplaceNesting, '  ');\n              nextLineWithoutTabs = nextLine;\n            } else {\n              nextLineWithoutTabs = nextLine.replace(this.rules.other.tabCharGlobal, '    ');\n            }\n\n            // End list item if found code fences\n            if (fencesBeginRegex.test(nextLine)) {\n              break;\n            }\n\n            // End list item if found start of new heading\n            if (headingBeginRegex.test(nextLine)) {\n              break;\n            }\n\n            // End list item if found start of html block\n            if (htmlBeginRegex.test(nextLine)) {\n              break;\n            }\n\n            // End list item if found start of blockquote\n            if (blockquoteBeginRegex.test(nextLine)) {\n              break;\n            }\n\n            // End list item if found start of new bullet\n            if (nextBulletRegex.test(nextLine)) {\n              break;\n            }\n\n            // Horizontal rule found\n            if (hrRegex.test(nextLine)) {\n              break;\n            }\n\n            if (nextLineWithoutTabs.search(this.rules.other.nonSpaceChar) >= indent || !nextLine.trim()) { // Dedent if possible\n              itemContents += '\\n' + nextLineWithoutTabs.slice(indent);\n            } else {\n              // not enough indentation\n              if (blankLine) {\n                break;\n              }\n\n              // paragraph continuation unless last line was a different block level element\n              if (line.replace(this.rules.other.tabCharGlobal, '    ').search(this.rules.other.nonSpaceChar) >= 4) { // indented code block\n                break;\n              }\n              if (fencesBeginRegex.test(line)) {\n                break;\n              }\n              if (headingBeginRegex.test(line)) {\n                break;\n              }\n              if (hrRegex.test(line)) {\n                break;\n              }\n\n              itemContents += '\\n' + nextLine;\n            }\n\n            blankLine = !nextLine.trim();\n\n            raw += rawLine + '\\n';\n            src = src.substring(rawLine.length + 1);\n            line = nextLineWithoutTabs.slice(indent);\n          }\n        }\n\n        if (!list.loose) {\n          // If the previous item ended with a blank line, the list is loose\n          if (endsWithBlankLine) {\n            list.loose = true;\n          } else if (this.rules.other.doubleBlankLine.test(raw)) {\n            endsWithBlankLine = true;\n          }\n        }\n\n        list.items.push({\n          type: 'list_item',\n          raw,\n          task: !!this.options.gfm && this.rules.other.listIsTask.test(itemContents),\n          loose: false,\n          text: itemContents,\n          tokens: [],\n        });\n\n        list.raw += raw;\n      }\n\n      // Do not consume newlines at end of final item. Alternatively, make itemRegex *start* with any newlines to simplify/speed up endsWithBlankLine logic\n      const lastItem = list.items.at(-1);\n      if (lastItem) {\n        lastItem.raw = lastItem.raw.trimEnd();\n        lastItem.text = lastItem.text.trimEnd();\n      } else {\n        // not a list since there were no items\n        return;\n      }\n      list.raw = list.raw.trimEnd();\n\n      // Item child tokens handled here at end because we needed to have the final item to trim it first\n      for (const item of list.items) {\n        this.lexer.state.top = false;\n        item.tokens = this.lexer.blockTokens(item.text, []);\n        if (item.task) {\n          // Remove checkbox markdown from item tokens\n          item.text = item.text.replace(this.rules.other.listReplaceTask, '');\n          if (item.tokens[0]?.type === 'text' || item.tokens[0]?.type === 'paragraph') {\n            item.tokens[0].raw = item.tokens[0].raw.replace(this.rules.other.listReplaceTask, '');\n            item.tokens[0].text = item.tokens[0].text.replace(this.rules.other.listReplaceTask, '');\n            for (let i = this.lexer.inlineQueue.length - 1; i >= 0; i--) {\n              if (this.rules.other.listIsTask.test(this.lexer.inlineQueue[i].src)) {\n                this.lexer.inlineQueue[i].src = this.lexer.inlineQueue[i].src.replace(this.rules.other.listReplaceTask, '');\n                break;\n              }\n            }\n          }\n\n          const taskRaw = this.rules.other.listTaskCheckbox.exec(item.raw);\n          if (taskRaw) {\n            const checkboxToken: Tokens.Checkbox = {\n              type: 'checkbox',\n              raw: taskRaw[0] + ' ',\n              checked: taskRaw[0] !== '[ ]',\n            };\n            item.checked = checkboxToken.checked;\n            if (list.loose) {\n              if (item.tokens[0] && ['paragraph', 'text'].includes(item.tokens[0].type) && 'tokens' in item.tokens[0] && item.tokens[0].tokens) {\n                item.tokens[0].raw = checkboxToken.raw + item.tokens[0].raw;\n                item.tokens[0].text = checkboxToken.raw + item.tokens[0].text;\n                item.tokens[0].tokens.unshift(checkboxToken);\n              } else {\n                item.tokens.unshift({\n                  type: 'paragraph',\n                  raw: checkboxToken.raw,\n                  text: checkboxToken.raw,\n                  tokens: [checkboxToken],\n                });\n              }\n            } else {\n              item.tokens.unshift(checkboxToken);\n            }\n          }\n        }\n\n        if (!list.loose) {\n          // Check if list should be loose\n          const spacers = item.tokens.filter(t => t.type === 'space');\n          const hasMultipleLineBreaks = spacers.length > 0 && spacers.some(t => this.rules.other.anyLine.test(t.raw));\n\n          list.loose = hasMultipleLineBreaks;\n        }\n      }\n\n      // Set all items to loose if list is loose\n      if (list.loose) {\n        for (const item of list.items) {\n          item.loose = true;\n          for (const token of item.tokens) {\n            if (token.type === 'text') {\n              token.type = 'paragraph';\n            }\n          }\n        }\n      }\n\n      return list;\n    }\n  }\n\n  html(src: string): Tokens.HTML | undefined {\n    const cap = this.rules.block.html.exec(src);\n    if (cap) {\n      const token: Tokens.HTML = {\n        type: 'html',\n        block: true,\n        raw: cap[0],\n        pre: cap[1] === 'pre' || cap[1] === 'script' || cap[1] === 'style',\n        text: cap[0],\n      };\n      return token;\n    }\n  }\n\n  def(src: string): Tokens.Def | undefined {\n    const cap = this.rules.block.def.exec(src);\n    if (cap) {\n      const tag = cap[1].toLowerCase().replace(this.rules.other.multipleSpaceGlobal, ' ');\n      const href = cap[2] ? cap[2].replace(this.rules.other.hrefBrackets, '$1').replace(this.rules.inline.anyPunctuation, '$1') : '';\n      const title = cap[3] ? cap[3].substring(1, cap[3].length - 1).replace(this.rules.inline.anyPunctuation, '$1') : cap[3];\n      return {\n        type: 'def',\n        tag,\n        raw: cap[0],\n        href,\n        title,\n      };\n    }\n  }\n\n  table(src: string): Tokens.Table | undefined {\n    const cap = this.rules.block.table.exec(src);\n    if (!cap) {\n      return;\n    }\n\n    if (!this.rules.other.tableDelimiter.test(cap[2])) {\n      // delimiter row must have a pipe (|) or colon (:) otherwise it is a setext heading\n      return;\n    }\n\n    const headers = splitCells(cap[1]);\n    const aligns = cap[2].replace(this.rules.other.tableAlignChars, '').split('|');\n    const rows = cap[3]?.trim() ? cap[3].replace(this.rules.other.tableRowBlankLine, '').split('\\n') : [];\n\n    const item: Tokens.Table = {\n      type: 'table',\n      raw: cap[0],\n      header: [],\n      align: [],\n      rows: [],\n    };\n\n    if (headers.length !== aligns.length) {\n      // header and align columns must be equal, rows can be different.\n      return;\n    }\n\n    for (const align of aligns) {\n      if (this.rules.other.tableAlignRight.test(align)) {\n        item.align.push('right');\n      } else if (this.rules.other.tableAlignCenter.test(align)) {\n        item.align.push('center');\n      } else if (this.rules.other.tableAlignLeft.test(align)) {\n        item.align.push('left');\n      } else {\n        item.align.push(null);\n      }\n    }\n\n    for (let i = 0; i < headers.length; i++) {\n      item.header.push({\n        text: headers[i],\n        tokens: this.lexer.inline(headers[i]),\n        header: true,\n        align: item.align[i],\n      });\n    }\n\n    for (const row of rows) {\n      item.rows.push(splitCells(row, item.header.length).map((cell, i) => {\n        return {\n          text: cell,\n          tokens: this.lexer.inline(cell),\n          header: false,\n          align: item.align[i],\n        };\n      }));\n    }\n\n    return item;\n  }\n\n  lheading(src: string): Tokens.Heading | undefined {\n    const cap = this.rules.block.lheading.exec(src);\n    if (cap) {\n      return {\n        type: 'heading',\n        raw: cap[0],\n        depth: cap[2].charAt(0) === '=' ? 1 : 2,\n        text: cap[1],\n        tokens: this.lexer.inline(cap[1]),\n      };\n    }\n  }\n\n  paragraph(src: string): Tokens.Paragraph | undefined {\n    const cap = this.rules.block.paragraph.exec(src);\n    if (cap) {\n      const text = cap[1].charAt(cap[1].length - 1) === '\\n'\n        ? cap[1].slice(0, -1)\n        : cap[1];\n      return {\n        type: 'paragraph',\n        raw: cap[0],\n        text,\n        tokens: this.lexer.inline(text),\n      };\n    }\n  }\n\n  text(src: string): Tokens.Text | undefined {\n    const cap = this.rules.block.text.exec(src);\n    if (cap) {\n      return {\n        type: 'text',\n        raw: cap[0],\n        text: cap[0],\n        tokens: this.lexer.inline(cap[0]),\n      };\n    }\n  }\n\n  escape(src: string): Tokens.Escape | undefined {\n    const cap = this.rules.inline.escape.exec(src);\n    if (cap) {\n      return {\n        type: 'escape',\n        raw: cap[0],\n        text: cap[1],\n      };\n    }\n  }\n\n  tag(src: string): Tokens.Tag | undefined {\n    const cap = this.rules.inline.tag.exec(src);\n    if (cap) {\n      if (!this.lexer.state.inLink && this.rules.other.startATag.test(cap[0])) {\n        this.lexer.state.inLink = true;\n      } else if (this.lexer.state.inLink && this.rules.other.endATag.test(cap[0])) {\n        this.lexer.state.inLink = false;\n      }\n      if (!this.lexer.state.inRawBlock && this.rules.other.startPreScriptTag.test(cap[0])) {\n        this.lexer.state.inRawBlock = true;\n      } else if (this.lexer.state.inRawBlock && this.rules.other.endPreScriptTag.test(cap[0])) {\n        this.lexer.state.inRawBlock = false;\n      }\n\n      return {\n        type: 'html',\n        raw: cap[0],\n        inLink: this.lexer.state.inLink,\n        inRawBlock: this.lexer.state.inRawBlock,\n        block: false,\n        text: cap[0],\n      };\n    }\n  }\n\n  link(src: string): Tokens.Link | Tokens.Image | undefined {\n    const cap = this.rules.inline.link.exec(src);\n    if (cap) {\n      const trimmedUrl = cap[2].trim();\n      if (!this.options.pedantic && this.rules.other.startAngleBracket.test(trimmedUrl)) {\n        // commonmark requires matching angle brackets\n        if (!(this.rules.other.endAngleBracket.test(trimmedUrl))) {\n          return;\n        }\n\n        // ending angle bracket cannot be escaped\n        const rtrimSlash = rtrim(trimmedUrl.slice(0, -1), '\\\\');\n        if ((trimmedUrl.length - rtrimSlash.length) % 2 === 0) {\n          return;\n        }\n      } else {\n        // find closing parenthesis\n        const lastParenIndex = findClosingBracket(cap[2], '()');\n        if (lastParenIndex === -2) {\n          // more open parens than closed\n          return;\n        }\n\n        if (lastParenIndex > -1) {\n          const start = cap[0].indexOf('!') === 0 ? 5 : 4;\n          const linkLen = start + cap[1].length + lastParenIndex;\n          cap[2] = cap[2].substring(0, lastParenIndex);\n          cap[0] = cap[0].substring(0, linkLen).trim();\n          cap[3] = '';\n        }\n      }\n      let href = cap[2];\n      let title = '';\n      if (this.options.pedantic) {\n        // split pedantic href and title\n        const link = this.rules.other.pedanticHrefTitle.exec(href);\n\n        if (link) {\n          href = link[1];\n          title = link[3];\n        }\n      } else {\n        title = cap[3] ? cap[3].slice(1, -1) : '';\n      }\n\n      href = href.trim();\n      if (this.rules.other.startAngleBracket.test(href)) {\n        if (this.options.pedantic && !(this.rules.other.endAngleBracket.test(trimmedUrl))) {\n          // pedantic allows starting angle bracket without ending angle bracket\n          href = href.slice(1);\n        } else {\n          href = href.slice(1, -1);\n        }\n      }\n      return outputLink(cap, {\n        href: href ? href.replace(this.rules.inline.anyPunctuation, '$1') : href,\n        title: title ? title.replace(this.rules.inline.anyPunctuation, '$1') : title,\n      }, cap[0], this.lexer, this.rules);\n    }\n  }\n\n  reflink(src: string, links: Links): Tokens.Link | Tokens.Image | Tokens.Text | undefined {\n    let cap;\n    if ((cap = this.rules.inline.reflink.exec(src))\n      || (cap = this.rules.inline.nolink.exec(src))) {\n      const linkString = (cap[2] || cap[1]).replace(this.rules.other.multipleSpaceGlobal, ' ');\n      const link = links[linkString.toLowerCase()];\n      if (!link) {\n        const text = cap[0].charAt(0);\n        return {\n          type: 'text',\n          raw: text,\n          text,\n        };\n      }\n      return outputLink(cap, link, cap[0], this.lexer, this.rules);\n    }\n  }\n\n  emStrong(src: string, maskedSrc: string, prevChar = ''): Tokens.Em | Tokens.Strong | undefined {\n    let match = this.rules.inline.emStrongLDelim.exec(src);\n    if (!match) return;\n\n    // _ can't be between two alphanumerics. \\p{L}\\p{N} includes non-english alphabet/numbers as well\n    if (match[3] && prevChar.match(this.rules.other.unicodeAlphaNumeric)) return;\n\n    const nextChar = match[1] || match[2] || '';\n\n    if (!nextChar || !prevChar || this.rules.inline.punctuation.exec(prevChar)) {\n      // unicode Regex counts emoji as 1 char; spread into array for proper count (used multiple times below)\n      const lLength = [...match[0]].length - 1;\n      let rDelim, rLength, delimTotal = lLength, midDelimTotal = 0;\n\n      const endReg = match[0][0] === '*' ? this.rules.inline.emStrongRDelimAst : this.rules.inline.emStrongRDelimUnd;\n      endReg.lastIndex = 0;\n\n      // Clip maskedSrc to same section of string as src (move to lexer?)\n      maskedSrc = maskedSrc.slice(-1 * src.length + lLength);\n\n      while ((match = endReg.exec(maskedSrc)) != null) {\n        rDelim = match[1] || match[2] || match[3] || match[4] || match[5] || match[6];\n\n        if (!rDelim) continue; // skip single * in __abc*abc__\n\n        rLength = [...rDelim].length;\n\n        if (match[3] || match[4]) { // found another Left Delim\n          delimTotal += rLength;\n          continue;\n        } else if (match[5] || match[6]) { // either Left or Right Delim\n          if (lLength % 3 && !((lLength + rLength) % 3)) {\n            midDelimTotal += rLength;\n            continue; // CommonMark Emphasis Rules 9-10\n          }\n        }\n\n        delimTotal -= rLength;\n\n        if (delimTotal > 0) continue; // Haven't found enough closing delimiters\n\n        // Remove extra characters. *a*** -> *a*\n        rLength = Math.min(rLength, rLength + delimTotal + midDelimTotal);\n        // char length can be >1 for unicode characters;\n        const lastCharLength = [...match[0]][0].length;\n        const raw = src.slice(0, lLength + match.index + lastCharLength + rLength);\n\n        // Create `em` if smallest delimiter has odd char count. *a***\n        if (Math.min(lLength, rLength) % 2) {\n          const text = raw.slice(1, -1);\n          return {\n            type: 'em',\n            raw,\n            text,\n            tokens: this.lexer.inlineTokens(text),\n          };\n        }\n\n        // Create 'strong' if smallest delimiter has even char count. **a***\n        const text = raw.slice(2, -2);\n        return {\n          type: 'strong',\n          raw,\n          text,\n          tokens: this.lexer.inlineTokens(text),\n        };\n      }\n    }\n  }\n\n  codespan(src: string): Tokens.Codespan | undefined {\n    const cap = this.rules.inline.code.exec(src);\n    if (cap) {\n      let text = cap[2].replace(this.rules.other.newLineCharGlobal, ' ');\n      const hasNonSpaceChars = this.rules.other.nonSpaceChar.test(text);\n      const hasSpaceCharsOnBothEnds = this.rules.other.startingSpaceChar.test(text) && this.rules.other.endingSpaceChar.test(text);\n      if (hasNonSpaceChars && hasSpaceCharsOnBothEnds) {\n        text = text.substring(1, text.length - 1);\n      }\n      return {\n        type: 'codespan',\n        raw: cap[0],\n        text,\n      };\n    }\n  }\n\n  br(src: string): Tokens.Br | undefined {\n    const cap = this.rules.inline.br.exec(src);\n    if (cap) {\n      return {\n        type: 'br',\n        raw: cap[0],\n      };\n    }\n  }\n\n  del(src: string, maskedSrc: string, prevChar = ''): Tokens.Del | undefined {\n    let match = this.rules.inline.delLDelim.exec(src);\n    if (!match) return;\n\n    const nextChar = match[1] || '';\n\n    if (!nextChar || !prevChar || this.rules.inline.punctuation.exec(prevChar)) {\n      // unicode Regex counts emoji as 1 char; spread into array for proper count\n      const lLength = [...match[0]].length - 1;\n      let rDelim, rLength, delimTotal = lLength;\n\n      const endReg = this.rules.inline.delRDelim;\n      endReg.lastIndex = 0;\n\n      // Clip maskedSrc to same section of string as src\n      maskedSrc = maskedSrc.slice(-1 * src.length + lLength);\n\n      while ((match = endReg.exec(maskedSrc)) != null) {\n        rDelim = match[1] || match[2] || match[3] || match[4] || match[5] || match[6];\n\n        if (!rDelim) continue;\n\n        rLength = [...rDelim].length;\n\n        if (rLength !== lLength) continue;\n\n        if (match[3] || match[4]) { // found another Left Delim\n          delimTotal += rLength;\n          continue;\n        }\n\n        delimTotal -= rLength;\n\n        if (delimTotal > 0) continue; // Haven't found enough closing delimiters\n\n        // Remove extra characters\n        rLength = Math.min(rLength, rLength + delimTotal);\n        // char length can be >1 for unicode characters\n        const lastCharLength = [...match[0]][0].length;\n        const raw = src.slice(0, lLength + match.index + lastCharLength + rLength);\n\n        // Create del token - only single ~ or double ~~ supported\n        const text = raw.slice(lLength, -lLength);\n        return {\n          type: 'del',\n          raw,\n          text,\n          tokens: this.lexer.inlineTokens(text),\n        };\n      }\n    }\n  }\n\n  autolink(src: string): Tokens.Link | undefined {\n    const cap = this.rules.inline.autolink.exec(src);\n    if (cap) {\n      let text, href;\n      if (cap[2] === '@') {\n        text = cap[1];\n        href = 'mailto:' + text;\n      } else {\n        text = cap[1];\n        href = text;\n      }\n\n      return {\n        type: 'link',\n        raw: cap[0],\n        text,\n        href,\n        tokens: [\n          {\n            type: 'text',\n            raw: text,\n            text,\n          },\n        ],\n      };\n    }\n  }\n\n  url(src: string): Tokens.Link | undefined {\n    let cap;\n    if (cap = this.rules.inline.url.exec(src)) {\n      let text, href;\n      if (cap[2] === '@') {\n        text = cap[0];\n        href = 'mailto:' + text;\n      } else {\n        // do extended autolink path validation\n        let prevCapZero;\n        do {\n          prevCapZero = cap[0];\n          cap[0] = this.rules.inline._backpedal.exec(cap[0])?.[0] ?? '';\n        } while (prevCapZero !== cap[0]);\n        text = cap[0];\n        if (cap[1] === 'www.') {\n          href = 'http://' + cap[0];\n        } else {\n          href = cap[0];\n        }\n      }\n      return {\n        type: 'link',\n        raw: cap[0],\n        text,\n        href,\n        tokens: [\n          {\n            type: 'text',\n            raw: text,\n            text,\n          },\n        ],\n      };\n    }\n  }\n\n  inlineText(src: string): Tokens.Text | undefined {\n    const cap = this.rules.inline.text.exec(src);\n    if (cap) {\n      const escaped = this.lexer.state.inRawBlock;\n      return {\n        type: 'text',\n        raw: cap[0],\n        text: cap[0],\n        escaped,\n      };\n    }\n  }\n}\n"
  },
  {
    "path": "src/Tokens.ts",
    "content": "/* eslint-disable no-use-before-define */\n\nexport type MarkedToken = (\n  Tokens.Blockquote\n  | Tokens.Br\n  | Tokens.Checkbox\n  | Tokens.Code\n  | Tokens.Codespan\n  | Tokens.Def\n  | Tokens.Del\n  | Tokens.Em\n  | Tokens.Escape\n  | Tokens.Heading\n  | Tokens.Hr\n  | Tokens.HTML\n  | Tokens.Image\n  | Tokens.Link\n  | Tokens.List\n  | Tokens.ListItem\n  | Tokens.Paragraph\n  | Tokens.Space\n  | Tokens.Strong\n  | Tokens.Table\n  | Tokens.Tag\n  | Tokens.Text\n);\n\nexport type Token = (\n  MarkedToken\n  | Tokens.Generic);\n\nexport namespace Tokens {\n  export interface Blockquote {\n    type: 'blockquote';\n    raw: string;\n    text: string;\n    tokens: Token[];\n  }\n\n  export interface Br {\n    type: 'br';\n    raw: string;\n  }\n\n  export interface Checkbox {\n    type: 'checkbox';\n    raw: string;\n    checked: boolean;\n  }\n\n  export interface Code {\n    type: 'code';\n    raw: string;\n    codeBlockStyle?: 'indented';\n    lang?: string;\n    text: string;\n    escaped?: boolean;\n  }\n\n  export interface Codespan {\n    type: 'codespan';\n    raw: string;\n    text: string;\n  }\n\n  export interface Def {\n    type: 'def';\n    raw: string;\n    tag: string;\n    href: string;\n    title: string;\n  }\n\n  export interface Del {\n    type: 'del';\n    raw: string;\n    text: string;\n    tokens: Token[];\n  }\n\n  export interface Em {\n    type: 'em';\n    raw: string;\n    text: string;\n    tokens: Token[];\n  }\n\n  export interface Escape {\n    type: 'escape';\n    raw: string;\n    text: string;\n  }\n\n  export interface Generic {\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    [index: string]: any;\n    type: string;\n    raw: string;\n    tokens?: Token[];\n  }\n\n  export interface Heading {\n    type: 'heading';\n    raw: string;\n    depth: number;\n    text: string;\n    tokens: Token[];\n  }\n\n  export interface Hr {\n    type: 'hr';\n    raw: string;\n  }\n\n  export interface HTML {\n    type: 'html';\n    raw: string;\n    pre: boolean;\n    text: string;\n    block: boolean;\n  }\n\n  export interface Image {\n    type: 'image';\n    raw: string;\n    href: string;\n    title: string | null;\n    text: string;\n    tokens: Token[];\n  }\n\n  export interface Link {\n    type: 'link';\n    raw: string;\n    href: string;\n    title?: string | null;\n    text: string;\n    tokens: Token[];\n  }\n\n  export interface List {\n    type: 'list';\n    raw: string;\n    ordered: boolean;\n    start: number | '';\n    loose: boolean;\n    items: ListItem[];\n  }\n\n  export interface ListItem {\n    type: 'list_item';\n    raw: string;\n    task: boolean;\n    checked?: boolean;\n    loose: boolean;\n    text: string;\n    tokens: Token[];\n  }\n\n  export interface Paragraph {\n    type: 'paragraph';\n    raw: string;\n    pre?: boolean;\n    text: string;\n    tokens: Token[];\n  }\n\n  export interface Space {\n    type: 'space';\n    raw: string;\n  }\n\n  export interface Strong {\n    type: 'strong';\n    raw: string;\n    text: string;\n    tokens: Token[];\n  }\n\n  export interface Table {\n    type: 'table';\n    raw: string;\n    align: Array<'center' | 'left' | 'right' | null>;\n    header: TableCell[];\n    rows: TableCell[][];\n  }\n\n  export interface TableCell {\n    text: string;\n    tokens: Token[];\n    header: boolean;\n    align: 'center' | 'left' | 'right' | null;\n  }\n\n  export interface TableRow<P = string> {\n    text: P;\n  }\n\n  export interface Tag {\n    type: 'html';\n    raw: string;\n    inLink: boolean;\n    inRawBlock: boolean;\n    text: string;\n    block: boolean;\n  }\n\n  export interface Text {\n    type: 'text';\n    raw: string;\n    text: string;\n    tokens?: Token[];\n    escaped?: boolean;\n  }\n}\n\nexport type Links = Record<string, Pick<Tokens.Link | Tokens.Image, 'href' | 'title'>>;\n\nexport type TokensList = Token[] & {\n  links: Links;\n};\n"
  },
  {
    "path": "src/defaults.ts",
    "content": "import type { MarkedOptions } from './MarkedOptions.ts';\n\n/**\n * Gets the original marked default options.\n */\nexport function _getDefaults<ParserOutput = string, RendererOutput = string>(): MarkedOptions<ParserOutput, RendererOutput> {\n  return {\n    async: false,\n    breaks: false,\n    extensions: null,\n    gfm: true,\n    hooks: null,\n    pedantic: false,\n    renderer: null,\n    silent: false,\n    tokenizer: null,\n    walkTokens: null,\n  };\n}\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport let _defaults: MarkedOptions<any, any> = _getDefaults();\n\nexport function changeDefaults<ParserOutput = string, RendererOutput = string>(newDefaults: MarkedOptions<ParserOutput, RendererOutput>) {\n  _defaults = newDefaults;\n}\n"
  },
  {
    "path": "src/helpers.ts",
    "content": "import { other } from './rules.ts';\n\n/**\n * Helpers\n */\nconst escapeReplacements: { [index: string]: string } = {\n  '&': '&amp;',\n  '<': '&lt;',\n  '>': '&gt;',\n  '\"': '&quot;',\n  \"'\": '&#39;',\n};\nconst getEscapeReplacement = (ch: string) => escapeReplacements[ch];\n\nexport function escapeHtmlEntities(html: string, encode?: boolean) {\n  if (encode) {\n    if (other.escapeTest.test(html)) {\n      return html.replace(other.escapeReplace, getEscapeReplacement);\n    }\n  } else {\n    if (other.escapeTestNoEncode.test(html)) {\n      return html.replace(other.escapeReplaceNoEncode, getEscapeReplacement);\n    }\n  }\n\n  return html;\n}\n\nexport function cleanUrl(href: string) {\n  try {\n    href = encodeURI(href).replace(other.percentDecode, '%');\n  } catch {\n    return null;\n  }\n  return href;\n}\n\nexport function splitCells(tableRow: string, count?: number) {\n  // ensure that every cell-delimiting pipe has a space\n  // before it to distinguish it from an escaped pipe\n  const row = tableRow.replace(other.findPipe, (match, offset, str) => {\n      let escaped = false;\n      let curr = offset;\n      while (--curr >= 0 && str[curr] === '\\\\') escaped = !escaped;\n      if (escaped) {\n        // odd number of slashes means | is escaped\n        // so we leave it alone\n        return '|';\n      } else {\n        // add space before unescaped |\n        return ' |';\n      }\n    }),\n    cells = row.split(other.splitPipe);\n  let i = 0;\n\n  // First/last cell in a row cannot be empty if it has no leading/trailing pipe\n  if (!cells[0].trim()) {\n    cells.shift();\n  }\n  if (cells.length > 0 && !cells.at(-1)?.trim()) {\n    cells.pop();\n  }\n\n  if (count) {\n    if (cells.length > count) {\n      cells.splice(count);\n    } else {\n      while (cells.length < count) cells.push('');\n    }\n  }\n\n  for (; i < cells.length; i++) {\n    // leading or trailing whitespace is ignored per the gfm spec\n    cells[i] = cells[i].trim().replace(other.slashPipe, '|');\n  }\n  return cells;\n}\n\n/**\n * Remove trailing 'c's. Equivalent to str.replace(/c*$/, '').\n * /c*$/ is vulnerable to REDOS.\n *\n * @param str\n * @param c\n * @param invert Remove suffix of non-c chars instead. Default falsey.\n */\nexport function rtrim(str: string, c: string, invert?: boolean) {\n  const l = str.length;\n  if (l === 0) {\n    return '';\n  }\n\n  // Length of suffix matching the invert condition.\n  let suffLen = 0;\n\n  // Step left until we fail to match the invert condition.\n  while (suffLen < l) {\n    const currChar = str.charAt(l - suffLen - 1);\n    if (currChar === c && !invert) {\n      suffLen++;\n    } else if (currChar !== c && invert) {\n      suffLen++;\n    } else {\n      break;\n    }\n  }\n\n  return str.slice(0, l - suffLen);\n}\n\nexport function findClosingBracket(str: string, b: string) {\n  if (str.indexOf(b[1]) === -1) {\n    return -1;\n  }\n\n  let level = 0;\n  for (let i = 0; i < str.length; i++) {\n    if (str[i] === '\\\\') {\n      i++;\n    } else if (str[i] === b[0]) {\n      level++;\n    } else if (str[i] === b[1]) {\n      level--;\n      if (level < 0) {\n        return i;\n      }\n    }\n  }\n  if (level > 0) {\n    return -2;\n  }\n\n  return -1;\n}\n\nexport function expandTabs(line: string, indent = 0) {\n  let col = indent;\n  let expanded = '';\n  for (const char of line) {\n    if (char === '\\t') {\n      const added = 4 - (col % 4);\n      expanded += ' '.repeat(added);\n      col += added;\n    } else {\n      expanded += char;\n      col++;\n    }\n  }\n\n  return expanded;\n}\n"
  },
  {
    "path": "src/marked.ts",
    "content": "import { _Lexer } from './Lexer.ts';\nimport { _Parser } from './Parser.ts';\nimport { _Tokenizer } from './Tokenizer.ts';\nimport { _Renderer } from './Renderer.ts';\nimport { _TextRenderer } from './TextRenderer.ts';\nimport { _Hooks } from './Hooks.ts';\nimport { Marked } from './Instance.ts';\nimport {\n  _getDefaults,\n  changeDefaults,\n  _defaults,\n} from './defaults.ts';\nimport type { MarkedExtension, MarkedOptions } from './MarkedOptions.ts';\nimport type { Token, TokensList } from './Tokens.ts';\nimport type { MaybePromise } from './Instance.ts';\n\nconst markedInstance = new Marked();\n\n/**\n * Compiles markdown to HTML asynchronously.\n *\n * @param src String of markdown source to be compiled\n * @param options Hash of options, having async: true\n * @return Promise of string of compiled HTML\n */\nexport function marked(src: string, options: MarkedOptions & { async: true }): Promise<string>;\n\n/**\n * Compiles markdown to HTML.\n *\n * @param src String of markdown source to be compiled\n * @param options Optional hash of options\n * @return String of compiled HTML. Will be a Promise of string if async is set to true by any extensions.\n */\nexport function marked(src: string, options: MarkedOptions & { async: false }): string;\nexport function marked(src: string, options: MarkedOptions & { async: true }): Promise<string>;\nexport function marked(src: string, options?: MarkedOptions | null): string | Promise<string>;\nexport function marked(src: string, opt?: MarkedOptions | null): string | Promise<string> {\n  return markedInstance.parse(src, opt);\n}\n\n/**\n * Sets the default options.\n *\n * @param options Hash of options\n */\nmarked.options =\n  marked.setOptions = function(options: MarkedOptions) {\n    markedInstance.setOptions(options);\n    marked.defaults = markedInstance.defaults;\n    changeDefaults(marked.defaults);\n    return marked;\n  };\n\n/**\n * Gets the original marked default options.\n */\nmarked.getDefaults = _getDefaults;\n\nmarked.defaults = _defaults;\n\n/**\n * Use Extension\n */\n\nmarked.use = function(...args: MarkedExtension[]) {\n  markedInstance.use(...args);\n  marked.defaults = markedInstance.defaults;\n  changeDefaults(marked.defaults);\n  return marked;\n};\n\n/**\n * Run callback for every token\n */\n\nmarked.walkTokens = function(tokens: Token[] | TokensList, callback: (token: Token) => MaybePromise | MaybePromise[]) {\n  return markedInstance.walkTokens(tokens, callback);\n};\n\n/**\n * Compiles markdown to HTML without enclosing `p` tag.\n *\n * @param src String of markdown source to be compiled\n * @param options Hash of options\n * @return String of compiled HTML\n */\nmarked.parseInline = markedInstance.parseInline;\n\n/**\n * Expose\n */\nmarked.Parser = _Parser;\nmarked.parser = _Parser.parse;\nmarked.Renderer = _Renderer;\nmarked.TextRenderer = _TextRenderer;\nmarked.Lexer = _Lexer;\nmarked.lexer = _Lexer.lex;\nmarked.Tokenizer = _Tokenizer;\nmarked.Hooks = _Hooks;\nmarked.parse = marked;\n\nexport const options = marked.options;\nexport const setOptions = marked.setOptions;\nexport const use = marked.use;\nexport const walkTokens = marked.walkTokens;\nexport const parseInline = marked.parseInline;\nexport const parse = marked;\nexport const parser = _Parser.parse;\nexport const lexer = _Lexer.lex;\nexport { _defaults as defaults, _getDefaults as getDefaults } from './defaults.ts';\nexport { _Lexer as Lexer } from './Lexer.ts';\nexport { _Parser as Parser } from './Parser.ts';\nexport { _Tokenizer as Tokenizer } from './Tokenizer.ts';\nexport { _Renderer as Renderer } from './Renderer.ts';\nexport { _TextRenderer as TextRenderer } from './TextRenderer.ts';\nexport { _Hooks as Hooks } from './Hooks.ts';\nexport { Marked } from './Instance.ts';\nexport type * from './MarkedOptions.ts';\nexport type * from './Tokens.ts';\n"
  },
  {
    "path": "src/rules.ts",
    "content": "const noopTest = { exec: () => null } as unknown as RegExp;\n\nfunction edit(regex: string | RegExp, opt = '') {\n  let source = typeof regex === 'string' ? regex : regex.source;\n  const obj = {\n    replace: (name: string | RegExp, val: string | RegExp) => {\n      let valSource = typeof val === 'string' ? val : val.source;\n      valSource = valSource.replace(other.caret, '$1');\n      source = source.replace(name, valSource);\n      return obj;\n    },\n    getRegex: () => {\n      return new RegExp(source, opt);\n    },\n  };\n  return obj;\n}\n\nconst supportsLookbehind = (() => {\ntry {\n  // eslint-disable-next-line prefer-regex-literals\n  return !!new RegExp('(?<=1)(?<!1)');\n} catch {\n  // See browser support here:\n  // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Regular_expressions/Lookbehind_assertion\n  return false;\n}\n})();\n\nexport const other = {\n  codeRemoveIndent: /^(?: {1,4}| {0,3}\\t)/gm,\n  outputLinkReplace: /\\\\([\\[\\]])/g,\n  indentCodeCompensation: /^(\\s+)(?:```)/,\n  beginningSpace: /^\\s+/,\n  endingHash: /#$/,\n  startingSpaceChar: /^ /,\n  endingSpaceChar: / $/,\n  nonSpaceChar: /[^ ]/,\n  newLineCharGlobal: /\\n/g,\n  tabCharGlobal: /\\t/g,\n  multipleSpaceGlobal: /\\s+/g,\n  blankLine: /^[ \\t]*$/,\n  doubleBlankLine: /\\n[ \\t]*\\n[ \\t]*$/,\n  blockquoteStart: /^ {0,3}>/,\n  blockquoteSetextReplace: /\\n {0,3}((?:=+|-+) *)(?=\\n|$)/g,\n  blockquoteSetextReplace2: /^ {0,3}>[ \\t]?/gm,\n  listReplaceNesting: /^ {1,4}(?=( {4})*[^ ])/g,\n  listIsTask: /^\\[[ xX]\\] +\\S/,\n  listReplaceTask: /^\\[[ xX]\\] +/,\n  listTaskCheckbox: /\\[[ xX]\\]/,\n  anyLine: /\\n.*\\n/,\n  hrefBrackets: /^<(.*)>$/,\n  tableDelimiter: /[:|]/,\n  tableAlignChars: /^\\||\\| *$/g,\n  tableRowBlankLine: /\\n[ \\t]*$/,\n  tableAlignRight: /^ *-+: *$/,\n  tableAlignCenter: /^ *:-+: *$/,\n  tableAlignLeft: /^ *:-+ *$/,\n  startATag: /^<a /i,\n  endATag: /^<\\/a>/i,\n  startPreScriptTag: /^<(pre|code|kbd|script)(\\s|>)/i,\n  endPreScriptTag: /^<\\/(pre|code|kbd|script)(\\s|>)/i,\n  startAngleBracket: /^</,\n  endAngleBracket: />$/,\n  pedanticHrefTitle: /^([^'\"]*[^\\s])\\s+(['\"])(.*)\\2/,\n  unicodeAlphaNumeric: /[\\p{L}\\p{N}]/u,\n  escapeTest: /[&<>\"']/,\n  escapeReplace: /[&<>\"']/g,\n  escapeTestNoEncode: /[<>\"']|&(?!(#\\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\\w+);)/,\n  escapeReplaceNoEncode: /[<>\"']|&(?!(#\\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\\w+);)/g,\n  caret: /(^|[^\\[])\\^/g,\n  percentDecode: /%25/g,\n  findPipe: /\\|/g,\n  splitPipe: / \\|/,\n  slashPipe: /\\\\\\|/g,\n  carriageReturn: /\\r\\n|\\r/g,\n  spaceLine: /^ +$/gm,\n  notSpaceStart: /^\\S*/,\n  endingNewline: /\\n$/,\n  listItemRegex: (bull: string) => new RegExp(`^( {0,3}${bull})((?:[\\t ][^\\\\n]*)?(?:\\\\n|$))`),\n  nextBulletRegex: (indent: number) => new RegExp(`^ {0,${Math.min(3, indent - 1)}}(?:[*+-]|\\\\d{1,9}[.)])((?:[ \\t][^\\\\n]*)?(?:\\\\n|$))`),\n  hrRegex: (indent: number) => new RegExp(`^ {0,${Math.min(3, indent - 1)}}((?:- *){3,}|(?:_ *){3,}|(?:\\\\* *){3,})(?:\\\\n+|$)`),\n  fencesBeginRegex: (indent: number) => new RegExp(`^ {0,${Math.min(3, indent - 1)}}(?:\\`\\`\\`|~~~)`),\n  headingBeginRegex: (indent: number) => new RegExp(`^ {0,${Math.min(3, indent - 1)}}#`),\n  htmlBeginRegex: (indent: number) => new RegExp(`^ {0,${Math.min(3, indent - 1)}}<(?:[a-z].*>|!--)`, 'i'),\n  blockquoteBeginRegex: (indent: number) => new RegExp(`^ {0,${Math.min(3, indent - 1)}}>`),\n};\n\n/**\n * Block-Level Grammar\n */\n\nconst newline = /^(?:[ \\t]*(?:\\n|$))+/;\nconst blockCode = /^((?: {4}| {0,3}\\t)[^\\n]+(?:\\n(?:[ \\t]*(?:\\n|$))*)?)+/;\nconst fences = /^ {0,3}(`{3,}(?=[^`\\n]*(?:\\n|$))|~{3,})([^\\n]*)(?:\\n|$)(?:|([\\s\\S]*?)(?:\\n|$))(?: {0,3}\\1[~`]* *(?=\\n|$)|$)/;\nconst hr = /^ {0,3}((?:-[\\t ]*){3,}|(?:_[ \\t]*){3,}|(?:\\*[ \\t]*){3,})(?:\\n+|$)/;\nconst heading = /^ {0,3}(#{1,6})(?=\\s|$)(.*)(?:\\n+|$)/;\nconst bullet = / {0,3}(?:[*+-]|\\d{1,9}[.)])/;\nconst lheadingCore = /^(?!bull |blockCode|fences|blockquote|heading|html|table)((?:.|\\n(?!\\s*?\\n|bull |blockCode|fences|blockquote|heading|html|table))+?)\\n {0,3}(=+|-+) *(?:\\n+|$)/;\nconst lheading = edit(lheadingCore)\n  .replace(/bull/g, bullet) // lists can interrupt\n  .replace(/blockCode/g, /(?: {4}| {0,3}\\t)/) // indented code blocks can interrupt\n  .replace(/fences/g, / {0,3}(?:`{3,}|~{3,})/) // fenced code blocks can interrupt\n  .replace(/blockquote/g, / {0,3}>/) // blockquote can interrupt\n  .replace(/heading/g, / {0,3}#{1,6}/) // ATX heading can interrupt\n  .replace(/html/g, / {0,3}<[^\\n>]+>\\n/) // block html can interrupt\n  .replace(/\\|table/g, '') // table not in commonmark\n  .getRegex();\nconst lheadingGfm = edit(lheadingCore)\n  .replace(/bull/g, bullet) // lists can interrupt\n  .replace(/blockCode/g, /(?: {4}| {0,3}\\t)/) // indented code blocks can interrupt\n  .replace(/fences/g, / {0,3}(?:`{3,}|~{3,})/) // fenced code blocks can interrupt\n  .replace(/blockquote/g, / {0,3}>/) // blockquote can interrupt\n  .replace(/heading/g, / {0,3}#{1,6}/) // ATX heading can interrupt\n  .replace(/html/g, / {0,3}<[^\\n>]+>\\n/) // block html can interrupt\n  .replace(/table/g, / {0,3}\\|?(?:[:\\- ]*\\|)+[\\:\\- ]*\\n/) // table can interrupt\n  .getRegex();\nconst _paragraph = /^([^\\n]+(?:\\n(?!hr|heading|lheading|blockquote|fences|list|html|table| +\\n)[^\\n]+)*)/;\nconst blockText = /^[^\\n]+/;\nconst _blockLabel = /(?!\\s*\\])(?:\\\\[\\s\\S]|[^\\[\\]\\\\])+/;\nconst def = edit(/^ {0,3}\\[(label)\\]: *(?:\\n[ \\t]*)?([^<\\s][^\\s]*|<.*?>)(?:(?: +(?:\\n[ \\t]*)?| *\\n[ \\t]*)(title))? *(?:\\n+|$)/)\n  .replace('label', _blockLabel)\n  .replace('title', /(?:\"(?:\\\\\"?|[^\"\\\\])*\"|'[^'\\n]*(?:\\n[^'\\n]+)*\\n?'|\\([^()]*\\))/)\n  .getRegex();\n\nconst list = edit(/^(bull)([ \\t][^\\n]+?)?(?:\\n|$)/)\n  .replace(/bull/g, bullet)\n  .getRegex();\n\nconst _tag = 'address|article|aside|base|basefont|blockquote|body|caption'\n  + '|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption'\n  + '|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe'\n  + '|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option'\n  + '|p|param|search|section|summary|table|tbody|td|tfoot|th|thead|title'\n  + '|tr|track|ul';\nconst _comment = /<!--(?:-?>|[\\s\\S]*?(?:-->|$))/;\nconst html = edit(\n  '^ {0,3}(?:' // optional indentation\n+ '<(script|pre|style|textarea)[\\\\s>][\\\\s\\\\S]*?(?:</\\\\1>[^\\\\n]*\\\\n+|$)' // (1)\n+ '|comment[^\\\\n]*(\\\\n+|$)' // (2)\n+ '|<\\\\?[\\\\s\\\\S]*?(?:\\\\?>\\\\n*|$)' // (3)\n+ '|<![A-Z][\\\\s\\\\S]*?(?:>\\\\n*|$)' // (4)\n+ '|<!\\\\[CDATA\\\\[[\\\\s\\\\S]*?(?:\\\\]\\\\]>\\\\n*|$)' // (5)\n+ '|</?(tag)(?: +|\\\\n|/?>)[\\\\s\\\\S]*?(?:(?:\\\\n[ \\t]*)+\\\\n|$)' // (6)\n+ '|<(?!script|pre|style|textarea)([a-z][\\\\w-]*)(?:attribute)*? */?>(?=[ \\\\t]*(?:\\\\n|$))[\\\\s\\\\S]*?(?:(?:\\\\n[ \\t]*)+\\\\n|$)' // (7) open tag\n+ '|</(?!script|pre|style|textarea)[a-z][\\\\w-]*\\\\s*>(?=[ \\\\t]*(?:\\\\n|$))[\\\\s\\\\S]*?(?:(?:\\\\n[ \\t]*)+\\\\n|$)' // (7) closing tag\n+ ')', 'i')\n  .replace('comment', _comment)\n  .replace('tag', _tag)\n  .replace('attribute', / +[a-zA-Z:_][\\w.:-]*(?: *= *\"[^\"\\n]*\"| *= *'[^'\\n]*'| *= *[^\\s\"'=<>`]+)?/)\n  .getRegex();\n\nconst paragraph = edit(_paragraph)\n  .replace('hr', hr)\n  .replace('heading', ' {0,3}#{1,6}(?:\\\\s|$)')\n  .replace('|lheading', '') // setext headings don't interrupt commonmark paragraphs\n  .replace('|table', '')\n  .replace('blockquote', ' {0,3}>')\n  .replace('fences', ' {0,3}(?:`{3,}(?=[^`\\\\n]*\\\\n)|~{3,})[^\\\\n]*\\\\n')\n  .replace('list', ' {0,3}(?:[*+-]|1[.)])[ \\\\t]') // only lists starting from 1 can interrupt\n  .replace('html', '</?(?:tag)(?: +|\\\\n|/?>)|<(?:script|pre|style|textarea|!--)')\n  .replace('tag', _tag) // pars can be interrupted by type (6) html blocks\n  .getRegex();\n\nconst blockquote = edit(/^( {0,3}> ?(paragraph|[^\\n]*)(?:\\n|$))+/)\n  .replace('paragraph', paragraph)\n  .getRegex();\n\n/**\n * Normal Block Grammar\n */\n\nconst blockNormal = {\n  blockquote,\n  code: blockCode,\n  def,\n  fences,\n  heading,\n  hr,\n  html,\n  lheading,\n  list,\n  newline,\n  paragraph,\n  table: noopTest,\n  text: blockText,\n};\n\ntype BlockKeys = keyof typeof blockNormal;\n\n/**\n * GFM Block Grammar\n */\n\nconst gfmTable = edit(\n  '^ *([^\\\\n ].*)\\\\n' // Header\n+ ' {0,3}((?:\\\\| *)?:?-+:? *(?:\\\\| *:?-+:? *)*(?:\\\\| *)?)' // Align\n+ '(?:\\\\n((?:(?! *\\\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\\\n|$))*)\\\\n*|$)') // Cells\n  .replace('hr', hr)\n  .replace('heading', ' {0,3}#{1,6}(?:\\\\s|$)')\n  .replace('blockquote', ' {0,3}>')\n  .replace('code', '(?: {4}| {0,3}\\t)[^\\\\n]')\n  .replace('fences', ' {0,3}(?:`{3,}(?=[^`\\\\n]*\\\\n)|~{3,})[^\\\\n]*\\\\n')\n  .replace('list', ' {0,3}(?:[*+-]|1[.)])[ \\\\t]') // only lists starting from 1 can interrupt\n  .replace('html', '</?(?:tag)(?: +|\\\\n|/?>)|<(?:script|pre|style|textarea|!--)')\n  .replace('tag', _tag) // tables can be interrupted by type (6) html blocks\n  .getRegex();\n\nconst blockGfm: Record<BlockKeys, RegExp> = {\n  ...blockNormal,\n  lheading: lheadingGfm,\n  table: gfmTable,\n  paragraph: edit(_paragraph)\n    .replace('hr', hr)\n    .replace('heading', ' {0,3}#{1,6}(?:\\\\s|$)')\n    .replace('|lheading', '') // setext headings don't interrupt commonmark paragraphs\n    .replace('table', gfmTable) // interrupt paragraphs with table\n    .replace('blockquote', ' {0,3}>')\n    .replace('fences', ' {0,3}(?:`{3,}(?=[^`\\\\n]*\\\\n)|~{3,})[^\\\\n]*\\\\n')\n    .replace('list', ' {0,3}(?:[*+-]|1[.)])[ \\\\t]') // only lists starting from 1 can interrupt\n    .replace('html', '</?(?:tag)(?: +|\\\\n|/?>)|<(?:script|pre|style|textarea|!--)')\n    .replace('tag', _tag) // pars can be interrupted by type (6) html blocks\n    .getRegex(),\n};\n\n/**\n * Pedantic grammar (original John Gruber's loose markdown specification)\n */\n\nconst blockPedantic: Record<BlockKeys, RegExp> = {\n  ...blockNormal,\n  html: edit(\n    '^ *(?:comment *(?:\\\\n|\\\\s*$)'\n    + '|<(tag)[\\\\s\\\\S]+?</\\\\1> *(?:\\\\n{2,}|\\\\s*$)' // closed tag\n    + '|<tag(?:\"[^\"]*\"|\\'[^\\']*\\'|\\\\s[^\\'\"/>\\\\s]*)*?/?> *(?:\\\\n{2,}|\\\\s*$))')\n    .replace('comment', _comment)\n    .replace(/tag/g, '(?!(?:'\n      + 'a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub'\n      + '|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)'\n      + '\\\\b)\\\\w+(?!:|[^\\\\w\\\\s@]*@)\\\\b')\n    .getRegex(),\n  def: /^ *\\[([^\\]]+)\\]: *<?([^\\s>]+)>?(?: +([\"(][^\\n]+[\")]))? *(?:\\n+|$)/,\n  heading: /^(#{1,6})(.*)(?:\\n+|$)/,\n  fences: noopTest, // fences not supported\n  lheading: /^(.+?)\\n {0,3}(=+|-+) *(?:\\n+|$)/,\n  paragraph: edit(_paragraph)\n    .replace('hr', hr)\n    .replace('heading', ' *#{1,6} *[^\\n]')\n    .replace('lheading', lheading)\n    .replace('|table', '')\n    .replace('blockquote', ' {0,3}>')\n    .replace('|fences', '')\n    .replace('|list', '')\n    .replace('|html', '')\n    .replace('|tag', '')\n    .getRegex(),\n};\n\n/**\n * Inline-Level Grammar\n */\n\nconst escape = /^\\\\([!\"#$%&'()*+,\\-./:;<=>?@\\[\\]\\\\^_`{|}~])/;\nconst inlineCode = /^(`+)([^`]|[^`][\\s\\S]*?[^`])\\1(?!`)/;\nconst br = /^( {2,}|\\\\)\\n(?!\\s*$)/;\nconst inlineText = /^(`+|[^`])(?:(?= {2,}\\n)|[\\s\\S]*?(?:(?=[\\\\<!\\[`*_]|\\b_|$)|[^ ](?= {2,}\\n)))/;\n\n// list of unicode punctuation marks, plus any missing characters from CommonMark spec\nconst _punctuation = /[\\p{P}\\p{S}]/u;\nconst _punctuationOrSpace = /[\\s\\p{P}\\p{S}]/u;\nconst _notPunctuationOrSpace = /[^\\s\\p{P}\\p{S}]/u;\nconst punctuation = edit(/^((?![*_])punctSpace)/, 'u')\n  .replace(/punctSpace/g, _punctuationOrSpace).getRegex();\n\n// GFM allows ~ inside strong and em for strikethrough\nconst _punctuationGfmStrongEm = /(?!~)[\\p{P}\\p{S}]/u;\nconst _punctuationOrSpaceGfmStrongEm = /(?!~)[\\s\\p{P}\\p{S}]/u;\nconst _notPunctuationOrSpaceGfmStrongEm = /(?:[^\\s\\p{P}\\p{S}]|~)/u;\n\n// GFM allows * and _ inside strikethrough\nconst _punctuationGfmDel = /(?![*_])[\\p{P}\\p{S}]/u;\nconst _punctuationOrSpaceGfmDel = /(?![*_])[\\s\\p{P}\\p{S}]/u;\nconst _notPunctuationOrSpaceGfmDel = /(?:[^\\s\\p{P}\\p{S}]|[*_])/u;\n\n// sequences em should skip over [title](link), `code`, <html>\nconst blockSkip = edit(/link|precode-code|html/, 'g')\n  .replace('link', /\\[(?:[^\\[\\]`]|(?<a>`+)[^`]+\\k<a>(?!`))*?\\]\\((?:\\\\[\\s\\S]|[^\\\\\\(\\)]|\\((?:\\\\[\\s\\S]|[^\\\\\\(\\)])*\\))*\\)/)\n  .replace('precode-', supportsLookbehind ? '(?<!`)()' : '(^^|[^`])')\n  .replace('code', /(?<b>`+)[^`]+\\k<b>(?!`)/)\n  .replace('html', /<(?! )[^<>]*?>/)\n  .getRegex();\n\nconst emStrongLDelimCore = /^(?:\\*+(?:((?!\\*)punct)|[^\\s*]))|^_+(?:((?!_)punct)|([^\\s_]))/;\n\nconst emStrongLDelim = edit(emStrongLDelimCore, 'u')\n  .replace(/punct/g, _punctuation)\n  .getRegex();\n\nconst emStrongLDelimGfm = edit(emStrongLDelimCore, 'u')\n  .replace(/punct/g, _punctuationGfmStrongEm)\n  .getRegex();\n\nconst emStrongRDelimAstCore =\n  '^[^_*]*?__[^_*]*?\\\\*[^_*]*?(?=__)' // Skip orphan inside strong\n+ '|[^*]+(?=[^*])' // Consume to delim\n+ '|(?!\\\\*)punct(\\\\*+)(?=[\\\\s]|$)' // (1) #*** can only be a Right Delimiter\n+ '|notPunctSpace(\\\\*+)(?!\\\\*)(?=punctSpace|$)' // (2) a***#, a*** can only be a Right Delimiter\n+ '|(?!\\\\*)punctSpace(\\\\*+)(?=notPunctSpace)' // (3) #***a, ***a can only be Left Delimiter\n+ '|[\\\\s](\\\\*+)(?!\\\\*)(?=punct)' // (4) ***# can only be Left Delimiter\n+ '|(?!\\\\*)punct(\\\\*+)(?!\\\\*)(?=punct)' // (5) #***# can be either Left or Right Delimiter\n+ '|notPunctSpace(\\\\*+)(?=notPunctSpace)'; // (6) a***a can be either Left or Right Delimiter\n\nconst emStrongRDelimAst = edit(emStrongRDelimAstCore, 'gu')\n  .replace(/notPunctSpace/g, _notPunctuationOrSpace)\n  .replace(/punctSpace/g, _punctuationOrSpace)\n  .replace(/punct/g, _punctuation)\n  .getRegex();\n\nconst emStrongRDelimAstGfm = edit(emStrongRDelimAstCore, 'gu')\n  .replace(/notPunctSpace/g, _notPunctuationOrSpaceGfmStrongEm)\n  .replace(/punctSpace/g, _punctuationOrSpaceGfmStrongEm)\n  .replace(/punct/g, _punctuationGfmStrongEm)\n  .getRegex();\n\n// (6) Not allowed for _\nconst emStrongRDelimUnd = edit(\n  '^[^_*]*?\\\\*\\\\*[^_*]*?_[^_*]*?(?=\\\\*\\\\*)' // Skip orphan inside strong\n+ '|[^_]+(?=[^_])' // Consume to delim\n+ '|(?!_)punct(_+)(?=[\\\\s]|$)' // (1) #___ can only be a Right Delimiter\n+ '|notPunctSpace(_+)(?!_)(?=punctSpace|$)' // (2) a___#, a___ can only be a Right Delimiter\n+ '|(?!_)punctSpace(_+)(?=notPunctSpace)' // (3) #___a, ___a can only be Left Delimiter\n+ '|[\\\\s](_+)(?!_)(?=punct)' // (4) ___# can only be Left Delimiter\n+ '|(?!_)punct(_+)(?!_)(?=punct)', 'gu') // (5) #___# can be either Left or Right Delimiter\n  .replace(/notPunctSpace/g, _notPunctuationOrSpace)\n  .replace(/punctSpace/g, _punctuationOrSpace)\n  .replace(/punct/g, _punctuation)\n  .getRegex();\n\n// Tilde left delimiter for strikethrough (similar to emStrongLDelim for asterisk)\nconst delLDelim = edit(/^~~?(?:((?!~)punct)|[^\\s~])/, 'u')\n  .replace(/punct/g, _punctuationGfmDel)\n  .getRegex();\n\n// Tilde delimiter patterns for strikethrough (similar to asterisk)\nconst delRDelimCore =\n  '^[^~]+(?=[^~])' // Consume to delim\n+ '|(?!~)punct(~~?)(?=[\\\\s]|$)' // (1) #~~ can only be a Right Delimiter\n+ '|notPunctSpace(~~?)(?!~)(?=punctSpace|$)' // (2) a~~#, a~~ can only be a Right Delimiter\n+ '|(?!~)punctSpace(~~?)(?=notPunctSpace)' // (3) #~~a, ~~a can only be Left Delimiter\n+ '|[\\\\s](~~?)(?!~)(?=punct)' // (4) ~~# can only be Left Delimiter\n+ '|(?!~)punct(~~?)(?!~)(?=punct)' // (5) #~~# can be either Left or Right Delimiter\n+ '|notPunctSpace(~~?)(?=notPunctSpace)'; // (6) a~~a can be either Left or Right Delimiter\n\nconst delRDelim = edit(delRDelimCore, 'gu')\n  .replace(/notPunctSpace/g, _notPunctuationOrSpaceGfmDel)\n  .replace(/punctSpace/g, _punctuationOrSpaceGfmDel)\n  .replace(/punct/g, _punctuationGfmDel)\n  .getRegex();\n\nconst anyPunctuation = edit(/\\\\(punct)/, 'gu')\n  .replace(/punct/g, _punctuation)\n  .getRegex();\n\nconst autolink = edit(/^<(scheme:[^\\s\\x00-\\x1f<>]*|email)>/)\n  .replace('scheme', /[a-zA-Z][a-zA-Z0-9+.-]{1,31}/)\n  .replace('email', /[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/)\n  .getRegex();\n\nconst _inlineComment = edit(_comment).replace('(?:-->|$)', '-->').getRegex();\nconst tag = edit(\n  '^comment'\n    + '|^</[a-zA-Z][\\\\w:-]*\\\\s*>' // self-closing tag\n    + '|^<[a-zA-Z][\\\\w-]*(?:attribute)*?\\\\s*/?>' // open tag\n    + '|^<\\\\?[\\\\s\\\\S]*?\\\\?>' // processing instruction, e.g. <?php ?>\n    + '|^<![a-zA-Z]+\\\\s[\\\\s\\\\S]*?>' // declaration, e.g. <!DOCTYPE html>\n    + '|^<!\\\\[CDATA\\\\[[\\\\s\\\\S]*?\\\\]\\\\]>') // CDATA section\n  .replace('comment', _inlineComment)\n  .replace('attribute', /\\s+[a-zA-Z:_][\\w.:-]*(?:\\s*=\\s*\"[^\"]*\"|\\s*=\\s*'[^']*'|\\s*=\\s*[^\\s\"'=<>`]+)?/)\n  .getRegex();\n\nconst _inlineLabel = /(?:\\[(?:\\\\[\\s\\S]|[^\\[\\]\\\\])*\\]|\\\\[\\s\\S]|`+[^`]*?`+(?!`)|[^\\[\\]\\\\`])*?/;\n\nconst link = edit(/^!?\\[(label)\\]\\(\\s*(href)(?:(?:[ \\t]+(?:\\n[ \\t]*)?|\\n[ \\t]*)(title))?\\s*\\)/)\n  .replace('label', _inlineLabel)\n  .replace('href', /<(?:\\\\.|[^\\n<>\\\\])+>|[^ \\t\\n\\x00-\\x1f]*/)\n  .replace('title', /\"(?:\\\\\"?|[^\"\\\\])*\"|'(?:\\\\'?|[^'\\\\])*'|\\((?:\\\\\\)?|[^)\\\\])*\\)/)\n  .getRegex();\n\nconst reflink = edit(/^!?\\[(label)\\]\\[(ref)\\]/)\n  .replace('label', _inlineLabel)\n  .replace('ref', _blockLabel)\n  .getRegex();\n\nconst nolink = edit(/^!?\\[(ref)\\](?:\\[\\])?/)\n  .replace('ref', _blockLabel)\n  .getRegex();\n\nconst reflinkSearch = edit('reflink|nolink(?!\\\\()', 'g')\n  .replace('reflink', reflink)\n  .replace('nolink', nolink)\n  .getRegex();\n\nconst _caseInsensitiveProtocol = /[hH][tT][tT][pP][sS]?|[fF][tT][pP]/;\n\n/**\n * Normal Inline Grammar\n */\n\nconst inlineNormal = {\n  _backpedal: noopTest, // only used for GFM url\n  anyPunctuation,\n  autolink,\n  blockSkip,\n  br,\n  code: inlineCode,\n  del: noopTest,\n  delLDelim: noopTest,\n  delRDelim: noopTest,\n  emStrongLDelim,\n  emStrongRDelimAst,\n  emStrongRDelimUnd,\n  escape,\n  link,\n  nolink,\n  punctuation,\n  reflink,\n  reflinkSearch,\n  tag,\n  text: inlineText,\n  url: noopTest,\n};\n\ntype InlineKeys = keyof typeof inlineNormal;\n\n/**\n * Pedantic Inline Grammar\n */\n\nconst inlinePedantic: Record<InlineKeys, RegExp> = {\n  ...inlineNormal,\n  link: edit(/^!?\\[(label)\\]\\((.*?)\\)/)\n    .replace('label', _inlineLabel)\n    .getRegex(),\n  reflink: edit(/^!?\\[(label)\\]\\s*\\[([^\\]]*)\\]/)\n    .replace('label', _inlineLabel)\n    .getRegex(),\n};\n\n/**\n * GFM Inline Grammar\n */\n\nconst inlineGfm: Record<InlineKeys, RegExp> = {\n  ...inlineNormal,\n  emStrongRDelimAst: emStrongRDelimAstGfm,\n  emStrongLDelim: emStrongLDelimGfm,\n  delLDelim,\n  delRDelim,\n  url: edit(/^((?:protocol):\\/\\/|www\\.)(?:[a-zA-Z0-9\\-]+\\.?)+[^\\s<]*|^email/)\n    .replace('protocol', _caseInsensitiveProtocol)\n    .replace('email', /[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/)\n    .getRegex(),\n  _backpedal: /(?:[^?!.,:;*_'\"~()&]+|\\([^)]*\\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_'\"~)]+(?!$))+/,\n  del: /^(~~?)(?=[^\\s~])((?:\\\\[\\s\\S]|[^\\\\])*?(?:\\\\[\\s\\S]|[^\\s~\\\\]))\\1(?=[^~]|$)/,\n  text: edit(/^([`~]+|[^`~])(?:(?= {2,}\\n)|(?=[a-zA-Z0-9.!#$%&'*+\\/=?_`{\\|}~-]+@)|[\\s\\S]*?(?:(?=[\\\\<!\\[`*~_]|\\b_|protocol:\\/\\/|www\\.|$)|[^ ](?= {2,}\\n)|[^a-zA-Z0-9.!#$%&'*+\\/=?_`{\\|}~-](?=[a-zA-Z0-9.!#$%&'*+\\/=?_`{\\|}~-]+@)))/)\n    .replace('protocol', _caseInsensitiveProtocol)\n    .getRegex(),\n};\n\n/**\n * GFM + Line Breaks Inline Grammar\n */\n\nconst inlineBreaks: Record<InlineKeys, RegExp> = {\n  ...inlineGfm,\n  br: edit(br).replace('{2,}', '*').getRegex(),\n  text: edit(inlineGfm.text)\n    .replace('\\\\b_', '\\\\b_| {2,}\\\\n')\n    .replace(/\\{2,\\}/g, '*')\n    .getRegex(),\n};\n\n/**\n * exports\n */\n\nexport const block = {\n  normal: blockNormal,\n  gfm: blockGfm,\n  pedantic: blockPedantic,\n};\n\nexport const inline = {\n  normal: inlineNormal,\n  gfm: inlineGfm,\n  breaks: inlineBreaks,\n  pedantic: inlinePedantic,\n};\n\nexport interface Rules {\n  other: typeof other\n  block: Record<BlockKeys, RegExp>\n  inline: Record<InlineKeys, RegExp>\n}\n"
  },
  {
    "path": "test/.eslintrc.json",
    "content": "{\n  \"extends\": \"standard\",\n  \"globals\": {\n    \"expectAsync\": \"readonly\"\n  },\n  \"rules\": {\n    \"semi\": [\"error\", \"always\"],\n    \"indent\": [\"error\", 2, {\n      \"SwitchCase\": 1,\n      \"VariableDeclarator\": { \"var\": 2 },\n      \"outerIIFEBody\": 0\n    }],\n    \"operator-linebreak\": [\"error\", \"before\", { \"overrides\": { \"=\": \"after\" } }],\n    \"space-before-function-paren\": [\"error\", \"never\"],\n    \"no-cond-assign\": \"off\",\n    \"no-useless-escape\": \"off\",\n    \"one-var\": \"off\",\n    \"no-control-regex\": \"off\",\n    \"no-prototype-builtins\": \"off\",\n\n    \"prefer-const\": \"error\",\n    \"no-var\": \"error\"\n  },\n  \"env\": {\n    \"node\": true\n  }\n}\n"
  },
  {
    "path": "test/bench.js",
    "content": "import { dirname, resolve } from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport { htmlIsEqual, getTests } from '@markedjs/testutils';\n\nimport { marked } from '../lib/marked.esm.js';\n\nconst __dirname = dirname(fileURLToPath(import.meta.url));\n\n/**\n * Load specs\n */\nexport async function load() {\n  const dir = resolve(__dirname, './specs/commonmark');\n  const sections = await getTests(dir);\n  let specs = [];\n\n  for (const section in sections) {\n    specs = specs.concat(sections[section].specs);\n  }\n\n  return specs;\n}\n\n/**\n * Run all benchmarks\n */\nexport async function runBench(options) {\n  options = options || {};\n  const specs = await load();\n  const tests = {};\n\n  marked.setOptions({\n    gfm: false,\n    breaks: false,\n    pedantic: false,\n  });\n  if (options.marked) {\n    marked.setOptions(options.marked);\n  }\n  tests.marked = marked.parse;\n\n  try {\n    tests.commonmark = await (async() => {\n      const { Parser, HtmlRenderer } = await import('commonmark');\n      const parser = new Parser();\n      const writer = new HtmlRenderer();\n      return function(text) {\n        return writer.render(parser.parse(text));\n      };\n    })();\n  } catch(e) {\n    console.error('Could not bench commonmark. (Error: %s)', e.message);\n  }\n\n  try {\n    tests['markdown-it'] = await (async() => {\n      const MarkdownIt = (await import('markdown-it')).default;\n      const md = new MarkdownIt();\n      return md.render.bind(md);\n    })();\n  } catch(e) {\n    console.error('Could not bench markdown-it. (Error: %s)', e.message);\n  }\n\n  await bench(tests, specs);\n}\n\nexport async function bench(tests, specs) {\n  const stats = {};\n  for (const name in tests) {\n    stats[name] = {\n      elapsed: 0n,\n      correct: 0,\n    };\n  }\n\n  console.log();\n  for (let i = 0; i < specs.length; i++) {\n    const spec = specs[i];\n    process.stdout.write(\n      `${((i * 100) / specs.length).toFixed(1).padStart(5)}% ${i\n        .toString()\n        .padStart(specs.length.toString().length)} of ${specs.length}\\r`,\n    );\n    for (const name in tests) {\n      const test = tests[name];\n      const before = process.hrtime.bigint();\n      for (let n = 0; n < 1e3; n++) {\n        await test(spec.markdown);\n      }\n      const after = process.hrtime.bigint();\n      stats[name].elapsed += after - before;\n      stats[name].correct += (await htmlIsEqual(\n        spec.html,\n        await test(spec.markdown),\n      ))\n        ? 1\n        : 0;\n    }\n  }\n\n  for (const name in tests) {\n    const ms = prettyElapsedTime(stats[name].elapsed);\n    const percent = ((stats[name].correct / specs.length) * 100).toFixed(2);\n    console.log(`${name} completed in ${ms}ms and passed ${percent}%`);\n  }\n\n  const percentSlower = ((\n    prettyElapsedTime(stats.marked.elapsed)\n    / prettyElapsedTime(stats.commonmark.elapsed)\n  ) - 1) * 100;\n\n  console.log(`${Math.round(percentSlower)}% slower than commonmark`);\n}\n\n/**\n * Argument Parsing\n */\nfunction parseArg(argv) {\n  argv = argv.slice(2);\n\n  const options = {};\n  const orphans = [];\n\n  function getArg() {\n    let arg = argv.shift();\n\n    if (arg.indexOf('--') === 0) {\n      // e.g. --opt\n      arg = arg.split('=');\n      if (arg.length > 1) {\n        // e.g. --opt=val\n        argv.unshift(arg.slice(1).join('='));\n      }\n      arg = arg[0];\n    } else if (arg[0] === '-') {\n      if (arg.length > 2) {\n        // e.g. -abc\n        argv = arg\n          .substring(1)\n          .split('')\n          .map((ch) => `-${ch}`)\n          .concat(argv);\n        arg = argv.shift();\n      } else {\n        // e.g. -a\n      }\n    } else {\n      // e.g. foo\n    }\n\n    return arg;\n  }\n\n  const defaults = marked.getDefaults();\n\n  while (argv.length) {\n    const arg = getArg();\n    if (arg.indexOf('--') === 0) {\n      const opt = camelize(arg.replace(/^--(no-)?/, ''));\n      if (!(opt in defaults)) {\n        continue;\n      }\n      options.marked = options.marked || {};\n      if (arg.indexOf('--no-') === 0) {\n        options.marked[opt] = typeof defaults[opt] !== 'boolean' ? null : false;\n      } else {\n        options.marked[opt] =\n          typeof defaults[opt] !== 'boolean' ? argv.shift() : true;\n      }\n    } else {\n      orphans.push(arg);\n    }\n  }\n\n  if (orphans.length > 0) {\n    console.error();\n    console.error('The following arguments are not used:');\n    orphans.forEach((arg) => console.error(`  ${arg}`));\n    console.error();\n  }\n\n  return options;\n}\n\n/**\n * Helpers\n */\nfunction camelize(text) {\n  return text.replace(/(\\w)-(\\w)/g, (_, a, b) => a + b.toUpperCase());\n}\n\n/**\n * Main\n */\nexport default async function main(argv) {\n  const opt = parseArg(argv);\n\n  await runBench(opt);\n}\n\n/**\n * returns time to millisecond granularity\n * @param hrtimeElapsed {bigint}\n */\nfunction prettyElapsedTime(hrtimeElapsed) {\n  return Number(hrtimeElapsed / 1_000_000n);\n}\n\nprocess.title = 'marked bench';\nmain(process.argv.slice());\n"
  },
  {
    "path": "test/cjs-test.cjs",
    "content": "// eslint-disable-next-line @typescript-eslint/no-require-imports\nconst { marked } = require('../lib/marked.esm.js');\n\nif (!marked.parse('# test').includes('<h1')) {\n  throw new Error('Invalid markdown');\n}\n"
  },
  {
    "path": "test/recheck.ts",
    "content": "import { block, inline, other } from '../src/rules.ts';\nimport { check } from 'recheck';\n\ninterface RegexpObj {\n  [k: string]: RegExp | string | ((arg: number) => RegExp | string) | ((arg: string) => RegExp | string) | RegexpObj;\n}\n\nasync function checkRegexp(obj: RegexpObj, name: string) {\n  await Promise.all(Object.keys(obj).map(async(prop: string) => {\n    const item = obj[prop];\n    const itemName = `${name}.${prop}`;\n    let source = '';\n    let flags = '';\n    if (item instanceof RegExp) {\n      source = item.source;\n      flags = item.flags;\n    } else if (typeof item === 'string') {\n      source = item;\n    } else if (typeof item === 'function') {\n      // TODO: skip functions for now\n      return;\n    } else {\n      return checkRegexp(item, itemName);\n    }\n    const gfm = itemName.includes('.gfm.');\n    const pedantic = itemName.includes('.pedantic.');\n    const recheckObj = await check(source, flags);\n    try {\n      console.log(`// ${itemName}: /${recheckObj.source}/${recheckObj.flags}`);\n      switch (recheckObj.status) {\n        case 'safe':\n          console.log('// safe');\n          break;\n        case 'vulnerable':\n          console.log(`// marked(${recheckObj.attack.pattern}, { pedantic: ${pedantic ? 'true' : 'false'}, gfm: ${gfm ? 'true' : 'false'} });`);\n          break;\n        default:\n          console.log('// error:', recheckObj.error);\n          break;\n      }\n    } catch(e) {\n      console.log(recheckObj);\n      throw e;\n    }\n  }));\n}\n\nconsole.log(`\nimport { marked } from '../lib/marked.esm.js';\n\nconst start = Date.now();\n`);\n\nawait Promise.all([\n  checkRegexp(inline, 'inline'),\n  checkRegexp(block, 'block'),\n  checkRegexp(other, 'other'),\n]);\n\nconsole.log(`\nconsole.log(Date.now() - start);`);\n"
  },
  {
    "path": "test/rules.js",
    "content": "import { Lexer } from '../lib/marked.esm.js';\nconst rules = Lexer.rules;\n\nconst COLOR = {\n  reset: '\\x1b[0m',\n  bright: '\\x1b[1m',\n  dim: '\\x1b[2m',\n  underscore: '\\x1b[4m',\n  blink: '\\x1b[5m',\n  reverse: '\\x1b[7m',\n  hidden: '\\x1b[8m',\n\n  fgBlack: '\\x1b[30m',\n  fgRed: '\\x1b[31m',\n  fgGreen: '\\x1b[32m',\n  fgYellow: '\\x1b[33m',\n  fgBlue: '\\x1b[34m',\n  fgMagenta: '\\x1b[35m',\n  fgCyan: '\\x1b[36m',\n  fgWhite: '\\x1b[37m',\n\n  bgBlack: '\\x1b[40m',\n  bgRed: '\\x1b[41m',\n  bgGreen: '\\x1b[42m',\n  bgYellow: '\\x1b[43m',\n  bgBlue: '\\x1b[44m',\n  bgMagenta: '\\x1b[45m',\n  bgCyan: '\\x1b[46m',\n  bgWhite: '\\x1b[47m',\n};\n\nfunction propsToString(obj) {\n  if (obj === null) {\n    return null;\n  }\n  if (obj.constructor.name === 'Object') {\n    if (obj.exec?.name === 'noopTest') {\n      return null;\n    }\n    for (const prop in obj) {\n      obj[prop] = propsToString(obj[prop]);\n    }\n    return obj;\n  }\n  return obj.toString();\n}\n\nlet rulesObj = {};\nif (process.argv.length > 2) {\n  for (let i = 2; i < process.argv.length; i++) {\n    const rulePath = process.argv[i].split('.');\n    let rulesList = rulesObj;\n    let rule = rules;\n    while (rulePath.length > 1) {\n      const prop = rulePath.shift();\n      if (!rulesList[prop]) {\n        rulesList[prop] = {};\n        rulesList = rulesList[prop];\n      }\n      if (rule) {\n        rule = rule[prop];\n      }\n    }\n    rulesList[rulePath[0]] = rule?.[rulePath[0]] ?? null;\n  }\n} else {\n  rulesObj = rules;\n}\n\nrulesObj = propsToString(rulesObj);\nlet output = JSON.stringify(rulesObj, null, 2);\noutput = output.replace(/^(\\s*)\"(.*)\": null,?$/gm, `$1${COLOR.fgGreen}$2${COLOR.reset}: undefined`);\noutput = output.replace(/^(\\s*)\"(.*)\": {$/gm, `$1${COLOR.fgGreen}$2${COLOR.reset}: {`);\noutput = output.replace(/^(\\s*)\"(.*)\": \"(.*)\",?$/gm, (...p) => {\n  return `${p[1]}${COLOR.fgGreen}${p[2]}${COLOR.reset}: ${COLOR.fgRed}${p[3].replace(/\\\\\\\\/g, '\\\\')}${COLOR.reset}`;\n});\nconsole.log(output, COLOR.reset);\n"
  },
  {
    "path": "test/run-spec-tests.js",
    "content": "import { Marked } from '../lib/marked.esm.js';\nimport { getTests, runTests, outputCompletionTable } from '@markedjs/testutils';\nimport { resolve, dirname } from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nfunction parse(markdown, options) {\n  const marked = new Marked(options);\n  return marked.parse(markdown);\n}\n\nconst __dirname = dirname(fileURLToPath(import.meta.url));\n\nconst [commonMarkTests, gfmTests, newTests, originalTests, redosTests] =\n  await getTests([\n    resolve(__dirname, './specs/commonmark'),\n    resolve(__dirname, './specs/gfm'),\n    resolve(__dirname, './specs/new'),\n    resolve(__dirname, './specs/original'),\n    resolve(__dirname, './specs/redos'),\n  ]);\n\noutputCompletionTable('CommonMark', commonMarkTests);\nrunTests({\n  tests: commonMarkTests,\n  parse,\n  defaultMarkedOptions: { gfm: false, pedantic: false },\n});\n\noutputCompletionTable('GFM', gfmTests);\nrunTests({\n  tests: gfmTests,\n  parse,\n  defaultMarkedOptions: { gfm: true, pedantic: false },\n});\n\nrunTests({\n  tests: newTests,\n  parse,\n});\n\nrunTests({\n  tests: originalTests,\n  parse,\n  defaultMarkedOptions: { gfm: false, pedantic: true },\n});\n\nrunTests({\n  tests: redosTests,\n  parse,\n});\n"
  },
  {
    "path": "test/specs/commonmark/commonmark.0.31.2.json",
    "content": "[\n  {\n    \"markdown\": \"\\tfoo\\tbaz\\t\\tbim\\n\",\n    \"html\": \"<pre><code>foo\\tbaz\\t\\tbim\\n</code></pre>\\n\",\n    \"example\": 1,\n    \"start_line\": 355,\n    \"end_line\": 360,\n    \"section\": \"Tabs\"\n  },\n  {\n    \"markdown\": \"  \\tfoo\\tbaz\\t\\tbim\\n\",\n    \"html\": \"<pre><code>foo\\tbaz\\t\\tbim\\n</code></pre>\\n\",\n    \"example\": 2,\n    \"start_line\": 362,\n    \"end_line\": 367,\n    \"section\": \"Tabs\"\n  },\n  {\n    \"markdown\": \"    a\\ta\\n    ὐ\\ta\\n\",\n    \"html\": \"<pre><code>a\\ta\\nὐ\\ta\\n</code></pre>\\n\",\n    \"example\": 3,\n    \"start_line\": 369,\n    \"end_line\": 376,\n    \"section\": \"Tabs\"\n  },\n  {\n    \"markdown\": \"  - foo\\n\\n\\tbar\\n\",\n    \"html\": \"<ul>\\n<li>\\n<p>foo</p>\\n<p>bar</p>\\n</li>\\n</ul>\\n\",\n    \"example\": 4,\n    \"start_line\": 382,\n    \"end_line\": 393,\n    \"section\": \"Tabs\"\n  },\n  {\n    \"markdown\": \"- foo\\n\\n\\t\\tbar\\n\",\n    \"html\": \"<ul>\\n<li>\\n<p>foo</p>\\n<pre><code>  bar\\n</code></pre>\\n</li>\\n</ul>\\n\",\n    \"example\": 5,\n    \"start_line\": 395,\n    \"end_line\": 407,\n    \"section\": \"Tabs\"\n  },\n  {\n    \"markdown\": \">\\t\\tfoo\\n\",\n    \"html\": \"<blockquote>\\n<pre><code>  foo\\n</code></pre>\\n</blockquote>\\n\",\n    \"example\": 6,\n    \"start_line\": 418,\n    \"end_line\": 425,\n    \"section\": \"Tabs\"\n  },\n  {\n    \"markdown\": \"-\\t\\tfoo\\n\",\n    \"html\": \"<ul>\\n<li>\\n<pre><code>  foo\\n</code></pre>\\n</li>\\n</ul>\\n\",\n    \"example\": 7,\n    \"start_line\": 427,\n    \"end_line\": 436,\n    \"section\": \"Tabs\"\n  },\n  {\n    \"markdown\": \"    foo\\n\\tbar\\n\",\n    \"html\": \"<pre><code>foo\\nbar\\n</code></pre>\\n\",\n    \"example\": 8,\n    \"start_line\": 439,\n    \"end_line\": 446,\n    \"section\": \"Tabs\"\n  },\n  {\n    \"markdown\": \" - foo\\n   - bar\\n\\t - baz\\n\",\n    \"html\": \"<ul>\\n<li>foo\\n<ul>\\n<li>bar\\n<ul>\\n<li>baz</li>\\n</ul>\\n</li>\\n</ul>\\n</li>\\n</ul>\\n\",\n    \"example\": 9,\n    \"start_line\": 448,\n    \"end_line\": 464,\n    \"section\": \"Tabs\"\n  },\n  {\n    \"markdown\": \"#\\tFoo\\n\",\n    \"html\": \"<h1>Foo</h1>\\n\",\n    \"example\": 10,\n    \"start_line\": 466,\n    \"end_line\": 470,\n    \"section\": \"Tabs\"\n  },\n  {\n    \"markdown\": \"*\\t*\\t*\\t\\n\",\n    \"html\": \"<hr />\\n\",\n    \"example\": 11,\n    \"start_line\": 472,\n    \"end_line\": 476,\n    \"section\": \"Tabs\"\n  },\n  {\n    \"markdown\": \"\\\\!\\\\\\\"\\\\#\\\\$\\\\%\\\\&\\\\'\\\\(\\\\)\\\\*\\\\+\\\\,\\\\-\\\\.\\\\/\\\\:\\\\;\\\\<\\\\=\\\\>\\\\?\\\\@\\\\[\\\\\\\\\\\\]\\\\^\\\\_\\\\`\\\\{\\\\|\\\\}\\\\~\\n\",\n    \"html\": \"<p>!&quot;#$%&amp;'()*+,-./:;&lt;=&gt;?@[\\\\]^_`{|}~</p>\\n\",\n    \"example\": 12,\n    \"start_line\": 489,\n    \"end_line\": 493,\n    \"section\": \"Backslash escapes\"\n  },\n  {\n    \"markdown\": \"\\\\\\t\\\\A\\\\a\\\\ \\\\3\\\\φ\\\\«\\n\",\n    \"html\": \"<p>\\\\\\t\\\\A\\\\a\\\\ \\\\3\\\\φ\\\\«</p>\\n\",\n    \"example\": 13,\n    \"start_line\": 499,\n    \"end_line\": 503,\n    \"section\": \"Backslash escapes\"\n  },\n  {\n    \"markdown\": \"\\\\*not emphasized*\\n\\\\<br/> not a tag\\n\\\\[not a link](/foo)\\n\\\\`not code`\\n1\\\\. not a list\\n\\\\* not a list\\n\\\\# not a heading\\n\\\\[foo]: /url \\\"not a reference\\\"\\n\\\\&ouml; not a character entity\\n\",\n    \"html\": \"<p>*not emphasized*\\n&lt;br/&gt; not a tag\\n[not a link](/foo)\\n`not code`\\n1. not a list\\n* not a list\\n# not a heading\\n[foo]: /url &quot;not a reference&quot;\\n&amp;ouml; not a character entity</p>\\n\",\n    \"example\": 14,\n    \"start_line\": 509,\n    \"end_line\": 529,\n    \"section\": \"Backslash escapes\"\n  },\n  {\n    \"markdown\": \"\\\\\\\\*emphasis*\\n\",\n    \"html\": \"<p>\\\\<em>emphasis</em></p>\\n\",\n    \"example\": 15,\n    \"start_line\": 534,\n    \"end_line\": 538,\n    \"section\": \"Backslash escapes\"\n  },\n  {\n    \"markdown\": \"foo\\\\\\nbar\\n\",\n    \"html\": \"<p>foo<br />\\nbar</p>\\n\",\n    \"example\": 16,\n    \"start_line\": 543,\n    \"end_line\": 549,\n    \"section\": \"Backslash escapes\"\n  },\n  {\n    \"markdown\": \"`` \\\\[\\\\` ``\\n\",\n    \"html\": \"<p><code>\\\\[\\\\`</code></p>\\n\",\n    \"example\": 17,\n    \"start_line\": 555,\n    \"end_line\": 559,\n    \"section\": \"Backslash escapes\"\n  },\n  {\n    \"markdown\": \"    \\\\[\\\\]\\n\",\n    \"html\": \"<pre><code>\\\\[\\\\]\\n</code></pre>\\n\",\n    \"example\": 18,\n    \"start_line\": 562,\n    \"end_line\": 567,\n    \"section\": \"Backslash escapes\"\n  },\n  {\n    \"markdown\": \"~~~\\n\\\\[\\\\]\\n~~~\\n\",\n    \"html\": \"<pre><code>\\\\[\\\\]\\n</code></pre>\\n\",\n    \"example\": 19,\n    \"start_line\": 570,\n    \"end_line\": 577,\n    \"section\": \"Backslash escapes\"\n  },\n  {\n    \"markdown\": \"<https://example.com?find=\\\\*>\\n\",\n    \"html\": \"<p><a href=\\\"https://example.com?find=%5C*\\\">https://example.com?find=\\\\*</a></p>\\n\",\n    \"example\": 20,\n    \"start_line\": 580,\n    \"end_line\": 584,\n    \"section\": \"Backslash escapes\"\n  },\n  {\n    \"markdown\": \"<a href=\\\"/bar\\\\/)\\\">\\n\",\n    \"html\": \"<a href=\\\"/bar\\\\/)\\\">\\n\",\n    \"example\": 21,\n    \"start_line\": 587,\n    \"end_line\": 591,\n    \"section\": \"Backslash escapes\"\n  },\n  {\n    \"markdown\": \"[foo](/bar\\\\* \\\"ti\\\\*tle\\\")\\n\",\n    \"html\": \"<p><a href=\\\"/bar*\\\" title=\\\"ti*tle\\\">foo</a></p>\\n\",\n    \"example\": 22,\n    \"start_line\": 597,\n    \"end_line\": 601,\n    \"section\": \"Backslash escapes\"\n  },\n  {\n    \"markdown\": \"[foo]\\n\\n[foo]: /bar\\\\* \\\"ti\\\\*tle\\\"\\n\",\n    \"html\": \"<p><a href=\\\"/bar*\\\" title=\\\"ti*tle\\\">foo</a></p>\\n\",\n    \"example\": 23,\n    \"start_line\": 604,\n    \"end_line\": 610,\n    \"section\": \"Backslash escapes\"\n  },\n  {\n    \"markdown\": \"``` foo\\\\+bar\\nfoo\\n```\\n\",\n    \"html\": \"<pre><code class=\\\"language-foo+bar\\\">foo\\n</code></pre>\\n\",\n    \"example\": 24,\n    \"start_line\": 613,\n    \"end_line\": 620,\n    \"section\": \"Backslash escapes\"\n  },\n  {\n    \"markdown\": \"&nbsp; &amp; &copy; &AElig; &Dcaron;\\n&frac34; &HilbertSpace; &DifferentialD;\\n&ClockwiseContourIntegral; &ngE;\\n\",\n    \"html\": \"<p>  &amp; © Æ Ď\\n¾ ℋ ⅆ\\n∲ ≧̸</p>\\n\",\n    \"example\": 25,\n    \"start_line\": 649,\n    \"end_line\": 657,\n    \"section\": \"Entity and numeric character references\"\n  },\n  {\n    \"markdown\": \"&#35; &#1234; &#992; &#0;\\n\",\n    \"html\": \"<p># Ӓ Ϡ �</p>\\n\",\n    \"example\": 26,\n    \"start_line\": 668,\n    \"end_line\": 672,\n    \"section\": \"Entity and numeric character references\"\n  },\n  {\n    \"markdown\": \"&#X22; &#XD06; &#xcab;\\n\",\n    \"html\": \"<p>&quot; ആ ಫ</p>\\n\",\n    \"example\": 27,\n    \"start_line\": 681,\n    \"end_line\": 685,\n    \"section\": \"Entity and numeric character references\"\n  },\n  {\n    \"markdown\": \"&nbsp &x; &#; &#x;\\n&#87654321;\\n&#abcdef0;\\n&ThisIsNotDefined; &hi?;\\n\",\n    \"html\": \"<p>&amp;nbsp &amp;x; &amp;#; &amp;#x;\\n&amp;#87654321;\\n&amp;#abcdef0;\\n&amp;ThisIsNotDefined; &amp;hi?;</p>\\n\",\n    \"example\": 28,\n    \"start_line\": 690,\n    \"end_line\": 700,\n    \"section\": \"Entity and numeric character references\"\n  },\n  {\n    \"markdown\": \"&copy\\n\",\n    \"html\": \"<p>&amp;copy</p>\\n\",\n    \"example\": 29,\n    \"start_line\": 707,\n    \"end_line\": 711,\n    \"section\": \"Entity and numeric character references\"\n  },\n  {\n    \"markdown\": \"&MadeUpEntity;\\n\",\n    \"html\": \"<p>&amp;MadeUpEntity;</p>\\n\",\n    \"example\": 30,\n    \"start_line\": 717,\n    \"end_line\": 721,\n    \"section\": \"Entity and numeric character references\"\n  },\n  {\n    \"markdown\": \"<a href=\\\"&ouml;&ouml;.html\\\">\\n\",\n    \"html\": \"<a href=\\\"&ouml;&ouml;.html\\\">\\n\",\n    \"example\": 31,\n    \"start_line\": 728,\n    \"end_line\": 732,\n    \"section\": \"Entity and numeric character references\"\n  },\n  {\n    \"markdown\": \"[foo](/f&ouml;&ouml; \\\"f&ouml;&ouml;\\\")\\n\",\n    \"html\": \"<p><a href=\\\"/f%C3%B6%C3%B6\\\" title=\\\"föö\\\">foo</a></p>\\n\",\n    \"example\": 32,\n    \"start_line\": 735,\n    \"end_line\": 739,\n    \"section\": \"Entity and numeric character references\",\n    \"shouldFail\": true\n  },\n  {\n    \"markdown\": \"[foo]\\n\\n[foo]: /f&ouml;&ouml; \\\"f&ouml;&ouml;\\\"\\n\",\n    \"html\": \"<p><a href=\\\"/f%C3%B6%C3%B6\\\" title=\\\"föö\\\">foo</a></p>\\n\",\n    \"example\": 33,\n    \"start_line\": 742,\n    \"end_line\": 748,\n    \"section\": \"Entity and numeric character references\",\n    \"shouldFail\": true\n  },\n  {\n    \"markdown\": \"``` f&ouml;&ouml;\\nfoo\\n```\\n\",\n    \"html\": \"<pre><code class=\\\"language-föö\\\">foo\\n</code></pre>\\n\",\n    \"example\": 34,\n    \"start_line\": 751,\n    \"end_line\": 758,\n    \"section\": \"Entity and numeric character references\"\n  },\n  {\n    \"markdown\": \"`f&ouml;&ouml;`\\n\",\n    \"html\": \"<p><code>f&amp;ouml;&amp;ouml;</code></p>\\n\",\n    \"example\": 35,\n    \"start_line\": 764,\n    \"end_line\": 768,\n    \"section\": \"Entity and numeric character references\"\n  },\n  {\n    \"markdown\": \"    f&ouml;f&ouml;\\n\",\n    \"html\": \"<pre><code>f&amp;ouml;f&amp;ouml;\\n</code></pre>\\n\",\n    \"example\": 36,\n    \"start_line\": 771,\n    \"end_line\": 776,\n    \"section\": \"Entity and numeric character references\"\n  },\n  {\n    \"markdown\": \"&#42;foo&#42;\\n*foo*\\n\",\n    \"html\": \"<p>*foo*\\n<em>foo</em></p>\\n\",\n    \"example\": 37,\n    \"start_line\": 783,\n    \"end_line\": 789,\n    \"section\": \"Entity and numeric character references\"\n  },\n  {\n    \"markdown\": \"&#42; foo\\n\\n* foo\\n\",\n    \"html\": \"<p>* foo</p>\\n<ul>\\n<li>foo</li>\\n</ul>\\n\",\n    \"example\": 38,\n    \"start_line\": 791,\n    \"end_line\": 800,\n    \"section\": \"Entity and numeric character references\"\n  },\n  {\n    \"markdown\": \"foo&#10;&#10;bar\\n\",\n    \"html\": \"<p>foo\\n\\nbar</p>\\n\",\n    \"example\": 39,\n    \"start_line\": 802,\n    \"end_line\": 808,\n    \"section\": \"Entity and numeric character references\"\n  },\n  {\n    \"markdown\": \"&#9;foo\\n\",\n    \"html\": \"<p>\\tfoo</p>\\n\",\n    \"example\": 40,\n    \"start_line\": 810,\n    \"end_line\": 814,\n    \"section\": \"Entity and numeric character references\"\n  },\n  {\n    \"markdown\": \"[a](url &quot;tit&quot;)\\n\",\n    \"html\": \"<p>[a](url &quot;tit&quot;)</p>\\n\",\n    \"example\": 41,\n    \"start_line\": 817,\n    \"end_line\": 821,\n    \"section\": \"Entity and numeric character references\"\n  },\n  {\n    \"markdown\": \"- `one\\n- two`\\n\",\n    \"html\": \"<ul>\\n<li>`one</li>\\n<li>two`</li>\\n</ul>\\n\",\n    \"example\": 42,\n    \"start_line\": 840,\n    \"end_line\": 848,\n    \"section\": \"Precedence\"\n  },\n  {\n    \"markdown\": \"***\\n---\\n___\\n\",\n    \"html\": \"<hr />\\n<hr />\\n<hr />\\n\",\n    \"example\": 43,\n    \"start_line\": 879,\n    \"end_line\": 887,\n    \"section\": \"Thematic breaks\"\n  },\n  {\n    \"markdown\": \"+++\\n\",\n    \"html\": \"<p>+++</p>\\n\",\n    \"example\": 44,\n    \"start_line\": 892,\n    \"end_line\": 896,\n    \"section\": \"Thematic breaks\"\n  },\n  {\n    \"markdown\": \"===\\n\",\n    \"html\": \"<p>===</p>\\n\",\n    \"example\": 45,\n    \"start_line\": 899,\n    \"end_line\": 903,\n    \"section\": \"Thematic breaks\"\n  },\n  {\n    \"markdown\": \"--\\n**\\n__\\n\",\n    \"html\": \"<p>--\\n**\\n__</p>\\n\",\n    \"example\": 46,\n    \"start_line\": 908,\n    \"end_line\": 916,\n    \"section\": \"Thematic breaks\"\n  },\n  {\n    \"markdown\": \" ***\\n  ***\\n   ***\\n\",\n    \"html\": \"<hr />\\n<hr />\\n<hr />\\n\",\n    \"example\": 47,\n    \"start_line\": 921,\n    \"end_line\": 929,\n    \"section\": \"Thematic breaks\"\n  },\n  {\n    \"markdown\": \"    ***\\n\",\n    \"html\": \"<pre><code>***\\n</code></pre>\\n\",\n    \"example\": 48,\n    \"start_line\": 934,\n    \"end_line\": 939,\n    \"section\": \"Thematic breaks\"\n  },\n  {\n    \"markdown\": \"Foo\\n    ***\\n\",\n    \"html\": \"<p>Foo\\n***</p>\\n\",\n    \"example\": 49,\n    \"start_line\": 942,\n    \"end_line\": 948,\n    \"section\": \"Thematic breaks\"\n  },\n  {\n    \"markdown\": \"_____________________________________\\n\",\n    \"html\": \"<hr />\\n\",\n    \"example\": 50,\n    \"start_line\": 953,\n    \"end_line\": 957,\n    \"section\": \"Thematic breaks\"\n  },\n  {\n    \"markdown\": \" - - -\\n\",\n    \"html\": \"<hr />\\n\",\n    \"example\": 51,\n    \"start_line\": 962,\n    \"end_line\": 966,\n    \"section\": \"Thematic breaks\"\n  },\n  {\n    \"markdown\": \" **  * ** * ** * **\\n\",\n    \"html\": \"<hr />\\n\",\n    \"example\": 52,\n    \"start_line\": 969,\n    \"end_line\": 973,\n    \"section\": \"Thematic breaks\"\n  },\n  {\n    \"markdown\": \"-     -      -      -\\n\",\n    \"html\": \"<hr />\\n\",\n    \"example\": 53,\n    \"start_line\": 976,\n    \"end_line\": 980,\n    \"section\": \"Thematic breaks\"\n  },\n  {\n    \"markdown\": \"- - - -    \\n\",\n    \"html\": \"<hr />\\n\",\n    \"example\": 54,\n    \"start_line\": 985,\n    \"end_line\": 989,\n    \"section\": \"Thematic breaks\"\n  },\n  {\n    \"markdown\": \"_ _ _ _ a\\n\\na------\\n\\n---a---\\n\",\n    \"html\": \"<p>_ _ _ _ a</p>\\n<p>a------</p>\\n<p>---a---</p>\\n\",\n    \"example\": 55,\n    \"start_line\": 994,\n    \"end_line\": 1004,\n    \"section\": \"Thematic breaks\"\n  },\n  {\n    \"markdown\": \" *-*\\n\",\n    \"html\": \"<p><em>-</em></p>\\n\",\n    \"example\": 56,\n    \"start_line\": 1010,\n    \"end_line\": 1014,\n    \"section\": \"Thematic breaks\"\n  },\n  {\n    \"markdown\": \"- foo\\n***\\n- bar\\n\",\n    \"html\": \"<ul>\\n<li>foo</li>\\n</ul>\\n<hr />\\n<ul>\\n<li>bar</li>\\n</ul>\\n\",\n    \"example\": 57,\n    \"start_line\": 1019,\n    \"end_line\": 1031,\n    \"section\": \"Thematic breaks\"\n  },\n  {\n    \"markdown\": \"Foo\\n***\\nbar\\n\",\n    \"html\": \"<p>Foo</p>\\n<hr />\\n<p>bar</p>\\n\",\n    \"example\": 58,\n    \"start_line\": 1036,\n    \"end_line\": 1044,\n    \"section\": \"Thematic breaks\"\n  },\n  {\n    \"markdown\": \"Foo\\n---\\nbar\\n\",\n    \"html\": \"<h2>Foo</h2>\\n<p>bar</p>\\n\",\n    \"example\": 59,\n    \"start_line\": 1053,\n    \"end_line\": 1060,\n    \"section\": \"Thematic breaks\"\n  },\n  {\n    \"markdown\": \"* Foo\\n* * *\\n* Bar\\n\",\n    \"html\": \"<ul>\\n<li>Foo</li>\\n</ul>\\n<hr />\\n<ul>\\n<li>Bar</li>\\n</ul>\\n\",\n    \"example\": 60,\n    \"start_line\": 1066,\n    \"end_line\": 1078,\n    \"section\": \"Thematic breaks\"\n  },\n  {\n    \"markdown\": \"- Foo\\n- * * *\\n\",\n    \"html\": \"<ul>\\n<li>Foo</li>\\n<li>\\n<hr />\\n</li>\\n</ul>\\n\",\n    \"example\": 61,\n    \"start_line\": 1083,\n    \"end_line\": 1093,\n    \"section\": \"Thematic breaks\"\n  },\n  {\n    \"markdown\": \"# foo\\n## foo\\n### foo\\n#### foo\\n##### foo\\n###### foo\\n\",\n    \"html\": \"<h1>foo</h1>\\n<h2>foo</h2>\\n<h3>foo</h3>\\n<h4>foo</h4>\\n<h5>foo</h5>\\n<h6>foo</h6>\\n\",\n    \"example\": 62,\n    \"start_line\": 1112,\n    \"end_line\": 1126,\n    \"section\": \"ATX headings\"\n  },\n  {\n    \"markdown\": \"####### foo\\n\",\n    \"html\": \"<p>####### foo</p>\\n\",\n    \"example\": 63,\n    \"start_line\": 1131,\n    \"end_line\": 1135,\n    \"section\": \"ATX headings\"\n  },\n  {\n    \"markdown\": \"#5 bolt\\n\\n#hashtag\\n\",\n    \"html\": \"<p>#5 bolt</p>\\n<p>#hashtag</p>\\n\",\n    \"example\": 64,\n    \"start_line\": 1146,\n    \"end_line\": 1153,\n    \"section\": \"ATX headings\"\n  },\n  {\n    \"markdown\": \"\\\\## foo\\n\",\n    \"html\": \"<p>## foo</p>\\n\",\n    \"example\": 65,\n    \"start_line\": 1158,\n    \"end_line\": 1162,\n    \"section\": \"ATX headings\"\n  },\n  {\n    \"markdown\": \"# foo *bar* \\\\*baz\\\\*\\n\",\n    \"html\": \"<h1>foo <em>bar</em> *baz*</h1>\\n\",\n    \"example\": 66,\n    \"start_line\": 1167,\n    \"end_line\": 1171,\n    \"section\": \"ATX headings\"\n  },\n  {\n    \"markdown\": \"#                  foo                     \\n\",\n    \"html\": \"<h1>foo</h1>\\n\",\n    \"example\": 67,\n    \"start_line\": 1176,\n    \"end_line\": 1180,\n    \"section\": \"ATX headings\"\n  },\n  {\n    \"markdown\": \" ### foo\\n  ## foo\\n   # foo\\n\",\n    \"html\": \"<h3>foo</h3>\\n<h2>foo</h2>\\n<h1>foo</h1>\\n\",\n    \"example\": 68,\n    \"start_line\": 1185,\n    \"end_line\": 1193,\n    \"section\": \"ATX headings\"\n  },\n  {\n    \"markdown\": \"    # foo\\n\",\n    \"html\": \"<pre><code># foo\\n</code></pre>\\n\",\n    \"example\": 69,\n    \"start_line\": 1198,\n    \"end_line\": 1203,\n    \"section\": \"ATX headings\"\n  },\n  {\n    \"markdown\": \"foo\\n    # bar\\n\",\n    \"html\": \"<p>foo\\n# bar</p>\\n\",\n    \"example\": 70,\n    \"start_line\": 1206,\n    \"end_line\": 1212,\n    \"section\": \"ATX headings\"\n  },\n  {\n    \"markdown\": \"## foo ##\\n  ###   bar    ###\\n\",\n    \"html\": \"<h2>foo</h2>\\n<h3>bar</h3>\\n\",\n    \"example\": 71,\n    \"start_line\": 1217,\n    \"end_line\": 1223,\n    \"section\": \"ATX headings\"\n  },\n  {\n    \"markdown\": \"# foo ##################################\\n##### foo ##\\n\",\n    \"html\": \"<h1>foo</h1>\\n<h5>foo</h5>\\n\",\n    \"example\": 72,\n    \"start_line\": 1228,\n    \"end_line\": 1234,\n    \"section\": \"ATX headings\"\n  },\n  {\n    \"markdown\": \"### foo ###     \\n\",\n    \"html\": \"<h3>foo</h3>\\n\",\n    \"example\": 73,\n    \"start_line\": 1239,\n    \"end_line\": 1243,\n    \"section\": \"ATX headings\"\n  },\n  {\n    \"markdown\": \"### foo ### b\\n\",\n    \"html\": \"<h3>foo ### b</h3>\\n\",\n    \"example\": 74,\n    \"start_line\": 1250,\n    \"end_line\": 1254,\n    \"section\": \"ATX headings\"\n  },\n  {\n    \"markdown\": \"# foo#\\n\",\n    \"html\": \"<h1>foo#</h1>\\n\",\n    \"example\": 75,\n    \"start_line\": 1259,\n    \"end_line\": 1263,\n    \"section\": \"ATX headings\"\n  },\n  {\n    \"markdown\": \"### foo \\\\###\\n## foo #\\\\##\\n# foo \\\\#\\n\",\n    \"html\": \"<h3>foo ###</h3>\\n<h2>foo ###</h2>\\n<h1>foo #</h1>\\n\",\n    \"example\": 76,\n    \"start_line\": 1269,\n    \"end_line\": 1277,\n    \"section\": \"ATX headings\"\n  },\n  {\n    \"markdown\": \"****\\n## foo\\n****\\n\",\n    \"html\": \"<hr />\\n<h2>foo</h2>\\n<hr />\\n\",\n    \"example\": 77,\n    \"start_line\": 1283,\n    \"end_line\": 1291,\n    \"section\": \"ATX headings\"\n  },\n  {\n    \"markdown\": \"Foo bar\\n# baz\\nBar foo\\n\",\n    \"html\": \"<p>Foo bar</p>\\n<h1>baz</h1>\\n<p>Bar foo</p>\\n\",\n    \"example\": 78,\n    \"start_line\": 1294,\n    \"end_line\": 1302,\n    \"section\": \"ATX headings\"\n  },\n  {\n    \"markdown\": \"## \\n#\\n### ###\\n\",\n    \"html\": \"<h2></h2>\\n<h1></h1>\\n<h3></h3>\\n\",\n    \"example\": 79,\n    \"start_line\": 1307,\n    \"end_line\": 1315,\n    \"section\": \"ATX headings\"\n  },\n  {\n    \"markdown\": \"Foo *bar*\\n=========\\n\\nFoo *bar*\\n---------\\n\",\n    \"html\": \"<h1>Foo <em>bar</em></h1>\\n<h2>Foo <em>bar</em></h2>\\n\",\n    \"example\": 80,\n    \"start_line\": 1347,\n    \"end_line\": 1356,\n    \"section\": \"Setext headings\"\n  },\n  {\n    \"markdown\": \"Foo *bar\\nbaz*\\n====\\n\",\n    \"html\": \"<h1>Foo <em>bar\\nbaz</em></h1>\\n\",\n    \"example\": 81,\n    \"start_line\": 1361,\n    \"end_line\": 1368,\n    \"section\": \"Setext headings\"\n  },\n  {\n    \"markdown\": \"  Foo *bar\\nbaz*\\t\\n====\\n\",\n    \"html\": \"<h1>Foo <em>bar\\nbaz</em></h1>\\n\",\n    \"example\": 82,\n    \"start_line\": 1375,\n    \"end_line\": 1382,\n    \"section\": \"Setext headings\"\n  },\n  {\n    \"markdown\": \"Foo\\n-------------------------\\n\\nFoo\\n=\\n\",\n    \"html\": \"<h2>Foo</h2>\\n<h1>Foo</h1>\\n\",\n    \"example\": 83,\n    \"start_line\": 1387,\n    \"end_line\": 1396,\n    \"section\": \"Setext headings\"\n  },\n  {\n    \"markdown\": \"   Foo\\n---\\n\\n  Foo\\n-----\\n\\n  Foo\\n  ===\\n\",\n    \"html\": \"<h2>Foo</h2>\\n<h2>Foo</h2>\\n<h1>Foo</h1>\\n\",\n    \"example\": 84,\n    \"start_line\": 1402,\n    \"end_line\": 1415,\n    \"section\": \"Setext headings\"\n  },\n  {\n    \"markdown\": \"    Foo\\n    ---\\n\\n    Foo\\n---\\n\",\n    \"html\": \"<pre><code>Foo\\n---\\n\\nFoo\\n</code></pre>\\n<hr />\\n\",\n    \"example\": 85,\n    \"start_line\": 1420,\n    \"end_line\": 1433,\n    \"section\": \"Setext headings\"\n  },\n  {\n    \"markdown\": \"Foo\\n   ----      \\n\",\n    \"html\": \"<h2>Foo</h2>\\n\",\n    \"example\": 86,\n    \"start_line\": 1439,\n    \"end_line\": 1444,\n    \"section\": \"Setext headings\"\n  },\n  {\n    \"markdown\": \"Foo\\n    ---\\n\",\n    \"html\": \"<p>Foo\\n---</p>\\n\",\n    \"example\": 87,\n    \"start_line\": 1449,\n    \"end_line\": 1455,\n    \"section\": \"Setext headings\"\n  },\n  {\n    \"markdown\": \"Foo\\n= =\\n\\nFoo\\n--- -\\n\",\n    \"html\": \"<p>Foo\\n= =</p>\\n<p>Foo</p>\\n<hr />\\n\",\n    \"example\": 88,\n    \"start_line\": 1460,\n    \"end_line\": 1471,\n    \"section\": \"Setext headings\"\n  },\n  {\n    \"markdown\": \"Foo  \\n-----\\n\",\n    \"html\": \"<h2>Foo</h2>\\n\",\n    \"example\": 89,\n    \"start_line\": 1476,\n    \"end_line\": 1481,\n    \"section\": \"Setext headings\"\n  },\n  {\n    \"markdown\": \"Foo\\\\\\n----\\n\",\n    \"html\": \"<h2>Foo\\\\</h2>\\n\",\n    \"example\": 90,\n    \"start_line\": 1486,\n    \"end_line\": 1491,\n    \"section\": \"Setext headings\"\n  },\n  {\n    \"markdown\": \"`Foo\\n----\\n`\\n\\n<a title=\\\"a lot\\n---\\nof dashes\\\"/>\\n\",\n    \"html\": \"<h2>`Foo</h2>\\n<p>`</p>\\n<h2>&lt;a title=&quot;a lot</h2>\\n<p>of dashes&quot;/&gt;</p>\\n\",\n    \"example\": 91,\n    \"start_line\": 1497,\n    \"end_line\": 1510,\n    \"section\": \"Setext headings\"\n  },\n  {\n    \"markdown\": \"> Foo\\n---\\n\",\n    \"html\": \"<blockquote>\\n<p>Foo</p>\\n</blockquote>\\n<hr />\\n\",\n    \"example\": 92,\n    \"start_line\": 1516,\n    \"end_line\": 1524,\n    \"section\": \"Setext headings\"\n  },\n  {\n    \"markdown\": \"> foo\\nbar\\n===\\n\",\n    \"html\": \"<blockquote>\\n<p>foo\\nbar\\n===</p>\\n</blockquote>\\n\",\n    \"example\": 93,\n    \"start_line\": 1527,\n    \"end_line\": 1537,\n    \"section\": \"Setext headings\"\n  },\n  {\n    \"markdown\": \"- Foo\\n---\\n\",\n    \"html\": \"<ul>\\n<li>Foo</li>\\n</ul>\\n<hr />\\n\",\n    \"example\": 94,\n    \"start_line\": 1540,\n    \"end_line\": 1548,\n    \"section\": \"Setext headings\"\n  },\n  {\n    \"markdown\": \"Foo\\nBar\\n---\\n\",\n    \"html\": \"<h2>Foo\\nBar</h2>\\n\",\n    \"example\": 95,\n    \"start_line\": 1555,\n    \"end_line\": 1562,\n    \"section\": \"Setext headings\"\n  },\n  {\n    \"markdown\": \"---\\nFoo\\n---\\nBar\\n---\\nBaz\\n\",\n    \"html\": \"<hr />\\n<h2>Foo</h2>\\n<h2>Bar</h2>\\n<p>Baz</p>\\n\",\n    \"example\": 96,\n    \"start_line\": 1568,\n    \"end_line\": 1580,\n    \"section\": \"Setext headings\"\n  },\n  {\n    \"markdown\": \"\\n====\\n\",\n    \"html\": \"<p>====</p>\\n\",\n    \"example\": 97,\n    \"start_line\": 1585,\n    \"end_line\": 1590,\n    \"section\": \"Setext headings\"\n  },\n  {\n    \"markdown\": \"---\\n---\\n\",\n    \"html\": \"<hr />\\n<hr />\\n\",\n    \"example\": 98,\n    \"start_line\": 1597,\n    \"end_line\": 1603,\n    \"section\": \"Setext headings\"\n  },\n  {\n    \"markdown\": \"- foo\\n-----\\n\",\n    \"html\": \"<ul>\\n<li>foo</li>\\n</ul>\\n<hr />\\n\",\n    \"example\": 99,\n    \"start_line\": 1606,\n    \"end_line\": 1614,\n    \"section\": \"Setext headings\"\n  },\n  {\n    \"markdown\": \"    foo\\n---\\n\",\n    \"html\": \"<pre><code>foo\\n</code></pre>\\n<hr />\\n\",\n    \"example\": 100,\n    \"start_line\": 1617,\n    \"end_line\": 1624,\n    \"section\": \"Setext headings\"\n  },\n  {\n    \"markdown\": \"> foo\\n-----\\n\",\n    \"html\": \"<blockquote>\\n<p>foo</p>\\n</blockquote>\\n<hr />\\n\",\n    \"example\": 101,\n    \"start_line\": 1627,\n    \"end_line\": 1635,\n    \"section\": \"Setext headings\"\n  },\n  {\n    \"markdown\": \"\\\\> foo\\n------\\n\",\n    \"html\": \"<h2>&gt; foo</h2>\\n\",\n    \"example\": 102,\n    \"start_line\": 1641,\n    \"end_line\": 1646,\n    \"section\": \"Setext headings\"\n  },\n  {\n    \"markdown\": \"Foo\\n\\nbar\\n---\\nbaz\\n\",\n    \"html\": \"<p>Foo</p>\\n<h2>bar</h2>\\n<p>baz</p>\\n\",\n    \"example\": 103,\n    \"start_line\": 1672,\n    \"end_line\": 1682,\n    \"section\": \"Setext headings\"\n  },\n  {\n    \"markdown\": \"Foo\\nbar\\n\\n---\\n\\nbaz\\n\",\n    \"html\": \"<p>Foo\\nbar</p>\\n<hr />\\n<p>baz</p>\\n\",\n    \"example\": 104,\n    \"start_line\": 1688,\n    \"end_line\": 1700,\n    \"section\": \"Setext headings\"\n  },\n  {\n    \"markdown\": \"Foo\\nbar\\n* * *\\nbaz\\n\",\n    \"html\": \"<p>Foo\\nbar</p>\\n<hr />\\n<p>baz</p>\\n\",\n    \"example\": 105,\n    \"start_line\": 1706,\n    \"end_line\": 1716,\n    \"section\": \"Setext headings\"\n  },\n  {\n    \"markdown\": \"Foo\\nbar\\n\\\\---\\nbaz\\n\",\n    \"html\": \"<p>Foo\\nbar\\n---\\nbaz</p>\\n\",\n    \"example\": 106,\n    \"start_line\": 1721,\n    \"end_line\": 1731,\n    \"section\": \"Setext headings\"\n  },\n  {\n    \"markdown\": \"    a simple\\n      indented code block\\n\",\n    \"html\": \"<pre><code>a simple\\n  indented code block\\n</code></pre>\\n\",\n    \"example\": 107,\n    \"start_line\": 1749,\n    \"end_line\": 1756,\n    \"section\": \"Indented code blocks\"\n  },\n  {\n    \"markdown\": \"  - foo\\n\\n    bar\\n\",\n    \"html\": \"<ul>\\n<li>\\n<p>foo</p>\\n<p>bar</p>\\n</li>\\n</ul>\\n\",\n    \"example\": 108,\n    \"start_line\": 1763,\n    \"end_line\": 1774,\n    \"section\": \"Indented code blocks\"\n  },\n  {\n    \"markdown\": \"1.  foo\\n\\n    - bar\\n\",\n    \"html\": \"<ol>\\n<li>\\n<p>foo</p>\\n<ul>\\n<li>bar</li>\\n</ul>\\n</li>\\n</ol>\\n\",\n    \"example\": 109,\n    \"start_line\": 1777,\n    \"end_line\": 1790,\n    \"section\": \"Indented code blocks\"\n  },\n  {\n    \"markdown\": \"    <a/>\\n    *hi*\\n\\n    - one\\n\",\n    \"html\": \"<pre><code>&lt;a/&gt;\\n*hi*\\n\\n- one\\n</code></pre>\\n\",\n    \"example\": 110,\n    \"start_line\": 1797,\n    \"end_line\": 1808,\n    \"section\": \"Indented code blocks\"\n  },\n  {\n    \"markdown\": \"    chunk1\\n\\n    chunk2\\n  \\n \\n \\n    chunk3\\n\",\n    \"html\": \"<pre><code>chunk1\\n\\nchunk2\\n\\n\\n\\nchunk3\\n</code></pre>\\n\",\n    \"example\": 111,\n    \"start_line\": 1813,\n    \"end_line\": 1830,\n    \"section\": \"Indented code blocks\"\n  },\n  {\n    \"markdown\": \"    chunk1\\n      \\n      chunk2\\n\",\n    \"html\": \"<pre><code>chunk1\\n  \\n  chunk2\\n</code></pre>\\n\",\n    \"example\": 112,\n    \"start_line\": 1836,\n    \"end_line\": 1845,\n    \"section\": \"Indented code blocks\"\n  },\n  {\n    \"markdown\": \"Foo\\n    bar\\n\\n\",\n    \"html\": \"<p>Foo\\nbar</p>\\n\",\n    \"example\": 113,\n    \"start_line\": 1851,\n    \"end_line\": 1858,\n    \"section\": \"Indented code blocks\"\n  },\n  {\n    \"markdown\": \"    foo\\nbar\\n\",\n    \"html\": \"<pre><code>foo\\n</code></pre>\\n<p>bar</p>\\n\",\n    \"example\": 114,\n    \"start_line\": 1865,\n    \"end_line\": 1872,\n    \"section\": \"Indented code blocks\"\n  },\n  {\n    \"markdown\": \"# Heading\\n    foo\\nHeading\\n------\\n    foo\\n----\\n\",\n    \"html\": \"<h1>Heading</h1>\\n<pre><code>foo\\n</code></pre>\\n<h2>Heading</h2>\\n<pre><code>foo\\n</code></pre>\\n<hr />\\n\",\n    \"example\": 115,\n    \"start_line\": 1878,\n    \"end_line\": 1893,\n    \"section\": \"Indented code blocks\"\n  },\n  {\n    \"markdown\": \"        foo\\n    bar\\n\",\n    \"html\": \"<pre><code>    foo\\nbar\\n</code></pre>\\n\",\n    \"example\": 116,\n    \"start_line\": 1898,\n    \"end_line\": 1905,\n    \"section\": \"Indented code blocks\"\n  },\n  {\n    \"markdown\": \"\\n    \\n    foo\\n    \\n\\n\",\n    \"html\": \"<pre><code>foo\\n</code></pre>\\n\",\n    \"example\": 117,\n    \"start_line\": 1911,\n    \"end_line\": 1920,\n    \"section\": \"Indented code blocks\"\n  },\n  {\n    \"markdown\": \"    foo  \\n\",\n    \"html\": \"<pre><code>foo  \\n</code></pre>\\n\",\n    \"example\": 118,\n    \"start_line\": 1925,\n    \"end_line\": 1930,\n    \"section\": \"Indented code blocks\"\n  },\n  {\n    \"markdown\": \"```\\n<\\n >\\n```\\n\",\n    \"html\": \"<pre><code>&lt;\\n &gt;\\n</code></pre>\\n\",\n    \"example\": 119,\n    \"start_line\": 1980,\n    \"end_line\": 1989,\n    \"section\": \"Fenced code blocks\"\n  },\n  {\n    \"markdown\": \"~~~\\n<\\n >\\n~~~\\n\",\n    \"html\": \"<pre><code>&lt;\\n &gt;\\n</code></pre>\\n\",\n    \"example\": 120,\n    \"start_line\": 1994,\n    \"end_line\": 2003,\n    \"section\": \"Fenced code blocks\"\n  },\n  {\n    \"markdown\": \"``\\nfoo\\n``\\n\",\n    \"html\": \"<p><code>foo</code></p>\\n\",\n    \"example\": 121,\n    \"start_line\": 2007,\n    \"end_line\": 2013,\n    \"section\": \"Fenced code blocks\"\n  },\n  {\n    \"markdown\": \"```\\naaa\\n~~~\\n```\\n\",\n    \"html\": \"<pre><code>aaa\\n~~~\\n</code></pre>\\n\",\n    \"example\": 122,\n    \"start_line\": 2018,\n    \"end_line\": 2027,\n    \"section\": \"Fenced code blocks\"\n  },\n  {\n    \"markdown\": \"~~~\\naaa\\n```\\n~~~\\n\",\n    \"html\": \"<pre><code>aaa\\n```\\n</code></pre>\\n\",\n    \"example\": 123,\n    \"start_line\": 2030,\n    \"end_line\": 2039,\n    \"section\": \"Fenced code blocks\"\n  },\n  {\n    \"markdown\": \"````\\naaa\\n```\\n``````\\n\",\n    \"html\": \"<pre><code>aaa\\n```\\n</code></pre>\\n\",\n    \"example\": 124,\n    \"start_line\": 2044,\n    \"end_line\": 2053,\n    \"section\": \"Fenced code blocks\"\n  },\n  {\n    \"markdown\": \"~~~~\\naaa\\n~~~\\n~~~~\\n\",\n    \"html\": \"<pre><code>aaa\\n~~~\\n</code></pre>\\n\",\n    \"example\": 125,\n    \"start_line\": 2056,\n    \"end_line\": 2065,\n    \"section\": \"Fenced code blocks\"\n  },\n  {\n    \"markdown\": \"```\\n\",\n    \"html\": \"<pre><code></code></pre>\\n\",\n    \"example\": 126,\n    \"start_line\": 2071,\n    \"end_line\": 2075,\n    \"section\": \"Fenced code blocks\"\n  },\n  {\n    \"markdown\": \"`````\\n\\n```\\naaa\\n\",\n    \"html\": \"<pre><code>\\n```\\naaa\\n</code></pre>\\n\",\n    \"example\": 127,\n    \"start_line\": 2078,\n    \"end_line\": 2088,\n    \"section\": \"Fenced code blocks\"\n  },\n  {\n    \"markdown\": \"> ```\\n> aaa\\n\\nbbb\\n\",\n    \"html\": \"<blockquote>\\n<pre><code>aaa\\n</code></pre>\\n</blockquote>\\n<p>bbb</p>\\n\",\n    \"example\": 128,\n    \"start_line\": 2091,\n    \"end_line\": 2102,\n    \"section\": \"Fenced code blocks\"\n  },\n  {\n    \"markdown\": \"```\\n\\n  \\n```\\n\",\n    \"html\": \"<pre><code>\\n  \\n</code></pre>\\n\",\n    \"example\": 129,\n    \"start_line\": 2107,\n    \"end_line\": 2116,\n    \"section\": \"Fenced code blocks\"\n  },\n  {\n    \"markdown\": \"```\\n```\\n\",\n    \"html\": \"<pre><code></code></pre>\\n\",\n    \"example\": 130,\n    \"start_line\": 2121,\n    \"end_line\": 2126,\n    \"section\": \"Fenced code blocks\"\n  },\n  {\n    \"markdown\": \" ```\\n aaa\\naaa\\n```\\n\",\n    \"html\": \"<pre><code>aaa\\naaa\\n</code></pre>\\n\",\n    \"example\": 131,\n    \"start_line\": 2133,\n    \"end_line\": 2142,\n    \"section\": \"Fenced code blocks\"\n  },\n  {\n    \"markdown\": \"  ```\\naaa\\n  aaa\\naaa\\n  ```\\n\",\n    \"html\": \"<pre><code>aaa\\naaa\\naaa\\n</code></pre>\\n\",\n    \"example\": 132,\n    \"start_line\": 2145,\n    \"end_line\": 2156,\n    \"section\": \"Fenced code blocks\"\n  },\n  {\n    \"markdown\": \"   ```\\n   aaa\\n    aaa\\n  aaa\\n   ```\\n\",\n    \"html\": \"<pre><code>aaa\\n aaa\\naaa\\n</code></pre>\\n\",\n    \"example\": 133,\n    \"start_line\": 2159,\n    \"end_line\": 2170,\n    \"section\": \"Fenced code blocks\"\n  },\n  {\n    \"markdown\": \"    ```\\n    aaa\\n    ```\\n\",\n    \"html\": \"<pre><code>```\\naaa\\n```\\n</code></pre>\\n\",\n    \"example\": 134,\n    \"start_line\": 2175,\n    \"end_line\": 2184,\n    \"section\": \"Fenced code blocks\"\n  },\n  {\n    \"markdown\": \"```\\naaa\\n  ```\\n\",\n    \"html\": \"<pre><code>aaa\\n</code></pre>\\n\",\n    \"example\": 135,\n    \"start_line\": 2190,\n    \"end_line\": 2197,\n    \"section\": \"Fenced code blocks\"\n  },\n  {\n    \"markdown\": \"   ```\\naaa\\n  ```\\n\",\n    \"html\": \"<pre><code>aaa\\n</code></pre>\\n\",\n    \"example\": 136,\n    \"start_line\": 2200,\n    \"end_line\": 2207,\n    \"section\": \"Fenced code blocks\"\n  },\n  {\n    \"markdown\": \"```\\naaa\\n    ```\\n\",\n    \"html\": \"<pre><code>aaa\\n    ```\\n</code></pre>\\n\",\n    \"example\": 137,\n    \"start_line\": 2212,\n    \"end_line\": 2220,\n    \"section\": \"Fenced code blocks\"\n  },\n  {\n    \"markdown\": \"``` ```\\naaa\\n\",\n    \"html\": \"<p><code> </code>\\naaa</p>\\n\",\n    \"example\": 138,\n    \"start_line\": 2226,\n    \"end_line\": 2232,\n    \"section\": \"Fenced code blocks\"\n  },\n  {\n    \"markdown\": \"~~~~~~\\naaa\\n~~~ ~~\\n\",\n    \"html\": \"<pre><code>aaa\\n~~~ ~~\\n</code></pre>\\n\",\n    \"example\": 139,\n    \"start_line\": 2235,\n    \"end_line\": 2243,\n    \"section\": \"Fenced code blocks\"\n  },\n  {\n    \"markdown\": \"foo\\n```\\nbar\\n```\\nbaz\\n\",\n    \"html\": \"<p>foo</p>\\n<pre><code>bar\\n</code></pre>\\n<p>baz</p>\\n\",\n    \"example\": 140,\n    \"start_line\": 2249,\n    \"end_line\": 2260,\n    \"section\": \"Fenced code blocks\"\n  },\n  {\n    \"markdown\": \"foo\\n---\\n~~~\\nbar\\n~~~\\n# baz\\n\",\n    \"html\": \"<h2>foo</h2>\\n<pre><code>bar\\n</code></pre>\\n<h1>baz</h1>\\n\",\n    \"example\": 141,\n    \"start_line\": 2266,\n    \"end_line\": 2278,\n    \"section\": \"Fenced code blocks\"\n  },\n  {\n    \"markdown\": \"```ruby\\ndef foo(x)\\n  return 3\\nend\\n```\\n\",\n    \"html\": \"<pre><code class=\\\"language-ruby\\\">def foo(x)\\n  return 3\\nend\\n</code></pre>\\n\",\n    \"example\": 142,\n    \"start_line\": 2288,\n    \"end_line\": 2299,\n    \"section\": \"Fenced code blocks\"\n  },\n  {\n    \"markdown\": \"~~~~    ruby startline=3 $%@#$\\ndef foo(x)\\n  return 3\\nend\\n~~~~~~~\\n\",\n    \"html\": \"<pre><code class=\\\"language-ruby\\\">def foo(x)\\n  return 3\\nend\\n</code></pre>\\n\",\n    \"example\": 143,\n    \"start_line\": 2302,\n    \"end_line\": 2313,\n    \"section\": \"Fenced code blocks\"\n  },\n  {\n    \"markdown\": \"````;\\n````\\n\",\n    \"html\": \"<pre><code class=\\\"language-;\\\"></code></pre>\\n\",\n    \"example\": 144,\n    \"start_line\": 2316,\n    \"end_line\": 2321,\n    \"section\": \"Fenced code blocks\"\n  },\n  {\n    \"markdown\": \"``` aa ```\\nfoo\\n\",\n    \"html\": \"<p><code>aa</code>\\nfoo</p>\\n\",\n    \"example\": 145,\n    \"start_line\": 2326,\n    \"end_line\": 2332,\n    \"section\": \"Fenced code blocks\"\n  },\n  {\n    \"markdown\": \"~~~ aa ``` ~~~\\nfoo\\n~~~\\n\",\n    \"html\": \"<pre><code class=\\\"language-aa\\\">foo\\n</code></pre>\\n\",\n    \"example\": 146,\n    \"start_line\": 2337,\n    \"end_line\": 2344,\n    \"section\": \"Fenced code blocks\"\n  },\n  {\n    \"markdown\": \"```\\n``` aaa\\n```\\n\",\n    \"html\": \"<pre><code>``` aaa\\n</code></pre>\\n\",\n    \"example\": 147,\n    \"start_line\": 2349,\n    \"end_line\": 2356,\n    \"section\": \"Fenced code blocks\"\n  },\n  {\n    \"markdown\": \"<table><tr><td>\\n<pre>\\n**Hello**,\\n\\n_world_.\\n</pre>\\n</td></tr></table>\\n\",\n    \"html\": \"<table><tr><td>\\n<pre>\\n**Hello**,\\n<p><em>world</em>.\\n</pre></p>\\n</td></tr></table>\\n\",\n    \"example\": 148,\n    \"start_line\": 2428,\n    \"end_line\": 2443,\n    \"section\": \"HTML blocks\"\n  },\n  {\n    \"markdown\": \"<table>\\n  <tr>\\n    <td>\\n           hi\\n    </td>\\n  </tr>\\n</table>\\n\\nokay.\\n\",\n    \"html\": \"<table>\\n  <tr>\\n    <td>\\n           hi\\n    </td>\\n  </tr>\\n</table>\\n<p>okay.</p>\\n\",\n    \"example\": 149,\n    \"start_line\": 2457,\n    \"end_line\": 2476,\n    \"section\": \"HTML blocks\"\n  },\n  {\n    \"markdown\": \" <div>\\n  *hello*\\n         <foo><a>\\n\",\n    \"html\": \" <div>\\n  *hello*\\n         <foo><a>\\n\",\n    \"example\": 150,\n    \"start_line\": 2479,\n    \"end_line\": 2487,\n    \"section\": \"HTML blocks\"\n  },\n  {\n    \"markdown\": \"</div>\\n*foo*\\n\",\n    \"html\": \"</div>\\n*foo*\\n\",\n    \"example\": 151,\n    \"start_line\": 2492,\n    \"end_line\": 2498,\n    \"section\": \"HTML blocks\"\n  },\n  {\n    \"markdown\": \"<DIV CLASS=\\\"foo\\\">\\n\\n*Markdown*\\n\\n</DIV>\\n\",\n    \"html\": \"<DIV CLASS=\\\"foo\\\">\\n<p><em>Markdown</em></p>\\n</DIV>\\n\",\n    \"example\": 152,\n    \"start_line\": 2503,\n    \"end_line\": 2513,\n    \"section\": \"HTML blocks\"\n  },\n  {\n    \"markdown\": \"<div id=\\\"foo\\\"\\n  class=\\\"bar\\\">\\n</div>\\n\",\n    \"html\": \"<div id=\\\"foo\\\"\\n  class=\\\"bar\\\">\\n</div>\\n\",\n    \"example\": 153,\n    \"start_line\": 2519,\n    \"end_line\": 2527,\n    \"section\": \"HTML blocks\"\n  },\n  {\n    \"markdown\": \"<div id=\\\"foo\\\" class=\\\"bar\\n  baz\\\">\\n</div>\\n\",\n    \"html\": \"<div id=\\\"foo\\\" class=\\\"bar\\n  baz\\\">\\n</div>\\n\",\n    \"example\": 154,\n    \"start_line\": 2530,\n    \"end_line\": 2538,\n    \"section\": \"HTML blocks\"\n  },\n  {\n    \"markdown\": \"<div>\\n*foo*\\n\\n*bar*\\n\",\n    \"html\": \"<div>\\n*foo*\\n<p><em>bar</em></p>\\n\",\n    \"example\": 155,\n    \"start_line\": 2542,\n    \"end_line\": 2551,\n    \"section\": \"HTML blocks\"\n  },\n  {\n    \"markdown\": \"<div id=\\\"foo\\\"\\n*hi*\\n\",\n    \"html\": \"<div id=\\\"foo\\\"\\n*hi*\\n\",\n    \"example\": 156,\n    \"start_line\": 2558,\n    \"end_line\": 2564,\n    \"section\": \"HTML blocks\"\n  },\n  {\n    \"markdown\": \"<div class\\nfoo\\n\",\n    \"html\": \"<div class\\nfoo\\n\",\n    \"example\": 157,\n    \"start_line\": 2567,\n    \"end_line\": 2573,\n    \"section\": \"HTML blocks\"\n  },\n  {\n    \"markdown\": \"<div *???-&&&-<---\\n*foo*\\n\",\n    \"html\": \"<div *???-&&&-<---\\n*foo*\\n\",\n    \"example\": 158,\n    \"start_line\": 2579,\n    \"end_line\": 2585,\n    \"section\": \"HTML blocks\"\n  },\n  {\n    \"markdown\": \"<div><a href=\\\"bar\\\">*foo*</a></div>\\n\",\n    \"html\": \"<div><a href=\\\"bar\\\">*foo*</a></div>\\n\",\n    \"example\": 159,\n    \"start_line\": 2591,\n    \"end_line\": 2595,\n    \"section\": \"HTML blocks\"\n  },\n  {\n    \"markdown\": \"<table><tr><td>\\nfoo\\n</td></tr></table>\\n\",\n    \"html\": \"<table><tr><td>\\nfoo\\n</td></tr></table>\\n\",\n    \"example\": 160,\n    \"start_line\": 2598,\n    \"end_line\": 2606,\n    \"section\": \"HTML blocks\"\n  },\n  {\n    \"markdown\": \"<div></div>\\n``` c\\nint x = 33;\\n```\\n\",\n    \"html\": \"<div></div>\\n``` c\\nint x = 33;\\n```\\n\",\n    \"example\": 161,\n    \"start_line\": 2615,\n    \"end_line\": 2625,\n    \"section\": \"HTML blocks\"\n  },\n  {\n    \"markdown\": \"<a href=\\\"foo\\\">\\n*bar*\\n</a>\\n\",\n    \"html\": \"<a href=\\\"foo\\\">\\n*bar*\\n</a>\\n\",\n    \"example\": 162,\n    \"start_line\": 2632,\n    \"end_line\": 2640,\n    \"section\": \"HTML blocks\"\n  },\n  {\n    \"markdown\": \"<Warning>\\n*bar*\\n</Warning>\\n\",\n    \"html\": \"<Warning>\\n*bar*\\n</Warning>\\n\",\n    \"example\": 163,\n    \"start_line\": 2645,\n    \"end_line\": 2653,\n    \"section\": \"HTML blocks\"\n  },\n  {\n    \"markdown\": \"<i class=\\\"foo\\\">\\n*bar*\\n</i>\\n\",\n    \"html\": \"<i class=\\\"foo\\\">\\n*bar*\\n</i>\\n\",\n    \"example\": 164,\n    \"start_line\": 2656,\n    \"end_line\": 2664,\n    \"section\": \"HTML blocks\"\n  },\n  {\n    \"markdown\": \"</ins>\\n*bar*\\n\",\n    \"html\": \"</ins>\\n*bar*\\n\",\n    \"example\": 165,\n    \"start_line\": 2667,\n    \"end_line\": 2673,\n    \"section\": \"HTML blocks\"\n  },\n  {\n    \"markdown\": \"<del>\\n*foo*\\n</del>\\n\",\n    \"html\": \"<del>\\n*foo*\\n</del>\\n\",\n    \"example\": 166,\n    \"start_line\": 2682,\n    \"end_line\": 2690,\n    \"section\": \"HTML blocks\"\n  },\n  {\n    \"markdown\": \"<del>\\n\\n*foo*\\n\\n</del>\\n\",\n    \"html\": \"<del>\\n<p><em>foo</em></p>\\n</del>\\n\",\n    \"example\": 167,\n    \"start_line\": 2697,\n    \"end_line\": 2707,\n    \"section\": \"HTML blocks\"\n  },\n  {\n    \"markdown\": \"<del>*foo*</del>\\n\",\n    \"html\": \"<p><del><em>foo</em></del></p>\\n\",\n    \"example\": 168,\n    \"start_line\": 2715,\n    \"end_line\": 2719,\n    \"section\": \"HTML blocks\"\n  },\n  {\n    \"markdown\": \"<pre language=\\\"haskell\\\"><code>\\nimport Text.HTML.TagSoup\\n\\nmain :: IO ()\\nmain = print $ parseTags tags\\n</code></pre>\\nokay\\n\",\n    \"html\": \"<pre language=\\\"haskell\\\"><code>\\nimport Text.HTML.TagSoup\\n\\nmain :: IO ()\\nmain = print $ parseTags tags\\n</code></pre>\\n<p>okay</p>\\n\",\n    \"example\": 169,\n    \"start_line\": 2731,\n    \"end_line\": 2747,\n    \"section\": \"HTML blocks\"\n  },\n  {\n    \"markdown\": \"<script type=\\\"text/javascript\\\">\\n// JavaScript example\\n\\ndocument.getElementById(\\\"demo\\\").innerHTML = \\\"Hello JavaScript!\\\";\\n</script>\\nokay\\n\",\n    \"html\": \"<script type=\\\"text/javascript\\\">\\n// JavaScript example\\n\\ndocument.getElementById(\\\"demo\\\").innerHTML = \\\"Hello JavaScript!\\\";\\n</script>\\n<p>okay</p>\\n\",\n    \"example\": 170,\n    \"start_line\": 2752,\n    \"end_line\": 2766,\n    \"section\": \"HTML blocks\"\n  },\n  {\n    \"markdown\": \"<textarea>\\n\\n*foo*\\n\\n_bar_\\n\\n</textarea>\\n\",\n    \"html\": \"<textarea>\\n\\n*foo*\\n\\n_bar_\\n\\n</textarea>\\n\",\n    \"example\": 171,\n    \"start_line\": 2771,\n    \"end_line\": 2787,\n    \"section\": \"HTML blocks\"\n  },\n  {\n    \"markdown\": \"<style\\n  type=\\\"text/css\\\">\\nh1 {color:red;}\\n\\np {color:blue;}\\n</style>\\nokay\\n\",\n    \"html\": \"<style\\n  type=\\\"text/css\\\">\\nh1 {color:red;}\\n\\np {color:blue;}\\n</style>\\n<p>okay</p>\\n\",\n    \"example\": 172,\n    \"start_line\": 2791,\n    \"end_line\": 2807,\n    \"section\": \"HTML blocks\"\n  },\n  {\n    \"markdown\": \"<style\\n  type=\\\"text/css\\\">\\n\\nfoo\\n\",\n    \"html\": \"<style\\n  type=\\\"text/css\\\">\\n\\nfoo\\n\",\n    \"example\": 173,\n    \"start_line\": 2814,\n    \"end_line\": 2824,\n    \"section\": \"HTML blocks\"\n  },\n  {\n    \"markdown\": \"> <div>\\n> foo\\n\\nbar\\n\",\n    \"html\": \"<blockquote>\\n<div>\\nfoo\\n</blockquote>\\n<p>bar</p>\\n\",\n    \"example\": 174,\n    \"start_line\": 2827,\n    \"end_line\": 2838,\n    \"section\": \"HTML blocks\"\n  },\n  {\n    \"markdown\": \"- <div>\\n- foo\\n\",\n    \"html\": \"<ul>\\n<li>\\n<div>\\n</li>\\n<li>foo</li>\\n</ul>\\n\",\n    \"example\": 175,\n    \"start_line\": 2841,\n    \"end_line\": 2851,\n    \"section\": \"HTML blocks\"\n  },\n  {\n    \"markdown\": \"<style>p{color:red;}</style>\\n*foo*\\n\",\n    \"html\": \"<style>p{color:red;}</style>\\n<p><em>foo</em></p>\\n\",\n    \"example\": 176,\n    \"start_line\": 2856,\n    \"end_line\": 2862,\n    \"section\": \"HTML blocks\"\n  },\n  {\n    \"markdown\": \"<!-- foo -->*bar*\\n*baz*\\n\",\n    \"html\": \"<!-- foo -->*bar*\\n<p><em>baz</em></p>\\n\",\n    \"example\": 177,\n    \"start_line\": 2865,\n    \"end_line\": 2871,\n    \"section\": \"HTML blocks\"\n  },\n  {\n    \"markdown\": \"<script>\\nfoo\\n</script>1. *bar*\\n\",\n    \"html\": \"<script>\\nfoo\\n</script>1. *bar*\\n\",\n    \"example\": 178,\n    \"start_line\": 2877,\n    \"end_line\": 2885,\n    \"section\": \"HTML blocks\"\n  },\n  {\n    \"markdown\": \"<!-- Foo\\n\\nbar\\n   baz -->\\nokay\\n\",\n    \"html\": \"<!-- Foo\\n\\nbar\\n   baz -->\\n<p>okay</p>\\n\",\n    \"example\": 179,\n    \"start_line\": 2890,\n    \"end_line\": 2902,\n    \"section\": \"HTML blocks\"\n  },\n  {\n    \"markdown\": \"<?php\\n\\n  echo '>';\\n\\n?>\\nokay\\n\",\n    \"html\": \"<?php\\n\\n  echo '>';\\n\\n?>\\n<p>okay</p>\\n\",\n    \"example\": 180,\n    \"start_line\": 2908,\n    \"end_line\": 2922,\n    \"section\": \"HTML blocks\"\n  },\n  {\n    \"markdown\": \"<!DOCTYPE html>\\n\",\n    \"html\": \"<!DOCTYPE html>\\n\",\n    \"example\": 181,\n    \"start_line\": 2927,\n    \"end_line\": 2931,\n    \"section\": \"HTML blocks\"\n  },\n  {\n    \"markdown\": \"<![CDATA[\\nfunction matchwo(a,b)\\n{\\n  if (a < b && a < 0) then {\\n    return 1;\\n\\n  } else {\\n\\n    return 0;\\n  }\\n}\\n]]>\\nokay\\n\",\n    \"html\": \"<![CDATA[\\nfunction matchwo(a,b)\\n{\\n  if (a < b && a < 0) then {\\n    return 1;\\n\\n  } else {\\n\\n    return 0;\\n  }\\n}\\n]]>\\n<p>okay</p>\\n\",\n    \"example\": 182,\n    \"start_line\": 2936,\n    \"end_line\": 2964,\n    \"section\": \"HTML blocks\"\n  },\n  {\n    \"markdown\": \"  <!-- foo -->\\n\\n    <!-- foo -->\\n\",\n    \"html\": \"  <!-- foo -->\\n<pre><code>&lt;!-- foo --&gt;\\n</code></pre>\\n\",\n    \"example\": 183,\n    \"start_line\": 2970,\n    \"end_line\": 2978,\n    \"section\": \"HTML blocks\"\n  },\n  {\n    \"markdown\": \"  <div>\\n\\n    <div>\\n\",\n    \"html\": \"  <div>\\n<pre><code>&lt;div&gt;\\n</code></pre>\\n\",\n    \"example\": 184,\n    \"start_line\": 2981,\n    \"end_line\": 2989,\n    \"section\": \"HTML blocks\"\n  },\n  {\n    \"markdown\": \"Foo\\n<div>\\nbar\\n</div>\\n\",\n    \"html\": \"<p>Foo</p>\\n<div>\\nbar\\n</div>\\n\",\n    \"example\": 185,\n    \"start_line\": 2995,\n    \"end_line\": 3005,\n    \"section\": \"HTML blocks\"\n  },\n  {\n    \"markdown\": \"<div>\\nbar\\n</div>\\n*foo*\\n\",\n    \"html\": \"<div>\\nbar\\n</div>\\n*foo*\\n\",\n    \"example\": 186,\n    \"start_line\": 3012,\n    \"end_line\": 3022,\n    \"section\": \"HTML blocks\"\n  },\n  {\n    \"markdown\": \"Foo\\n<a href=\\\"bar\\\">\\nbaz\\n\",\n    \"html\": \"<p>Foo\\n<a href=\\\"bar\\\">\\nbaz</p>\\n\",\n    \"example\": 187,\n    \"start_line\": 3027,\n    \"end_line\": 3035,\n    \"section\": \"HTML blocks\"\n  },\n  {\n    \"markdown\": \"<div>\\n\\n*Emphasized* text.\\n\\n</div>\\n\",\n    \"html\": \"<div>\\n<p><em>Emphasized</em> text.</p>\\n</div>\\n\",\n    \"example\": 188,\n    \"start_line\": 3068,\n    \"end_line\": 3078,\n    \"section\": \"HTML blocks\"\n  },\n  {\n    \"markdown\": \"<div>\\n*Emphasized* text.\\n</div>\\n\",\n    \"html\": \"<div>\\n*Emphasized* text.\\n</div>\\n\",\n    \"example\": 189,\n    \"start_line\": 3081,\n    \"end_line\": 3089,\n    \"section\": \"HTML blocks\"\n  },\n  {\n    \"markdown\": \"<table>\\n\\n<tr>\\n\\n<td>\\nHi\\n</td>\\n\\n</tr>\\n\\n</table>\\n\",\n    \"html\": \"<table>\\n<tr>\\n<td>\\nHi\\n</td>\\n</tr>\\n</table>\\n\",\n    \"example\": 190,\n    \"start_line\": 3103,\n    \"end_line\": 3123,\n    \"section\": \"HTML blocks\"\n  },\n  {\n    \"markdown\": \"<table>\\n\\n  <tr>\\n\\n    <td>\\n      Hi\\n    </td>\\n\\n  </tr>\\n\\n</table>\\n\",\n    \"html\": \"<table>\\n  <tr>\\n<pre><code>&lt;td&gt;\\n  Hi\\n&lt;/td&gt;\\n</code></pre>\\n  </tr>\\n</table>\\n\",\n    \"example\": 191,\n    \"start_line\": 3130,\n    \"end_line\": 3151,\n    \"section\": \"HTML blocks\"\n  },\n  {\n    \"markdown\": \"[foo]: /url \\\"title\\\"\\n\\n[foo]\\n\",\n    \"html\": \"<p><a href=\\\"/url\\\" title=\\\"title\\\">foo</a></p>\\n\",\n    \"example\": 192,\n    \"start_line\": 3179,\n    \"end_line\": 3185,\n    \"section\": \"Link reference definitions\"\n  },\n  {\n    \"markdown\": \"   [foo]: \\n      /url  \\n           'the title'  \\n\\n[foo]\\n\",\n    \"html\": \"<p><a href=\\\"/url\\\" title=\\\"the title\\\">foo</a></p>\\n\",\n    \"example\": 193,\n    \"start_line\": 3188,\n    \"end_line\": 3196,\n    \"section\": \"Link reference definitions\"\n  },\n  {\n    \"markdown\": \"[Foo*bar\\\\]]:my_(url) 'title (with parens)'\\n\\n[Foo*bar\\\\]]\\n\",\n    \"html\": \"<p><a href=\\\"my_(url)\\\" title=\\\"title (with parens)\\\">Foo*bar]</a></p>\\n\",\n    \"example\": 194,\n    \"start_line\": 3199,\n    \"end_line\": 3205,\n    \"section\": \"Link reference definitions\"\n  },\n  {\n    \"markdown\": \"[Foo bar]:\\n<my url>\\n'title'\\n\\n[Foo bar]\\n\",\n    \"html\": \"<p><a href=\\\"my%20url\\\" title=\\\"title\\\">Foo bar</a></p>\\n\",\n    \"example\": 195,\n    \"start_line\": 3208,\n    \"end_line\": 3216,\n    \"section\": \"Link reference definitions\"\n  },\n  {\n    \"markdown\": \"[foo]: /url '\\ntitle\\nline1\\nline2\\n'\\n\\n[foo]\\n\",\n    \"html\": \"<p><a href=\\\"/url\\\" title=\\\"\\ntitle\\nline1\\nline2\\n\\\">foo</a></p>\\n\",\n    \"example\": 196,\n    \"start_line\": 3221,\n    \"end_line\": 3235,\n    \"section\": \"Link reference definitions\"\n  },\n  {\n    \"markdown\": \"[foo]: /url 'title\\n\\nwith blank line'\\n\\n[foo]\\n\",\n    \"html\": \"<p>[foo]: /url 'title</p>\\n<p>with blank line'</p>\\n<p>[foo]</p>\\n\",\n    \"example\": 197,\n    \"start_line\": 3240,\n    \"end_line\": 3250,\n    \"section\": \"Link reference definitions\"\n  },\n  {\n    \"markdown\": \"[foo]:\\n/url\\n\\n[foo]\\n\",\n    \"html\": \"<p><a href=\\\"/url\\\">foo</a></p>\\n\",\n    \"example\": 198,\n    \"start_line\": 3255,\n    \"end_line\": 3262,\n    \"section\": \"Link reference definitions\"\n  },\n  {\n    \"markdown\": \"[foo]:\\n\\n[foo]\\n\",\n    \"html\": \"<p>[foo]:</p>\\n<p>[foo]</p>\\n\",\n    \"example\": 199,\n    \"start_line\": 3267,\n    \"end_line\": 3274,\n    \"section\": \"Link reference definitions\"\n  },\n  {\n    \"markdown\": \"[foo]: <>\\n\\n[foo]\\n\",\n    \"html\": \"<p><a href=\\\"\\\">foo</a></p>\\n\",\n    \"example\": 200,\n    \"start_line\": 3279,\n    \"end_line\": 3285,\n    \"section\": \"Link reference definitions\"\n  },\n  {\n    \"markdown\": \"[foo]: <bar>(baz)\\n\\n[foo]\\n\",\n    \"html\": \"<p>[foo]: <bar>(baz)</p>\\n<p>[foo]</p>\\n\",\n    \"example\": 201,\n    \"start_line\": 3290,\n    \"end_line\": 3297,\n    \"section\": \"Link reference definitions\"\n  },\n  {\n    \"markdown\": \"[foo]: /url\\\\bar\\\\*baz \\\"foo\\\\\\\"bar\\\\baz\\\"\\n\\n[foo]\\n\",\n    \"html\": \"<p><a href=\\\"/url%5Cbar*baz\\\" title=\\\"foo&quot;bar\\\\baz\\\">foo</a></p>\\n\",\n    \"example\": 202,\n    \"start_line\": 3303,\n    \"end_line\": 3309,\n    \"section\": \"Link reference definitions\"\n  },\n  {\n    \"markdown\": \"[foo]\\n\\n[foo]: url\\n\",\n    \"html\": \"<p><a href=\\\"url\\\">foo</a></p>\\n\",\n    \"example\": 203,\n    \"start_line\": 3314,\n    \"end_line\": 3320,\n    \"section\": \"Link reference definitions\"\n  },\n  {\n    \"markdown\": \"[foo]\\n\\n[foo]: first\\n[foo]: second\\n\",\n    \"html\": \"<p><a href=\\\"first\\\">foo</a></p>\\n\",\n    \"example\": 204,\n    \"start_line\": 3326,\n    \"end_line\": 3333,\n    \"section\": \"Link reference definitions\"\n  },\n  {\n    \"markdown\": \"[FOO]: /url\\n\\n[Foo]\\n\",\n    \"html\": \"<p><a href=\\\"/url\\\">Foo</a></p>\\n\",\n    \"example\": 205,\n    \"start_line\": 3339,\n    \"end_line\": 3345,\n    \"section\": \"Link reference definitions\"\n  },\n  {\n    \"markdown\": \"[ΑΓΩ]: /φου\\n\\n[αγω]\\n\",\n    \"html\": \"<p><a href=\\\"/%CF%86%CE%BF%CF%85\\\">αγω</a></p>\\n\",\n    \"example\": 206,\n    \"start_line\": 3348,\n    \"end_line\": 3354,\n    \"section\": \"Link reference definitions\"\n  },\n  {\n    \"markdown\": \"[foo]: /url\\n\",\n    \"html\": \"\",\n    \"example\": 207,\n    \"start_line\": 3363,\n    \"end_line\": 3366,\n    \"section\": \"Link reference definitions\"\n  },\n  {\n    \"markdown\": \"[\\nfoo\\n]: /url\\nbar\\n\",\n    \"html\": \"<p>bar</p>\\n\",\n    \"example\": 208,\n    \"start_line\": 3371,\n    \"end_line\": 3378,\n    \"section\": \"Link reference definitions\"\n  },\n  {\n    \"markdown\": \"[foo]: /url \\\"title\\\" ok\\n\",\n    \"html\": \"<p>[foo]: /url &quot;title&quot; ok</p>\\n\",\n    \"example\": 209,\n    \"start_line\": 3384,\n    \"end_line\": 3388,\n    \"section\": \"Link reference definitions\"\n  },\n  {\n    \"markdown\": \"[foo]: /url\\n\\\"title\\\" ok\\n\",\n    \"html\": \"<p>&quot;title&quot; ok</p>\\n\",\n    \"example\": 210,\n    \"start_line\": 3393,\n    \"end_line\": 3398,\n    \"section\": \"Link reference definitions\"\n  },\n  {\n    \"markdown\": \"    [foo]: /url \\\"title\\\"\\n\\n[foo]\\n\",\n    \"html\": \"<pre><code>[foo]: /url &quot;title&quot;\\n</code></pre>\\n<p>[foo]</p>\\n\",\n    \"example\": 211,\n    \"start_line\": 3404,\n    \"end_line\": 3412,\n    \"section\": \"Link reference definitions\"\n  },\n  {\n    \"markdown\": \"```\\n[foo]: /url\\n```\\n\\n[foo]\\n\",\n    \"html\": \"<pre><code>[foo]: /url\\n</code></pre>\\n<p>[foo]</p>\\n\",\n    \"example\": 212,\n    \"start_line\": 3418,\n    \"end_line\": 3428,\n    \"section\": \"Link reference definitions\"\n  },\n  {\n    \"markdown\": \"Foo\\n[bar]: /baz\\n\\n[bar]\\n\",\n    \"html\": \"<p>Foo\\n[bar]: /baz</p>\\n<p>[bar]</p>\\n\",\n    \"example\": 213,\n    \"start_line\": 3433,\n    \"end_line\": 3442,\n    \"section\": \"Link reference definitions\"\n  },\n  {\n    \"markdown\": \"# [Foo]\\n[foo]: /url\\n> bar\\n\",\n    \"html\": \"<h1><a href=\\\"/url\\\">Foo</a></h1>\\n<blockquote>\\n<p>bar</p>\\n</blockquote>\\n\",\n    \"example\": 214,\n    \"start_line\": 3448,\n    \"end_line\": 3457,\n    \"section\": \"Link reference definitions\"\n  },\n  {\n    \"markdown\": \"[foo]: /url\\nbar\\n===\\n[foo]\\n\",\n    \"html\": \"<h1>bar</h1>\\n<p><a href=\\\"/url\\\">foo</a></p>\\n\",\n    \"example\": 215,\n    \"start_line\": 3459,\n    \"end_line\": 3467,\n    \"section\": \"Link reference definitions\"\n  },\n  {\n    \"markdown\": \"[foo]: /url\\n===\\n[foo]\\n\",\n    \"html\": \"<p>===\\n<a href=\\\"/url\\\">foo</a></p>\\n\",\n    \"example\": 216,\n    \"start_line\": 3469,\n    \"end_line\": 3476,\n    \"section\": \"Link reference definitions\"\n  },\n  {\n    \"markdown\": \"[foo]: /foo-url \\\"foo\\\"\\n[bar]: /bar-url\\n  \\\"bar\\\"\\n[baz]: /baz-url\\n\\n[foo],\\n[bar],\\n[baz]\\n\",\n    \"html\": \"<p><a href=\\\"/foo-url\\\" title=\\\"foo\\\">foo</a>,\\n<a href=\\\"/bar-url\\\" title=\\\"bar\\\">bar</a>,\\n<a href=\\\"/baz-url\\\">baz</a></p>\\n\",\n    \"example\": 217,\n    \"start_line\": 3482,\n    \"end_line\": 3495,\n    \"section\": \"Link reference definitions\"\n  },\n  {\n    \"markdown\": \"[foo]\\n\\n> [foo]: /url\\n\",\n    \"html\": \"<p><a href=\\\"/url\\\">foo</a></p>\\n<blockquote>\\n</blockquote>\\n\",\n    \"example\": 218,\n    \"start_line\": 3503,\n    \"end_line\": 3511,\n    \"section\": \"Link reference definitions\"\n  },\n  {\n    \"markdown\": \"aaa\\n\\nbbb\\n\",\n    \"html\": \"<p>aaa</p>\\n<p>bbb</p>\\n\",\n    \"example\": 219,\n    \"start_line\": 3525,\n    \"end_line\": 3532,\n    \"section\": \"Paragraphs\"\n  },\n  {\n    \"markdown\": \"aaa\\nbbb\\n\\nccc\\nddd\\n\",\n    \"html\": \"<p>aaa\\nbbb</p>\\n<p>ccc\\nddd</p>\\n\",\n    \"example\": 220,\n    \"start_line\": 3537,\n    \"end_line\": 3548,\n    \"section\": \"Paragraphs\"\n  },\n  {\n    \"markdown\": \"aaa\\n\\n\\nbbb\\n\",\n    \"html\": \"<p>aaa</p>\\n<p>bbb</p>\\n\",\n    \"example\": 221,\n    \"start_line\": 3553,\n    \"end_line\": 3561,\n    \"section\": \"Paragraphs\"\n  },\n  {\n    \"markdown\": \"  aaa\\n bbb\\n\",\n    \"html\": \"<p>aaa\\nbbb</p>\\n\",\n    \"example\": 222,\n    \"start_line\": 3566,\n    \"end_line\": 3572,\n    \"section\": \"Paragraphs\"\n  },\n  {\n    \"markdown\": \"aaa\\n             bbb\\n                                       ccc\\n\",\n    \"html\": \"<p>aaa\\nbbb\\nccc</p>\\n\",\n    \"example\": 223,\n    \"start_line\": 3578,\n    \"end_line\": 3586,\n    \"section\": \"Paragraphs\"\n  },\n  {\n    \"markdown\": \"   aaa\\nbbb\\n\",\n    \"html\": \"<p>aaa\\nbbb</p>\\n\",\n    \"example\": 224,\n    \"start_line\": 3592,\n    \"end_line\": 3598,\n    \"section\": \"Paragraphs\"\n  },\n  {\n    \"markdown\": \"    aaa\\nbbb\\n\",\n    \"html\": \"<pre><code>aaa\\n</code></pre>\\n<p>bbb</p>\\n\",\n    \"example\": 225,\n    \"start_line\": 3601,\n    \"end_line\": 3608,\n    \"section\": \"Paragraphs\"\n  },\n  {\n    \"markdown\": \"aaa     \\nbbb     \\n\",\n    \"html\": \"<p>aaa<br />\\nbbb</p>\\n\",\n    \"example\": 226,\n    \"start_line\": 3615,\n    \"end_line\": 3621,\n    \"section\": \"Paragraphs\"\n  },\n  {\n    \"markdown\": \"  \\n\\naaa\\n  \\n\\n# aaa\\n\\n  \\n\",\n    \"html\": \"<p>aaa</p>\\n<h1>aaa</h1>\\n\",\n    \"example\": 227,\n    \"start_line\": 3632,\n    \"end_line\": 3644,\n    \"section\": \"Blank lines\"\n  },\n  {\n    \"markdown\": \"> # Foo\\n> bar\\n> baz\\n\",\n    \"html\": \"<blockquote>\\n<h1>Foo</h1>\\n<p>bar\\nbaz</p>\\n</blockquote>\\n\",\n    \"example\": 228,\n    \"start_line\": 3700,\n    \"end_line\": 3710,\n    \"section\": \"Block quotes\"\n  },\n  {\n    \"markdown\": \"># Foo\\n>bar\\n> baz\\n\",\n    \"html\": \"<blockquote>\\n<h1>Foo</h1>\\n<p>bar\\nbaz</p>\\n</blockquote>\\n\",\n    \"example\": 229,\n    \"start_line\": 3715,\n    \"end_line\": 3725,\n    \"section\": \"Block quotes\"\n  },\n  {\n    \"markdown\": \"   > # Foo\\n   > bar\\n > baz\\n\",\n    \"html\": \"<blockquote>\\n<h1>Foo</h1>\\n<p>bar\\nbaz</p>\\n</blockquote>\\n\",\n    \"example\": 230,\n    \"start_line\": 3730,\n    \"end_line\": 3740,\n    \"section\": \"Block quotes\"\n  },\n  {\n    \"markdown\": \"    > # Foo\\n    > bar\\n    > baz\\n\",\n    \"html\": \"<pre><code>&gt; # Foo\\n&gt; bar\\n&gt; baz\\n</code></pre>\\n\",\n    \"example\": 231,\n    \"start_line\": 3745,\n    \"end_line\": 3754,\n    \"section\": \"Block quotes\"\n  },\n  {\n    \"markdown\": \"> # Foo\\n> bar\\nbaz\\n\",\n    \"html\": \"<blockquote>\\n<h1>Foo</h1>\\n<p>bar\\nbaz</p>\\n</blockquote>\\n\",\n    \"example\": 232,\n    \"start_line\": 3760,\n    \"end_line\": 3770,\n    \"section\": \"Block quotes\"\n  },\n  {\n    \"markdown\": \"> bar\\nbaz\\n> foo\\n\",\n    \"html\": \"<blockquote>\\n<p>bar\\nbaz\\nfoo</p>\\n</blockquote>\\n\",\n    \"example\": 233,\n    \"start_line\": 3776,\n    \"end_line\": 3786,\n    \"section\": \"Block quotes\"\n  },\n  {\n    \"markdown\": \"> foo\\n---\\n\",\n    \"html\": \"<blockquote>\\n<p>foo</p>\\n</blockquote>\\n<hr />\\n\",\n    \"example\": 234,\n    \"start_line\": 3800,\n    \"end_line\": 3808,\n    \"section\": \"Block quotes\"\n  },\n  {\n    \"markdown\": \"> - foo\\n- bar\\n\",\n    \"html\": \"<blockquote>\\n<ul>\\n<li>foo</li>\\n</ul>\\n</blockquote>\\n<ul>\\n<li>bar</li>\\n</ul>\\n\",\n    \"example\": 235,\n    \"start_line\": 3820,\n    \"end_line\": 3832,\n    \"section\": \"Block quotes\"\n  },\n  {\n    \"markdown\": \">     foo\\n    bar\\n\",\n    \"html\": \"<blockquote>\\n<pre><code>foo\\n</code></pre>\\n</blockquote>\\n<pre><code>bar\\n</code></pre>\\n\",\n    \"example\": 236,\n    \"start_line\": 3838,\n    \"end_line\": 3848,\n    \"section\": \"Block quotes\"\n  },\n  {\n    \"markdown\": \"> ```\\nfoo\\n```\\n\",\n    \"html\": \"<blockquote>\\n<pre><code></code></pre>\\n</blockquote>\\n<p>foo</p>\\n<pre><code></code></pre>\\n\",\n    \"example\": 237,\n    \"start_line\": 3851,\n    \"end_line\": 3861,\n    \"section\": \"Block quotes\"\n  },\n  {\n    \"markdown\": \"> foo\\n    - bar\\n\",\n    \"html\": \"<blockquote>\\n<p>foo\\n- bar</p>\\n</blockquote>\\n\",\n    \"example\": 238,\n    \"start_line\": 3867,\n    \"end_line\": 3875,\n    \"section\": \"Block quotes\"\n  },\n  {\n    \"markdown\": \">\\n\",\n    \"html\": \"<blockquote>\\n</blockquote>\\n\",\n    \"example\": 239,\n    \"start_line\": 3891,\n    \"end_line\": 3896,\n    \"section\": \"Block quotes\"\n  },\n  {\n    \"markdown\": \">\\n>  \\n> \\n\",\n    \"html\": \"<blockquote>\\n</blockquote>\\n\",\n    \"example\": 240,\n    \"start_line\": 3899,\n    \"end_line\": 3906,\n    \"section\": \"Block quotes\"\n  },\n  {\n    \"markdown\": \">\\n> foo\\n>  \\n\",\n    \"html\": \"<blockquote>\\n<p>foo</p>\\n</blockquote>\\n\",\n    \"example\": 241,\n    \"start_line\": 3911,\n    \"end_line\": 3919,\n    \"section\": \"Block quotes\"\n  },\n  {\n    \"markdown\": \"> foo\\n\\n> bar\\n\",\n    \"html\": \"<blockquote>\\n<p>foo</p>\\n</blockquote>\\n<blockquote>\\n<p>bar</p>\\n</blockquote>\\n\",\n    \"example\": 242,\n    \"start_line\": 3924,\n    \"end_line\": 3935,\n    \"section\": \"Block quotes\"\n  },\n  {\n    \"markdown\": \"> foo\\n> bar\\n\",\n    \"html\": \"<blockquote>\\n<p>foo\\nbar</p>\\n</blockquote>\\n\",\n    \"example\": 243,\n    \"start_line\": 3946,\n    \"end_line\": 3954,\n    \"section\": \"Block quotes\"\n  },\n  {\n    \"markdown\": \"> foo\\n>\\n> bar\\n\",\n    \"html\": \"<blockquote>\\n<p>foo</p>\\n<p>bar</p>\\n</blockquote>\\n\",\n    \"example\": 244,\n    \"start_line\": 3959,\n    \"end_line\": 3968,\n    \"section\": \"Block quotes\"\n  },\n  {\n    \"markdown\": \"foo\\n> bar\\n\",\n    \"html\": \"<p>foo</p>\\n<blockquote>\\n<p>bar</p>\\n</blockquote>\\n\",\n    \"example\": 245,\n    \"start_line\": 3973,\n    \"end_line\": 3981,\n    \"section\": \"Block quotes\"\n  },\n  {\n    \"markdown\": \"> aaa\\n***\\n> bbb\\n\",\n    \"html\": \"<blockquote>\\n<p>aaa</p>\\n</blockquote>\\n<hr />\\n<blockquote>\\n<p>bbb</p>\\n</blockquote>\\n\",\n    \"example\": 246,\n    \"start_line\": 3987,\n    \"end_line\": 3999,\n    \"section\": \"Block quotes\"\n  },\n  {\n    \"markdown\": \"> bar\\nbaz\\n\",\n    \"html\": \"<blockquote>\\n<p>bar\\nbaz</p>\\n</blockquote>\\n\",\n    \"example\": 247,\n    \"start_line\": 4005,\n    \"end_line\": 4013,\n    \"section\": \"Block quotes\"\n  },\n  {\n    \"markdown\": \"> bar\\n\\nbaz\\n\",\n    \"html\": \"<blockquote>\\n<p>bar</p>\\n</blockquote>\\n<p>baz</p>\\n\",\n    \"example\": 248,\n    \"start_line\": 4016,\n    \"end_line\": 4025,\n    \"section\": \"Block quotes\"\n  },\n  {\n    \"markdown\": \"> bar\\n>\\nbaz\\n\",\n    \"html\": \"<blockquote>\\n<p>bar</p>\\n</blockquote>\\n<p>baz</p>\\n\",\n    \"example\": 249,\n    \"start_line\": 4028,\n    \"end_line\": 4037,\n    \"section\": \"Block quotes\"\n  },\n  {\n    \"markdown\": \"> > > foo\\nbar\\n\",\n    \"html\": \"<blockquote>\\n<blockquote>\\n<blockquote>\\n<p>foo\\nbar</p>\\n</blockquote>\\n</blockquote>\\n</blockquote>\\n\",\n    \"example\": 250,\n    \"start_line\": 4044,\n    \"end_line\": 4056,\n    \"section\": \"Block quotes\"\n  },\n  {\n    \"markdown\": \">>> foo\\n> bar\\n>>baz\\n\",\n    \"html\": \"<blockquote>\\n<blockquote>\\n<blockquote>\\n<p>foo\\nbar\\nbaz</p>\\n</blockquote>\\n</blockquote>\\n</blockquote>\\n\",\n    \"example\": 251,\n    \"start_line\": 4059,\n    \"end_line\": 4073,\n    \"section\": \"Block quotes\"\n  },\n  {\n    \"markdown\": \">     code\\n\\n>    not code\\n\",\n    \"html\": \"<blockquote>\\n<pre><code>code\\n</code></pre>\\n</blockquote>\\n<blockquote>\\n<p>not code</p>\\n</blockquote>\\n\",\n    \"example\": 252,\n    \"start_line\": 4081,\n    \"end_line\": 4093,\n    \"section\": \"Block quotes\"\n  },\n  {\n    \"markdown\": \"A paragraph\\nwith two lines.\\n\\n    indented code\\n\\n> A block quote.\\n\",\n    \"html\": \"<p>A paragraph\\nwith two lines.</p>\\n<pre><code>indented code\\n</code></pre>\\n<blockquote>\\n<p>A block quote.</p>\\n</blockquote>\\n\",\n    \"example\": 253,\n    \"start_line\": 4135,\n    \"end_line\": 4150,\n    \"section\": \"List items\"\n  },\n  {\n    \"markdown\": \"1.  A paragraph\\n    with two lines.\\n\\n        indented code\\n\\n    > A block quote.\\n\",\n    \"html\": \"<ol>\\n<li>\\n<p>A paragraph\\nwith two lines.</p>\\n<pre><code>indented code\\n</code></pre>\\n<blockquote>\\n<p>A block quote.</p>\\n</blockquote>\\n</li>\\n</ol>\\n\",\n    \"example\": 254,\n    \"start_line\": 4157,\n    \"end_line\": 4176,\n    \"section\": \"List items\"\n  },\n  {\n    \"markdown\": \"- one\\n\\n two\\n\",\n    \"html\": \"<ul>\\n<li>one</li>\\n</ul>\\n<p>two</p>\\n\",\n    \"example\": 255,\n    \"start_line\": 4190,\n    \"end_line\": 4199,\n    \"section\": \"List items\"\n  },\n  {\n    \"markdown\": \"- one\\n\\n  two\\n\",\n    \"html\": \"<ul>\\n<li>\\n<p>one</p>\\n<p>two</p>\\n</li>\\n</ul>\\n\",\n    \"example\": 256,\n    \"start_line\": 4202,\n    \"end_line\": 4213,\n    \"section\": \"List items\"\n  },\n  {\n    \"markdown\": \" -    one\\n\\n     two\\n\",\n    \"html\": \"<ul>\\n<li>one</li>\\n</ul>\\n<pre><code> two\\n</code></pre>\\n\",\n    \"example\": 257,\n    \"start_line\": 4216,\n    \"end_line\": 4226,\n    \"section\": \"List items\"\n  },\n  {\n    \"markdown\": \" -    one\\n\\n      two\\n\",\n    \"html\": \"<ul>\\n<li>\\n<p>one</p>\\n<p>two</p>\\n</li>\\n</ul>\\n\",\n    \"example\": 258,\n    \"start_line\": 4229,\n    \"end_line\": 4240,\n    \"section\": \"List items\"\n  },\n  {\n    \"markdown\": \"   > > 1.  one\\n>>\\n>>     two\\n\",\n    \"html\": \"<blockquote>\\n<blockquote>\\n<ol>\\n<li>\\n<p>one</p>\\n<p>two</p>\\n</li>\\n</ol>\\n</blockquote>\\n</blockquote>\\n\",\n    \"example\": 259,\n    \"start_line\": 4251,\n    \"end_line\": 4266,\n    \"section\": \"List items\"\n  },\n  {\n    \"markdown\": \">>- one\\n>>\\n  >  > two\\n\",\n    \"html\": \"<blockquote>\\n<blockquote>\\n<ul>\\n<li>one</li>\\n</ul>\\n<p>two</p>\\n</blockquote>\\n</blockquote>\\n\",\n    \"example\": 260,\n    \"start_line\": 4278,\n    \"end_line\": 4291,\n    \"section\": \"List items\"\n  },\n  {\n    \"markdown\": \"-one\\n\\n2.two\\n\",\n    \"html\": \"<p>-one</p>\\n<p>2.two</p>\\n\",\n    \"example\": 261,\n    \"start_line\": 4297,\n    \"end_line\": 4304,\n    \"section\": \"List items\"\n  },\n  {\n    \"markdown\": \"- foo\\n\\n\\n  bar\\n\",\n    \"html\": \"<ul>\\n<li>\\n<p>foo</p>\\n<p>bar</p>\\n</li>\\n</ul>\\n\",\n    \"example\": 262,\n    \"start_line\": 4310,\n    \"end_line\": 4322,\n    \"section\": \"List items\"\n  },\n  {\n    \"markdown\": \"1.  foo\\n\\n    ```\\n    bar\\n    ```\\n\\n    baz\\n\\n    > bam\\n\",\n    \"html\": \"<ol>\\n<li>\\n<p>foo</p>\\n<pre><code>bar\\n</code></pre>\\n<p>baz</p>\\n<blockquote>\\n<p>bam</p>\\n</blockquote>\\n</li>\\n</ol>\\n\",\n    \"example\": 263,\n    \"start_line\": 4327,\n    \"end_line\": 4349,\n    \"section\": \"List items\"\n  },\n  {\n    \"markdown\": \"- Foo\\n\\n      bar\\n\\n\\n      baz\\n\",\n    \"html\": \"<ul>\\n<li>\\n<p>Foo</p>\\n<pre><code>bar\\n\\n\\nbaz\\n</code></pre>\\n</li>\\n</ul>\\n\",\n    \"example\": 264,\n    \"start_line\": 4355,\n    \"end_line\": 4373,\n    \"section\": \"List items\"\n  },\n  {\n    \"markdown\": \"123456789. ok\\n\",\n    \"html\": \"<ol start=\\\"123456789\\\">\\n<li>ok</li>\\n</ol>\\n\",\n    \"example\": 265,\n    \"start_line\": 4377,\n    \"end_line\": 4383,\n    \"section\": \"List items\"\n  },\n  {\n    \"markdown\": \"1234567890. not ok\\n\",\n    \"html\": \"<p>1234567890. not ok</p>\\n\",\n    \"example\": 266,\n    \"start_line\": 4386,\n    \"end_line\": 4390,\n    \"section\": \"List items\"\n  },\n  {\n    \"markdown\": \"0. ok\\n\",\n    \"html\": \"<ol start=\\\"0\\\">\\n<li>ok</li>\\n</ol>\\n\",\n    \"example\": 267,\n    \"start_line\": 4395,\n    \"end_line\": 4401,\n    \"section\": \"List items\"\n  },\n  {\n    \"markdown\": \"003. ok\\n\",\n    \"html\": \"<ol start=\\\"3\\\">\\n<li>ok</li>\\n</ol>\\n\",\n    \"example\": 268,\n    \"start_line\": 4404,\n    \"end_line\": 4410,\n    \"section\": \"List items\"\n  },\n  {\n    \"markdown\": \"-1. not ok\\n\",\n    \"html\": \"<p>-1. not ok</p>\\n\",\n    \"example\": 269,\n    \"start_line\": 4415,\n    \"end_line\": 4419,\n    \"section\": \"List items\"\n  },\n  {\n    \"markdown\": \"- foo\\n\\n      bar\\n\",\n    \"html\": \"<ul>\\n<li>\\n<p>foo</p>\\n<pre><code>bar\\n</code></pre>\\n</li>\\n</ul>\\n\",\n    \"example\": 270,\n    \"start_line\": 4438,\n    \"end_line\": 4450,\n    \"section\": \"List items\"\n  },\n  {\n    \"markdown\": \"  10.  foo\\n\\n           bar\\n\",\n    \"html\": \"<ol start=\\\"10\\\">\\n<li>\\n<p>foo</p>\\n<pre><code>bar\\n</code></pre>\\n</li>\\n</ol>\\n\",\n    \"example\": 271,\n    \"start_line\": 4455,\n    \"end_line\": 4467,\n    \"section\": \"List items\"\n  },\n  {\n    \"markdown\": \"    indented code\\n\\nparagraph\\n\\n    more code\\n\",\n    \"html\": \"<pre><code>indented code\\n</code></pre>\\n<p>paragraph</p>\\n<pre><code>more code\\n</code></pre>\\n\",\n    \"example\": 272,\n    \"start_line\": 4474,\n    \"end_line\": 4486,\n    \"section\": \"List items\"\n  },\n  {\n    \"markdown\": \"1.     indented code\\n\\n   paragraph\\n\\n       more code\\n\",\n    \"html\": \"<ol>\\n<li>\\n<pre><code>indented code\\n</code></pre>\\n<p>paragraph</p>\\n<pre><code>more code\\n</code></pre>\\n</li>\\n</ol>\\n\",\n    \"example\": 273,\n    \"start_line\": 4489,\n    \"end_line\": 4505,\n    \"section\": \"List items\"\n  },\n  {\n    \"markdown\": \"1.      indented code\\n\\n   paragraph\\n\\n       more code\\n\",\n    \"html\": \"<ol>\\n<li>\\n<pre><code> indented code\\n</code></pre>\\n<p>paragraph</p>\\n<pre><code>more code\\n</code></pre>\\n</li>\\n</ol>\\n\",\n    \"example\": 274,\n    \"start_line\": 4511,\n    \"end_line\": 4527,\n    \"section\": \"List items\"\n  },\n  {\n    \"markdown\": \"   foo\\n\\nbar\\n\",\n    \"html\": \"<p>foo</p>\\n<p>bar</p>\\n\",\n    \"example\": 275,\n    \"start_line\": 4538,\n    \"end_line\": 4545,\n    \"section\": \"List items\"\n  },\n  {\n    \"markdown\": \"-    foo\\n\\n  bar\\n\",\n    \"html\": \"<ul>\\n<li>foo</li>\\n</ul>\\n<p>bar</p>\\n\",\n    \"example\": 276,\n    \"start_line\": 4548,\n    \"end_line\": 4557,\n    \"section\": \"List items\"\n  },\n  {\n    \"markdown\": \"-  foo\\n\\n   bar\\n\",\n    \"html\": \"<ul>\\n<li>\\n<p>foo</p>\\n<p>bar</p>\\n</li>\\n</ul>\\n\",\n    \"example\": 277,\n    \"start_line\": 4565,\n    \"end_line\": 4576,\n    \"section\": \"List items\"\n  },\n  {\n    \"markdown\": \"-\\n  foo\\n-\\n  ```\\n  bar\\n  ```\\n-\\n      baz\\n\",\n    \"html\": \"<ul>\\n<li>foo</li>\\n<li>\\n<pre><code>bar\\n</code></pre>\\n</li>\\n<li>\\n<pre><code>baz\\n</code></pre>\\n</li>\\n</ul>\\n\",\n    \"example\": 278,\n    \"start_line\": 4592,\n    \"end_line\": 4613,\n    \"section\": \"List items\"\n  },\n  {\n    \"markdown\": \"-   \\n  foo\\n\",\n    \"html\": \"<ul>\\n<li>foo</li>\\n</ul>\\n\",\n    \"example\": 279,\n    \"start_line\": 4618,\n    \"end_line\": 4625,\n    \"section\": \"List items\"\n  },\n  {\n    \"markdown\": \"-\\n\\n  foo\\n\",\n    \"html\": \"<ul>\\n<li></li>\\n</ul>\\n<p>foo</p>\\n\",\n    \"example\": 280,\n    \"start_line\": 4632,\n    \"end_line\": 4641,\n    \"section\": \"List items\"\n  },\n  {\n    \"markdown\": \"- foo\\n-\\n- bar\\n\",\n    \"html\": \"<ul>\\n<li>foo</li>\\n<li></li>\\n<li>bar</li>\\n</ul>\\n\",\n    \"example\": 281,\n    \"start_line\": 4646,\n    \"end_line\": 4656,\n    \"section\": \"List items\"\n  },\n  {\n    \"markdown\": \"- foo\\n-   \\n- bar\\n\",\n    \"html\": \"<ul>\\n<li>foo</li>\\n<li></li>\\n<li>bar</li>\\n</ul>\\n\",\n    \"example\": 282,\n    \"start_line\": 4661,\n    \"end_line\": 4671,\n    \"section\": \"List items\"\n  },\n  {\n    \"markdown\": \"1. foo\\n2.\\n3. bar\\n\",\n    \"html\": \"<ol>\\n<li>foo</li>\\n<li></li>\\n<li>bar</li>\\n</ol>\\n\",\n    \"example\": 283,\n    \"start_line\": 4676,\n    \"end_line\": 4686,\n    \"section\": \"List items\"\n  },\n  {\n    \"markdown\": \"*\\n\",\n    \"html\": \"<ul>\\n<li></li>\\n</ul>\\n\",\n    \"example\": 284,\n    \"start_line\": 4691,\n    \"end_line\": 4697,\n    \"section\": \"List items\"\n  },\n  {\n    \"markdown\": \"foo\\n*\\n\\nfoo\\n1.\\n\",\n    \"html\": \"<p>foo\\n*</p>\\n<p>foo\\n1.</p>\\n\",\n    \"example\": 285,\n    \"start_line\": 4701,\n    \"end_line\": 4712,\n    \"section\": \"List items\"\n  },\n  {\n    \"markdown\": \" 1.  A paragraph\\n     with two lines.\\n\\n         indented code\\n\\n     > A block quote.\\n\",\n    \"html\": \"<ol>\\n<li>\\n<p>A paragraph\\nwith two lines.</p>\\n<pre><code>indented code\\n</code></pre>\\n<blockquote>\\n<p>A block quote.</p>\\n</blockquote>\\n</li>\\n</ol>\\n\",\n    \"example\": 286,\n    \"start_line\": 4723,\n    \"end_line\": 4742,\n    \"section\": \"List items\"\n  },\n  {\n    \"markdown\": \"  1.  A paragraph\\n      with two lines.\\n\\n          indented code\\n\\n      > A block quote.\\n\",\n    \"html\": \"<ol>\\n<li>\\n<p>A paragraph\\nwith two lines.</p>\\n<pre><code>indented code\\n</code></pre>\\n<blockquote>\\n<p>A block quote.</p>\\n</blockquote>\\n</li>\\n</ol>\\n\",\n    \"example\": 287,\n    \"start_line\": 4747,\n    \"end_line\": 4766,\n    \"section\": \"List items\"\n  },\n  {\n    \"markdown\": \"   1.  A paragraph\\n       with two lines.\\n\\n           indented code\\n\\n       > A block quote.\\n\",\n    \"html\": \"<ol>\\n<li>\\n<p>A paragraph\\nwith two lines.</p>\\n<pre><code>indented code\\n</code></pre>\\n<blockquote>\\n<p>A block quote.</p>\\n</blockquote>\\n</li>\\n</ol>\\n\",\n    \"example\": 288,\n    \"start_line\": 4771,\n    \"end_line\": 4790,\n    \"section\": \"List items\"\n  },\n  {\n    \"markdown\": \"    1.  A paragraph\\n        with two lines.\\n\\n            indented code\\n\\n        > A block quote.\\n\",\n    \"html\": \"<pre><code>1.  A paragraph\\n    with two lines.\\n\\n        indented code\\n\\n    &gt; A block quote.\\n</code></pre>\\n\",\n    \"example\": 289,\n    \"start_line\": 4795,\n    \"end_line\": 4810,\n    \"section\": \"List items\"\n  },\n  {\n    \"markdown\": \"  1.  A paragraph\\nwith two lines.\\n\\n          indented code\\n\\n      > A block quote.\\n\",\n    \"html\": \"<ol>\\n<li>\\n<p>A paragraph\\nwith two lines.</p>\\n<pre><code>indented code\\n</code></pre>\\n<blockquote>\\n<p>A block quote.</p>\\n</blockquote>\\n</li>\\n</ol>\\n\",\n    \"example\": 290,\n    \"start_line\": 4825,\n    \"end_line\": 4844,\n    \"section\": \"List items\"\n  },\n  {\n    \"markdown\": \"  1.  A paragraph\\n    with two lines.\\n\",\n    \"html\": \"<ol>\\n<li>A paragraph\\nwith two lines.</li>\\n</ol>\\n\",\n    \"example\": 291,\n    \"start_line\": 4849,\n    \"end_line\": 4857,\n    \"section\": \"List items\"\n  },\n  {\n    \"markdown\": \"> 1. > Blockquote\\ncontinued here.\\n\",\n    \"html\": \"<blockquote>\\n<ol>\\n<li>\\n<blockquote>\\n<p>Blockquote\\ncontinued here.</p>\\n</blockquote>\\n</li>\\n</ol>\\n</blockquote>\\n\",\n    \"example\": 292,\n    \"start_line\": 4862,\n    \"end_line\": 4876,\n    \"section\": \"List items\"\n  },\n  {\n    \"markdown\": \"> 1. > Blockquote\\n> continued here.\\n\",\n    \"html\": \"<blockquote>\\n<ol>\\n<li>\\n<blockquote>\\n<p>Blockquote\\ncontinued here.</p>\\n</blockquote>\\n</li>\\n</ol>\\n</blockquote>\\n\",\n    \"example\": 293,\n    \"start_line\": 4879,\n    \"end_line\": 4893,\n    \"section\": \"List items\"\n  },\n  {\n    \"markdown\": \"- foo\\n  - bar\\n    - baz\\n      - boo\\n\",\n    \"html\": \"<ul>\\n<li>foo\\n<ul>\\n<li>bar\\n<ul>\\n<li>baz\\n<ul>\\n<li>boo</li>\\n</ul>\\n</li>\\n</ul>\\n</li>\\n</ul>\\n</li>\\n</ul>\\n\",\n    \"example\": 294,\n    \"start_line\": 4907,\n    \"end_line\": 4928,\n    \"section\": \"List items\"\n  },\n  {\n    \"markdown\": \"- foo\\n - bar\\n  - baz\\n   - boo\\n\",\n    \"html\": \"<ul>\\n<li>foo</li>\\n<li>bar</li>\\n<li>baz</li>\\n<li>boo</li>\\n</ul>\\n\",\n    \"example\": 295,\n    \"start_line\": 4933,\n    \"end_line\": 4945,\n    \"section\": \"List items\"\n  },\n  {\n    \"markdown\": \"10) foo\\n    - bar\\n\",\n    \"html\": \"<ol start=\\\"10\\\">\\n<li>foo\\n<ul>\\n<li>bar</li>\\n</ul>\\n</li>\\n</ol>\\n\",\n    \"example\": 296,\n    \"start_line\": 4950,\n    \"end_line\": 4961,\n    \"section\": \"List items\"\n  },\n  {\n    \"markdown\": \"10) foo\\n   - bar\\n\",\n    \"html\": \"<ol start=\\\"10\\\">\\n<li>foo</li>\\n</ol>\\n<ul>\\n<li>bar</li>\\n</ul>\\n\",\n    \"example\": 297,\n    \"start_line\": 4966,\n    \"end_line\": 4976,\n    \"section\": \"List items\"\n  },\n  {\n    \"markdown\": \"- - foo\\n\",\n    \"html\": \"<ul>\\n<li>\\n<ul>\\n<li>foo</li>\\n</ul>\\n</li>\\n</ul>\\n\",\n    \"example\": 298,\n    \"start_line\": 4981,\n    \"end_line\": 4991,\n    \"section\": \"List items\"\n  },\n  {\n    \"markdown\": \"1. - 2. foo\\n\",\n    \"html\": \"<ol>\\n<li>\\n<ul>\\n<li>\\n<ol start=\\\"2\\\">\\n<li>foo</li>\\n</ol>\\n</li>\\n</ul>\\n</li>\\n</ol>\\n\",\n    \"example\": 299,\n    \"start_line\": 4994,\n    \"end_line\": 5008,\n    \"section\": \"List items\"\n  },\n  {\n    \"markdown\": \"- # Foo\\n- Bar\\n  ---\\n  baz\\n\",\n    \"html\": \"<ul>\\n<li>\\n<h1>Foo</h1>\\n</li>\\n<li>\\n<h2>Bar</h2>\\nbaz</li>\\n</ul>\\n\",\n    \"example\": 300,\n    \"start_line\": 5013,\n    \"end_line\": 5027,\n    \"section\": \"List items\"\n  },\n  {\n    \"markdown\": \"- foo\\n- bar\\n+ baz\\n\",\n    \"html\": \"<ul>\\n<li>foo</li>\\n<li>bar</li>\\n</ul>\\n<ul>\\n<li>baz</li>\\n</ul>\\n\",\n    \"example\": 301,\n    \"start_line\": 5249,\n    \"end_line\": 5261,\n    \"section\": \"Lists\"\n  },\n  {\n    \"markdown\": \"1. foo\\n2. bar\\n3) baz\\n\",\n    \"html\": \"<ol>\\n<li>foo</li>\\n<li>bar</li>\\n</ol>\\n<ol start=\\\"3\\\">\\n<li>baz</li>\\n</ol>\\n\",\n    \"example\": 302,\n    \"start_line\": 5264,\n    \"end_line\": 5276,\n    \"section\": \"Lists\"\n  },\n  {\n    \"markdown\": \"Foo\\n- bar\\n- baz\\n\",\n    \"html\": \"<p>Foo</p>\\n<ul>\\n<li>bar</li>\\n<li>baz</li>\\n</ul>\\n\",\n    \"example\": 303,\n    \"start_line\": 5283,\n    \"end_line\": 5293,\n    \"section\": \"Lists\"\n  },\n  {\n    \"markdown\": \"The number of windows in my house is\\n14.  The number of doors is 6.\\n\",\n    \"html\": \"<p>The number of windows in my house is\\n14.  The number of doors is 6.</p>\\n\",\n    \"example\": 304,\n    \"start_line\": 5360,\n    \"end_line\": 5366,\n    \"section\": \"Lists\"\n  },\n  {\n    \"markdown\": \"The number of windows in my house is\\n1.  The number of doors is 6.\\n\",\n    \"html\": \"<p>The number of windows in my house is</p>\\n<ol>\\n<li>The number of doors is 6.</li>\\n</ol>\\n\",\n    \"example\": 305,\n    \"start_line\": 5370,\n    \"end_line\": 5378,\n    \"section\": \"Lists\"\n  },\n  {\n    \"markdown\": \"- foo\\n\\n- bar\\n\\n\\n- baz\\n\",\n    \"html\": \"<ul>\\n<li>\\n<p>foo</p>\\n</li>\\n<li>\\n<p>bar</p>\\n</li>\\n<li>\\n<p>baz</p>\\n</li>\\n</ul>\\n\",\n    \"example\": 306,\n    \"start_line\": 5384,\n    \"end_line\": 5403,\n    \"section\": \"Lists\"\n  },\n  {\n    \"markdown\": \"- foo\\n  - bar\\n    - baz\\n\\n\\n      bim\\n\",\n    \"html\": \"<ul>\\n<li>foo\\n<ul>\\n<li>bar\\n<ul>\\n<li>\\n<p>baz</p>\\n<p>bim</p>\\n</li>\\n</ul>\\n</li>\\n</ul>\\n</li>\\n</ul>\\n\",\n    \"example\": 307,\n    \"start_line\": 5405,\n    \"end_line\": 5427,\n    \"section\": \"Lists\"\n  },\n  {\n    \"markdown\": \"- foo\\n- bar\\n\\n<!-- -->\\n\\n- baz\\n- bim\\n\",\n    \"html\": \"<ul>\\n<li>foo</li>\\n<li>bar</li>\\n</ul>\\n<!-- -->\\n<ul>\\n<li>baz</li>\\n<li>bim</li>\\n</ul>\\n\",\n    \"example\": 308,\n    \"start_line\": 5435,\n    \"end_line\": 5453,\n    \"section\": \"Lists\"\n  },\n  {\n    \"markdown\": \"-   foo\\n\\n    notcode\\n\\n-   foo\\n\\n<!-- -->\\n\\n    code\\n\",\n    \"html\": \"<ul>\\n<li>\\n<p>foo</p>\\n<p>notcode</p>\\n</li>\\n<li>\\n<p>foo</p>\\n</li>\\n</ul>\\n<!-- -->\\n<pre><code>code\\n</code></pre>\\n\",\n    \"example\": 309,\n    \"start_line\": 5456,\n    \"end_line\": 5479,\n    \"section\": \"Lists\"\n  },\n  {\n    \"markdown\": \"- a\\n - b\\n  - c\\n   - d\\n  - e\\n - f\\n- g\\n\",\n    \"html\": \"<ul>\\n<li>a</li>\\n<li>b</li>\\n<li>c</li>\\n<li>d</li>\\n<li>e</li>\\n<li>f</li>\\n<li>g</li>\\n</ul>\\n\",\n    \"example\": 310,\n    \"start_line\": 5487,\n    \"end_line\": 5505,\n    \"section\": \"Lists\"\n  },\n  {\n    \"markdown\": \"1. a\\n\\n  2. b\\n\\n   3. c\\n\",\n    \"html\": \"<ol>\\n<li>\\n<p>a</p>\\n</li>\\n<li>\\n<p>b</p>\\n</li>\\n<li>\\n<p>c</p>\\n</li>\\n</ol>\\n\",\n    \"example\": 311,\n    \"start_line\": 5508,\n    \"end_line\": 5526,\n    \"section\": \"Lists\"\n  },\n  {\n    \"markdown\": \"- a\\n - b\\n  - c\\n   - d\\n    - e\\n\",\n    \"html\": \"<ul>\\n<li>a</li>\\n<li>b</li>\\n<li>c</li>\\n<li>d\\n- e</li>\\n</ul>\\n\",\n    \"example\": 312,\n    \"start_line\": 5532,\n    \"end_line\": 5546,\n    \"section\": \"Lists\"\n  },\n  {\n    \"markdown\": \"1. a\\n\\n  2. b\\n\\n    3. c\\n\",\n    \"html\": \"<ol>\\n<li>\\n<p>a</p>\\n</li>\\n<li>\\n<p>b</p>\\n</li>\\n</ol>\\n<pre><code>3. c\\n</code></pre>\\n\",\n    \"example\": 313,\n    \"start_line\": 5552,\n    \"end_line\": 5569,\n    \"section\": \"Lists\"\n  },\n  {\n    \"markdown\": \"- a\\n- b\\n\\n- c\\n\",\n    \"html\": \"<ul>\\n<li>\\n<p>a</p>\\n</li>\\n<li>\\n<p>b</p>\\n</li>\\n<li>\\n<p>c</p>\\n</li>\\n</ul>\\n\",\n    \"example\": 314,\n    \"start_line\": 5575,\n    \"end_line\": 5592,\n    \"section\": \"Lists\"\n  },\n  {\n    \"markdown\": \"* a\\n*\\n\\n* c\\n\",\n    \"html\": \"<ul>\\n<li>\\n<p>a</p>\\n</li>\\n<li></li>\\n<li>\\n<p>c</p>\\n</li>\\n</ul>\\n\",\n    \"example\": 315,\n    \"start_line\": 5597,\n    \"end_line\": 5612,\n    \"section\": \"Lists\"\n  },\n  {\n    \"markdown\": \"- a\\n- b\\n\\n  c\\n- d\\n\",\n    \"html\": \"<ul>\\n<li>\\n<p>a</p>\\n</li>\\n<li>\\n<p>b</p>\\n<p>c</p>\\n</li>\\n<li>\\n<p>d</p>\\n</li>\\n</ul>\\n\",\n    \"example\": 316,\n    \"start_line\": 5619,\n    \"end_line\": 5638,\n    \"section\": \"Lists\"\n  },\n  {\n    \"markdown\": \"- a\\n- b\\n\\n  [ref]: /url\\n- d\\n\",\n    \"html\": \"<ul>\\n<li>\\n<p>a</p>\\n</li>\\n<li>\\n<p>b</p>\\n</li>\\n<li>\\n<p>d</p>\\n</li>\\n</ul>\\n\",\n    \"example\": 317,\n    \"start_line\": 5641,\n    \"end_line\": 5659,\n    \"section\": \"Lists\"\n  },\n  {\n    \"markdown\": \"- a\\n- ```\\n  b\\n\\n\\n  ```\\n- c\\n\",\n    \"html\": \"<ul>\\n<li>a</li>\\n<li>\\n<pre><code>b\\n\\n\\n</code></pre>\\n</li>\\n<li>c</li>\\n</ul>\\n\",\n    \"example\": 318,\n    \"start_line\": 5664,\n    \"end_line\": 5683,\n    \"section\": \"Lists\"\n  },\n  {\n    \"markdown\": \"- a\\n  - b\\n\\n    c\\n- d\\n\",\n    \"html\": \"<ul>\\n<li>a\\n<ul>\\n<li>\\n<p>b</p>\\n<p>c</p>\\n</li>\\n</ul>\\n</li>\\n<li>d</li>\\n</ul>\\n\",\n    \"example\": 319,\n    \"start_line\": 5690,\n    \"end_line\": 5708,\n    \"section\": \"Lists\"\n  },\n  {\n    \"markdown\": \"* a\\n  > b\\n  >\\n* c\\n\",\n    \"html\": \"<ul>\\n<li>a\\n<blockquote>\\n<p>b</p>\\n</blockquote>\\n</li>\\n<li>c</li>\\n</ul>\\n\",\n    \"example\": 320,\n    \"start_line\": 5714,\n    \"end_line\": 5728,\n    \"section\": \"Lists\"\n  },\n  {\n    \"markdown\": \"- a\\n  > b\\n  ```\\n  c\\n  ```\\n- d\\n\",\n    \"html\": \"<ul>\\n<li>a\\n<blockquote>\\n<p>b</p>\\n</blockquote>\\n<pre><code>c\\n</code></pre>\\n</li>\\n<li>d</li>\\n</ul>\\n\",\n    \"example\": 321,\n    \"start_line\": 5734,\n    \"end_line\": 5752,\n    \"section\": \"Lists\"\n  },\n  {\n    \"markdown\": \"- a\\n\",\n    \"html\": \"<ul>\\n<li>a</li>\\n</ul>\\n\",\n    \"example\": 322,\n    \"start_line\": 5757,\n    \"end_line\": 5763,\n    \"section\": \"Lists\"\n  },\n  {\n    \"markdown\": \"- a\\n  - b\\n\",\n    \"html\": \"<ul>\\n<li>a\\n<ul>\\n<li>b</li>\\n</ul>\\n</li>\\n</ul>\\n\",\n    \"example\": 323,\n    \"start_line\": 5766,\n    \"end_line\": 5777,\n    \"section\": \"Lists\"\n  },\n  {\n    \"markdown\": \"1. ```\\n   foo\\n   ```\\n\\n   bar\\n\",\n    \"html\": \"<ol>\\n<li>\\n<pre><code>foo\\n</code></pre>\\n<p>bar</p>\\n</li>\\n</ol>\\n\",\n    \"example\": 324,\n    \"start_line\": 5783,\n    \"end_line\": 5797,\n    \"section\": \"Lists\"\n  },\n  {\n    \"markdown\": \"* foo\\n  * bar\\n\\n  baz\\n\",\n    \"html\": \"<ul>\\n<li>\\n<p>foo</p>\\n<ul>\\n<li>bar</li>\\n</ul>\\n<p>baz</p>\\n</li>\\n</ul>\\n\",\n    \"example\": 325,\n    \"start_line\": 5802,\n    \"end_line\": 5817,\n    \"section\": \"Lists\"\n  },\n  {\n    \"markdown\": \"- a\\n  - b\\n  - c\\n\\n- d\\n  - e\\n  - f\\n\",\n    \"html\": \"<ul>\\n<li>\\n<p>a</p>\\n<ul>\\n<li>b</li>\\n<li>c</li>\\n</ul>\\n</li>\\n<li>\\n<p>d</p>\\n<ul>\\n<li>e</li>\\n<li>f</li>\\n</ul>\\n</li>\\n</ul>\\n\",\n    \"example\": 326,\n    \"start_line\": 5820,\n    \"end_line\": 5845,\n    \"section\": \"Lists\"\n  },\n  {\n    \"markdown\": \"`hi`lo`\\n\",\n    \"html\": \"<p><code>hi</code>lo`</p>\\n\",\n    \"example\": 327,\n    \"start_line\": 5854,\n    \"end_line\": 5858,\n    \"section\": \"Inlines\"\n  },\n  {\n    \"markdown\": \"`foo`\\n\",\n    \"html\": \"<p><code>foo</code></p>\\n\",\n    \"example\": 328,\n    \"start_line\": 5886,\n    \"end_line\": 5890,\n    \"section\": \"Code spans\"\n  },\n  {\n    \"markdown\": \"`` foo ` bar ``\\n\",\n    \"html\": \"<p><code>foo ` bar</code></p>\\n\",\n    \"example\": 329,\n    \"start_line\": 5897,\n    \"end_line\": 5901,\n    \"section\": \"Code spans\"\n  },\n  {\n    \"markdown\": \"` `` `\\n\",\n    \"html\": \"<p><code>``</code></p>\\n\",\n    \"example\": 330,\n    \"start_line\": 5907,\n    \"end_line\": 5911,\n    \"section\": \"Code spans\"\n  },\n  {\n    \"markdown\": \"`  ``  `\\n\",\n    \"html\": \"<p><code> `` </code></p>\\n\",\n    \"example\": 331,\n    \"start_line\": 5915,\n    \"end_line\": 5919,\n    \"section\": \"Code spans\"\n  },\n  {\n    \"markdown\": \"` a`\\n\",\n    \"html\": \"<p><code> a</code></p>\\n\",\n    \"example\": 332,\n    \"start_line\": 5924,\n    \"end_line\": 5928,\n    \"section\": \"Code spans\"\n  },\n  {\n    \"markdown\": \"` b `\\n\",\n    \"html\": \"<p><code> b </code></p>\\n\",\n    \"example\": 333,\n    \"start_line\": 5933,\n    \"end_line\": 5937,\n    \"section\": \"Code spans\"\n  },\n  {\n    \"markdown\": \"` `\\n`  `\\n\",\n    \"html\": \"<p><code> </code>\\n<code>  </code></p>\\n\",\n    \"example\": 334,\n    \"start_line\": 5941,\n    \"end_line\": 5947,\n    \"section\": \"Code spans\"\n  },\n  {\n    \"markdown\": \"``\\nfoo\\nbar  \\nbaz\\n``\\n\",\n    \"html\": \"<p><code>foo bar   baz</code></p>\\n\",\n    \"example\": 335,\n    \"start_line\": 5952,\n    \"end_line\": 5960,\n    \"section\": \"Code spans\"\n  },\n  {\n    \"markdown\": \"``\\nfoo \\n``\\n\",\n    \"html\": \"<p><code>foo </code></p>\\n\",\n    \"example\": 336,\n    \"start_line\": 5962,\n    \"end_line\": 5968,\n    \"section\": \"Code spans\"\n  },\n  {\n    \"markdown\": \"`foo   bar \\nbaz`\\n\",\n    \"html\": \"<p><code>foo   bar  baz</code></p>\\n\",\n    \"example\": 337,\n    \"start_line\": 5973,\n    \"end_line\": 5978,\n    \"section\": \"Code spans\"\n  },\n  {\n    \"markdown\": \"`foo\\\\`bar`\\n\",\n    \"html\": \"<p><code>foo\\\\</code>bar`</p>\\n\",\n    \"example\": 338,\n    \"start_line\": 5990,\n    \"end_line\": 5994,\n    \"section\": \"Code spans\"\n  },\n  {\n    \"markdown\": \"``foo`bar``\\n\",\n    \"html\": \"<p><code>foo`bar</code></p>\\n\",\n    \"example\": 339,\n    \"start_line\": 6001,\n    \"end_line\": 6005,\n    \"section\": \"Code spans\"\n  },\n  {\n    \"markdown\": \"` foo `` bar `\\n\",\n    \"html\": \"<p><code>foo `` bar</code></p>\\n\",\n    \"example\": 340,\n    \"start_line\": 6007,\n    \"end_line\": 6011,\n    \"section\": \"Code spans\"\n  },\n  {\n    \"markdown\": \"*foo`*`\\n\",\n    \"html\": \"<p>*foo<code>*</code></p>\\n\",\n    \"example\": 341,\n    \"start_line\": 6019,\n    \"end_line\": 6023,\n    \"section\": \"Code spans\"\n  },\n  {\n    \"markdown\": \"[not a `link](/foo`)\\n\",\n    \"html\": \"<p>[not a <code>link](/foo</code>)</p>\\n\",\n    \"example\": 342,\n    \"start_line\": 6028,\n    \"end_line\": 6032,\n    \"section\": \"Code spans\"\n  },\n  {\n    \"markdown\": \"`<a href=\\\"`\\\">`\\n\",\n    \"html\": \"<p><code>&lt;a href=&quot;</code>&quot;&gt;`</p>\\n\",\n    \"example\": 343,\n    \"start_line\": 6038,\n    \"end_line\": 6042,\n    \"section\": \"Code spans\"\n  },\n  {\n    \"markdown\": \"<a href=\\\"`\\\">`\\n\",\n    \"html\": \"<p><a href=\\\"`\\\">`</p>\\n\",\n    \"example\": 344,\n    \"start_line\": 6047,\n    \"end_line\": 6051,\n    \"section\": \"Code spans\"\n  },\n  {\n    \"markdown\": \"`<https://foo.bar.`baz>`\\n\",\n    \"html\": \"<p><code>&lt;https://foo.bar.</code>baz&gt;`</p>\\n\",\n    \"example\": 345,\n    \"start_line\": 6056,\n    \"end_line\": 6060,\n    \"section\": \"Code spans\"\n  },\n  {\n    \"markdown\": \"<https://foo.bar.`baz>`\\n\",\n    \"html\": \"<p><a href=\\\"https://foo.bar.%60baz\\\">https://foo.bar.`baz</a>`</p>\\n\",\n    \"example\": 346,\n    \"start_line\": 6065,\n    \"end_line\": 6069,\n    \"section\": \"Code spans\"\n  },\n  {\n    \"markdown\": \"```foo``\\n\",\n    \"html\": \"<p>```foo``</p>\\n\",\n    \"example\": 347,\n    \"start_line\": 6075,\n    \"end_line\": 6079,\n    \"section\": \"Code spans\"\n  },\n  {\n    \"markdown\": \"`foo\\n\",\n    \"html\": \"<p>`foo</p>\\n\",\n    \"example\": 348,\n    \"start_line\": 6082,\n    \"end_line\": 6086,\n    \"section\": \"Code spans\"\n  },\n  {\n    \"markdown\": \"`foo``bar``\\n\",\n    \"html\": \"<p>`foo<code>bar</code></p>\\n\",\n    \"example\": 349,\n    \"start_line\": 6091,\n    \"end_line\": 6095,\n    \"section\": \"Code spans\"\n  },\n  {\n    \"markdown\": \"*foo bar*\\n\",\n    \"html\": \"<p><em>foo bar</em></p>\\n\",\n    \"example\": 350,\n    \"start_line\": 6308,\n    \"end_line\": 6312,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"a * foo bar*\\n\",\n    \"html\": \"<p>a * foo bar*</p>\\n\",\n    \"example\": 351,\n    \"start_line\": 6318,\n    \"end_line\": 6322,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"a*\\\"foo\\\"*\\n\",\n    \"html\": \"<p>a*&quot;foo&quot;*</p>\\n\",\n    \"example\": 352,\n    \"start_line\": 6329,\n    \"end_line\": 6333,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"* a *\\n\",\n    \"html\": \"<p>* a *</p>\\n\",\n    \"example\": 353,\n    \"start_line\": 6338,\n    \"end_line\": 6342,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"*$*alpha.\\n\\n*£*bravo.\\n\\n*€*charlie.\\n\",\n    \"html\": \"<p>*$*alpha.</p>\\n<p>*£*bravo.</p>\\n<p>*€*charlie.</p>\\n\",\n    \"example\": 354,\n    \"start_line\": 6347,\n    \"end_line\": 6357,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"foo*bar*\\n\",\n    \"html\": \"<p>foo<em>bar</em></p>\\n\",\n    \"example\": 355,\n    \"start_line\": 6362,\n    \"end_line\": 6366,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"5*6*78\\n\",\n    \"html\": \"<p>5<em>6</em>78</p>\\n\",\n    \"example\": 356,\n    \"start_line\": 6369,\n    \"end_line\": 6373,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"_foo bar_\\n\",\n    \"html\": \"<p><em>foo bar</em></p>\\n\",\n    \"example\": 357,\n    \"start_line\": 6378,\n    \"end_line\": 6382,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"_ foo bar_\\n\",\n    \"html\": \"<p>_ foo bar_</p>\\n\",\n    \"example\": 358,\n    \"start_line\": 6388,\n    \"end_line\": 6392,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"a_\\\"foo\\\"_\\n\",\n    \"html\": \"<p>a_&quot;foo&quot;_</p>\\n\",\n    \"example\": 359,\n    \"start_line\": 6398,\n    \"end_line\": 6402,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"foo_bar_\\n\",\n    \"html\": \"<p>foo_bar_</p>\\n\",\n    \"example\": 360,\n    \"start_line\": 6407,\n    \"end_line\": 6411,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"5_6_78\\n\",\n    \"html\": \"<p>5_6_78</p>\\n\",\n    \"example\": 361,\n    \"start_line\": 6414,\n    \"end_line\": 6418,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"пристаням_стремятся_\\n\",\n    \"html\": \"<p>пристаням_стремятся_</p>\\n\",\n    \"example\": 362,\n    \"start_line\": 6421,\n    \"end_line\": 6425,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"aa_\\\"bb\\\"_cc\\n\",\n    \"html\": \"<p>aa_&quot;bb&quot;_cc</p>\\n\",\n    \"example\": 363,\n    \"start_line\": 6431,\n    \"end_line\": 6435,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"foo-_(bar)_\\n\",\n    \"html\": \"<p>foo-<em>(bar)</em></p>\\n\",\n    \"example\": 364,\n    \"start_line\": 6442,\n    \"end_line\": 6446,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"_foo*\\n\",\n    \"html\": \"<p>_foo*</p>\\n\",\n    \"example\": 365,\n    \"start_line\": 6454,\n    \"end_line\": 6458,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"*foo bar *\\n\",\n    \"html\": \"<p>*foo bar *</p>\\n\",\n    \"example\": 366,\n    \"start_line\": 6464,\n    \"end_line\": 6468,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"*foo bar\\n*\\n\",\n    \"html\": \"<p>*foo bar\\n*</p>\\n\",\n    \"example\": 367,\n    \"start_line\": 6473,\n    \"end_line\": 6479,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"*(*foo)\\n\",\n    \"html\": \"<p>*(*foo)</p>\\n\",\n    \"example\": 368,\n    \"start_line\": 6486,\n    \"end_line\": 6490,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"*(*foo*)*\\n\",\n    \"html\": \"<p><em>(<em>foo</em>)</em></p>\\n\",\n    \"example\": 369,\n    \"start_line\": 6496,\n    \"end_line\": 6500,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"*foo*bar\\n\",\n    \"html\": \"<p><em>foo</em>bar</p>\\n\",\n    \"example\": 370,\n    \"start_line\": 6505,\n    \"end_line\": 6509,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"_foo bar _\\n\",\n    \"html\": \"<p>_foo bar _</p>\\n\",\n    \"example\": 371,\n    \"start_line\": 6518,\n    \"end_line\": 6522,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"_(_foo)\\n\",\n    \"html\": \"<p>_(_foo)</p>\\n\",\n    \"example\": 372,\n    \"start_line\": 6528,\n    \"end_line\": 6532,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"_(_foo_)_\\n\",\n    \"html\": \"<p><em>(<em>foo</em>)</em></p>\\n\",\n    \"example\": 373,\n    \"start_line\": 6537,\n    \"end_line\": 6541,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"_foo_bar\\n\",\n    \"html\": \"<p>_foo_bar</p>\\n\",\n    \"example\": 374,\n    \"start_line\": 6546,\n    \"end_line\": 6550,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"_пристаням_стремятся\\n\",\n    \"html\": \"<p>_пристаням_стремятся</p>\\n\",\n    \"example\": 375,\n    \"start_line\": 6553,\n    \"end_line\": 6557,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"_foo_bar_baz_\\n\",\n    \"html\": \"<p><em>foo_bar_baz</em></p>\\n\",\n    \"example\": 376,\n    \"start_line\": 6560,\n    \"end_line\": 6564,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"_(bar)_.\\n\",\n    \"html\": \"<p><em>(bar)</em>.</p>\\n\",\n    \"example\": 377,\n    \"start_line\": 6571,\n    \"end_line\": 6575,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"**foo bar**\\n\",\n    \"html\": \"<p><strong>foo bar</strong></p>\\n\",\n    \"example\": 378,\n    \"start_line\": 6580,\n    \"end_line\": 6584,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"** foo bar**\\n\",\n    \"html\": \"<p>** foo bar**</p>\\n\",\n    \"example\": 379,\n    \"start_line\": 6590,\n    \"end_line\": 6594,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"a**\\\"foo\\\"**\\n\",\n    \"html\": \"<p>a**&quot;foo&quot;**</p>\\n\",\n    \"example\": 380,\n    \"start_line\": 6601,\n    \"end_line\": 6605,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"foo**bar**\\n\",\n    \"html\": \"<p>foo<strong>bar</strong></p>\\n\",\n    \"example\": 381,\n    \"start_line\": 6610,\n    \"end_line\": 6614,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"__foo bar__\\n\",\n    \"html\": \"<p><strong>foo bar</strong></p>\\n\",\n    \"example\": 382,\n    \"start_line\": 6619,\n    \"end_line\": 6623,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"__ foo bar__\\n\",\n    \"html\": \"<p>__ foo bar__</p>\\n\",\n    \"example\": 383,\n    \"start_line\": 6629,\n    \"end_line\": 6633,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"__\\nfoo bar__\\n\",\n    \"html\": \"<p>__\\nfoo bar__</p>\\n\",\n    \"example\": 384,\n    \"start_line\": 6637,\n    \"end_line\": 6643,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"a__\\\"foo\\\"__\\n\",\n    \"html\": \"<p>a__&quot;foo&quot;__</p>\\n\",\n    \"example\": 385,\n    \"start_line\": 6649,\n    \"end_line\": 6653,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"foo__bar__\\n\",\n    \"html\": \"<p>foo__bar__</p>\\n\",\n    \"example\": 386,\n    \"start_line\": 6658,\n    \"end_line\": 6662,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"5__6__78\\n\",\n    \"html\": \"<p>5__6__78</p>\\n\",\n    \"example\": 387,\n    \"start_line\": 6665,\n    \"end_line\": 6669,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"пристаням__стремятся__\\n\",\n    \"html\": \"<p>пристаням__стремятся__</p>\\n\",\n    \"example\": 388,\n    \"start_line\": 6672,\n    \"end_line\": 6676,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"__foo, __bar__, baz__\\n\",\n    \"html\": \"<p><strong>foo, <strong>bar</strong>, baz</strong></p>\\n\",\n    \"example\": 389,\n    \"start_line\": 6679,\n    \"end_line\": 6683,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"foo-__(bar)__\\n\",\n    \"html\": \"<p>foo-<strong>(bar)</strong></p>\\n\",\n    \"example\": 390,\n    \"start_line\": 6690,\n    \"end_line\": 6694,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"**foo bar **\\n\",\n    \"html\": \"<p>**foo bar **</p>\\n\",\n    \"example\": 391,\n    \"start_line\": 6703,\n    \"end_line\": 6707,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"**(**foo)\\n\",\n    \"html\": \"<p>**(**foo)</p>\\n\",\n    \"example\": 392,\n    \"start_line\": 6716,\n    \"end_line\": 6720,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"*(**foo**)*\\n\",\n    \"html\": \"<p><em>(<strong>foo</strong>)</em></p>\\n\",\n    \"example\": 393,\n    \"start_line\": 6726,\n    \"end_line\": 6730,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"**Gomphocarpus (*Gomphocarpus physocarpus*, syn.\\n*Asclepias physocarpa*)**\\n\",\n    \"html\": \"<p><strong>Gomphocarpus (<em>Gomphocarpus physocarpus</em>, syn.\\n<em>Asclepias physocarpa</em>)</strong></p>\\n\",\n    \"example\": 394,\n    \"start_line\": 6733,\n    \"end_line\": 6739,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"**foo \\\"*bar*\\\" foo**\\n\",\n    \"html\": \"<p><strong>foo &quot;<em>bar</em>&quot; foo</strong></p>\\n\",\n    \"example\": 395,\n    \"start_line\": 6742,\n    \"end_line\": 6746,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"**foo**bar\\n\",\n    \"html\": \"<p><strong>foo</strong>bar</p>\\n\",\n    \"example\": 396,\n    \"start_line\": 6751,\n    \"end_line\": 6755,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"__foo bar __\\n\",\n    \"html\": \"<p>__foo bar __</p>\\n\",\n    \"example\": 397,\n    \"start_line\": 6763,\n    \"end_line\": 6767,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"__(__foo)\\n\",\n    \"html\": \"<p>__(__foo)</p>\\n\",\n    \"example\": 398,\n    \"start_line\": 6773,\n    \"end_line\": 6777,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"_(__foo__)_\\n\",\n    \"html\": \"<p><em>(<strong>foo</strong>)</em></p>\\n\",\n    \"example\": 399,\n    \"start_line\": 6783,\n    \"end_line\": 6787,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"__foo__bar\\n\",\n    \"html\": \"<p>__foo__bar</p>\\n\",\n    \"example\": 400,\n    \"start_line\": 6792,\n    \"end_line\": 6796,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"__пристаням__стремятся\\n\",\n    \"html\": \"<p>__пристаням__стремятся</p>\\n\",\n    \"example\": 401,\n    \"start_line\": 6799,\n    \"end_line\": 6803,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"__foo__bar__baz__\\n\",\n    \"html\": \"<p><strong>foo__bar__baz</strong></p>\\n\",\n    \"example\": 402,\n    \"start_line\": 6806,\n    \"end_line\": 6810,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"__(bar)__.\\n\",\n    \"html\": \"<p><strong>(bar)</strong>.</p>\\n\",\n    \"example\": 403,\n    \"start_line\": 6817,\n    \"end_line\": 6821,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"*foo [bar](/url)*\\n\",\n    \"html\": \"<p><em>foo <a href=\\\"/url\\\">bar</a></em></p>\\n\",\n    \"example\": 404,\n    \"start_line\": 6829,\n    \"end_line\": 6833,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"*foo\\nbar*\\n\",\n    \"html\": \"<p><em>foo\\nbar</em></p>\\n\",\n    \"example\": 405,\n    \"start_line\": 6836,\n    \"end_line\": 6842,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"_foo __bar__ baz_\\n\",\n    \"html\": \"<p><em>foo <strong>bar</strong> baz</em></p>\\n\",\n    \"example\": 406,\n    \"start_line\": 6848,\n    \"end_line\": 6852,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"_foo _bar_ baz_\\n\",\n    \"html\": \"<p><em>foo <em>bar</em> baz</em></p>\\n\",\n    \"example\": 407,\n    \"start_line\": 6855,\n    \"end_line\": 6859,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"__foo_ bar_\\n\",\n    \"html\": \"<p><em><em>foo</em> bar</em></p>\\n\",\n    \"example\": 408,\n    \"start_line\": 6862,\n    \"end_line\": 6866,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"*foo *bar**\\n\",\n    \"html\": \"<p><em>foo <em>bar</em></em></p>\\n\",\n    \"example\": 409,\n    \"start_line\": 6869,\n    \"end_line\": 6873,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"*foo **bar** baz*\\n\",\n    \"html\": \"<p><em>foo <strong>bar</strong> baz</em></p>\\n\",\n    \"example\": 410,\n    \"start_line\": 6876,\n    \"end_line\": 6880,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"*foo**bar**baz*\\n\",\n    \"html\": \"<p><em>foo<strong>bar</strong>baz</em></p>\\n\",\n    \"example\": 411,\n    \"start_line\": 6882,\n    \"end_line\": 6886,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"*foo**bar*\\n\",\n    \"html\": \"<p><em>foo**bar</em></p>\\n\",\n    \"example\": 412,\n    \"start_line\": 6906,\n    \"end_line\": 6910,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"***foo** bar*\\n\",\n    \"html\": \"<p><em><strong>foo</strong> bar</em></p>\\n\",\n    \"example\": 413,\n    \"start_line\": 6919,\n    \"end_line\": 6923,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"*foo **bar***\\n\",\n    \"html\": \"<p><em>foo <strong>bar</strong></em></p>\\n\",\n    \"example\": 414,\n    \"start_line\": 6926,\n    \"end_line\": 6930,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"*foo**bar***\\n\",\n    \"html\": \"<p><em>foo<strong>bar</strong></em></p>\\n\",\n    \"example\": 415,\n    \"start_line\": 6933,\n    \"end_line\": 6937,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"foo***bar***baz\\n\",\n    \"html\": \"<p>foo<em><strong>bar</strong></em>baz</p>\\n\",\n    \"example\": 416,\n    \"start_line\": 6944,\n    \"end_line\": 6948,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"foo******bar*********baz\\n\",\n    \"html\": \"<p>foo<strong><strong><strong>bar</strong></strong></strong>***baz</p>\\n\",\n    \"example\": 417,\n    \"start_line\": 6950,\n    \"end_line\": 6954,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"*foo **bar *baz* bim** bop*\\n\",\n    \"html\": \"<p><em>foo <strong>bar <em>baz</em> bim</strong> bop</em></p>\\n\",\n    \"example\": 418,\n    \"start_line\": 6959,\n    \"end_line\": 6963,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"*foo [*bar*](/url)*\\n\",\n    \"html\": \"<p><em>foo <a href=\\\"/url\\\"><em>bar</em></a></em></p>\\n\",\n    \"example\": 419,\n    \"start_line\": 6966,\n    \"end_line\": 6970,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"** is not an empty emphasis\\n\",\n    \"html\": \"<p>** is not an empty emphasis</p>\\n\",\n    \"example\": 420,\n    \"start_line\": 6975,\n    \"end_line\": 6979,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"**** is not an empty strong emphasis\\n\",\n    \"html\": \"<p>**** is not an empty strong emphasis</p>\\n\",\n    \"example\": 421,\n    \"start_line\": 6982,\n    \"end_line\": 6986,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"**foo [bar](/url)**\\n\",\n    \"html\": \"<p><strong>foo <a href=\\\"/url\\\">bar</a></strong></p>\\n\",\n    \"example\": 422,\n    \"start_line\": 6995,\n    \"end_line\": 6999,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"**foo\\nbar**\\n\",\n    \"html\": \"<p><strong>foo\\nbar</strong></p>\\n\",\n    \"example\": 423,\n    \"start_line\": 7002,\n    \"end_line\": 7008,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"__foo _bar_ baz__\\n\",\n    \"html\": \"<p><strong>foo <em>bar</em> baz</strong></p>\\n\",\n    \"example\": 424,\n    \"start_line\": 7014,\n    \"end_line\": 7018,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"__foo __bar__ baz__\\n\",\n    \"html\": \"<p><strong>foo <strong>bar</strong> baz</strong></p>\\n\",\n    \"example\": 425,\n    \"start_line\": 7021,\n    \"end_line\": 7025,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"____foo__ bar__\\n\",\n    \"html\": \"<p><strong><strong>foo</strong> bar</strong></p>\\n\",\n    \"example\": 426,\n    \"start_line\": 7028,\n    \"end_line\": 7032,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"**foo **bar****\\n\",\n    \"html\": \"<p><strong>foo <strong>bar</strong></strong></p>\\n\",\n    \"example\": 427,\n    \"start_line\": 7035,\n    \"end_line\": 7039,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"**foo *bar* baz**\\n\",\n    \"html\": \"<p><strong>foo <em>bar</em> baz</strong></p>\\n\",\n    \"example\": 428,\n    \"start_line\": 7042,\n    \"end_line\": 7046,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"**foo*bar*baz**\\n\",\n    \"html\": \"<p><strong>foo<em>bar</em>baz</strong></p>\\n\",\n    \"example\": 429,\n    \"start_line\": 7049,\n    \"end_line\": 7053,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"***foo* bar**\\n\",\n    \"html\": \"<p><strong><em>foo</em> bar</strong></p>\\n\",\n    \"example\": 430,\n    \"start_line\": 7056,\n    \"end_line\": 7060,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"**foo *bar***\\n\",\n    \"html\": \"<p><strong>foo <em>bar</em></strong></p>\\n\",\n    \"example\": 431,\n    \"start_line\": 7063,\n    \"end_line\": 7067,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"**foo *bar **baz**\\nbim* bop**\\n\",\n    \"html\": \"<p><strong>foo <em>bar <strong>baz</strong>\\nbim</em> bop</strong></p>\\n\",\n    \"example\": 432,\n    \"start_line\": 7072,\n    \"end_line\": 7078,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"**foo [*bar*](/url)**\\n\",\n    \"html\": \"<p><strong>foo <a href=\\\"/url\\\"><em>bar</em></a></strong></p>\\n\",\n    \"example\": 433,\n    \"start_line\": 7081,\n    \"end_line\": 7085,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"__ is not an empty emphasis\\n\",\n    \"html\": \"<p>__ is not an empty emphasis</p>\\n\",\n    \"example\": 434,\n    \"start_line\": 7090,\n    \"end_line\": 7094,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"____ is not an empty strong emphasis\\n\",\n    \"html\": \"<p>____ is not an empty strong emphasis</p>\\n\",\n    \"example\": 435,\n    \"start_line\": 7097,\n    \"end_line\": 7101,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"foo ***\\n\",\n    \"html\": \"<p>foo ***</p>\\n\",\n    \"example\": 436,\n    \"start_line\": 7107,\n    \"end_line\": 7111,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"foo *\\\\**\\n\",\n    \"html\": \"<p>foo <em>*</em></p>\\n\",\n    \"example\": 437,\n    \"start_line\": 7114,\n    \"end_line\": 7118,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"foo *_*\\n\",\n    \"html\": \"<p>foo <em>_</em></p>\\n\",\n    \"example\": 438,\n    \"start_line\": 7121,\n    \"end_line\": 7125,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"foo *****\\n\",\n    \"html\": \"<p>foo *****</p>\\n\",\n    \"example\": 439,\n    \"start_line\": 7128,\n    \"end_line\": 7132,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"foo **\\\\***\\n\",\n    \"html\": \"<p>foo <strong>*</strong></p>\\n\",\n    \"example\": 440,\n    \"start_line\": 7135,\n    \"end_line\": 7139,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"foo **_**\\n\",\n    \"html\": \"<p>foo <strong>_</strong></p>\\n\",\n    \"example\": 441,\n    \"start_line\": 7142,\n    \"end_line\": 7146,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"**foo*\\n\",\n    \"html\": \"<p>*<em>foo</em></p>\\n\",\n    \"example\": 442,\n    \"start_line\": 7153,\n    \"end_line\": 7157,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"*foo**\\n\",\n    \"html\": \"<p><em>foo</em>*</p>\\n\",\n    \"example\": 443,\n    \"start_line\": 7160,\n    \"end_line\": 7164,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"***foo**\\n\",\n    \"html\": \"<p>*<strong>foo</strong></p>\\n\",\n    \"example\": 444,\n    \"start_line\": 7167,\n    \"end_line\": 7171,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"****foo*\\n\",\n    \"html\": \"<p>***<em>foo</em></p>\\n\",\n    \"example\": 445,\n    \"start_line\": 7174,\n    \"end_line\": 7178,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"**foo***\\n\",\n    \"html\": \"<p><strong>foo</strong>*</p>\\n\",\n    \"example\": 446,\n    \"start_line\": 7181,\n    \"end_line\": 7185,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"*foo****\\n\",\n    \"html\": \"<p><em>foo</em>***</p>\\n\",\n    \"example\": 447,\n    \"start_line\": 7188,\n    \"end_line\": 7192,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"foo ___\\n\",\n    \"html\": \"<p>foo ___</p>\\n\",\n    \"example\": 448,\n    \"start_line\": 7198,\n    \"end_line\": 7202,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"foo _\\\\__\\n\",\n    \"html\": \"<p>foo <em>_</em></p>\\n\",\n    \"example\": 449,\n    \"start_line\": 7205,\n    \"end_line\": 7209,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"foo _*_\\n\",\n    \"html\": \"<p>foo <em>*</em></p>\\n\",\n    \"example\": 450,\n    \"start_line\": 7212,\n    \"end_line\": 7216,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"foo _____\\n\",\n    \"html\": \"<p>foo _____</p>\\n\",\n    \"example\": 451,\n    \"start_line\": 7219,\n    \"end_line\": 7223,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"foo __\\\\___\\n\",\n    \"html\": \"<p>foo <strong>_</strong></p>\\n\",\n    \"example\": 452,\n    \"start_line\": 7226,\n    \"end_line\": 7230,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"foo __*__\\n\",\n    \"html\": \"<p>foo <strong>*</strong></p>\\n\",\n    \"example\": 453,\n    \"start_line\": 7233,\n    \"end_line\": 7237,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"__foo_\\n\",\n    \"html\": \"<p>_<em>foo</em></p>\\n\",\n    \"example\": 454,\n    \"start_line\": 7240,\n    \"end_line\": 7244,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"_foo__\\n\",\n    \"html\": \"<p><em>foo</em>_</p>\\n\",\n    \"example\": 455,\n    \"start_line\": 7251,\n    \"end_line\": 7255,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"___foo__\\n\",\n    \"html\": \"<p>_<strong>foo</strong></p>\\n\",\n    \"example\": 456,\n    \"start_line\": 7258,\n    \"end_line\": 7262,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"____foo_\\n\",\n    \"html\": \"<p>___<em>foo</em></p>\\n\",\n    \"example\": 457,\n    \"start_line\": 7265,\n    \"end_line\": 7269,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"__foo___\\n\",\n    \"html\": \"<p><strong>foo</strong>_</p>\\n\",\n    \"example\": 458,\n    \"start_line\": 7272,\n    \"end_line\": 7276,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"_foo____\\n\",\n    \"html\": \"<p><em>foo</em>___</p>\\n\",\n    \"example\": 459,\n    \"start_line\": 7279,\n    \"end_line\": 7283,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"**foo**\\n\",\n    \"html\": \"<p><strong>foo</strong></p>\\n\",\n    \"example\": 460,\n    \"start_line\": 7289,\n    \"end_line\": 7293,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"*_foo_*\\n\",\n    \"html\": \"<p><em><em>foo</em></em></p>\\n\",\n    \"example\": 461,\n    \"start_line\": 7296,\n    \"end_line\": 7300,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"__foo__\\n\",\n    \"html\": \"<p><strong>foo</strong></p>\\n\",\n    \"example\": 462,\n    \"start_line\": 7303,\n    \"end_line\": 7307,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"_*foo*_\\n\",\n    \"html\": \"<p><em><em>foo</em></em></p>\\n\",\n    \"example\": 463,\n    \"start_line\": 7310,\n    \"end_line\": 7314,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"****foo****\\n\",\n    \"html\": \"<p><strong><strong>foo</strong></strong></p>\\n\",\n    \"example\": 464,\n    \"start_line\": 7320,\n    \"end_line\": 7324,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"____foo____\\n\",\n    \"html\": \"<p><strong><strong>foo</strong></strong></p>\\n\",\n    \"example\": 465,\n    \"start_line\": 7327,\n    \"end_line\": 7331,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"******foo******\\n\",\n    \"html\": \"<p><strong><strong><strong>foo</strong></strong></strong></p>\\n\",\n    \"example\": 466,\n    \"start_line\": 7338,\n    \"end_line\": 7342,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"***foo***\\n\",\n    \"html\": \"<p><em><strong>foo</strong></em></p>\\n\",\n    \"example\": 467,\n    \"start_line\": 7347,\n    \"end_line\": 7351,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"_____foo_____\\n\",\n    \"html\": \"<p><em><strong><strong>foo</strong></strong></em></p>\\n\",\n    \"example\": 468,\n    \"start_line\": 7354,\n    \"end_line\": 7358,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"*foo _bar* baz_\\n\",\n    \"html\": \"<p><em>foo _bar</em> baz_</p>\\n\",\n    \"example\": 469,\n    \"start_line\": 7363,\n    \"end_line\": 7367,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"*foo __bar *baz bim__ bam*\\n\",\n    \"html\": \"<p><em>foo <strong>bar *baz bim</strong> bam</em></p>\\n\",\n    \"example\": 470,\n    \"start_line\": 7370,\n    \"end_line\": 7374,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"**foo **bar baz**\\n\",\n    \"html\": \"<p>**foo <strong>bar baz</strong></p>\\n\",\n    \"example\": 471,\n    \"start_line\": 7379,\n    \"end_line\": 7383,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"*foo *bar baz*\\n\",\n    \"html\": \"<p>*foo <em>bar baz</em></p>\\n\",\n    \"example\": 472,\n    \"start_line\": 7386,\n    \"end_line\": 7390,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"*[bar*](/url)\\n\",\n    \"html\": \"<p>*<a href=\\\"/url\\\">bar*</a></p>\\n\",\n    \"example\": 473,\n    \"start_line\": 7395,\n    \"end_line\": 7399,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"_foo [bar_](/url)\\n\",\n    \"html\": \"<p>_foo <a href=\\\"/url\\\">bar_</a></p>\\n\",\n    \"example\": 474,\n    \"start_line\": 7402,\n    \"end_line\": 7406,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"*<img src=\\\"foo\\\" title=\\\"*\\\"/>\\n\",\n    \"html\": \"<p>*<img src=\\\"foo\\\" title=\\\"*\\\"/></p>\\n\",\n    \"example\": 475,\n    \"start_line\": 7409,\n    \"end_line\": 7413,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"**<a href=\\\"**\\\">\\n\",\n    \"html\": \"<p>**<a href=\\\"**\\\"></p>\\n\",\n    \"example\": 476,\n    \"start_line\": 7416,\n    \"end_line\": 7420,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"__<a href=\\\"__\\\">\\n\",\n    \"html\": \"<p>__<a href=\\\"__\\\"></p>\\n\",\n    \"example\": 477,\n    \"start_line\": 7423,\n    \"end_line\": 7427,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"*a `*`*\\n\",\n    \"html\": \"<p><em>a <code>*</code></em></p>\\n\",\n    \"example\": 478,\n    \"start_line\": 7430,\n    \"end_line\": 7434,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"_a `_`_\\n\",\n    \"html\": \"<p><em>a <code>_</code></em></p>\\n\",\n    \"example\": 479,\n    \"start_line\": 7437,\n    \"end_line\": 7441,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"**a<https://foo.bar/?q=**>\\n\",\n    \"html\": \"<p>**a<a href=\\\"https://foo.bar/?q=**\\\">https://foo.bar/?q=**</a></p>\\n\",\n    \"example\": 480,\n    \"start_line\": 7444,\n    \"end_line\": 7448,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"__a<https://foo.bar/?q=__>\\n\",\n    \"html\": \"<p>__a<a href=\\\"https://foo.bar/?q=__\\\">https://foo.bar/?q=__</a></p>\\n\",\n    \"example\": 481,\n    \"start_line\": 7451,\n    \"end_line\": 7455,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"[link](/uri \\\"title\\\")\\n\",\n    \"html\": \"<p><a href=\\\"/uri\\\" title=\\\"title\\\">link</a></p>\\n\",\n    \"example\": 482,\n    \"start_line\": 7539,\n    \"end_line\": 7543,\n    \"section\": \"Links\"\n  },\n  {\n    \"markdown\": \"[link](/uri)\\n\",\n    \"html\": \"<p><a href=\\\"/uri\\\">link</a></p>\\n\",\n    \"example\": 483,\n    \"start_line\": 7549,\n    \"end_line\": 7553,\n    \"section\": \"Links\"\n  },\n  {\n    \"markdown\": \"[](./target.md)\\n\",\n    \"html\": \"<p><a href=\\\"./target.md\\\"></a></p>\\n\",\n    \"example\": 484,\n    \"start_line\": 7555,\n    \"end_line\": 7559,\n    \"section\": \"Links\"\n  },\n  {\n    \"markdown\": \"[link]()\\n\",\n    \"html\": \"<p><a href=\\\"\\\">link</a></p>\\n\",\n    \"example\": 485,\n    \"start_line\": 7562,\n    \"end_line\": 7566,\n    \"section\": \"Links\"\n  },\n  {\n    \"markdown\": \"[link](<>)\\n\",\n    \"html\": \"<p><a href=\\\"\\\">link</a></p>\\n\",\n    \"example\": 486,\n    \"start_line\": 7569,\n    \"end_line\": 7573,\n    \"section\": \"Links\"\n  },\n  {\n    \"markdown\": \"[]()\\n\",\n    \"html\": \"<p><a href=\\\"\\\"></a></p>\\n\",\n    \"example\": 487,\n    \"start_line\": 7576,\n    \"end_line\": 7580,\n    \"section\": \"Links\"\n  },\n  {\n    \"markdown\": \"[link](/my uri)\\n\",\n    \"html\": \"<p>[link](/my uri)</p>\\n\",\n    \"example\": 488,\n    \"start_line\": 7585,\n    \"end_line\": 7589,\n    \"section\": \"Links\"\n  },\n  {\n    \"markdown\": \"[link](</my uri>)\\n\",\n    \"html\": \"<p><a href=\\\"/my%20uri\\\">link</a></p>\\n\",\n    \"example\": 489,\n    \"start_line\": 7591,\n    \"end_line\": 7595,\n    \"section\": \"Links\"\n  },\n  {\n    \"markdown\": \"[link](foo\\nbar)\\n\",\n    \"html\": \"<p>[link](foo\\nbar)</p>\\n\",\n    \"example\": 490,\n    \"start_line\": 7600,\n    \"end_line\": 7606,\n    \"section\": \"Links\"\n  },\n  {\n    \"markdown\": \"[link](<foo\\nbar>)\\n\",\n    \"html\": \"<p>[link](<foo\\nbar>)</p>\\n\",\n    \"example\": 491,\n    \"start_line\": 7608,\n    \"end_line\": 7614,\n    \"section\": \"Links\"\n  },\n  {\n    \"markdown\": \"[a](<b)c>)\\n\",\n    \"html\": \"<p><a href=\\\"b)c\\\">a</a></p>\\n\",\n    \"example\": 492,\n    \"start_line\": 7619,\n    \"end_line\": 7623,\n    \"section\": \"Links\"\n  },\n  {\n    \"markdown\": \"[link](<foo\\\\>)\\n\",\n    \"html\": \"<p>[link](&lt;foo&gt;)</p>\\n\",\n    \"example\": 493,\n    \"start_line\": 7627,\n    \"end_line\": 7631,\n    \"section\": \"Links\"\n  },\n  {\n    \"markdown\": \"[a](<b)c\\n[a](<b)c>\\n[a](<b>c)\\n\",\n    \"html\": \"<p>[a](&lt;b)c\\n[a](&lt;b)c&gt;\\n[a](<b>c)</p>\\n\",\n    \"example\": 494,\n    \"start_line\": 7636,\n    \"end_line\": 7644,\n    \"section\": \"Links\"\n  },\n  {\n    \"markdown\": \"[link](\\\\(foo\\\\))\\n\",\n    \"html\": \"<p><a href=\\\"(foo)\\\">link</a></p>\\n\",\n    \"example\": 495,\n    \"start_line\": 7648,\n    \"end_line\": 7652,\n    \"section\": \"Links\"\n  },\n  {\n    \"markdown\": \"[link](foo(and(bar)))\\n\",\n    \"html\": \"<p><a href=\\\"foo(and(bar))\\\">link</a></p>\\n\",\n    \"example\": 496,\n    \"start_line\": 7657,\n    \"end_line\": 7661,\n    \"section\": \"Links\"\n  },\n  {\n    \"markdown\": \"[link](foo(and(bar))\\n\",\n    \"html\": \"<p>[link](foo(and(bar))</p>\\n\",\n    \"example\": 497,\n    \"start_line\": 7666,\n    \"end_line\": 7670,\n    \"section\": \"Links\"\n  },\n  {\n    \"markdown\": \"[link](foo\\\\(and\\\\(bar\\\\))\\n\",\n    \"html\": \"<p><a href=\\\"foo(and(bar)\\\">link</a></p>\\n\",\n    \"example\": 498,\n    \"start_line\": 7673,\n    \"end_line\": 7677,\n    \"section\": \"Links\"\n  },\n  {\n    \"markdown\": \"[link](<foo(and(bar)>)\\n\",\n    \"html\": \"<p><a href=\\\"foo(and(bar)\\\">link</a></p>\\n\",\n    \"example\": 499,\n    \"start_line\": 7680,\n    \"end_line\": 7684,\n    \"section\": \"Links\"\n  },\n  {\n    \"markdown\": \"[link](foo\\\\)\\\\:)\\n\",\n    \"html\": \"<p><a href=\\\"foo):\\\">link</a></p>\\n\",\n    \"example\": 500,\n    \"start_line\": 7690,\n    \"end_line\": 7694,\n    \"section\": \"Links\"\n  },\n  {\n    \"markdown\": \"[link](#fragment)\\n\\n[link](https://example.com#fragment)\\n\\n[link](https://example.com?foo=3#frag)\\n\",\n    \"html\": \"<p><a href=\\\"#fragment\\\">link</a></p>\\n<p><a href=\\\"https://example.com#fragment\\\">link</a></p>\\n<p><a href=\\\"https://example.com?foo=3#frag\\\">link</a></p>\\n\",\n    \"example\": 501,\n    \"start_line\": 7699,\n    \"end_line\": 7709,\n    \"section\": \"Links\"\n  },\n  {\n    \"markdown\": \"[link](foo\\\\bar)\\n\",\n    \"html\": \"<p><a href=\\\"foo%5Cbar\\\">link</a></p>\\n\",\n    \"example\": 502,\n    \"start_line\": 7715,\n    \"end_line\": 7719,\n    \"section\": \"Links\"\n  },\n  {\n    \"markdown\": \"[link](foo%20b&auml;)\\n\",\n    \"html\": \"<p><a href=\\\"foo%20b%C3%A4\\\">link</a></p>\\n\",\n    \"example\": 503,\n    \"start_line\": 7731,\n    \"end_line\": 7735,\n    \"section\": \"Links\",\n    \"shouldFail\": true\n  },\n  {\n    \"markdown\": \"[link](\\\"title\\\")\\n\",\n    \"html\": \"<p><a href=\\\"%22title%22\\\">link</a></p>\\n\",\n    \"example\": 504,\n    \"start_line\": 7742,\n    \"end_line\": 7746,\n    \"section\": \"Links\"\n  },\n  {\n    \"markdown\": \"[link](/url \\\"title\\\")\\n[link](/url 'title')\\n[link](/url (title))\\n\",\n    \"html\": \"<p><a href=\\\"/url\\\" title=\\\"title\\\">link</a>\\n<a href=\\\"/url\\\" title=\\\"title\\\">link</a>\\n<a href=\\\"/url\\\" title=\\\"title\\\">link</a></p>\\n\",\n    \"example\": 505,\n    \"start_line\": 7751,\n    \"end_line\": 7759,\n    \"section\": \"Links\"\n  },\n  {\n    \"markdown\": \"[link](/url \\\"title \\\\\\\"&quot;\\\")\\n\",\n    \"html\": \"<p><a href=\\\"/url\\\" title=\\\"title &quot;&quot;\\\">link</a></p>\\n\",\n    \"example\": 506,\n    \"start_line\": 7765,\n    \"end_line\": 7769,\n    \"section\": \"Links\"\n  },\n  {\n    \"markdown\": \"[link](/url \\\"title\\\")\\n\",\n    \"html\": \"<p><a href=\\\"/url%C2%A0%22title%22\\\">link</a></p>\\n\",\n    \"example\": 507,\n    \"start_line\": 7776,\n    \"end_line\": 7780,\n    \"section\": \"Links\"\n  },\n  {\n    \"markdown\": \"[link](/url \\\"title \\\"and\\\" title\\\")\\n\",\n    \"html\": \"<p>[link](/url &quot;title &quot;and&quot; title&quot;)</p>\\n\",\n    \"example\": 508,\n    \"start_line\": 7785,\n    \"end_line\": 7789,\n    \"section\": \"Links\"\n  },\n  {\n    \"markdown\": \"[link](/url 'title \\\"and\\\" title')\\n\",\n    \"html\": \"<p><a href=\\\"/url\\\" title=\\\"title &quot;and&quot; title\\\">link</a></p>\\n\",\n    \"example\": 509,\n    \"start_line\": 7794,\n    \"end_line\": 7798,\n    \"section\": \"Links\"\n  },\n  {\n    \"markdown\": \"[link](   /uri\\n  \\\"title\\\"  )\\n\",\n    \"html\": \"<p><a href=\\\"/uri\\\" title=\\\"title\\\">link</a></p>\\n\",\n    \"example\": 510,\n    \"start_line\": 7819,\n    \"end_line\": 7824,\n    \"section\": \"Links\"\n  },\n  {\n    \"markdown\": \"[link] (/uri)\\n\",\n    \"html\": \"<p>[link] (/uri)</p>\\n\",\n    \"example\": 511,\n    \"start_line\": 7830,\n    \"end_line\": 7834,\n    \"section\": \"Links\"\n  },\n  {\n    \"markdown\": \"[link [foo [bar]]](/uri)\\n\",\n    \"html\": \"<p><a href=\\\"/uri\\\">link [foo [bar]]</a></p>\\n\",\n    \"example\": 512,\n    \"start_line\": 7840,\n    \"end_line\": 7844,\n    \"section\": \"Links\",\n    \"shouldFail\": true\n  },\n  {\n    \"markdown\": \"[link] bar](/uri)\\n\",\n    \"html\": \"<p>[link] bar](/uri)</p>\\n\",\n    \"example\": 513,\n    \"start_line\": 7847,\n    \"end_line\": 7851,\n    \"section\": \"Links\"\n  },\n  {\n    \"markdown\": \"[link [bar](/uri)\\n\",\n    \"html\": \"<p>[link <a href=\\\"/uri\\\">bar</a></p>\\n\",\n    \"example\": 514,\n    \"start_line\": 7854,\n    \"end_line\": 7858,\n    \"section\": \"Links\"\n  },\n  {\n    \"markdown\": \"[link \\\\[bar](/uri)\\n\",\n    \"html\": \"<p><a href=\\\"/uri\\\">link [bar</a></p>\\n\",\n    \"example\": 515,\n    \"start_line\": 7861,\n    \"end_line\": 7865,\n    \"section\": \"Links\"\n  },\n  {\n    \"markdown\": \"[link *foo **bar** `#`*](/uri)\\n\",\n    \"html\": \"<p><a href=\\\"/uri\\\">link <em>foo <strong>bar</strong> <code>#</code></em></a></p>\\n\",\n    \"example\": 516,\n    \"start_line\": 7870,\n    \"end_line\": 7874,\n    \"section\": \"Links\"\n  },\n  {\n    \"markdown\": \"[![moon](moon.jpg)](/uri)\\n\",\n    \"html\": \"<p><a href=\\\"/uri\\\"><img src=\\\"moon.jpg\\\" alt=\\\"moon\\\" /></a></p>\\n\",\n    \"example\": 517,\n    \"start_line\": 7877,\n    \"end_line\": 7881,\n    \"section\": \"Links\"\n  },\n  {\n    \"markdown\": \"[foo [bar](/uri)](/uri)\\n\",\n    \"html\": \"<p>[foo <a href=\\\"/uri\\\">bar</a>](/uri)</p>\\n\",\n    \"example\": 518,\n    \"start_line\": 7886,\n    \"end_line\": 7890,\n    \"section\": \"Links\",\n    \"shouldFail\": true\n  },\n  {\n    \"markdown\": \"[foo *[bar [baz](/uri)](/uri)*](/uri)\\n\",\n    \"html\": \"<p>[foo <em>[bar <a href=\\\"/uri\\\">baz</a>](/uri)</em>](/uri)</p>\\n\",\n    \"example\": 519,\n    \"start_line\": 7893,\n    \"end_line\": 7897,\n    \"section\": \"Links\",\n    \"shouldFail\": true\n  },\n  {\n    \"markdown\": \"![[[foo](uri1)](uri2)](uri3)\\n\",\n    \"html\": \"<p><img src=\\\"uri3\\\" alt=\\\"[foo](uri2)\\\" /></p>\\n\",\n    \"example\": 520,\n    \"start_line\": 7900,\n    \"end_line\": 7904,\n    \"section\": \"Links\",\n    \"shouldFail\": true\n  },\n  {\n    \"markdown\": \"*[foo*](/uri)\\n\",\n    \"html\": \"<p>*<a href=\\\"/uri\\\">foo*</a></p>\\n\",\n    \"example\": 521,\n    \"start_line\": 7910,\n    \"end_line\": 7914,\n    \"section\": \"Links\"\n  },\n  {\n    \"markdown\": \"[foo *bar](baz*)\\n\",\n    \"html\": \"<p><a href=\\\"baz*\\\">foo *bar</a></p>\\n\",\n    \"example\": 522,\n    \"start_line\": 7917,\n    \"end_line\": 7921,\n    \"section\": \"Links\"\n  },\n  {\n    \"markdown\": \"*foo [bar* baz]\\n\",\n    \"html\": \"<p><em>foo [bar</em> baz]</p>\\n\",\n    \"example\": 523,\n    \"start_line\": 7927,\n    \"end_line\": 7931,\n    \"section\": \"Links\"\n  },\n  {\n    \"markdown\": \"[foo <bar attr=\\\"](baz)\\\">\\n\",\n    \"html\": \"<p>[foo <bar attr=\\\"](baz)\\\"></p>\\n\",\n    \"example\": 524,\n    \"start_line\": 7937,\n    \"end_line\": 7941,\n    \"section\": \"Links\",\n    \"shouldFail\": true\n  },\n  {\n    \"markdown\": \"[foo`](/uri)`\\n\",\n    \"html\": \"<p>[foo<code>](/uri)</code></p>\\n\",\n    \"example\": 525,\n    \"start_line\": 7944,\n    \"end_line\": 7948,\n    \"section\": \"Links\"\n  },\n  {\n    \"markdown\": \"[foo<https://example.com/?search=](uri)>\\n\",\n    \"html\": \"<p>[foo<a href=\\\"https://example.com/?search=%5D(uri)\\\">https://example.com/?search=](uri)</a></p>\\n\",\n    \"example\": 526,\n    \"start_line\": 7951,\n    \"end_line\": 7955,\n    \"section\": \"Links\",\n    \"shouldFail\": true\n  },\n  {\n    \"markdown\": \"[foo][bar]\\n\\n[bar]: /url \\\"title\\\"\\n\",\n    \"html\": \"<p><a href=\\\"/url\\\" title=\\\"title\\\">foo</a></p>\\n\",\n    \"example\": 527,\n    \"start_line\": 7989,\n    \"end_line\": 7995,\n    \"section\": \"Links\"\n  },\n  {\n    \"markdown\": \"[link [foo [bar]]][ref]\\n\\n[ref]: /uri\\n\",\n    \"html\": \"<p><a href=\\\"/uri\\\">link [foo [bar]]</a></p>\\n\",\n    \"example\": 528,\n    \"start_line\": 8004,\n    \"end_line\": 8010,\n    \"section\": \"Links\",\n    \"shouldFail\": true\n  },\n  {\n    \"markdown\": \"[link \\\\[bar][ref]\\n\\n[ref]: /uri\\n\",\n    \"html\": \"<p><a href=\\\"/uri\\\">link [bar</a></p>\\n\",\n    \"example\": 529,\n    \"start_line\": 8013,\n    \"end_line\": 8019,\n    \"section\": \"Links\"\n  },\n  {\n    \"markdown\": \"[link *foo **bar** `#`*][ref]\\n\\n[ref]: /uri\\n\",\n    \"html\": \"<p><a href=\\\"/uri\\\">link <em>foo <strong>bar</strong> <code>#</code></em></a></p>\\n\",\n    \"example\": 530,\n    \"start_line\": 8024,\n    \"end_line\": 8030,\n    \"section\": \"Links\"\n  },\n  {\n    \"markdown\": \"[![moon](moon.jpg)][ref]\\n\\n[ref]: /uri\\n\",\n    \"html\": \"<p><a href=\\\"/uri\\\"><img src=\\\"moon.jpg\\\" alt=\\\"moon\\\" /></a></p>\\n\",\n    \"example\": 531,\n    \"start_line\": 8033,\n    \"end_line\": 8039,\n    \"section\": \"Links\"\n  },\n  {\n    \"markdown\": \"[foo [bar](/uri)][ref]\\n\\n[ref]: /uri\\n\",\n    \"html\": \"<p>[foo <a href=\\\"/uri\\\">bar</a>]<a href=\\\"/uri\\\">ref</a></p>\\n\",\n    \"example\": 532,\n    \"start_line\": 8044,\n    \"end_line\": 8050,\n    \"section\": \"Links\",\n    \"shouldFail\": true\n  },\n  {\n    \"markdown\": \"[foo *bar [baz][ref]*][ref]\\n\\n[ref]: /uri\\n\",\n    \"html\": \"<p>[foo <em>bar <a href=\\\"/uri\\\">baz</a></em>]<a href=\\\"/uri\\\">ref</a></p>\\n\",\n    \"example\": 533,\n    \"start_line\": 8053,\n    \"end_line\": 8059,\n    \"section\": \"Links\",\n    \"shouldFail\": true\n  },\n  {\n    \"markdown\": \"*[foo*][ref]\\n\\n[ref]: /uri\\n\",\n    \"html\": \"<p>*<a href=\\\"/uri\\\">foo*</a></p>\\n\",\n    \"example\": 534,\n    \"start_line\": 8068,\n    \"end_line\": 8074,\n    \"section\": \"Links\"\n  },\n  {\n    \"markdown\": \"[foo *bar][ref]*\\n\\n[ref]: /uri\\n\",\n    \"html\": \"<p><a href=\\\"/uri\\\">foo *bar</a>*</p>\\n\",\n    \"example\": 535,\n    \"start_line\": 8077,\n    \"end_line\": 8083,\n    \"section\": \"Links\"\n  },\n  {\n    \"markdown\": \"[foo <bar attr=\\\"][ref]\\\">\\n\\n[ref]: /uri\\n\",\n    \"html\": \"<p>[foo <bar attr=\\\"][ref]\\\"></p>\\n\",\n    \"example\": 536,\n    \"start_line\": 8089,\n    \"end_line\": 8095,\n    \"section\": \"Links\",\n    \"shouldFail\": true\n  },\n  {\n    \"markdown\": \"[foo`][ref]`\\n\\n[ref]: /uri\\n\",\n    \"html\": \"<p>[foo<code>][ref]</code></p>\\n\",\n    \"example\": 537,\n    \"start_line\": 8098,\n    \"end_line\": 8104,\n    \"section\": \"Links\"\n  },\n  {\n    \"markdown\": \"[foo<https://example.com/?search=][ref]>\\n\\n[ref]: /uri\\n\",\n    \"html\": \"<p>[foo<a href=\\\"https://example.com/?search=%5D%5Bref%5D\\\">https://example.com/?search=][ref]</a></p>\\n\",\n    \"example\": 538,\n    \"start_line\": 8107,\n    \"end_line\": 8113,\n    \"section\": \"Links\",\n    \"shouldFail\": true\n  },\n  {\n    \"markdown\": \"[foo][BaR]\\n\\n[bar]: /url \\\"title\\\"\\n\",\n    \"html\": \"<p><a href=\\\"/url\\\" title=\\\"title\\\">foo</a></p>\\n\",\n    \"example\": 539,\n    \"start_line\": 8118,\n    \"end_line\": 8124,\n    \"section\": \"Links\"\n  },\n  {\n    \"markdown\": \"[ẞ]\\n\\n[SS]: /url\\n\",\n    \"html\": \"<p><a href=\\\"/url\\\">ẞ</a></p>\\n\",\n    \"example\": 540,\n    \"start_line\": 8129,\n    \"end_line\": 8135,\n    \"section\": \"Links\",\n    \"shouldFail\": true\n  },\n  {\n    \"markdown\": \"[Foo\\n  bar]: /url\\n\\n[Baz][Foo bar]\\n\",\n    \"html\": \"<p><a href=\\\"/url\\\">Baz</a></p>\\n\",\n    \"example\": 541,\n    \"start_line\": 8141,\n    \"end_line\": 8148,\n    \"section\": \"Links\"\n  },\n  {\n    \"markdown\": \"[foo] [bar]\\n\\n[bar]: /url \\\"title\\\"\\n\",\n    \"html\": \"<p>[foo] <a href=\\\"/url\\\" title=\\\"title\\\">bar</a></p>\\n\",\n    \"example\": 542,\n    \"start_line\": 8154,\n    \"end_line\": 8160,\n    \"section\": \"Links\"\n  },\n  {\n    \"markdown\": \"[foo]\\n[bar]\\n\\n[bar]: /url \\\"title\\\"\\n\",\n    \"html\": \"<p>[foo]\\n<a href=\\\"/url\\\" title=\\\"title\\\">bar</a></p>\\n\",\n    \"example\": 543,\n    \"start_line\": 8163,\n    \"end_line\": 8171,\n    \"section\": \"Links\"\n  },\n  {\n    \"markdown\": \"[foo]: /url1\\n\\n[foo]: /url2\\n\\n[bar][foo]\\n\",\n    \"html\": \"<p><a href=\\\"/url1\\\">bar</a></p>\\n\",\n    \"example\": 544,\n    \"start_line\": 8204,\n    \"end_line\": 8212,\n    \"section\": \"Links\"\n  },\n  {\n    \"markdown\": \"[bar][foo\\\\!]\\n\\n[foo!]: /url\\n\",\n    \"html\": \"<p>[bar][foo!]</p>\\n\",\n    \"example\": 545,\n    \"start_line\": 8219,\n    \"end_line\": 8225,\n    \"section\": \"Links\"\n  },\n  {\n    \"markdown\": \"[foo][ref[]\\n\\n[ref[]: /uri\\n\",\n    \"html\": \"<p>[foo][ref[]</p>\\n<p>[ref[]: /uri</p>\\n\",\n    \"example\": 546,\n    \"start_line\": 8231,\n    \"end_line\": 8238,\n    \"section\": \"Links\"\n  },\n  {\n    \"markdown\": \"[foo][ref[bar]]\\n\\n[ref[bar]]: /uri\\n\",\n    \"html\": \"<p>[foo][ref[bar]]</p>\\n<p>[ref[bar]]: /uri</p>\\n\",\n    \"example\": 547,\n    \"start_line\": 8241,\n    \"end_line\": 8248,\n    \"section\": \"Links\"\n  },\n  {\n    \"markdown\": \"[[[foo]]]\\n\\n[[[foo]]]: /url\\n\",\n    \"html\": \"<p>[[[foo]]]</p>\\n<p>[[[foo]]]: /url</p>\\n\",\n    \"example\": 548,\n    \"start_line\": 8251,\n    \"end_line\": 8258,\n    \"section\": \"Links\"\n  },\n  {\n    \"markdown\": \"[foo][ref\\\\[]\\n\\n[ref\\\\[]: /uri\\n\",\n    \"html\": \"<p><a href=\\\"/uri\\\">foo</a></p>\\n\",\n    \"example\": 549,\n    \"start_line\": 8261,\n    \"end_line\": 8267,\n    \"section\": \"Links\"\n  },\n  {\n    \"markdown\": \"[bar\\\\\\\\]: /uri\\n\\n[bar\\\\\\\\]\\n\",\n    \"html\": \"<p><a href=\\\"/uri\\\">bar\\\\</a></p>\\n\",\n    \"example\": 550,\n    \"start_line\": 8272,\n    \"end_line\": 8278,\n    \"section\": \"Links\"\n  },\n  {\n    \"markdown\": \"[]\\n\\n[]: /uri\\n\",\n    \"html\": \"<p>[]</p>\\n<p>[]: /uri</p>\\n\",\n    \"example\": 551,\n    \"start_line\": 8284,\n    \"end_line\": 8291,\n    \"section\": \"Links\"\n  },\n  {\n    \"markdown\": \"[\\n ]\\n\\n[\\n ]: /uri\\n\",\n    \"html\": \"<p>[\\n]</p>\\n<p>[\\n]: /uri</p>\\n\",\n    \"example\": 552,\n    \"start_line\": 8294,\n    \"end_line\": 8305,\n    \"section\": \"Links\"\n  },\n  {\n    \"markdown\": \"[foo][]\\n\\n[foo]: /url \\\"title\\\"\\n\",\n    \"html\": \"<p><a href=\\\"/url\\\" title=\\\"title\\\">foo</a></p>\\n\",\n    \"example\": 553,\n    \"start_line\": 8317,\n    \"end_line\": 8323,\n    \"section\": \"Links\"\n  },\n  {\n    \"markdown\": \"[*foo* bar][]\\n\\n[*foo* bar]: /url \\\"title\\\"\\n\",\n    \"html\": \"<p><a href=\\\"/url\\\" title=\\\"title\\\"><em>foo</em> bar</a></p>\\n\",\n    \"example\": 554,\n    \"start_line\": 8326,\n    \"end_line\": 8332,\n    \"section\": \"Links\"\n  },\n  {\n    \"markdown\": \"[Foo][]\\n\\n[foo]: /url \\\"title\\\"\\n\",\n    \"html\": \"<p><a href=\\\"/url\\\" title=\\\"title\\\">Foo</a></p>\\n\",\n    \"example\": 555,\n    \"start_line\": 8337,\n    \"end_line\": 8343,\n    \"section\": \"Links\"\n  },\n  {\n    \"markdown\": \"[foo] \\n[]\\n\\n[foo]: /url \\\"title\\\"\\n\",\n    \"html\": \"<p><a href=\\\"/url\\\" title=\\\"title\\\">foo</a>\\n[]</p>\\n\",\n    \"example\": 556,\n    \"start_line\": 8350,\n    \"end_line\": 8358,\n    \"section\": \"Links\"\n  },\n  {\n    \"markdown\": \"[foo]\\n\\n[foo]: /url \\\"title\\\"\\n\",\n    \"html\": \"<p><a href=\\\"/url\\\" title=\\\"title\\\">foo</a></p>\\n\",\n    \"example\": 557,\n    \"start_line\": 8370,\n    \"end_line\": 8376,\n    \"section\": \"Links\"\n  },\n  {\n    \"markdown\": \"[*foo* bar]\\n\\n[*foo* bar]: /url \\\"title\\\"\\n\",\n    \"html\": \"<p><a href=\\\"/url\\\" title=\\\"title\\\"><em>foo</em> bar</a></p>\\n\",\n    \"example\": 558,\n    \"start_line\": 8379,\n    \"end_line\": 8385,\n    \"section\": \"Links\"\n  },\n  {\n    \"markdown\": \"[[*foo* bar]]\\n\\n[*foo* bar]: /url \\\"title\\\"\\n\",\n    \"html\": \"<p>[<a href=\\\"/url\\\" title=\\\"title\\\"><em>foo</em> bar</a>]</p>\\n\",\n    \"example\": 559,\n    \"start_line\": 8388,\n    \"end_line\": 8394,\n    \"section\": \"Links\"\n  },\n  {\n    \"markdown\": \"[[bar [foo]\\n\\n[foo]: /url\\n\",\n    \"html\": \"<p>[[bar <a href=\\\"/url\\\">foo</a></p>\\n\",\n    \"example\": 560,\n    \"start_line\": 8397,\n    \"end_line\": 8403,\n    \"section\": \"Links\"\n  },\n  {\n    \"markdown\": \"[Foo]\\n\\n[foo]: /url \\\"title\\\"\\n\",\n    \"html\": \"<p><a href=\\\"/url\\\" title=\\\"title\\\">Foo</a></p>\\n\",\n    \"example\": 561,\n    \"start_line\": 8408,\n    \"end_line\": 8414,\n    \"section\": \"Links\"\n  },\n  {\n    \"markdown\": \"[foo] bar\\n\\n[foo]: /url\\n\",\n    \"html\": \"<p><a href=\\\"/url\\\">foo</a> bar</p>\\n\",\n    \"example\": 562,\n    \"start_line\": 8419,\n    \"end_line\": 8425,\n    \"section\": \"Links\"\n  },\n  {\n    \"markdown\": \"\\\\[foo]\\n\\n[foo]: /url \\\"title\\\"\\n\",\n    \"html\": \"<p>[foo]</p>\\n\",\n    \"example\": 563,\n    \"start_line\": 8431,\n    \"end_line\": 8437,\n    \"section\": \"Links\"\n  },\n  {\n    \"markdown\": \"[foo*]: /url\\n\\n*[foo*]\\n\",\n    \"html\": \"<p>*<a href=\\\"/url\\\">foo*</a></p>\\n\",\n    \"example\": 564,\n    \"start_line\": 8443,\n    \"end_line\": 8449,\n    \"section\": \"Links\"\n  },\n  {\n    \"markdown\": \"[foo][bar]\\n\\n[foo]: /url1\\n[bar]: /url2\\n\",\n    \"html\": \"<p><a href=\\\"/url2\\\">foo</a></p>\\n\",\n    \"example\": 565,\n    \"start_line\": 8455,\n    \"end_line\": 8462,\n    \"section\": \"Links\"\n  },\n  {\n    \"markdown\": \"[foo][]\\n\\n[foo]: /url1\\n\",\n    \"html\": \"<p><a href=\\\"/url1\\\">foo</a></p>\\n\",\n    \"example\": 566,\n    \"start_line\": 8464,\n    \"end_line\": 8470,\n    \"section\": \"Links\"\n  },\n  {\n    \"markdown\": \"[foo]()\\n\\n[foo]: /url1\\n\",\n    \"html\": \"<p><a href=\\\"\\\">foo</a></p>\\n\",\n    \"example\": 567,\n    \"start_line\": 8474,\n    \"end_line\": 8480,\n    \"section\": \"Links\"\n  },\n  {\n    \"markdown\": \"[foo](not a link)\\n\\n[foo]: /url1\\n\",\n    \"html\": \"<p><a href=\\\"/url1\\\">foo</a>(not a link)</p>\\n\",\n    \"example\": 568,\n    \"start_line\": 8482,\n    \"end_line\": 8488,\n    \"section\": \"Links\"\n  },\n  {\n    \"markdown\": \"[foo][bar][baz]\\n\\n[baz]: /url\\n\",\n    \"html\": \"<p>[foo]<a href=\\\"/url\\\">bar</a></p>\\n\",\n    \"example\": 569,\n    \"start_line\": 8493,\n    \"end_line\": 8499,\n    \"section\": \"Links\"\n  },\n  {\n    \"markdown\": \"[foo][bar][baz]\\n\\n[baz]: /url1\\n[bar]: /url2\\n\",\n    \"html\": \"<p><a href=\\\"/url2\\\">foo</a><a href=\\\"/url1\\\">baz</a></p>\\n\",\n    \"example\": 570,\n    \"start_line\": 8505,\n    \"end_line\": 8512,\n    \"section\": \"Links\"\n  },\n  {\n    \"markdown\": \"[foo][bar][baz]\\n\\n[baz]: /url1\\n[foo]: /url2\\n\",\n    \"html\": \"<p>[foo]<a href=\\\"/url1\\\">bar</a></p>\\n\",\n    \"example\": 571,\n    \"start_line\": 8518,\n    \"end_line\": 8525,\n    \"section\": \"Links\"\n  },\n  {\n    \"markdown\": \"![foo](/url \\\"title\\\")\\n\",\n    \"html\": \"<p><img src=\\\"/url\\\" alt=\\\"foo\\\" title=\\\"title\\\" /></p>\\n\",\n    \"example\": 572,\n    \"start_line\": 8541,\n    \"end_line\": 8545,\n    \"section\": \"Images\"\n  },\n  {\n    \"markdown\": \"![foo *bar*]\\n\\n[foo *bar*]: train.jpg \\\"train & tracks\\\"\\n\",\n    \"html\": \"<p><img src=\\\"train.jpg\\\" alt=\\\"foo bar\\\" title=\\\"train &amp; tracks\\\" /></p>\\n\",\n    \"example\": 573,\n    \"start_line\": 8548,\n    \"end_line\": 8554,\n    \"section\": \"Images\"\n  },\n  {\n    \"markdown\": \"![foo ![bar](/url)](/url2)\\n\",\n    \"html\": \"<p><img src=\\\"/url2\\\" alt=\\\"foo bar\\\" /></p>\\n\",\n    \"example\": 574,\n    \"start_line\": 8557,\n    \"end_line\": 8561,\n    \"section\": \"Images\"\n  },\n  {\n    \"markdown\": \"![foo [bar](/url)](/url2)\\n\",\n    \"html\": \"<p><img src=\\\"/url2\\\" alt=\\\"foo bar\\\" /></p>\\n\",\n    \"example\": 575,\n    \"start_line\": 8564,\n    \"end_line\": 8568,\n    \"section\": \"Images\"\n  },\n  {\n    \"markdown\": \"![foo *bar*][]\\n\\n[foo *bar*]: train.jpg \\\"train & tracks\\\"\\n\",\n    \"html\": \"<p><img src=\\\"train.jpg\\\" alt=\\\"foo bar\\\" title=\\\"train &amp; tracks\\\" /></p>\\n\",\n    \"example\": 576,\n    \"start_line\": 8578,\n    \"end_line\": 8584,\n    \"section\": \"Images\"\n  },\n  {\n    \"markdown\": \"![foo *bar*][foobar]\\n\\n[FOOBAR]: train.jpg \\\"train & tracks\\\"\\n\",\n    \"html\": \"<p><img src=\\\"train.jpg\\\" alt=\\\"foo bar\\\" title=\\\"train &amp; tracks\\\" /></p>\\n\",\n    \"example\": 577,\n    \"start_line\": 8587,\n    \"end_line\": 8593,\n    \"section\": \"Images\"\n  },\n  {\n    \"markdown\": \"![foo](train.jpg)\\n\",\n    \"html\": \"<p><img src=\\\"train.jpg\\\" alt=\\\"foo\\\" /></p>\\n\",\n    \"example\": 578,\n    \"start_line\": 8596,\n    \"end_line\": 8600,\n    \"section\": \"Images\"\n  },\n  {\n    \"markdown\": \"My ![foo bar](/path/to/train.jpg  \\\"title\\\"   )\\n\",\n    \"html\": \"<p>My <img src=\\\"/path/to/train.jpg\\\" alt=\\\"foo bar\\\" title=\\\"title\\\" /></p>\\n\",\n    \"example\": 579,\n    \"start_line\": 8603,\n    \"end_line\": 8607,\n    \"section\": \"Images\"\n  },\n  {\n    \"markdown\": \"![foo](<url>)\\n\",\n    \"html\": \"<p><img src=\\\"url\\\" alt=\\\"foo\\\" /></p>\\n\",\n    \"example\": 580,\n    \"start_line\": 8610,\n    \"end_line\": 8614,\n    \"section\": \"Images\"\n  },\n  {\n    \"markdown\": \"![](/url)\\n\",\n    \"html\": \"<p><img src=\\\"/url\\\" alt=\\\"\\\" /></p>\\n\",\n    \"example\": 581,\n    \"start_line\": 8617,\n    \"end_line\": 8621,\n    \"section\": \"Images\"\n  },\n  {\n    \"markdown\": \"![foo][bar]\\n\\n[bar]: /url\\n\",\n    \"html\": \"<p><img src=\\\"/url\\\" alt=\\\"foo\\\" /></p>\\n\",\n    \"example\": 582,\n    \"start_line\": 8626,\n    \"end_line\": 8632,\n    \"section\": \"Images\"\n  },\n  {\n    \"markdown\": \"![foo][bar]\\n\\n[BAR]: /url\\n\",\n    \"html\": \"<p><img src=\\\"/url\\\" alt=\\\"foo\\\" /></p>\\n\",\n    \"example\": 583,\n    \"start_line\": 8635,\n    \"end_line\": 8641,\n    \"section\": \"Images\"\n  },\n  {\n    \"markdown\": \"![foo][]\\n\\n[foo]: /url \\\"title\\\"\\n\",\n    \"html\": \"<p><img src=\\\"/url\\\" alt=\\\"foo\\\" title=\\\"title\\\" /></p>\\n\",\n    \"example\": 584,\n    \"start_line\": 8646,\n    \"end_line\": 8652,\n    \"section\": \"Images\"\n  },\n  {\n    \"markdown\": \"![*foo* bar][]\\n\\n[*foo* bar]: /url \\\"title\\\"\\n\",\n    \"html\": \"<p><img src=\\\"/url\\\" alt=\\\"foo bar\\\" title=\\\"title\\\" /></p>\\n\",\n    \"example\": 585,\n    \"start_line\": 8655,\n    \"end_line\": 8661,\n    \"section\": \"Images\"\n  },\n  {\n    \"markdown\": \"![Foo][]\\n\\n[foo]: /url \\\"title\\\"\\n\",\n    \"html\": \"<p><img src=\\\"/url\\\" alt=\\\"Foo\\\" title=\\\"title\\\" /></p>\\n\",\n    \"example\": 586,\n    \"start_line\": 8666,\n    \"end_line\": 8672,\n    \"section\": \"Images\"\n  },\n  {\n    \"markdown\": \"![foo] \\n[]\\n\\n[foo]: /url \\\"title\\\"\\n\",\n    \"html\": \"<p><img src=\\\"/url\\\" alt=\\\"foo\\\" title=\\\"title\\\" />\\n[]</p>\\n\",\n    \"example\": 587,\n    \"start_line\": 8678,\n    \"end_line\": 8686,\n    \"section\": \"Images\"\n  },\n  {\n    \"markdown\": \"![foo]\\n\\n[foo]: /url \\\"title\\\"\\n\",\n    \"html\": \"<p><img src=\\\"/url\\\" alt=\\\"foo\\\" title=\\\"title\\\" /></p>\\n\",\n    \"example\": 588,\n    \"start_line\": 8691,\n    \"end_line\": 8697,\n    \"section\": \"Images\"\n  },\n  {\n    \"markdown\": \"![*foo* bar]\\n\\n[*foo* bar]: /url \\\"title\\\"\\n\",\n    \"html\": \"<p><img src=\\\"/url\\\" alt=\\\"foo bar\\\" title=\\\"title\\\" /></p>\\n\",\n    \"example\": 589,\n    \"start_line\": 8700,\n    \"end_line\": 8706,\n    \"section\": \"Images\"\n  },\n  {\n    \"markdown\": \"![[foo]]\\n\\n[[foo]]: /url \\\"title\\\"\\n\",\n    \"html\": \"<p>![[foo]]</p>\\n<p>[[foo]]: /url &quot;title&quot;</p>\\n\",\n    \"example\": 590,\n    \"start_line\": 8711,\n    \"end_line\": 8718,\n    \"section\": \"Images\"\n  },\n  {\n    \"markdown\": \"![Foo]\\n\\n[foo]: /url \\\"title\\\"\\n\",\n    \"html\": \"<p><img src=\\\"/url\\\" alt=\\\"Foo\\\" title=\\\"title\\\" /></p>\\n\",\n    \"example\": 591,\n    \"start_line\": 8723,\n    \"end_line\": 8729,\n    \"section\": \"Images\"\n  },\n  {\n    \"markdown\": \"!\\\\[foo]\\n\\n[foo]: /url \\\"title\\\"\\n\",\n    \"html\": \"<p>![foo]</p>\\n\",\n    \"example\": 592,\n    \"start_line\": 8735,\n    \"end_line\": 8741,\n    \"section\": \"Images\"\n  },\n  {\n    \"markdown\": \"\\\\![foo]\\n\\n[foo]: /url \\\"title\\\"\\n\",\n    \"html\": \"<p>!<a href=\\\"/url\\\" title=\\\"title\\\">foo</a></p>\\n\",\n    \"example\": 593,\n    \"start_line\": 8747,\n    \"end_line\": 8753,\n    \"section\": \"Images\"\n  },\n  {\n    \"markdown\": \"<http://foo.bar.baz>\\n\",\n    \"html\": \"<p><a href=\\\"http://foo.bar.baz\\\">http://foo.bar.baz</a></p>\\n\",\n    \"example\": 594,\n    \"start_line\": 8780,\n    \"end_line\": 8784,\n    \"section\": \"Autolinks\"\n  },\n  {\n    \"markdown\": \"<https://foo.bar.baz/test?q=hello&id=22&boolean>\\n\",\n    \"html\": \"<p><a href=\\\"https://foo.bar.baz/test?q=hello&amp;id=22&amp;boolean\\\">https://foo.bar.baz/test?q=hello&amp;id=22&amp;boolean</a></p>\\n\",\n    \"example\": 595,\n    \"start_line\": 8787,\n    \"end_line\": 8791,\n    \"section\": \"Autolinks\"\n  },\n  {\n    \"markdown\": \"<irc://foo.bar:2233/baz>\\n\",\n    \"html\": \"<p><a href=\\\"irc://foo.bar:2233/baz\\\">irc://foo.bar:2233/baz</a></p>\\n\",\n    \"example\": 596,\n    \"start_line\": 8794,\n    \"end_line\": 8798,\n    \"section\": \"Autolinks\"\n  },\n  {\n    \"markdown\": \"<MAILTO:FOO@BAR.BAZ>\\n\",\n    \"html\": \"<p><a href=\\\"MAILTO:FOO@BAR.BAZ\\\">MAILTO:FOO@BAR.BAZ</a></p>\\n\",\n    \"example\": 597,\n    \"start_line\": 8803,\n    \"end_line\": 8807,\n    \"section\": \"Autolinks\"\n  },\n  {\n    \"markdown\": \"<a+b+c:d>\\n\",\n    \"html\": \"<p><a href=\\\"a+b+c:d\\\">a+b+c:d</a></p>\\n\",\n    \"example\": 598,\n    \"start_line\": 8815,\n    \"end_line\": 8819,\n    \"section\": \"Autolinks\"\n  },\n  {\n    \"markdown\": \"<made-up-scheme://foo,bar>\\n\",\n    \"html\": \"<p><a href=\\\"made-up-scheme://foo,bar\\\">made-up-scheme://foo,bar</a></p>\\n\",\n    \"example\": 599,\n    \"start_line\": 8822,\n    \"end_line\": 8826,\n    \"section\": \"Autolinks\"\n  },\n  {\n    \"markdown\": \"<https://../>\\n\",\n    \"html\": \"<p><a href=\\\"https://../\\\">https://../</a></p>\\n\",\n    \"example\": 600,\n    \"start_line\": 8829,\n    \"end_line\": 8833,\n    \"section\": \"Autolinks\"\n  },\n  {\n    \"markdown\": \"<localhost:5001/foo>\\n\",\n    \"html\": \"<p><a href=\\\"localhost:5001/foo\\\">localhost:5001/foo</a></p>\\n\",\n    \"example\": 601,\n    \"start_line\": 8836,\n    \"end_line\": 8840,\n    \"section\": \"Autolinks\"\n  },\n  {\n    \"markdown\": \"<https://foo.bar/baz bim>\\n\",\n    \"html\": \"<p>&lt;https://foo.bar/baz bim&gt;</p>\\n\",\n    \"example\": 602,\n    \"start_line\": 8845,\n    \"end_line\": 8849,\n    \"section\": \"Autolinks\"\n  },\n  {\n    \"markdown\": \"<https://example.com/\\\\[\\\\>\\n\",\n    \"html\": \"<p><a href=\\\"https://example.com/%5C%5B%5C\\\">https://example.com/\\\\[\\\\</a></p>\\n\",\n    \"example\": 603,\n    \"start_line\": 8854,\n    \"end_line\": 8858,\n    \"section\": \"Autolinks\"\n  },\n  {\n    \"markdown\": \"<foo@bar.example.com>\\n\",\n    \"html\": \"<p><a href=\\\"mailto:foo@bar.example.com\\\">foo@bar.example.com</a></p>\\n\",\n    \"example\": 604,\n    \"start_line\": 8876,\n    \"end_line\": 8880,\n    \"section\": \"Autolinks\"\n  },\n  {\n    \"markdown\": \"<foo+special@Bar.baz-bar0.com>\\n\",\n    \"html\": \"<p><a href=\\\"mailto:foo+special@Bar.baz-bar0.com\\\">foo+special@Bar.baz-bar0.com</a></p>\\n\",\n    \"example\": 605,\n    \"start_line\": 8883,\n    \"end_line\": 8887,\n    \"section\": \"Autolinks\"\n  },\n  {\n    \"markdown\": \"<foo\\\\+@bar.example.com>\\n\",\n    \"html\": \"<p>&lt;foo+@bar.example.com&gt;</p>\\n\",\n    \"example\": 606,\n    \"start_line\": 8892,\n    \"end_line\": 8896,\n    \"section\": \"Autolinks\"\n  },\n  {\n    \"markdown\": \"<>\\n\",\n    \"html\": \"<p>&lt;&gt;</p>\\n\",\n    \"example\": 607,\n    \"start_line\": 8901,\n    \"end_line\": 8905,\n    \"section\": \"Autolinks\"\n  },\n  {\n    \"markdown\": \"< https://foo.bar >\\n\",\n    \"html\": \"<p>&lt; https://foo.bar &gt;</p>\\n\",\n    \"example\": 608,\n    \"start_line\": 8908,\n    \"end_line\": 8912,\n    \"section\": \"Autolinks\"\n  },\n  {\n    \"markdown\": \"<m:abc>\\n\",\n    \"html\": \"<p>&lt;m:abc&gt;</p>\\n\",\n    \"example\": 609,\n    \"start_line\": 8915,\n    \"end_line\": 8919,\n    \"section\": \"Autolinks\"\n  },\n  {\n    \"markdown\": \"<foo.bar.baz>\\n\",\n    \"html\": \"<p>&lt;foo.bar.baz&gt;</p>\\n\",\n    \"example\": 610,\n    \"start_line\": 8922,\n    \"end_line\": 8926,\n    \"section\": \"Autolinks\"\n  },\n  {\n    \"markdown\": \"https://example.com\\n\",\n    \"html\": \"<p>https://example.com</p>\\n\",\n    \"example\": 611,\n    \"start_line\": 8929,\n    \"end_line\": 8933,\n    \"section\": \"Autolinks\"\n  },\n  {\n    \"markdown\": \"foo@bar.example.com\\n\",\n    \"html\": \"<p>foo@bar.example.com</p>\\n\",\n    \"example\": 612,\n    \"start_line\": 8936,\n    \"end_line\": 8940,\n    \"section\": \"Autolinks\"\n  },\n  {\n    \"markdown\": \"<a><bab><c2c>\\n\",\n    \"html\": \"<p><a><bab><c2c></p>\\n\",\n    \"example\": 613,\n    \"start_line\": 9016,\n    \"end_line\": 9020,\n    \"section\": \"Raw HTML\"\n  },\n  {\n    \"markdown\": \"<a/><b2/>\\n\",\n    \"html\": \"<p><a/><b2/></p>\\n\",\n    \"example\": 614,\n    \"start_line\": 9025,\n    \"end_line\": 9029,\n    \"section\": \"Raw HTML\"\n  },\n  {\n    \"markdown\": \"<a  /><b2\\ndata=\\\"foo\\\" >\\n\",\n    \"html\": \"<p><a  /><b2\\ndata=\\\"foo\\\" ></p>\\n\",\n    \"example\": 615,\n    \"start_line\": 9034,\n    \"end_line\": 9040,\n    \"section\": \"Raw HTML\"\n  },\n  {\n    \"markdown\": \"<a foo=\\\"bar\\\" bam = 'baz <em>\\\"</em>'\\n_boolean zoop:33=zoop:33 />\\n\",\n    \"html\": \"<p><a foo=\\\"bar\\\" bam = 'baz <em>\\\"</em>'\\n_boolean zoop:33=zoop:33 /></p>\\n\",\n    \"example\": 616,\n    \"start_line\": 9045,\n    \"end_line\": 9051,\n    \"section\": \"Raw HTML\"\n  },\n  {\n    \"markdown\": \"Foo <responsive-image src=\\\"foo.jpg\\\" />\\n\",\n    \"html\": \"<p>Foo <responsive-image src=\\\"foo.jpg\\\" /></p>\\n\",\n    \"example\": 617,\n    \"start_line\": 9056,\n    \"end_line\": 9060,\n    \"section\": \"Raw HTML\"\n  },\n  {\n    \"markdown\": \"<33> <__>\\n\",\n    \"html\": \"<p>&lt;33&gt; &lt;__&gt;</p>\\n\",\n    \"example\": 618,\n    \"start_line\": 9065,\n    \"end_line\": 9069,\n    \"section\": \"Raw HTML\"\n  },\n  {\n    \"markdown\": \"<a h*#ref=\\\"hi\\\">\\n\",\n    \"html\": \"<p>&lt;a h*#ref=&quot;hi&quot;&gt;</p>\\n\",\n    \"example\": 619,\n    \"start_line\": 9074,\n    \"end_line\": 9078,\n    \"section\": \"Raw HTML\"\n  },\n  {\n    \"markdown\": \"<a href=\\\"hi'> <a href=hi'>\\n\",\n    \"html\": \"<p>&lt;a href=&quot;hi'&gt; &lt;a href=hi'&gt;</p>\\n\",\n    \"example\": 620,\n    \"start_line\": 9083,\n    \"end_line\": 9087,\n    \"section\": \"Raw HTML\"\n  },\n  {\n    \"markdown\": \"< a><\\nfoo><bar/ >\\n<foo bar=baz\\nbim!bop />\\n\",\n    \"html\": \"<p>&lt; a&gt;&lt;\\nfoo&gt;&lt;bar/ &gt;\\n&lt;foo bar=baz\\nbim!bop /&gt;</p>\\n\",\n    \"example\": 621,\n    \"start_line\": 9092,\n    \"end_line\": 9102,\n    \"section\": \"Raw HTML\"\n  },\n  {\n    \"markdown\": \"<a href='bar'title=title>\\n\",\n    \"html\": \"<p>&lt;a href='bar'title=title&gt;</p>\\n\",\n    \"example\": 622,\n    \"start_line\": 9107,\n    \"end_line\": 9111,\n    \"section\": \"Raw HTML\"\n  },\n  {\n    \"markdown\": \"</a></foo >\\n\",\n    \"html\": \"<p></a></foo ></p>\\n\",\n    \"example\": 623,\n    \"start_line\": 9116,\n    \"end_line\": 9120,\n    \"section\": \"Raw HTML\"\n  },\n  {\n    \"markdown\": \"</a href=\\\"foo\\\">\\n\",\n    \"html\": \"<p>&lt;/a href=&quot;foo&quot;&gt;</p>\\n\",\n    \"example\": 624,\n    \"start_line\": 9125,\n    \"end_line\": 9129,\n    \"section\": \"Raw HTML\"\n  },\n  {\n    \"markdown\": \"foo <!-- this is a --\\ncomment - with hyphens -->\\n\",\n    \"html\": \"<p>foo <!-- this is a --\\ncomment - with hyphens --></p>\\n\",\n    \"example\": 625,\n    \"start_line\": 9134,\n    \"end_line\": 9140,\n    \"section\": \"Raw HTML\"\n  },\n  {\n    \"markdown\": \"foo <!--> foo -->\\n\\nfoo <!---> foo -->\\n\",\n    \"html\": \"<p>foo <!--> foo --&gt;</p>\\n<p>foo <!---> foo --&gt;</p>\\n\",\n    \"example\": 626,\n    \"start_line\": 9142,\n    \"end_line\": 9149,\n    \"section\": \"Raw HTML\"\n  },\n  {\n    \"markdown\": \"foo <?php echo $a; ?>\\n\",\n    \"html\": \"<p>foo <?php echo $a; ?></p>\\n\",\n    \"example\": 627,\n    \"start_line\": 9154,\n    \"end_line\": 9158,\n    \"section\": \"Raw HTML\"\n  },\n  {\n    \"markdown\": \"foo <!ELEMENT br EMPTY>\\n\",\n    \"html\": \"<p>foo <!ELEMENT br EMPTY></p>\\n\",\n    \"example\": 628,\n    \"start_line\": 9163,\n    \"end_line\": 9167,\n    \"section\": \"Raw HTML\"\n  },\n  {\n    \"markdown\": \"foo <![CDATA[>&<]]>\\n\",\n    \"html\": \"<p>foo <![CDATA[>&<]]></p>\\n\",\n    \"example\": 629,\n    \"start_line\": 9172,\n    \"end_line\": 9176,\n    \"section\": \"Raw HTML\"\n  },\n  {\n    \"markdown\": \"foo <a href=\\\"&ouml;\\\">\\n\",\n    \"html\": \"<p>foo <a href=\\\"&ouml;\\\"></p>\\n\",\n    \"example\": 630,\n    \"start_line\": 9182,\n    \"end_line\": 9186,\n    \"section\": \"Raw HTML\"\n  },\n  {\n    \"markdown\": \"foo <a href=\\\"\\\\*\\\">\\n\",\n    \"html\": \"<p>foo <a href=\\\"\\\\*\\\"></p>\\n\",\n    \"example\": 631,\n    \"start_line\": 9191,\n    \"end_line\": 9195,\n    \"section\": \"Raw HTML\"\n  },\n  {\n    \"markdown\": \"<a href=\\\"\\\\\\\"\\\">\\n\",\n    \"html\": \"<p>&lt;a href=&quot;&quot;&quot;&gt;</p>\\n\",\n    \"example\": 632,\n    \"start_line\": 9198,\n    \"end_line\": 9202,\n    \"section\": \"Raw HTML\"\n  },\n  {\n    \"markdown\": \"foo  \\nbaz\\n\",\n    \"html\": \"<p>foo<br />\\nbaz</p>\\n\",\n    \"example\": 633,\n    \"start_line\": 9212,\n    \"end_line\": 9218,\n    \"section\": \"Hard line breaks\"\n  },\n  {\n    \"markdown\": \"foo\\\\\\nbaz\\n\",\n    \"html\": \"<p>foo<br />\\nbaz</p>\\n\",\n    \"example\": 634,\n    \"start_line\": 9224,\n    \"end_line\": 9230,\n    \"section\": \"Hard line breaks\"\n  },\n  {\n    \"markdown\": \"foo       \\nbaz\\n\",\n    \"html\": \"<p>foo<br />\\nbaz</p>\\n\",\n    \"example\": 635,\n    \"start_line\": 9235,\n    \"end_line\": 9241,\n    \"section\": \"Hard line breaks\"\n  },\n  {\n    \"markdown\": \"foo  \\n     bar\\n\",\n    \"html\": \"<p>foo<br />\\nbar</p>\\n\",\n    \"example\": 636,\n    \"start_line\": 9246,\n    \"end_line\": 9252,\n    \"section\": \"Hard line breaks\"\n  },\n  {\n    \"markdown\": \"foo\\\\\\n     bar\\n\",\n    \"html\": \"<p>foo<br />\\nbar</p>\\n\",\n    \"example\": 637,\n    \"start_line\": 9255,\n    \"end_line\": 9261,\n    \"section\": \"Hard line breaks\"\n  },\n  {\n    \"markdown\": \"*foo  \\nbar*\\n\",\n    \"html\": \"<p><em>foo<br />\\nbar</em></p>\\n\",\n    \"example\": 638,\n    \"start_line\": 9267,\n    \"end_line\": 9273,\n    \"section\": \"Hard line breaks\"\n  },\n  {\n    \"markdown\": \"*foo\\\\\\nbar*\\n\",\n    \"html\": \"<p><em>foo<br />\\nbar</em></p>\\n\",\n    \"example\": 639,\n    \"start_line\": 9276,\n    \"end_line\": 9282,\n    \"section\": \"Hard line breaks\"\n  },\n  {\n    \"markdown\": \"`code  \\nspan`\\n\",\n    \"html\": \"<p><code>code   span</code></p>\\n\",\n    \"example\": 640,\n    \"start_line\": 9287,\n    \"end_line\": 9292,\n    \"section\": \"Hard line breaks\"\n  },\n  {\n    \"markdown\": \"`code\\\\\\nspan`\\n\",\n    \"html\": \"<p><code>code\\\\ span</code></p>\\n\",\n    \"example\": 641,\n    \"start_line\": 9295,\n    \"end_line\": 9300,\n    \"section\": \"Hard line breaks\"\n  },\n  {\n    \"markdown\": \"<a href=\\\"foo  \\nbar\\\">\\n\",\n    \"html\": \"<p><a href=\\\"foo  \\nbar\\\"></p>\\n\",\n    \"example\": 642,\n    \"start_line\": 9305,\n    \"end_line\": 9311,\n    \"section\": \"Hard line breaks\"\n  },\n  {\n    \"markdown\": \"<a href=\\\"foo\\\\\\nbar\\\">\\n\",\n    \"html\": \"<p><a href=\\\"foo\\\\\\nbar\\\"></p>\\n\",\n    \"example\": 643,\n    \"start_line\": 9314,\n    \"end_line\": 9320,\n    \"section\": \"Hard line breaks\"\n  },\n  {\n    \"markdown\": \"foo\\\\\\n\",\n    \"html\": \"<p>foo\\\\</p>\\n\",\n    \"example\": 644,\n    \"start_line\": 9327,\n    \"end_line\": 9331,\n    \"section\": \"Hard line breaks\"\n  },\n  {\n    \"markdown\": \"foo  \\n\",\n    \"html\": \"<p>foo</p>\\n\",\n    \"example\": 645,\n    \"start_line\": 9334,\n    \"end_line\": 9338,\n    \"section\": \"Hard line breaks\"\n  },\n  {\n    \"markdown\": \"### foo\\\\\\n\",\n    \"html\": \"<h3>foo\\\\</h3>\\n\",\n    \"example\": 646,\n    \"start_line\": 9341,\n    \"end_line\": 9345,\n    \"section\": \"Hard line breaks\"\n  },\n  {\n    \"markdown\": \"### foo  \\n\",\n    \"html\": \"<h3>foo</h3>\\n\",\n    \"example\": 647,\n    \"start_line\": 9348,\n    \"end_line\": 9352,\n    \"section\": \"Hard line breaks\"\n  },\n  {\n    \"markdown\": \"foo\\nbaz\\n\",\n    \"html\": \"<p>foo\\nbaz</p>\\n\",\n    \"example\": 648,\n    \"start_line\": 9363,\n    \"end_line\": 9369,\n    \"section\": \"Soft line breaks\"\n  },\n  {\n    \"markdown\": \"foo \\n baz\\n\",\n    \"html\": \"<p>foo\\nbaz</p>\\n\",\n    \"example\": 649,\n    \"start_line\": 9375,\n    \"end_line\": 9381,\n    \"section\": \"Soft line breaks\"\n  },\n  {\n    \"markdown\": \"hello $.;'there\\n\",\n    \"html\": \"<p>hello $.;'there</p>\\n\",\n    \"example\": 650,\n    \"start_line\": 9395,\n    \"end_line\": 9399,\n    \"section\": \"Textual content\"\n  },\n  {\n    \"markdown\": \"Foo χρῆν\\n\",\n    \"html\": \"<p>Foo χρῆν</p>\\n\",\n    \"example\": 651,\n    \"start_line\": 9402,\n    \"end_line\": 9406,\n    \"section\": \"Textual content\"\n  },\n  {\n    \"markdown\": \"Multiple     spaces\\n\",\n    \"html\": \"<p>Multiple     spaces</p>\\n\",\n    \"example\": 652,\n    \"start_line\": 9411,\n    \"end_line\": 9415,\n    \"section\": \"Textual content\"\n  }\n]\n"
  },
  {
    "path": "test/specs/gfm/commonmark.0.31.2.json",
    "content": "[\n  {\n    \"markdown\": \"\\tfoo\\tbaz\\t\\tbim\\n\",\n    \"html\": \"<pre><code>foo\\tbaz\\t\\tbim\\n</code></pre>\\n\",\n    \"example\": 1,\n    \"start_line\": 355,\n    \"end_line\": 360,\n    \"section\": \"Tabs\"\n  },\n  {\n    \"markdown\": \"  \\tfoo\\tbaz\\t\\tbim\\n\",\n    \"html\": \"<pre><code>foo\\tbaz\\t\\tbim\\n</code></pre>\\n\",\n    \"example\": 2,\n    \"start_line\": 362,\n    \"end_line\": 367,\n    \"section\": \"Tabs\"\n  },\n  {\n    \"markdown\": \"    a\\ta\\n    ὐ\\ta\\n\",\n    \"html\": \"<pre><code>a\\ta\\nὐ\\ta\\n</code></pre>\\n\",\n    \"example\": 3,\n    \"start_line\": 369,\n    \"end_line\": 376,\n    \"section\": \"Tabs\"\n  },\n  {\n    \"markdown\": \"  - foo\\n\\n\\tbar\\n\",\n    \"html\": \"<ul>\\n<li>\\n<p>foo</p>\\n<p>bar</p>\\n</li>\\n</ul>\\n\",\n    \"example\": 4,\n    \"start_line\": 382,\n    \"end_line\": 393,\n    \"section\": \"Tabs\"\n  },\n  {\n    \"markdown\": \"- foo\\n\\n\\t\\tbar\\n\",\n    \"html\": \"<ul>\\n<li>\\n<p>foo</p>\\n<pre><code>  bar\\n</code></pre>\\n</li>\\n</ul>\\n\",\n    \"example\": 5,\n    \"start_line\": 395,\n    \"end_line\": 407,\n    \"section\": \"Tabs\"\n  },\n  {\n    \"markdown\": \">\\t\\tfoo\\n\",\n    \"html\": \"<blockquote>\\n<pre><code>  foo\\n</code></pre>\\n</blockquote>\\n\",\n    \"example\": 6,\n    \"start_line\": 418,\n    \"end_line\": 425,\n    \"section\": \"Tabs\"\n  },\n  {\n    \"markdown\": \"-\\t\\tfoo\\n\",\n    \"html\": \"<ul>\\n<li>\\n<pre><code>  foo\\n</code></pre>\\n</li>\\n</ul>\\n\",\n    \"example\": 7,\n    \"start_line\": 427,\n    \"end_line\": 436,\n    \"section\": \"Tabs\"\n  },\n  {\n    \"markdown\": \"    foo\\n\\tbar\\n\",\n    \"html\": \"<pre><code>foo\\nbar\\n</code></pre>\\n\",\n    \"example\": 8,\n    \"start_line\": 439,\n    \"end_line\": 446,\n    \"section\": \"Tabs\"\n  },\n  {\n    \"markdown\": \" - foo\\n   - bar\\n\\t - baz\\n\",\n    \"html\": \"<ul>\\n<li>foo\\n<ul>\\n<li>bar\\n<ul>\\n<li>baz</li>\\n</ul>\\n</li>\\n</ul>\\n</li>\\n</ul>\\n\",\n    \"example\": 9,\n    \"start_line\": 448,\n    \"end_line\": 464,\n    \"section\": \"Tabs\"\n  },\n  {\n    \"markdown\": \"#\\tFoo\\n\",\n    \"html\": \"<h1>Foo</h1>\\n\",\n    \"example\": 10,\n    \"start_line\": 466,\n    \"end_line\": 470,\n    \"section\": \"Tabs\"\n  },\n  {\n    \"markdown\": \"*\\t*\\t*\\t\\n\",\n    \"html\": \"<hr />\\n\",\n    \"example\": 11,\n    \"start_line\": 472,\n    \"end_line\": 476,\n    \"section\": \"Tabs\"\n  },\n  {\n    \"markdown\": \"\\\\!\\\\\\\"\\\\#\\\\$\\\\%\\\\&\\\\'\\\\(\\\\)\\\\*\\\\+\\\\,\\\\-\\\\.\\\\/\\\\:\\\\;\\\\<\\\\=\\\\>\\\\?\\\\@\\\\[\\\\\\\\\\\\]\\\\^\\\\_\\\\`\\\\{\\\\|\\\\}\\\\~\\n\",\n    \"html\": \"<p>!&quot;#$%&amp;'()*+,-./:;&lt;=&gt;?@[\\\\]^_`{|}~</p>\\n\",\n    \"example\": 12,\n    \"start_line\": 489,\n    \"end_line\": 493,\n    \"section\": \"Backslash escapes\"\n  },\n  {\n    \"markdown\": \"\\\\\\t\\\\A\\\\a\\\\ \\\\3\\\\φ\\\\«\\n\",\n    \"html\": \"<p>\\\\\\t\\\\A\\\\a\\\\ \\\\3\\\\φ\\\\«</p>\\n\",\n    \"example\": 13,\n    \"start_line\": 499,\n    \"end_line\": 503,\n    \"section\": \"Backslash escapes\"\n  },\n  {\n    \"markdown\": \"\\\\*not emphasized*\\n\\\\<br/> not a tag\\n\\\\[not a link](/foo)\\n\\\\`not code`\\n1\\\\. not a list\\n\\\\* not a list\\n\\\\# not a heading\\n\\\\[foo]: /url \\\"not a reference\\\"\\n\\\\&ouml; not a character entity\\n\",\n    \"html\": \"<p>*not emphasized*\\n&lt;br/&gt; not a tag\\n[not a link](/foo)\\n`not code`\\n1. not a list\\n* not a list\\n# not a heading\\n[foo]: /url &quot;not a reference&quot;\\n&amp;ouml; not a character entity</p>\\n\",\n    \"example\": 14,\n    \"start_line\": 509,\n    \"end_line\": 529,\n    \"section\": \"Backslash escapes\"\n  },\n  {\n    \"markdown\": \"\\\\\\\\*emphasis*\\n\",\n    \"html\": \"<p>\\\\<em>emphasis</em></p>\\n\",\n    \"example\": 15,\n    \"start_line\": 534,\n    \"end_line\": 538,\n    \"section\": \"Backslash escapes\"\n  },\n  {\n    \"markdown\": \"foo\\\\\\nbar\\n\",\n    \"html\": \"<p>foo<br />\\nbar</p>\\n\",\n    \"example\": 16,\n    \"start_line\": 543,\n    \"end_line\": 549,\n    \"section\": \"Backslash escapes\"\n  },\n  {\n    \"markdown\": \"`` \\\\[\\\\` ``\\n\",\n    \"html\": \"<p><code>\\\\[\\\\`</code></p>\\n\",\n    \"example\": 17,\n    \"start_line\": 555,\n    \"end_line\": 559,\n    \"section\": \"Backslash escapes\"\n  },\n  {\n    \"markdown\": \"    \\\\[\\\\]\\n\",\n    \"html\": \"<pre><code>\\\\[\\\\]\\n</code></pre>\\n\",\n    \"example\": 18,\n    \"start_line\": 562,\n    \"end_line\": 567,\n    \"section\": \"Backslash escapes\"\n  },\n  {\n    \"markdown\": \"~~~\\n\\\\[\\\\]\\n~~~\\n\",\n    \"html\": \"<pre><code>\\\\[\\\\]\\n</code></pre>\\n\",\n    \"example\": 19,\n    \"start_line\": 570,\n    \"end_line\": 577,\n    \"section\": \"Backslash escapes\"\n  },\n  {\n    \"markdown\": \"<https://example.com?find=\\\\*>\\n\",\n    \"html\": \"<p><a href=\\\"https://example.com?find=%5C*\\\">https://example.com?find=\\\\*</a></p>\\n\",\n    \"example\": 20,\n    \"start_line\": 580,\n    \"end_line\": 584,\n    \"section\": \"Backslash escapes\"\n  },\n  {\n    \"markdown\": \"<a href=\\\"/bar\\\\/)\\\">\\n\",\n    \"html\": \"<a href=\\\"/bar\\\\/)\\\">\\n\",\n    \"example\": 21,\n    \"start_line\": 587,\n    \"end_line\": 591,\n    \"section\": \"Backslash escapes\"\n  },\n  {\n    \"markdown\": \"[foo](/bar\\\\* \\\"ti\\\\*tle\\\")\\n\",\n    \"html\": \"<p><a href=\\\"/bar*\\\" title=\\\"ti*tle\\\">foo</a></p>\\n\",\n    \"example\": 22,\n    \"start_line\": 597,\n    \"end_line\": 601,\n    \"section\": \"Backslash escapes\"\n  },\n  {\n    \"markdown\": \"[foo]\\n\\n[foo]: /bar\\\\* \\\"ti\\\\*tle\\\"\\n\",\n    \"html\": \"<p><a href=\\\"/bar*\\\" title=\\\"ti*tle\\\">foo</a></p>\\n\",\n    \"example\": 23,\n    \"start_line\": 604,\n    \"end_line\": 610,\n    \"section\": \"Backslash escapes\"\n  },\n  {\n    \"markdown\": \"``` foo\\\\+bar\\nfoo\\n```\\n\",\n    \"html\": \"<pre><code class=\\\"language-foo+bar\\\">foo\\n</code></pre>\\n\",\n    \"example\": 24,\n    \"start_line\": 613,\n    \"end_line\": 620,\n    \"section\": \"Backslash escapes\"\n  },\n  {\n    \"markdown\": \"&nbsp; &amp; &copy; &AElig; &Dcaron;\\n&frac34; &HilbertSpace; &DifferentialD;\\n&ClockwiseContourIntegral; &ngE;\\n\",\n    \"html\": \"<p>  &amp; © Æ Ď\\n¾ ℋ ⅆ\\n∲ ≧̸</p>\\n\",\n    \"example\": 25,\n    \"start_line\": 649,\n    \"end_line\": 657,\n    \"section\": \"Entity and numeric character references\"\n  },\n  {\n    \"markdown\": \"&#35; &#1234; &#992; &#0;\\n\",\n    \"html\": \"<p># Ӓ Ϡ �</p>\\n\",\n    \"example\": 26,\n    \"start_line\": 668,\n    \"end_line\": 672,\n    \"section\": \"Entity and numeric character references\"\n  },\n  {\n    \"markdown\": \"&#X22; &#XD06; &#xcab;\\n\",\n    \"html\": \"<p>&quot; ആ ಫ</p>\\n\",\n    \"example\": 27,\n    \"start_line\": 681,\n    \"end_line\": 685,\n    \"section\": \"Entity and numeric character references\"\n  },\n  {\n    \"markdown\": \"&nbsp &x; &#; &#x;\\n&#87654321;\\n&#abcdef0;\\n&ThisIsNotDefined; &hi?;\\n\",\n    \"html\": \"<p>&amp;nbsp &amp;x; &amp;#; &amp;#x;\\n&amp;#87654321;\\n&amp;#abcdef0;\\n&amp;ThisIsNotDefined; &amp;hi?;</p>\\n\",\n    \"example\": 28,\n    \"start_line\": 690,\n    \"end_line\": 700,\n    \"section\": \"Entity and numeric character references\"\n  },\n  {\n    \"markdown\": \"&copy\\n\",\n    \"html\": \"<p>&amp;copy</p>\\n\",\n    \"example\": 29,\n    \"start_line\": 707,\n    \"end_line\": 711,\n    \"section\": \"Entity and numeric character references\"\n  },\n  {\n    \"markdown\": \"&MadeUpEntity;\\n\",\n    \"html\": \"<p>&amp;MadeUpEntity;</p>\\n\",\n    \"example\": 30,\n    \"start_line\": 717,\n    \"end_line\": 721,\n    \"section\": \"Entity and numeric character references\"\n  },\n  {\n    \"markdown\": \"<a href=\\\"&ouml;&ouml;.html\\\">\\n\",\n    \"html\": \"<a href=\\\"&ouml;&ouml;.html\\\">\\n\",\n    \"example\": 31,\n    \"start_line\": 728,\n    \"end_line\": 732,\n    \"section\": \"Entity and numeric character references\"\n  },\n  {\n    \"markdown\": \"[foo](/f&ouml;&ouml; \\\"f&ouml;&ouml;\\\")\\n\",\n    \"html\": \"<p><a href=\\\"/f%C3%B6%C3%B6\\\" title=\\\"föö\\\">foo</a></p>\\n\",\n    \"example\": 32,\n    \"start_line\": 735,\n    \"end_line\": 739,\n    \"section\": \"Entity and numeric character references\",\n    \"shouldFail\": true\n  },\n  {\n    \"markdown\": \"[foo]\\n\\n[foo]: /f&ouml;&ouml; \\\"f&ouml;&ouml;\\\"\\n\",\n    \"html\": \"<p><a href=\\\"/f%C3%B6%C3%B6\\\" title=\\\"föö\\\">foo</a></p>\\n\",\n    \"example\": 33,\n    \"start_line\": 742,\n    \"end_line\": 748,\n    \"section\": \"Entity and numeric character references\",\n    \"shouldFail\": true\n  },\n  {\n    \"markdown\": \"``` f&ouml;&ouml;\\nfoo\\n```\\n\",\n    \"html\": \"<pre><code class=\\\"language-föö\\\">foo\\n</code></pre>\\n\",\n    \"example\": 34,\n    \"start_line\": 751,\n    \"end_line\": 758,\n    \"section\": \"Entity and numeric character references\"\n  },\n  {\n    \"markdown\": \"`f&ouml;&ouml;`\\n\",\n    \"html\": \"<p><code>f&amp;ouml;&amp;ouml;</code></p>\\n\",\n    \"example\": 35,\n    \"start_line\": 764,\n    \"end_line\": 768,\n    \"section\": \"Entity and numeric character references\"\n  },\n  {\n    \"markdown\": \"    f&ouml;f&ouml;\\n\",\n    \"html\": \"<pre><code>f&amp;ouml;f&amp;ouml;\\n</code></pre>\\n\",\n    \"example\": 36,\n    \"start_line\": 771,\n    \"end_line\": 776,\n    \"section\": \"Entity and numeric character references\"\n  },\n  {\n    \"markdown\": \"&#42;foo&#42;\\n*foo*\\n\",\n    \"html\": \"<p>*foo*\\n<em>foo</em></p>\\n\",\n    \"example\": 37,\n    \"start_line\": 783,\n    \"end_line\": 789,\n    \"section\": \"Entity and numeric character references\"\n  },\n  {\n    \"markdown\": \"&#42; foo\\n\\n* foo\\n\",\n    \"html\": \"<p>* foo</p>\\n<ul>\\n<li>foo</li>\\n</ul>\\n\",\n    \"example\": 38,\n    \"start_line\": 791,\n    \"end_line\": 800,\n    \"section\": \"Entity and numeric character references\"\n  },\n  {\n    \"markdown\": \"foo&#10;&#10;bar\\n\",\n    \"html\": \"<p>foo\\n\\nbar</p>\\n\",\n    \"example\": 39,\n    \"start_line\": 802,\n    \"end_line\": 808,\n    \"section\": \"Entity and numeric character references\"\n  },\n  {\n    \"markdown\": \"&#9;foo\\n\",\n    \"html\": \"<p>\\tfoo</p>\\n\",\n    \"example\": 40,\n    \"start_line\": 810,\n    \"end_line\": 814,\n    \"section\": \"Entity and numeric character references\"\n  },\n  {\n    \"markdown\": \"[a](url &quot;tit&quot;)\\n\",\n    \"html\": \"<p>[a](url &quot;tit&quot;)</p>\\n\",\n    \"example\": 41,\n    \"start_line\": 817,\n    \"end_line\": 821,\n    \"section\": \"Entity and numeric character references\"\n  },\n  {\n    \"markdown\": \"- `one\\n- two`\\n\",\n    \"html\": \"<ul>\\n<li>`one</li>\\n<li>two`</li>\\n</ul>\\n\",\n    \"example\": 42,\n    \"start_line\": 840,\n    \"end_line\": 848,\n    \"section\": \"Precedence\"\n  },\n  {\n    \"markdown\": \"***\\n---\\n___\\n\",\n    \"html\": \"<hr />\\n<hr />\\n<hr />\\n\",\n    \"example\": 43,\n    \"start_line\": 879,\n    \"end_line\": 887,\n    \"section\": \"Thematic breaks\"\n  },\n  {\n    \"markdown\": \"+++\\n\",\n    \"html\": \"<p>+++</p>\\n\",\n    \"example\": 44,\n    \"start_line\": 892,\n    \"end_line\": 896,\n    \"section\": \"Thematic breaks\"\n  },\n  {\n    \"markdown\": \"===\\n\",\n    \"html\": \"<p>===</p>\\n\",\n    \"example\": 45,\n    \"start_line\": 899,\n    \"end_line\": 903,\n    \"section\": \"Thematic breaks\"\n  },\n  {\n    \"markdown\": \"--\\n**\\n__\\n\",\n    \"html\": \"<p>--\\n**\\n__</p>\\n\",\n    \"example\": 46,\n    \"start_line\": 908,\n    \"end_line\": 916,\n    \"section\": \"Thematic breaks\"\n  },\n  {\n    \"markdown\": \" ***\\n  ***\\n   ***\\n\",\n    \"html\": \"<hr />\\n<hr />\\n<hr />\\n\",\n    \"example\": 47,\n    \"start_line\": 921,\n    \"end_line\": 929,\n    \"section\": \"Thematic breaks\"\n  },\n  {\n    \"markdown\": \"    ***\\n\",\n    \"html\": \"<pre><code>***\\n</code></pre>\\n\",\n    \"example\": 48,\n    \"start_line\": 934,\n    \"end_line\": 939,\n    \"section\": \"Thematic breaks\"\n  },\n  {\n    \"markdown\": \"Foo\\n    ***\\n\",\n    \"html\": \"<p>Foo\\n***</p>\\n\",\n    \"example\": 49,\n    \"start_line\": 942,\n    \"end_line\": 948,\n    \"section\": \"Thematic breaks\"\n  },\n  {\n    \"markdown\": \"_____________________________________\\n\",\n    \"html\": \"<hr />\\n\",\n    \"example\": 50,\n    \"start_line\": 953,\n    \"end_line\": 957,\n    \"section\": \"Thematic breaks\"\n  },\n  {\n    \"markdown\": \" - - -\\n\",\n    \"html\": \"<hr />\\n\",\n    \"example\": 51,\n    \"start_line\": 962,\n    \"end_line\": 966,\n    \"section\": \"Thematic breaks\"\n  },\n  {\n    \"markdown\": \" **  * ** * ** * **\\n\",\n    \"html\": \"<hr />\\n\",\n    \"example\": 52,\n    \"start_line\": 969,\n    \"end_line\": 973,\n    \"section\": \"Thematic breaks\"\n  },\n  {\n    \"markdown\": \"-     -      -      -\\n\",\n    \"html\": \"<hr />\\n\",\n    \"example\": 53,\n    \"start_line\": 976,\n    \"end_line\": 980,\n    \"section\": \"Thematic breaks\"\n  },\n  {\n    \"markdown\": \"- - - -    \\n\",\n    \"html\": \"<hr />\\n\",\n    \"example\": 54,\n    \"start_line\": 985,\n    \"end_line\": 989,\n    \"section\": \"Thematic breaks\"\n  },\n  {\n    \"markdown\": \"_ _ _ _ a\\n\\na------\\n\\n---a---\\n\",\n    \"html\": \"<p>_ _ _ _ a</p>\\n<p>a------</p>\\n<p>---a---</p>\\n\",\n    \"example\": 55,\n    \"start_line\": 994,\n    \"end_line\": 1004,\n    \"section\": \"Thematic breaks\"\n  },\n  {\n    \"markdown\": \" *-*\\n\",\n    \"html\": \"<p><em>-</em></p>\\n\",\n    \"example\": 56,\n    \"start_line\": 1010,\n    \"end_line\": 1014,\n    \"section\": \"Thematic breaks\"\n  },\n  {\n    \"markdown\": \"- foo\\n***\\n- bar\\n\",\n    \"html\": \"<ul>\\n<li>foo</li>\\n</ul>\\n<hr />\\n<ul>\\n<li>bar</li>\\n</ul>\\n\",\n    \"example\": 57,\n    \"start_line\": 1019,\n    \"end_line\": 1031,\n    \"section\": \"Thematic breaks\"\n  },\n  {\n    \"markdown\": \"Foo\\n***\\nbar\\n\",\n    \"html\": \"<p>Foo</p>\\n<hr />\\n<p>bar</p>\\n\",\n    \"example\": 58,\n    \"start_line\": 1036,\n    \"end_line\": 1044,\n    \"section\": \"Thematic breaks\"\n  },\n  {\n    \"markdown\": \"Foo\\n---\\nbar\\n\",\n    \"html\": \"<h2>Foo</h2>\\n<p>bar</p>\\n\",\n    \"example\": 59,\n    \"start_line\": 1053,\n    \"end_line\": 1060,\n    \"section\": \"Thematic breaks\"\n  },\n  {\n    \"markdown\": \"* Foo\\n* * *\\n* Bar\\n\",\n    \"html\": \"<ul>\\n<li>Foo</li>\\n</ul>\\n<hr />\\n<ul>\\n<li>Bar</li>\\n</ul>\\n\",\n    \"example\": 60,\n    \"start_line\": 1066,\n    \"end_line\": 1078,\n    \"section\": \"Thematic breaks\"\n  },\n  {\n    \"markdown\": \"- Foo\\n- * * *\\n\",\n    \"html\": \"<ul>\\n<li>Foo</li>\\n<li>\\n<hr />\\n</li>\\n</ul>\\n\",\n    \"example\": 61,\n    \"start_line\": 1083,\n    \"end_line\": 1093,\n    \"section\": \"Thematic breaks\"\n  },\n  {\n    \"markdown\": \"# foo\\n## foo\\n### foo\\n#### foo\\n##### foo\\n###### foo\\n\",\n    \"html\": \"<h1>foo</h1>\\n<h2>foo</h2>\\n<h3>foo</h3>\\n<h4>foo</h4>\\n<h5>foo</h5>\\n<h6>foo</h6>\\n\",\n    \"example\": 62,\n    \"start_line\": 1112,\n    \"end_line\": 1126,\n    \"section\": \"ATX headings\"\n  },\n  {\n    \"markdown\": \"####### foo\\n\",\n    \"html\": \"<p>####### foo</p>\\n\",\n    \"example\": 63,\n    \"start_line\": 1131,\n    \"end_line\": 1135,\n    \"section\": \"ATX headings\"\n  },\n  {\n    \"markdown\": \"#5 bolt\\n\\n#hashtag\\n\",\n    \"html\": \"<p>#5 bolt</p>\\n<p>#hashtag</p>\\n\",\n    \"example\": 64,\n    \"start_line\": 1146,\n    \"end_line\": 1153,\n    \"section\": \"ATX headings\"\n  },\n  {\n    \"markdown\": \"\\\\## foo\\n\",\n    \"html\": \"<p>## foo</p>\\n\",\n    \"example\": 65,\n    \"start_line\": 1158,\n    \"end_line\": 1162,\n    \"section\": \"ATX headings\"\n  },\n  {\n    \"markdown\": \"# foo *bar* \\\\*baz\\\\*\\n\",\n    \"html\": \"<h1>foo <em>bar</em> *baz*</h1>\\n\",\n    \"example\": 66,\n    \"start_line\": 1167,\n    \"end_line\": 1171,\n    \"section\": \"ATX headings\"\n  },\n  {\n    \"markdown\": \"#                  foo                     \\n\",\n    \"html\": \"<h1>foo</h1>\\n\",\n    \"example\": 67,\n    \"start_line\": 1176,\n    \"end_line\": 1180,\n    \"section\": \"ATX headings\"\n  },\n  {\n    \"markdown\": \" ### foo\\n  ## foo\\n   # foo\\n\",\n    \"html\": \"<h3>foo</h3>\\n<h2>foo</h2>\\n<h1>foo</h1>\\n\",\n    \"example\": 68,\n    \"start_line\": 1185,\n    \"end_line\": 1193,\n    \"section\": \"ATX headings\"\n  },\n  {\n    \"markdown\": \"    # foo\\n\",\n    \"html\": \"<pre><code># foo\\n</code></pre>\\n\",\n    \"example\": 69,\n    \"start_line\": 1198,\n    \"end_line\": 1203,\n    \"section\": \"ATX headings\"\n  },\n  {\n    \"markdown\": \"foo\\n    # bar\\n\",\n    \"html\": \"<p>foo\\n# bar</p>\\n\",\n    \"example\": 70,\n    \"start_line\": 1206,\n    \"end_line\": 1212,\n    \"section\": \"ATX headings\"\n  },\n  {\n    \"markdown\": \"## foo ##\\n  ###   bar    ###\\n\",\n    \"html\": \"<h2>foo</h2>\\n<h3>bar</h3>\\n\",\n    \"example\": 71,\n    \"start_line\": 1217,\n    \"end_line\": 1223,\n    \"section\": \"ATX headings\"\n  },\n  {\n    \"markdown\": \"# foo ##################################\\n##### foo ##\\n\",\n    \"html\": \"<h1>foo</h1>\\n<h5>foo</h5>\\n\",\n    \"example\": 72,\n    \"start_line\": 1228,\n    \"end_line\": 1234,\n    \"section\": \"ATX headings\"\n  },\n  {\n    \"markdown\": \"### foo ###     \\n\",\n    \"html\": \"<h3>foo</h3>\\n\",\n    \"example\": 73,\n    \"start_line\": 1239,\n    \"end_line\": 1243,\n    \"section\": \"ATX headings\"\n  },\n  {\n    \"markdown\": \"### foo ### b\\n\",\n    \"html\": \"<h3>foo ### b</h3>\\n\",\n    \"example\": 74,\n    \"start_line\": 1250,\n    \"end_line\": 1254,\n    \"section\": \"ATX headings\"\n  },\n  {\n    \"markdown\": \"# foo#\\n\",\n    \"html\": \"<h1>foo#</h1>\\n\",\n    \"example\": 75,\n    \"start_line\": 1259,\n    \"end_line\": 1263,\n    \"section\": \"ATX headings\"\n  },\n  {\n    \"markdown\": \"### foo \\\\###\\n## foo #\\\\##\\n# foo \\\\#\\n\",\n    \"html\": \"<h3>foo ###</h3>\\n<h2>foo ###</h2>\\n<h1>foo #</h1>\\n\",\n    \"example\": 76,\n    \"start_line\": 1269,\n    \"end_line\": 1277,\n    \"section\": \"ATX headings\"\n  },\n  {\n    \"markdown\": \"****\\n## foo\\n****\\n\",\n    \"html\": \"<hr />\\n<h2>foo</h2>\\n<hr />\\n\",\n    \"example\": 77,\n    \"start_line\": 1283,\n    \"end_line\": 1291,\n    \"section\": \"ATX headings\"\n  },\n  {\n    \"markdown\": \"Foo bar\\n# baz\\nBar foo\\n\",\n    \"html\": \"<p>Foo bar</p>\\n<h1>baz</h1>\\n<p>Bar foo</p>\\n\",\n    \"example\": 78,\n    \"start_line\": 1294,\n    \"end_line\": 1302,\n    \"section\": \"ATX headings\"\n  },\n  {\n    \"markdown\": \"## \\n#\\n### ###\\n\",\n    \"html\": \"<h2></h2>\\n<h1></h1>\\n<h3></h3>\\n\",\n    \"example\": 79,\n    \"start_line\": 1307,\n    \"end_line\": 1315,\n    \"section\": \"ATX headings\"\n  },\n  {\n    \"markdown\": \"Foo *bar*\\n=========\\n\\nFoo *bar*\\n---------\\n\",\n    \"html\": \"<h1>Foo <em>bar</em></h1>\\n<h2>Foo <em>bar</em></h2>\\n\",\n    \"example\": 80,\n    \"start_line\": 1347,\n    \"end_line\": 1356,\n    \"section\": \"Setext headings\"\n  },\n  {\n    \"markdown\": \"Foo *bar\\nbaz*\\n====\\n\",\n    \"html\": \"<h1>Foo <em>bar\\nbaz</em></h1>\\n\",\n    \"example\": 81,\n    \"start_line\": 1361,\n    \"end_line\": 1368,\n    \"section\": \"Setext headings\"\n  },\n  {\n    \"markdown\": \"  Foo *bar\\nbaz*\\t\\n====\\n\",\n    \"html\": \"<h1>Foo <em>bar\\nbaz</em></h1>\\n\",\n    \"example\": 82,\n    \"start_line\": 1375,\n    \"end_line\": 1382,\n    \"section\": \"Setext headings\"\n  },\n  {\n    \"markdown\": \"Foo\\n-------------------------\\n\\nFoo\\n=\\n\",\n    \"html\": \"<h2>Foo</h2>\\n<h1>Foo</h1>\\n\",\n    \"example\": 83,\n    \"start_line\": 1387,\n    \"end_line\": 1396,\n    \"section\": \"Setext headings\"\n  },\n  {\n    \"markdown\": \"   Foo\\n---\\n\\n  Foo\\n-----\\n\\n  Foo\\n  ===\\n\",\n    \"html\": \"<h2>Foo</h2>\\n<h2>Foo</h2>\\n<h1>Foo</h1>\\n\",\n    \"example\": 84,\n    \"start_line\": 1402,\n    \"end_line\": 1415,\n    \"section\": \"Setext headings\"\n  },\n  {\n    \"markdown\": \"    Foo\\n    ---\\n\\n    Foo\\n---\\n\",\n    \"html\": \"<pre><code>Foo\\n---\\n\\nFoo\\n</code></pre>\\n<hr />\\n\",\n    \"example\": 85,\n    \"start_line\": 1420,\n    \"end_line\": 1433,\n    \"section\": \"Setext headings\"\n  },\n  {\n    \"markdown\": \"Foo\\n   ----      \\n\",\n    \"html\": \"<h2>Foo</h2>\\n\",\n    \"example\": 86,\n    \"start_line\": 1439,\n    \"end_line\": 1444,\n    \"section\": \"Setext headings\"\n  },\n  {\n    \"markdown\": \"Foo\\n    ---\\n\",\n    \"html\": \"<p>Foo\\n---</p>\\n\",\n    \"example\": 87,\n    \"start_line\": 1449,\n    \"end_line\": 1455,\n    \"section\": \"Setext headings\"\n  },\n  {\n    \"markdown\": \"Foo\\n= =\\n\\nFoo\\n--- -\\n\",\n    \"html\": \"<p>Foo\\n= =</p>\\n<p>Foo</p>\\n<hr />\\n\",\n    \"example\": 88,\n    \"start_line\": 1460,\n    \"end_line\": 1471,\n    \"section\": \"Setext headings\"\n  },\n  {\n    \"markdown\": \"Foo  \\n-----\\n\",\n    \"html\": \"<h2>Foo</h2>\\n\",\n    \"example\": 89,\n    \"start_line\": 1476,\n    \"end_line\": 1481,\n    \"section\": \"Setext headings\"\n  },\n  {\n    \"markdown\": \"Foo\\\\\\n----\\n\",\n    \"html\": \"<h2>Foo\\\\</h2>\\n\",\n    \"example\": 90,\n    \"start_line\": 1486,\n    \"end_line\": 1491,\n    \"section\": \"Setext headings\"\n  },\n  {\n    \"markdown\": \"`Foo\\n----\\n`\\n\\n<a title=\\\"a lot\\n---\\nof dashes\\\"/>\\n\",\n    \"html\": \"<h2>`Foo</h2>\\n<p>`</p>\\n<h2>&lt;a title=&quot;a lot</h2>\\n<p>of dashes&quot;/&gt;</p>\\n\",\n    \"example\": 91,\n    \"start_line\": 1497,\n    \"end_line\": 1510,\n    \"section\": \"Setext headings\"\n  },\n  {\n    \"markdown\": \"> Foo\\n---\\n\",\n    \"html\": \"<blockquote>\\n<p>Foo</p>\\n</blockquote>\\n<hr />\\n\",\n    \"example\": 92,\n    \"start_line\": 1516,\n    \"end_line\": 1524,\n    \"section\": \"Setext headings\"\n  },\n  {\n    \"markdown\": \"> foo\\nbar\\n===\\n\",\n    \"html\": \"<blockquote>\\n<p>foo\\nbar\\n===</p>\\n</blockquote>\\n\",\n    \"example\": 93,\n    \"start_line\": 1527,\n    \"end_line\": 1537,\n    \"section\": \"Setext headings\"\n  },\n  {\n    \"markdown\": \"- Foo\\n---\\n\",\n    \"html\": \"<ul>\\n<li>Foo</li>\\n</ul>\\n<hr />\\n\",\n    \"example\": 94,\n    \"start_line\": 1540,\n    \"end_line\": 1548,\n    \"section\": \"Setext headings\"\n  },\n  {\n    \"markdown\": \"Foo\\nBar\\n---\\n\",\n    \"html\": \"<h2>Foo\\nBar</h2>\\n\",\n    \"example\": 95,\n    \"start_line\": 1555,\n    \"end_line\": 1562,\n    \"section\": \"Setext headings\"\n  },\n  {\n    \"markdown\": \"---\\nFoo\\n---\\nBar\\n---\\nBaz\\n\",\n    \"html\": \"<hr />\\n<h2>Foo</h2>\\n<h2>Bar</h2>\\n<p>Baz</p>\\n\",\n    \"example\": 96,\n    \"start_line\": 1568,\n    \"end_line\": 1580,\n    \"section\": \"Setext headings\"\n  },\n  {\n    \"markdown\": \"\\n====\\n\",\n    \"html\": \"<p>====</p>\\n\",\n    \"example\": 97,\n    \"start_line\": 1585,\n    \"end_line\": 1590,\n    \"section\": \"Setext headings\"\n  },\n  {\n    \"markdown\": \"---\\n---\\n\",\n    \"html\": \"<hr />\\n<hr />\\n\",\n    \"example\": 98,\n    \"start_line\": 1597,\n    \"end_line\": 1603,\n    \"section\": \"Setext headings\"\n  },\n  {\n    \"markdown\": \"- foo\\n-----\\n\",\n    \"html\": \"<ul>\\n<li>foo</li>\\n</ul>\\n<hr />\\n\",\n    \"example\": 99,\n    \"start_line\": 1606,\n    \"end_line\": 1614,\n    \"section\": \"Setext headings\"\n  },\n  {\n    \"markdown\": \"    foo\\n---\\n\",\n    \"html\": \"<pre><code>foo\\n</code></pre>\\n<hr />\\n\",\n    \"example\": 100,\n    \"start_line\": 1617,\n    \"end_line\": 1624,\n    \"section\": \"Setext headings\"\n  },\n  {\n    \"markdown\": \"> foo\\n-----\\n\",\n    \"html\": \"<blockquote>\\n<p>foo</p>\\n</blockquote>\\n<hr />\\n\",\n    \"example\": 101,\n    \"start_line\": 1627,\n    \"end_line\": 1635,\n    \"section\": \"Setext headings\"\n  },\n  {\n    \"markdown\": \"\\\\> foo\\n------\\n\",\n    \"html\": \"<h2>&gt; foo</h2>\\n\",\n    \"example\": 102,\n    \"start_line\": 1641,\n    \"end_line\": 1646,\n    \"section\": \"Setext headings\"\n  },\n  {\n    \"markdown\": \"Foo\\n\\nbar\\n---\\nbaz\\n\",\n    \"html\": \"<p>Foo</p>\\n<h2>bar</h2>\\n<p>baz</p>\\n\",\n    \"example\": 103,\n    \"start_line\": 1672,\n    \"end_line\": 1682,\n    \"section\": \"Setext headings\"\n  },\n  {\n    \"markdown\": \"Foo\\nbar\\n\\n---\\n\\nbaz\\n\",\n    \"html\": \"<p>Foo\\nbar</p>\\n<hr />\\n<p>baz</p>\\n\",\n    \"example\": 104,\n    \"start_line\": 1688,\n    \"end_line\": 1700,\n    \"section\": \"Setext headings\"\n  },\n  {\n    \"markdown\": \"Foo\\nbar\\n* * *\\nbaz\\n\",\n    \"html\": \"<p>Foo\\nbar</p>\\n<hr />\\n<p>baz</p>\\n\",\n    \"example\": 105,\n    \"start_line\": 1706,\n    \"end_line\": 1716,\n    \"section\": \"Setext headings\"\n  },\n  {\n    \"markdown\": \"Foo\\nbar\\n\\\\---\\nbaz\\n\",\n    \"html\": \"<p>Foo\\nbar\\n---\\nbaz</p>\\n\",\n    \"example\": 106,\n    \"start_line\": 1721,\n    \"end_line\": 1731,\n    \"section\": \"Setext headings\"\n  },\n  {\n    \"markdown\": \"    a simple\\n      indented code block\\n\",\n    \"html\": \"<pre><code>a simple\\n  indented code block\\n</code></pre>\\n\",\n    \"example\": 107,\n    \"start_line\": 1749,\n    \"end_line\": 1756,\n    \"section\": \"Indented code blocks\"\n  },\n  {\n    \"markdown\": \"  - foo\\n\\n    bar\\n\",\n    \"html\": \"<ul>\\n<li>\\n<p>foo</p>\\n<p>bar</p>\\n</li>\\n</ul>\\n\",\n    \"example\": 108,\n    \"start_line\": 1763,\n    \"end_line\": 1774,\n    \"section\": \"Indented code blocks\"\n  },\n  {\n    \"markdown\": \"1.  foo\\n\\n    - bar\\n\",\n    \"html\": \"<ol>\\n<li>\\n<p>foo</p>\\n<ul>\\n<li>bar</li>\\n</ul>\\n</li>\\n</ol>\\n\",\n    \"example\": 109,\n    \"start_line\": 1777,\n    \"end_line\": 1790,\n    \"section\": \"Indented code blocks\"\n  },\n  {\n    \"markdown\": \"    <a/>\\n    *hi*\\n\\n    - one\\n\",\n    \"html\": \"<pre><code>&lt;a/&gt;\\n*hi*\\n\\n- one\\n</code></pre>\\n\",\n    \"example\": 110,\n    \"start_line\": 1797,\n    \"end_line\": 1808,\n    \"section\": \"Indented code blocks\"\n  },\n  {\n    \"markdown\": \"    chunk1\\n\\n    chunk2\\n  \\n \\n \\n    chunk3\\n\",\n    \"html\": \"<pre><code>chunk1\\n\\nchunk2\\n\\n\\n\\nchunk3\\n</code></pre>\\n\",\n    \"example\": 111,\n    \"start_line\": 1813,\n    \"end_line\": 1830,\n    \"section\": \"Indented code blocks\"\n  },\n  {\n    \"markdown\": \"    chunk1\\n      \\n      chunk2\\n\",\n    \"html\": \"<pre><code>chunk1\\n  \\n  chunk2\\n</code></pre>\\n\",\n    \"example\": 112,\n    \"start_line\": 1836,\n    \"end_line\": 1845,\n    \"section\": \"Indented code blocks\"\n  },\n  {\n    \"markdown\": \"Foo\\n    bar\\n\\n\",\n    \"html\": \"<p>Foo\\nbar</p>\\n\",\n    \"example\": 113,\n    \"start_line\": 1851,\n    \"end_line\": 1858,\n    \"section\": \"Indented code blocks\"\n  },\n  {\n    \"markdown\": \"    foo\\nbar\\n\",\n    \"html\": \"<pre><code>foo\\n</code></pre>\\n<p>bar</p>\\n\",\n    \"example\": 114,\n    \"start_line\": 1865,\n    \"end_line\": 1872,\n    \"section\": \"Indented code blocks\"\n  },\n  {\n    \"markdown\": \"# Heading\\n    foo\\nHeading\\n------\\n    foo\\n----\\n\",\n    \"html\": \"<h1>Heading</h1>\\n<pre><code>foo\\n</code></pre>\\n<h2>Heading</h2>\\n<pre><code>foo\\n</code></pre>\\n<hr />\\n\",\n    \"example\": 115,\n    \"start_line\": 1878,\n    \"end_line\": 1893,\n    \"section\": \"Indented code blocks\"\n  },\n  {\n    \"markdown\": \"        foo\\n    bar\\n\",\n    \"html\": \"<pre><code>    foo\\nbar\\n</code></pre>\\n\",\n    \"example\": 116,\n    \"start_line\": 1898,\n    \"end_line\": 1905,\n    \"section\": \"Indented code blocks\"\n  },\n  {\n    \"markdown\": \"\\n    \\n    foo\\n    \\n\\n\",\n    \"html\": \"<pre><code>foo\\n</code></pre>\\n\",\n    \"example\": 117,\n    \"start_line\": 1911,\n    \"end_line\": 1920,\n    \"section\": \"Indented code blocks\"\n  },\n  {\n    \"markdown\": \"    foo  \\n\",\n    \"html\": \"<pre><code>foo  \\n</code></pre>\\n\",\n    \"example\": 118,\n    \"start_line\": 1925,\n    \"end_line\": 1930,\n    \"section\": \"Indented code blocks\"\n  },\n  {\n    \"markdown\": \"```\\n<\\n >\\n```\\n\",\n    \"html\": \"<pre><code>&lt;\\n &gt;\\n</code></pre>\\n\",\n    \"example\": 119,\n    \"start_line\": 1980,\n    \"end_line\": 1989,\n    \"section\": \"Fenced code blocks\"\n  },\n  {\n    \"markdown\": \"~~~\\n<\\n >\\n~~~\\n\",\n    \"html\": \"<pre><code>&lt;\\n &gt;\\n</code></pre>\\n\",\n    \"example\": 120,\n    \"start_line\": 1994,\n    \"end_line\": 2003,\n    \"section\": \"Fenced code blocks\"\n  },\n  {\n    \"markdown\": \"``\\nfoo\\n``\\n\",\n    \"html\": \"<p><code>foo</code></p>\\n\",\n    \"example\": 121,\n    \"start_line\": 2007,\n    \"end_line\": 2013,\n    \"section\": \"Fenced code blocks\"\n  },\n  {\n    \"markdown\": \"```\\naaa\\n~~~\\n```\\n\",\n    \"html\": \"<pre><code>aaa\\n~~~\\n</code></pre>\\n\",\n    \"example\": 122,\n    \"start_line\": 2018,\n    \"end_line\": 2027,\n    \"section\": \"Fenced code blocks\"\n  },\n  {\n    \"markdown\": \"~~~\\naaa\\n```\\n~~~\\n\",\n    \"html\": \"<pre><code>aaa\\n```\\n</code></pre>\\n\",\n    \"example\": 123,\n    \"start_line\": 2030,\n    \"end_line\": 2039,\n    \"section\": \"Fenced code blocks\"\n  },\n  {\n    \"markdown\": \"````\\naaa\\n```\\n``````\\n\",\n    \"html\": \"<pre><code>aaa\\n```\\n</code></pre>\\n\",\n    \"example\": 124,\n    \"start_line\": 2044,\n    \"end_line\": 2053,\n    \"section\": \"Fenced code blocks\"\n  },\n  {\n    \"markdown\": \"~~~~\\naaa\\n~~~\\n~~~~\\n\",\n    \"html\": \"<pre><code>aaa\\n~~~\\n</code></pre>\\n\",\n    \"example\": 125,\n    \"start_line\": 2056,\n    \"end_line\": 2065,\n    \"section\": \"Fenced code blocks\"\n  },\n  {\n    \"markdown\": \"```\\n\",\n    \"html\": \"<pre><code></code></pre>\\n\",\n    \"example\": 126,\n    \"start_line\": 2071,\n    \"end_line\": 2075,\n    \"section\": \"Fenced code blocks\"\n  },\n  {\n    \"markdown\": \"`````\\n\\n```\\naaa\\n\",\n    \"html\": \"<pre><code>\\n```\\naaa\\n</code></pre>\\n\",\n    \"example\": 127,\n    \"start_line\": 2078,\n    \"end_line\": 2088,\n    \"section\": \"Fenced code blocks\"\n  },\n  {\n    \"markdown\": \"> ```\\n> aaa\\n\\nbbb\\n\",\n    \"html\": \"<blockquote>\\n<pre><code>aaa\\n</code></pre>\\n</blockquote>\\n<p>bbb</p>\\n\",\n    \"example\": 128,\n    \"start_line\": 2091,\n    \"end_line\": 2102,\n    \"section\": \"Fenced code blocks\"\n  },\n  {\n    \"markdown\": \"```\\n\\n  \\n```\\n\",\n    \"html\": \"<pre><code>\\n  \\n</code></pre>\\n\",\n    \"example\": 129,\n    \"start_line\": 2107,\n    \"end_line\": 2116,\n    \"section\": \"Fenced code blocks\"\n  },\n  {\n    \"markdown\": \"```\\n```\\n\",\n    \"html\": \"<pre><code></code></pre>\\n\",\n    \"example\": 130,\n    \"start_line\": 2121,\n    \"end_line\": 2126,\n    \"section\": \"Fenced code blocks\"\n  },\n  {\n    \"markdown\": \" ```\\n aaa\\naaa\\n```\\n\",\n    \"html\": \"<pre><code>aaa\\naaa\\n</code></pre>\\n\",\n    \"example\": 131,\n    \"start_line\": 2133,\n    \"end_line\": 2142,\n    \"section\": \"Fenced code blocks\"\n  },\n  {\n    \"markdown\": \"  ```\\naaa\\n  aaa\\naaa\\n  ```\\n\",\n    \"html\": \"<pre><code>aaa\\naaa\\naaa\\n</code></pre>\\n\",\n    \"example\": 132,\n    \"start_line\": 2145,\n    \"end_line\": 2156,\n    \"section\": \"Fenced code blocks\"\n  },\n  {\n    \"markdown\": \"   ```\\n   aaa\\n    aaa\\n  aaa\\n   ```\\n\",\n    \"html\": \"<pre><code>aaa\\n aaa\\naaa\\n</code></pre>\\n\",\n    \"example\": 133,\n    \"start_line\": 2159,\n    \"end_line\": 2170,\n    \"section\": \"Fenced code blocks\"\n  },\n  {\n    \"markdown\": \"    ```\\n    aaa\\n    ```\\n\",\n    \"html\": \"<pre><code>```\\naaa\\n```\\n</code></pre>\\n\",\n    \"example\": 134,\n    \"start_line\": 2175,\n    \"end_line\": 2184,\n    \"section\": \"Fenced code blocks\"\n  },\n  {\n    \"markdown\": \"```\\naaa\\n  ```\\n\",\n    \"html\": \"<pre><code>aaa\\n</code></pre>\\n\",\n    \"example\": 135,\n    \"start_line\": 2190,\n    \"end_line\": 2197,\n    \"section\": \"Fenced code blocks\"\n  },\n  {\n    \"markdown\": \"   ```\\naaa\\n  ```\\n\",\n    \"html\": \"<pre><code>aaa\\n</code></pre>\\n\",\n    \"example\": 136,\n    \"start_line\": 2200,\n    \"end_line\": 2207,\n    \"section\": \"Fenced code blocks\"\n  },\n  {\n    \"markdown\": \"```\\naaa\\n    ```\\n\",\n    \"html\": \"<pre><code>aaa\\n    ```\\n</code></pre>\\n\",\n    \"example\": 137,\n    \"start_line\": 2212,\n    \"end_line\": 2220,\n    \"section\": \"Fenced code blocks\"\n  },\n  {\n    \"markdown\": \"``` ```\\naaa\\n\",\n    \"html\": \"<p><code> </code>\\naaa</p>\\n\",\n    \"example\": 138,\n    \"start_line\": 2226,\n    \"end_line\": 2232,\n    \"section\": \"Fenced code blocks\"\n  },\n  {\n    \"markdown\": \"~~~~~~\\naaa\\n~~~ ~~\\n\",\n    \"html\": \"<pre><code>aaa\\n~~~ ~~\\n</code></pre>\\n\",\n    \"example\": 139,\n    \"start_line\": 2235,\n    \"end_line\": 2243,\n    \"section\": \"Fenced code blocks\"\n  },\n  {\n    \"markdown\": \"foo\\n```\\nbar\\n```\\nbaz\\n\",\n    \"html\": \"<p>foo</p>\\n<pre><code>bar\\n</code></pre>\\n<p>baz</p>\\n\",\n    \"example\": 140,\n    \"start_line\": 2249,\n    \"end_line\": 2260,\n    \"section\": \"Fenced code blocks\"\n  },\n  {\n    \"markdown\": \"foo\\n---\\n~~~\\nbar\\n~~~\\n# baz\\n\",\n    \"html\": \"<h2>foo</h2>\\n<pre><code>bar\\n</code></pre>\\n<h1>baz</h1>\\n\",\n    \"example\": 141,\n    \"start_line\": 2266,\n    \"end_line\": 2278,\n    \"section\": \"Fenced code blocks\"\n  },\n  {\n    \"markdown\": \"```ruby\\ndef foo(x)\\n  return 3\\nend\\n```\\n\",\n    \"html\": \"<pre><code class=\\\"language-ruby\\\">def foo(x)\\n  return 3\\nend\\n</code></pre>\\n\",\n    \"example\": 142,\n    \"start_line\": 2288,\n    \"end_line\": 2299,\n    \"section\": \"Fenced code blocks\"\n  },\n  {\n    \"markdown\": \"~~~~    ruby startline=3 $%@#$\\ndef foo(x)\\n  return 3\\nend\\n~~~~~~~\\n\",\n    \"html\": \"<pre><code class=\\\"language-ruby\\\">def foo(x)\\n  return 3\\nend\\n</code></pre>\\n\",\n    \"example\": 143,\n    \"start_line\": 2302,\n    \"end_line\": 2313,\n    \"section\": \"Fenced code blocks\"\n  },\n  {\n    \"markdown\": \"````;\\n````\\n\",\n    \"html\": \"<pre><code class=\\\"language-;\\\"></code></pre>\\n\",\n    \"example\": 144,\n    \"start_line\": 2316,\n    \"end_line\": 2321,\n    \"section\": \"Fenced code blocks\"\n  },\n  {\n    \"markdown\": \"``` aa ```\\nfoo\\n\",\n    \"html\": \"<p><code>aa</code>\\nfoo</p>\\n\",\n    \"example\": 145,\n    \"start_line\": 2326,\n    \"end_line\": 2332,\n    \"section\": \"Fenced code blocks\"\n  },\n  {\n    \"markdown\": \"~~~ aa ``` ~~~\\nfoo\\n~~~\\n\",\n    \"html\": \"<pre><code class=\\\"language-aa\\\">foo\\n</code></pre>\\n\",\n    \"example\": 146,\n    \"start_line\": 2337,\n    \"end_line\": 2344,\n    \"section\": \"Fenced code blocks\"\n  },\n  {\n    \"markdown\": \"```\\n``` aaa\\n```\\n\",\n    \"html\": \"<pre><code>``` aaa\\n</code></pre>\\n\",\n    \"example\": 147,\n    \"start_line\": 2349,\n    \"end_line\": 2356,\n    \"section\": \"Fenced code blocks\"\n  },\n  {\n    \"markdown\": \"<table><tr><td>\\n<pre>\\n**Hello**,\\n\\n_world_.\\n</pre>\\n</td></tr></table>\\n\",\n    \"html\": \"<table><tr><td>\\n<pre>\\n**Hello**,\\n<p><em>world</em>.\\n</pre></p>\\n</td></tr></table>\\n\",\n    \"example\": 148,\n    \"start_line\": 2428,\n    \"end_line\": 2443,\n    \"section\": \"HTML blocks\"\n  },\n  {\n    \"markdown\": \"<table>\\n  <tr>\\n    <td>\\n           hi\\n    </td>\\n  </tr>\\n</table>\\n\\nokay.\\n\",\n    \"html\": \"<table>\\n  <tr>\\n    <td>\\n           hi\\n    </td>\\n  </tr>\\n</table>\\n<p>okay.</p>\\n\",\n    \"example\": 149,\n    \"start_line\": 2457,\n    \"end_line\": 2476,\n    \"section\": \"HTML blocks\"\n  },\n  {\n    \"markdown\": \" <div>\\n  *hello*\\n         <foo><a>\\n\",\n    \"html\": \" <div>\\n  *hello*\\n         <foo><a>\\n\",\n    \"example\": 150,\n    \"start_line\": 2479,\n    \"end_line\": 2487,\n    \"section\": \"HTML blocks\"\n  },\n  {\n    \"markdown\": \"</div>\\n*foo*\\n\",\n    \"html\": \"</div>\\n*foo*\\n\",\n    \"example\": 151,\n    \"start_line\": 2492,\n    \"end_line\": 2498,\n    \"section\": \"HTML blocks\"\n  },\n  {\n    \"markdown\": \"<DIV CLASS=\\\"foo\\\">\\n\\n*Markdown*\\n\\n</DIV>\\n\",\n    \"html\": \"<DIV CLASS=\\\"foo\\\">\\n<p><em>Markdown</em></p>\\n</DIV>\\n\",\n    \"example\": 152,\n    \"start_line\": 2503,\n    \"end_line\": 2513,\n    \"section\": \"HTML blocks\"\n  },\n  {\n    \"markdown\": \"<div id=\\\"foo\\\"\\n  class=\\\"bar\\\">\\n</div>\\n\",\n    \"html\": \"<div id=\\\"foo\\\"\\n  class=\\\"bar\\\">\\n</div>\\n\",\n    \"example\": 153,\n    \"start_line\": 2519,\n    \"end_line\": 2527,\n    \"section\": \"HTML blocks\"\n  },\n  {\n    \"markdown\": \"<div id=\\\"foo\\\" class=\\\"bar\\n  baz\\\">\\n</div>\\n\",\n    \"html\": \"<div id=\\\"foo\\\" class=\\\"bar\\n  baz\\\">\\n</div>\\n\",\n    \"example\": 154,\n    \"start_line\": 2530,\n    \"end_line\": 2538,\n    \"section\": \"HTML blocks\"\n  },\n  {\n    \"markdown\": \"<div>\\n*foo*\\n\\n*bar*\\n\",\n    \"html\": \"<div>\\n*foo*\\n<p><em>bar</em></p>\\n\",\n    \"example\": 155,\n    \"start_line\": 2542,\n    \"end_line\": 2551,\n    \"section\": \"HTML blocks\"\n  },\n  {\n    \"markdown\": \"<div id=\\\"foo\\\"\\n*hi*\\n\",\n    \"html\": \"<div id=\\\"foo\\\"\\n*hi*\\n\",\n    \"example\": 156,\n    \"start_line\": 2558,\n    \"end_line\": 2564,\n    \"section\": \"HTML blocks\"\n  },\n  {\n    \"markdown\": \"<div class\\nfoo\\n\",\n    \"html\": \"<div class\\nfoo\\n\",\n    \"example\": 157,\n    \"start_line\": 2567,\n    \"end_line\": 2573,\n    \"section\": \"HTML blocks\"\n  },\n  {\n    \"markdown\": \"<div *???-&&&-<---\\n*foo*\\n\",\n    \"html\": \"<div *???-&&&-<---\\n*foo*\\n\",\n    \"example\": 158,\n    \"start_line\": 2579,\n    \"end_line\": 2585,\n    \"section\": \"HTML blocks\"\n  },\n  {\n    \"markdown\": \"<div><a href=\\\"bar\\\">*foo*</a></div>\\n\",\n    \"html\": \"<div><a href=\\\"bar\\\">*foo*</a></div>\\n\",\n    \"example\": 159,\n    \"start_line\": 2591,\n    \"end_line\": 2595,\n    \"section\": \"HTML blocks\"\n  },\n  {\n    \"markdown\": \"<table><tr><td>\\nfoo\\n</td></tr></table>\\n\",\n    \"html\": \"<table><tr><td>\\nfoo\\n</td></tr></table>\\n\",\n    \"example\": 160,\n    \"start_line\": 2598,\n    \"end_line\": 2606,\n    \"section\": \"HTML blocks\"\n  },\n  {\n    \"markdown\": \"<div></div>\\n``` c\\nint x = 33;\\n```\\n\",\n    \"html\": \"<div></div>\\n``` c\\nint x = 33;\\n```\\n\",\n    \"example\": 161,\n    \"start_line\": 2615,\n    \"end_line\": 2625,\n    \"section\": \"HTML blocks\"\n  },\n  {\n    \"markdown\": \"<a href=\\\"foo\\\">\\n*bar*\\n</a>\\n\",\n    \"html\": \"<a href=\\\"foo\\\">\\n*bar*\\n</a>\\n\",\n    \"example\": 162,\n    \"start_line\": 2632,\n    \"end_line\": 2640,\n    \"section\": \"HTML blocks\"\n  },\n  {\n    \"markdown\": \"<Warning>\\n*bar*\\n</Warning>\\n\",\n    \"html\": \"<Warning>\\n*bar*\\n</Warning>\\n\",\n    \"example\": 163,\n    \"start_line\": 2645,\n    \"end_line\": 2653,\n    \"section\": \"HTML blocks\"\n  },\n  {\n    \"markdown\": \"<i class=\\\"foo\\\">\\n*bar*\\n</i>\\n\",\n    \"html\": \"<i class=\\\"foo\\\">\\n*bar*\\n</i>\\n\",\n    \"example\": 164,\n    \"start_line\": 2656,\n    \"end_line\": 2664,\n    \"section\": \"HTML blocks\"\n  },\n  {\n    \"markdown\": \"</ins>\\n*bar*\\n\",\n    \"html\": \"</ins>\\n*bar*\\n\",\n    \"example\": 165,\n    \"start_line\": 2667,\n    \"end_line\": 2673,\n    \"section\": \"HTML blocks\"\n  },\n  {\n    \"markdown\": \"<del>\\n*foo*\\n</del>\\n\",\n    \"html\": \"<del>\\n*foo*\\n</del>\\n\",\n    \"example\": 166,\n    \"start_line\": 2682,\n    \"end_line\": 2690,\n    \"section\": \"HTML blocks\"\n  },\n  {\n    \"markdown\": \"<del>\\n\\n*foo*\\n\\n</del>\\n\",\n    \"html\": \"<del>\\n<p><em>foo</em></p>\\n</del>\\n\",\n    \"example\": 167,\n    \"start_line\": 2697,\n    \"end_line\": 2707,\n    \"section\": \"HTML blocks\"\n  },\n  {\n    \"markdown\": \"<del>*foo*</del>\\n\",\n    \"html\": \"<p><del><em>foo</em></del></p>\\n\",\n    \"example\": 168,\n    \"start_line\": 2715,\n    \"end_line\": 2719,\n    \"section\": \"HTML blocks\"\n  },\n  {\n    \"markdown\": \"<pre language=\\\"haskell\\\"><code>\\nimport Text.HTML.TagSoup\\n\\nmain :: IO ()\\nmain = print $ parseTags tags\\n</code></pre>\\nokay\\n\",\n    \"html\": \"<pre language=\\\"haskell\\\"><code>\\nimport Text.HTML.TagSoup\\n\\nmain :: IO ()\\nmain = print $ parseTags tags\\n</code></pre>\\n<p>okay</p>\\n\",\n    \"example\": 169,\n    \"start_line\": 2731,\n    \"end_line\": 2747,\n    \"section\": \"HTML blocks\"\n  },\n  {\n    \"markdown\": \"<script type=\\\"text/javascript\\\">\\n// JavaScript example\\n\\ndocument.getElementById(\\\"demo\\\").innerHTML = \\\"Hello JavaScript!\\\";\\n</script>\\nokay\\n\",\n    \"html\": \"<script type=\\\"text/javascript\\\">\\n// JavaScript example\\n\\ndocument.getElementById(\\\"demo\\\").innerHTML = \\\"Hello JavaScript!\\\";\\n</script>\\n<p>okay</p>\\n\",\n    \"example\": 170,\n    \"start_line\": 2752,\n    \"end_line\": 2766,\n    \"section\": \"HTML blocks\"\n  },\n  {\n    \"markdown\": \"<textarea>\\n\\n*foo*\\n\\n_bar_\\n\\n</textarea>\\n\",\n    \"html\": \"<textarea>\\n\\n*foo*\\n\\n_bar_\\n\\n</textarea>\\n\",\n    \"example\": 171,\n    \"start_line\": 2771,\n    \"end_line\": 2787,\n    \"section\": \"HTML blocks\"\n  },\n  {\n    \"markdown\": \"<style\\n  type=\\\"text/css\\\">\\nh1 {color:red;}\\n\\np {color:blue;}\\n</style>\\nokay\\n\",\n    \"html\": \"<style\\n  type=\\\"text/css\\\">\\nh1 {color:red;}\\n\\np {color:blue;}\\n</style>\\n<p>okay</p>\\n\",\n    \"example\": 172,\n    \"start_line\": 2791,\n    \"end_line\": 2807,\n    \"section\": \"HTML blocks\"\n  },\n  {\n    \"markdown\": \"<style\\n  type=\\\"text/css\\\">\\n\\nfoo\\n\",\n    \"html\": \"<style\\n  type=\\\"text/css\\\">\\n\\nfoo\\n\",\n    \"example\": 173,\n    \"start_line\": 2814,\n    \"end_line\": 2824,\n    \"section\": \"HTML blocks\"\n  },\n  {\n    \"markdown\": \"> <div>\\n> foo\\n\\nbar\\n\",\n    \"html\": \"<blockquote>\\n<div>\\nfoo\\n</blockquote>\\n<p>bar</p>\\n\",\n    \"example\": 174,\n    \"start_line\": 2827,\n    \"end_line\": 2838,\n    \"section\": \"HTML blocks\"\n  },\n  {\n    \"markdown\": \"- <div>\\n- foo\\n\",\n    \"html\": \"<ul>\\n<li>\\n<div>\\n</li>\\n<li>foo</li>\\n</ul>\\n\",\n    \"example\": 175,\n    \"start_line\": 2841,\n    \"end_line\": 2851,\n    \"section\": \"HTML blocks\"\n  },\n  {\n    \"markdown\": \"<style>p{color:red;}</style>\\n*foo*\\n\",\n    \"html\": \"<style>p{color:red;}</style>\\n<p><em>foo</em></p>\\n\",\n    \"example\": 176,\n    \"start_line\": 2856,\n    \"end_line\": 2862,\n    \"section\": \"HTML blocks\"\n  },\n  {\n    \"markdown\": \"<!-- foo -->*bar*\\n*baz*\\n\",\n    \"html\": \"<!-- foo -->*bar*\\n<p><em>baz</em></p>\\n\",\n    \"example\": 177,\n    \"start_line\": 2865,\n    \"end_line\": 2871,\n    \"section\": \"HTML blocks\"\n  },\n  {\n    \"markdown\": \"<script>\\nfoo\\n</script>1. *bar*\\n\",\n    \"html\": \"<script>\\nfoo\\n</script>1. *bar*\\n\",\n    \"example\": 178,\n    \"start_line\": 2877,\n    \"end_line\": 2885,\n    \"section\": \"HTML blocks\"\n  },\n  {\n    \"markdown\": \"<!-- Foo\\n\\nbar\\n   baz -->\\nokay\\n\",\n    \"html\": \"<!-- Foo\\n\\nbar\\n   baz -->\\n<p>okay</p>\\n\",\n    \"example\": 179,\n    \"start_line\": 2890,\n    \"end_line\": 2902,\n    \"section\": \"HTML blocks\"\n  },\n  {\n    \"markdown\": \"<?php\\n\\n  echo '>';\\n\\n?>\\nokay\\n\",\n    \"html\": \"<?php\\n\\n  echo '>';\\n\\n?>\\n<p>okay</p>\\n\",\n    \"example\": 180,\n    \"start_line\": 2908,\n    \"end_line\": 2922,\n    \"section\": \"HTML blocks\"\n  },\n  {\n    \"markdown\": \"<!DOCTYPE html>\\n\",\n    \"html\": \"<!DOCTYPE html>\\n\",\n    \"example\": 181,\n    \"start_line\": 2927,\n    \"end_line\": 2931,\n    \"section\": \"HTML blocks\"\n  },\n  {\n    \"markdown\": \"<![CDATA[\\nfunction matchwo(a,b)\\n{\\n  if (a < b && a < 0) then {\\n    return 1;\\n\\n  } else {\\n\\n    return 0;\\n  }\\n}\\n]]>\\nokay\\n\",\n    \"html\": \"<![CDATA[\\nfunction matchwo(a,b)\\n{\\n  if (a < b && a < 0) then {\\n    return 1;\\n\\n  } else {\\n\\n    return 0;\\n  }\\n}\\n]]>\\n<p>okay</p>\\n\",\n    \"example\": 182,\n    \"start_line\": 2936,\n    \"end_line\": 2964,\n    \"section\": \"HTML blocks\"\n  },\n  {\n    \"markdown\": \"  <!-- foo -->\\n\\n    <!-- foo -->\\n\",\n    \"html\": \"  <!-- foo -->\\n<pre><code>&lt;!-- foo --&gt;\\n</code></pre>\\n\",\n    \"example\": 183,\n    \"start_line\": 2970,\n    \"end_line\": 2978,\n    \"section\": \"HTML blocks\"\n  },\n  {\n    \"markdown\": \"  <div>\\n\\n    <div>\\n\",\n    \"html\": \"  <div>\\n<pre><code>&lt;div&gt;\\n</code></pre>\\n\",\n    \"example\": 184,\n    \"start_line\": 2981,\n    \"end_line\": 2989,\n    \"section\": \"HTML blocks\"\n  },\n  {\n    \"markdown\": \"Foo\\n<div>\\nbar\\n</div>\\n\",\n    \"html\": \"<p>Foo</p>\\n<div>\\nbar\\n</div>\\n\",\n    \"example\": 185,\n    \"start_line\": 2995,\n    \"end_line\": 3005,\n    \"section\": \"HTML blocks\"\n  },\n  {\n    \"markdown\": \"<div>\\nbar\\n</div>\\n*foo*\\n\",\n    \"html\": \"<div>\\nbar\\n</div>\\n*foo*\\n\",\n    \"example\": 186,\n    \"start_line\": 3012,\n    \"end_line\": 3022,\n    \"section\": \"HTML blocks\"\n  },\n  {\n    \"markdown\": \"Foo\\n<a href=\\\"bar\\\">\\nbaz\\n\",\n    \"html\": \"<p>Foo\\n<a href=\\\"bar\\\">\\nbaz</p>\\n\",\n    \"example\": 187,\n    \"start_line\": 3027,\n    \"end_line\": 3035,\n    \"section\": \"HTML blocks\"\n  },\n  {\n    \"markdown\": \"<div>\\n\\n*Emphasized* text.\\n\\n</div>\\n\",\n    \"html\": \"<div>\\n<p><em>Emphasized</em> text.</p>\\n</div>\\n\",\n    \"example\": 188,\n    \"start_line\": 3068,\n    \"end_line\": 3078,\n    \"section\": \"HTML blocks\"\n  },\n  {\n    \"markdown\": \"<div>\\n*Emphasized* text.\\n</div>\\n\",\n    \"html\": \"<div>\\n*Emphasized* text.\\n</div>\\n\",\n    \"example\": 189,\n    \"start_line\": 3081,\n    \"end_line\": 3089,\n    \"section\": \"HTML blocks\"\n  },\n  {\n    \"markdown\": \"<table>\\n\\n<tr>\\n\\n<td>\\nHi\\n</td>\\n\\n</tr>\\n\\n</table>\\n\",\n    \"html\": \"<table>\\n<tr>\\n<td>\\nHi\\n</td>\\n</tr>\\n</table>\\n\",\n    \"example\": 190,\n    \"start_line\": 3103,\n    \"end_line\": 3123,\n    \"section\": \"HTML blocks\"\n  },\n  {\n    \"markdown\": \"<table>\\n\\n  <tr>\\n\\n    <td>\\n      Hi\\n    </td>\\n\\n  </tr>\\n\\n</table>\\n\",\n    \"html\": \"<table>\\n  <tr>\\n<pre><code>&lt;td&gt;\\n  Hi\\n&lt;/td&gt;\\n</code></pre>\\n  </tr>\\n</table>\\n\",\n    \"example\": 191,\n    \"start_line\": 3130,\n    \"end_line\": 3151,\n    \"section\": \"HTML blocks\"\n  },\n  {\n    \"markdown\": \"[foo]: /url \\\"title\\\"\\n\\n[foo]\\n\",\n    \"html\": \"<p><a href=\\\"/url\\\" title=\\\"title\\\">foo</a></p>\\n\",\n    \"example\": 192,\n    \"start_line\": 3179,\n    \"end_line\": 3185,\n    \"section\": \"Link reference definitions\"\n  },\n  {\n    \"markdown\": \"   [foo]: \\n      /url  \\n           'the title'  \\n\\n[foo]\\n\",\n    \"html\": \"<p><a href=\\\"/url\\\" title=\\\"the title\\\">foo</a></p>\\n\",\n    \"example\": 193,\n    \"start_line\": 3188,\n    \"end_line\": 3196,\n    \"section\": \"Link reference definitions\"\n  },\n  {\n    \"markdown\": \"[Foo*bar\\\\]]:my_(url) 'title (with parens)'\\n\\n[Foo*bar\\\\]]\\n\",\n    \"html\": \"<p><a href=\\\"my_(url)\\\" title=\\\"title (with parens)\\\">Foo*bar]</a></p>\\n\",\n    \"example\": 194,\n    \"start_line\": 3199,\n    \"end_line\": 3205,\n    \"section\": \"Link reference definitions\"\n  },\n  {\n    \"markdown\": \"[Foo bar]:\\n<my url>\\n'title'\\n\\n[Foo bar]\\n\",\n    \"html\": \"<p><a href=\\\"my%20url\\\" title=\\\"title\\\">Foo bar</a></p>\\n\",\n    \"example\": 195,\n    \"start_line\": 3208,\n    \"end_line\": 3216,\n    \"section\": \"Link reference definitions\"\n  },\n  {\n    \"markdown\": \"[foo]: /url '\\ntitle\\nline1\\nline2\\n'\\n\\n[foo]\\n\",\n    \"html\": \"<p><a href=\\\"/url\\\" title=\\\"\\ntitle\\nline1\\nline2\\n\\\">foo</a></p>\\n\",\n    \"example\": 196,\n    \"start_line\": 3221,\n    \"end_line\": 3235,\n    \"section\": \"Link reference definitions\"\n  },\n  {\n    \"markdown\": \"[foo]: /url 'title\\n\\nwith blank line'\\n\\n[foo]\\n\",\n    \"html\": \"<p>[foo]: /url 'title</p>\\n<p>with blank line'</p>\\n<p>[foo]</p>\\n\",\n    \"example\": 197,\n    \"start_line\": 3240,\n    \"end_line\": 3250,\n    \"section\": \"Link reference definitions\"\n  },\n  {\n    \"markdown\": \"[foo]:\\n/url\\n\\n[foo]\\n\",\n    \"html\": \"<p><a href=\\\"/url\\\">foo</a></p>\\n\",\n    \"example\": 198,\n    \"start_line\": 3255,\n    \"end_line\": 3262,\n    \"section\": \"Link reference definitions\"\n  },\n  {\n    \"markdown\": \"[foo]:\\n\\n[foo]\\n\",\n    \"html\": \"<p>[foo]:</p>\\n<p>[foo]</p>\\n\",\n    \"example\": 199,\n    \"start_line\": 3267,\n    \"end_line\": 3274,\n    \"section\": \"Link reference definitions\"\n  },\n  {\n    \"markdown\": \"[foo]: <>\\n\\n[foo]\\n\",\n    \"html\": \"<p><a href=\\\"\\\">foo</a></p>\\n\",\n    \"example\": 200,\n    \"start_line\": 3279,\n    \"end_line\": 3285,\n    \"section\": \"Link reference definitions\"\n  },\n  {\n    \"markdown\": \"[foo]: <bar>(baz)\\n\\n[foo]\\n\",\n    \"html\": \"<p>[foo]: <bar>(baz)</p>\\n<p>[foo]</p>\\n\",\n    \"example\": 201,\n    \"start_line\": 3290,\n    \"end_line\": 3297,\n    \"section\": \"Link reference definitions\"\n  },\n  {\n    \"markdown\": \"[foo]: /url\\\\bar\\\\*baz \\\"foo\\\\\\\"bar\\\\baz\\\"\\n\\n[foo]\\n\",\n    \"html\": \"<p><a href=\\\"/url%5Cbar*baz\\\" title=\\\"foo&quot;bar\\\\baz\\\">foo</a></p>\\n\",\n    \"example\": 202,\n    \"start_line\": 3303,\n    \"end_line\": 3309,\n    \"section\": \"Link reference definitions\"\n  },\n  {\n    \"markdown\": \"[foo]\\n\\n[foo]: url\\n\",\n    \"html\": \"<p><a href=\\\"url\\\">foo</a></p>\\n\",\n    \"example\": 203,\n    \"start_line\": 3314,\n    \"end_line\": 3320,\n    \"section\": \"Link reference definitions\"\n  },\n  {\n    \"markdown\": \"[foo]\\n\\n[foo]: first\\n[foo]: second\\n\",\n    \"html\": \"<p><a href=\\\"first\\\">foo</a></p>\\n\",\n    \"example\": 204,\n    \"start_line\": 3326,\n    \"end_line\": 3333,\n    \"section\": \"Link reference definitions\"\n  },\n  {\n    \"markdown\": \"[FOO]: /url\\n\\n[Foo]\\n\",\n    \"html\": \"<p><a href=\\\"/url\\\">Foo</a></p>\\n\",\n    \"example\": 205,\n    \"start_line\": 3339,\n    \"end_line\": 3345,\n    \"section\": \"Link reference definitions\"\n  },\n  {\n    \"markdown\": \"[ΑΓΩ]: /φου\\n\\n[αγω]\\n\",\n    \"html\": \"<p><a href=\\\"/%CF%86%CE%BF%CF%85\\\">αγω</a></p>\\n\",\n    \"example\": 206,\n    \"start_line\": 3348,\n    \"end_line\": 3354,\n    \"section\": \"Link reference definitions\"\n  },\n  {\n    \"markdown\": \"[foo]: /url\\n\",\n    \"html\": \"\",\n    \"example\": 207,\n    \"start_line\": 3363,\n    \"end_line\": 3366,\n    \"section\": \"Link reference definitions\"\n  },\n  {\n    \"markdown\": \"[\\nfoo\\n]: /url\\nbar\\n\",\n    \"html\": \"<p>bar</p>\\n\",\n    \"example\": 208,\n    \"start_line\": 3371,\n    \"end_line\": 3378,\n    \"section\": \"Link reference definitions\"\n  },\n  {\n    \"markdown\": \"[foo]: /url \\\"title\\\" ok\\n\",\n    \"html\": \"<p>[foo]: /url &quot;title&quot; ok</p>\\n\",\n    \"example\": 209,\n    \"start_line\": 3384,\n    \"end_line\": 3388,\n    \"section\": \"Link reference definitions\"\n  },\n  {\n    \"markdown\": \"[foo]: /url\\n\\\"title\\\" ok\\n\",\n    \"html\": \"<p>&quot;title&quot; ok</p>\\n\",\n    \"example\": 210,\n    \"start_line\": 3393,\n    \"end_line\": 3398,\n    \"section\": \"Link reference definitions\"\n  },\n  {\n    \"markdown\": \"    [foo]: /url \\\"title\\\"\\n\\n[foo]\\n\",\n    \"html\": \"<pre><code>[foo]: /url &quot;title&quot;\\n</code></pre>\\n<p>[foo]</p>\\n\",\n    \"example\": 211,\n    \"start_line\": 3404,\n    \"end_line\": 3412,\n    \"section\": \"Link reference definitions\"\n  },\n  {\n    \"markdown\": \"```\\n[foo]: /url\\n```\\n\\n[foo]\\n\",\n    \"html\": \"<pre><code>[foo]: /url\\n</code></pre>\\n<p>[foo]</p>\\n\",\n    \"example\": 212,\n    \"start_line\": 3418,\n    \"end_line\": 3428,\n    \"section\": \"Link reference definitions\"\n  },\n  {\n    \"markdown\": \"Foo\\n[bar]: /baz\\n\\n[bar]\\n\",\n    \"html\": \"<p>Foo\\n[bar]: /baz</p>\\n<p>[bar]</p>\\n\",\n    \"example\": 213,\n    \"start_line\": 3433,\n    \"end_line\": 3442,\n    \"section\": \"Link reference definitions\"\n  },\n  {\n    \"markdown\": \"# [Foo]\\n[foo]: /url\\n> bar\\n\",\n    \"html\": \"<h1><a href=\\\"/url\\\">Foo</a></h1>\\n<blockquote>\\n<p>bar</p>\\n</blockquote>\\n\",\n    \"example\": 214,\n    \"start_line\": 3448,\n    \"end_line\": 3457,\n    \"section\": \"Link reference definitions\"\n  },\n  {\n    \"markdown\": \"[foo]: /url\\nbar\\n===\\n[foo]\\n\",\n    \"html\": \"<h1>bar</h1>\\n<p><a href=\\\"/url\\\">foo</a></p>\\n\",\n    \"example\": 215,\n    \"start_line\": 3459,\n    \"end_line\": 3467,\n    \"section\": \"Link reference definitions\"\n  },\n  {\n    \"markdown\": \"[foo]: /url\\n===\\n[foo]\\n\",\n    \"html\": \"<p>===\\n<a href=\\\"/url\\\">foo</a></p>\\n\",\n    \"example\": 216,\n    \"start_line\": 3469,\n    \"end_line\": 3476,\n    \"section\": \"Link reference definitions\"\n  },\n  {\n    \"markdown\": \"[foo]: /foo-url \\\"foo\\\"\\n[bar]: /bar-url\\n  \\\"bar\\\"\\n[baz]: /baz-url\\n\\n[foo],\\n[bar],\\n[baz]\\n\",\n    \"html\": \"<p><a href=\\\"/foo-url\\\" title=\\\"foo\\\">foo</a>,\\n<a href=\\\"/bar-url\\\" title=\\\"bar\\\">bar</a>,\\n<a href=\\\"/baz-url\\\">baz</a></p>\\n\",\n    \"example\": 217,\n    \"start_line\": 3482,\n    \"end_line\": 3495,\n    \"section\": \"Link reference definitions\"\n  },\n  {\n    \"markdown\": \"[foo]\\n\\n> [foo]: /url\\n\",\n    \"html\": \"<p><a href=\\\"/url\\\">foo</a></p>\\n<blockquote>\\n</blockquote>\\n\",\n    \"example\": 218,\n    \"start_line\": 3503,\n    \"end_line\": 3511,\n    \"section\": \"Link reference definitions\"\n  },\n  {\n    \"markdown\": \"aaa\\n\\nbbb\\n\",\n    \"html\": \"<p>aaa</p>\\n<p>bbb</p>\\n\",\n    \"example\": 219,\n    \"start_line\": 3525,\n    \"end_line\": 3532,\n    \"section\": \"Paragraphs\"\n  },\n  {\n    \"markdown\": \"aaa\\nbbb\\n\\nccc\\nddd\\n\",\n    \"html\": \"<p>aaa\\nbbb</p>\\n<p>ccc\\nddd</p>\\n\",\n    \"example\": 220,\n    \"start_line\": 3537,\n    \"end_line\": 3548,\n    \"section\": \"Paragraphs\"\n  },\n  {\n    \"markdown\": \"aaa\\n\\n\\nbbb\\n\",\n    \"html\": \"<p>aaa</p>\\n<p>bbb</p>\\n\",\n    \"example\": 221,\n    \"start_line\": 3553,\n    \"end_line\": 3561,\n    \"section\": \"Paragraphs\"\n  },\n  {\n    \"markdown\": \"  aaa\\n bbb\\n\",\n    \"html\": \"<p>aaa\\nbbb</p>\\n\",\n    \"example\": 222,\n    \"start_line\": 3566,\n    \"end_line\": 3572,\n    \"section\": \"Paragraphs\"\n  },\n  {\n    \"markdown\": \"aaa\\n             bbb\\n                                       ccc\\n\",\n    \"html\": \"<p>aaa\\nbbb\\nccc</p>\\n\",\n    \"example\": 223,\n    \"start_line\": 3578,\n    \"end_line\": 3586,\n    \"section\": \"Paragraphs\"\n  },\n  {\n    \"markdown\": \"   aaa\\nbbb\\n\",\n    \"html\": \"<p>aaa\\nbbb</p>\\n\",\n    \"example\": 224,\n    \"start_line\": 3592,\n    \"end_line\": 3598,\n    \"section\": \"Paragraphs\"\n  },\n  {\n    \"markdown\": \"    aaa\\nbbb\\n\",\n    \"html\": \"<pre><code>aaa\\n</code></pre>\\n<p>bbb</p>\\n\",\n    \"example\": 225,\n    \"start_line\": 3601,\n    \"end_line\": 3608,\n    \"section\": \"Paragraphs\"\n  },\n  {\n    \"markdown\": \"aaa     \\nbbb     \\n\",\n    \"html\": \"<p>aaa<br />\\nbbb</p>\\n\",\n    \"example\": 226,\n    \"start_line\": 3615,\n    \"end_line\": 3621,\n    \"section\": \"Paragraphs\"\n  },\n  {\n    \"markdown\": \"  \\n\\naaa\\n  \\n\\n# aaa\\n\\n  \\n\",\n    \"html\": \"<p>aaa</p>\\n<h1>aaa</h1>\\n\",\n    \"example\": 227,\n    \"start_line\": 3632,\n    \"end_line\": 3644,\n    \"section\": \"Blank lines\"\n  },\n  {\n    \"markdown\": \"> # Foo\\n> bar\\n> baz\\n\",\n    \"html\": \"<blockquote>\\n<h1>Foo</h1>\\n<p>bar\\nbaz</p>\\n</blockquote>\\n\",\n    \"example\": 228,\n    \"start_line\": 3700,\n    \"end_line\": 3710,\n    \"section\": \"Block quotes\"\n  },\n  {\n    \"markdown\": \"># Foo\\n>bar\\n> baz\\n\",\n    \"html\": \"<blockquote>\\n<h1>Foo</h1>\\n<p>bar\\nbaz</p>\\n</blockquote>\\n\",\n    \"example\": 229,\n    \"start_line\": 3715,\n    \"end_line\": 3725,\n    \"section\": \"Block quotes\"\n  },\n  {\n    \"markdown\": \"   > # Foo\\n   > bar\\n > baz\\n\",\n    \"html\": \"<blockquote>\\n<h1>Foo</h1>\\n<p>bar\\nbaz</p>\\n</blockquote>\\n\",\n    \"example\": 230,\n    \"start_line\": 3730,\n    \"end_line\": 3740,\n    \"section\": \"Block quotes\"\n  },\n  {\n    \"markdown\": \"    > # Foo\\n    > bar\\n    > baz\\n\",\n    \"html\": \"<pre><code>&gt; # Foo\\n&gt; bar\\n&gt; baz\\n</code></pre>\\n\",\n    \"example\": 231,\n    \"start_line\": 3745,\n    \"end_line\": 3754,\n    \"section\": \"Block quotes\"\n  },\n  {\n    \"markdown\": \"> # Foo\\n> bar\\nbaz\\n\",\n    \"html\": \"<blockquote>\\n<h1>Foo</h1>\\n<p>bar\\nbaz</p>\\n</blockquote>\\n\",\n    \"example\": 232,\n    \"start_line\": 3760,\n    \"end_line\": 3770,\n    \"section\": \"Block quotes\"\n  },\n  {\n    \"markdown\": \"> bar\\nbaz\\n> foo\\n\",\n    \"html\": \"<blockquote>\\n<p>bar\\nbaz\\nfoo</p>\\n</blockquote>\\n\",\n    \"example\": 233,\n    \"start_line\": 3776,\n    \"end_line\": 3786,\n    \"section\": \"Block quotes\"\n  },\n  {\n    \"markdown\": \"> foo\\n---\\n\",\n    \"html\": \"<blockquote>\\n<p>foo</p>\\n</blockquote>\\n<hr />\\n\",\n    \"example\": 234,\n    \"start_line\": 3800,\n    \"end_line\": 3808,\n    \"section\": \"Block quotes\"\n  },\n  {\n    \"markdown\": \"> - foo\\n- bar\\n\",\n    \"html\": \"<blockquote>\\n<ul>\\n<li>foo</li>\\n</ul>\\n</blockquote>\\n<ul>\\n<li>bar</li>\\n</ul>\\n\",\n    \"example\": 235,\n    \"start_line\": 3820,\n    \"end_line\": 3832,\n    \"section\": \"Block quotes\"\n  },\n  {\n    \"markdown\": \">     foo\\n    bar\\n\",\n    \"html\": \"<blockquote>\\n<pre><code>foo\\n</code></pre>\\n</blockquote>\\n<pre><code>bar\\n</code></pre>\\n\",\n    \"example\": 236,\n    \"start_line\": 3838,\n    \"end_line\": 3848,\n    \"section\": \"Block quotes\"\n  },\n  {\n    \"markdown\": \"> ```\\nfoo\\n```\\n\",\n    \"html\": \"<blockquote>\\n<pre><code></code></pre>\\n</blockquote>\\n<p>foo</p>\\n<pre><code></code></pre>\\n\",\n    \"example\": 237,\n    \"start_line\": 3851,\n    \"end_line\": 3861,\n    \"section\": \"Block quotes\"\n  },\n  {\n    \"markdown\": \"> foo\\n    - bar\\n\",\n    \"html\": \"<blockquote>\\n<p>foo\\n- bar</p>\\n</blockquote>\\n\",\n    \"example\": 238,\n    \"start_line\": 3867,\n    \"end_line\": 3875,\n    \"section\": \"Block quotes\"\n  },\n  {\n    \"markdown\": \">\\n\",\n    \"html\": \"<blockquote>\\n</blockquote>\\n\",\n    \"example\": 239,\n    \"start_line\": 3891,\n    \"end_line\": 3896,\n    \"section\": \"Block quotes\"\n  },\n  {\n    \"markdown\": \">\\n>  \\n> \\n\",\n    \"html\": \"<blockquote>\\n</blockquote>\\n\",\n    \"example\": 240,\n    \"start_line\": 3899,\n    \"end_line\": 3906,\n    \"section\": \"Block quotes\"\n  },\n  {\n    \"markdown\": \">\\n> foo\\n>  \\n\",\n    \"html\": \"<blockquote>\\n<p>foo</p>\\n</blockquote>\\n\",\n    \"example\": 241,\n    \"start_line\": 3911,\n    \"end_line\": 3919,\n    \"section\": \"Block quotes\"\n  },\n  {\n    \"markdown\": \"> foo\\n\\n> bar\\n\",\n    \"html\": \"<blockquote>\\n<p>foo</p>\\n</blockquote>\\n<blockquote>\\n<p>bar</p>\\n</blockquote>\\n\",\n    \"example\": 242,\n    \"start_line\": 3924,\n    \"end_line\": 3935,\n    \"section\": \"Block quotes\"\n  },\n  {\n    \"markdown\": \"> foo\\n> bar\\n\",\n    \"html\": \"<blockquote>\\n<p>foo\\nbar</p>\\n</blockquote>\\n\",\n    \"example\": 243,\n    \"start_line\": 3946,\n    \"end_line\": 3954,\n    \"section\": \"Block quotes\"\n  },\n  {\n    \"markdown\": \"> foo\\n>\\n> bar\\n\",\n    \"html\": \"<blockquote>\\n<p>foo</p>\\n<p>bar</p>\\n</blockquote>\\n\",\n    \"example\": 244,\n    \"start_line\": 3959,\n    \"end_line\": 3968,\n    \"section\": \"Block quotes\"\n  },\n  {\n    \"markdown\": \"foo\\n> bar\\n\",\n    \"html\": \"<p>foo</p>\\n<blockquote>\\n<p>bar</p>\\n</blockquote>\\n\",\n    \"example\": 245,\n    \"start_line\": 3973,\n    \"end_line\": 3981,\n    \"section\": \"Block quotes\"\n  },\n  {\n    \"markdown\": \"> aaa\\n***\\n> bbb\\n\",\n    \"html\": \"<blockquote>\\n<p>aaa</p>\\n</blockquote>\\n<hr />\\n<blockquote>\\n<p>bbb</p>\\n</blockquote>\\n\",\n    \"example\": 246,\n    \"start_line\": 3987,\n    \"end_line\": 3999,\n    \"section\": \"Block quotes\"\n  },\n  {\n    \"markdown\": \"> bar\\nbaz\\n\",\n    \"html\": \"<blockquote>\\n<p>bar\\nbaz</p>\\n</blockquote>\\n\",\n    \"example\": 247,\n    \"start_line\": 4005,\n    \"end_line\": 4013,\n    \"section\": \"Block quotes\"\n  },\n  {\n    \"markdown\": \"> bar\\n\\nbaz\\n\",\n    \"html\": \"<blockquote>\\n<p>bar</p>\\n</blockquote>\\n<p>baz</p>\\n\",\n    \"example\": 248,\n    \"start_line\": 4016,\n    \"end_line\": 4025,\n    \"section\": \"Block quotes\"\n  },\n  {\n    \"markdown\": \"> bar\\n>\\nbaz\\n\",\n    \"html\": \"<blockquote>\\n<p>bar</p>\\n</blockquote>\\n<p>baz</p>\\n\",\n    \"example\": 249,\n    \"start_line\": 4028,\n    \"end_line\": 4037,\n    \"section\": \"Block quotes\"\n  },\n  {\n    \"markdown\": \"> > > foo\\nbar\\n\",\n    \"html\": \"<blockquote>\\n<blockquote>\\n<blockquote>\\n<p>foo\\nbar</p>\\n</blockquote>\\n</blockquote>\\n</blockquote>\\n\",\n    \"example\": 250,\n    \"start_line\": 4044,\n    \"end_line\": 4056,\n    \"section\": \"Block quotes\"\n  },\n  {\n    \"markdown\": \">>> foo\\n> bar\\n>>baz\\n\",\n    \"html\": \"<blockquote>\\n<blockquote>\\n<blockquote>\\n<p>foo\\nbar\\nbaz</p>\\n</blockquote>\\n</blockquote>\\n</blockquote>\\n\",\n    \"example\": 251,\n    \"start_line\": 4059,\n    \"end_line\": 4073,\n    \"section\": \"Block quotes\"\n  },\n  {\n    \"markdown\": \">     code\\n\\n>    not code\\n\",\n    \"html\": \"<blockquote>\\n<pre><code>code\\n</code></pre>\\n</blockquote>\\n<blockquote>\\n<p>not code</p>\\n</blockquote>\\n\",\n    \"example\": 252,\n    \"start_line\": 4081,\n    \"end_line\": 4093,\n    \"section\": \"Block quotes\"\n  },\n  {\n    \"markdown\": \"A paragraph\\nwith two lines.\\n\\n    indented code\\n\\n> A block quote.\\n\",\n    \"html\": \"<p>A paragraph\\nwith two lines.</p>\\n<pre><code>indented code\\n</code></pre>\\n<blockquote>\\n<p>A block quote.</p>\\n</blockquote>\\n\",\n    \"example\": 253,\n    \"start_line\": 4135,\n    \"end_line\": 4150,\n    \"section\": \"List items\"\n  },\n  {\n    \"markdown\": \"1.  A paragraph\\n    with two lines.\\n\\n        indented code\\n\\n    > A block quote.\\n\",\n    \"html\": \"<ol>\\n<li>\\n<p>A paragraph\\nwith two lines.</p>\\n<pre><code>indented code\\n</code></pre>\\n<blockquote>\\n<p>A block quote.</p>\\n</blockquote>\\n</li>\\n</ol>\\n\",\n    \"example\": 254,\n    \"start_line\": 4157,\n    \"end_line\": 4176,\n    \"section\": \"List items\"\n  },\n  {\n    \"markdown\": \"- one\\n\\n two\\n\",\n    \"html\": \"<ul>\\n<li>one</li>\\n</ul>\\n<p>two</p>\\n\",\n    \"example\": 255,\n    \"start_line\": 4190,\n    \"end_line\": 4199,\n    \"section\": \"List items\"\n  },\n  {\n    \"markdown\": \"- one\\n\\n  two\\n\",\n    \"html\": \"<ul>\\n<li>\\n<p>one</p>\\n<p>two</p>\\n</li>\\n</ul>\\n\",\n    \"example\": 256,\n    \"start_line\": 4202,\n    \"end_line\": 4213,\n    \"section\": \"List items\"\n  },\n  {\n    \"markdown\": \" -    one\\n\\n     two\\n\",\n    \"html\": \"<ul>\\n<li>one</li>\\n</ul>\\n<pre><code> two\\n</code></pre>\\n\",\n    \"example\": 257,\n    \"start_line\": 4216,\n    \"end_line\": 4226,\n    \"section\": \"List items\"\n  },\n  {\n    \"markdown\": \" -    one\\n\\n      two\\n\",\n    \"html\": \"<ul>\\n<li>\\n<p>one</p>\\n<p>two</p>\\n</li>\\n</ul>\\n\",\n    \"example\": 258,\n    \"start_line\": 4229,\n    \"end_line\": 4240,\n    \"section\": \"List items\"\n  },\n  {\n    \"markdown\": \"   > > 1.  one\\n>>\\n>>     two\\n\",\n    \"html\": \"<blockquote>\\n<blockquote>\\n<ol>\\n<li>\\n<p>one</p>\\n<p>two</p>\\n</li>\\n</ol>\\n</blockquote>\\n</blockquote>\\n\",\n    \"example\": 259,\n    \"start_line\": 4251,\n    \"end_line\": 4266,\n    \"section\": \"List items\"\n  },\n  {\n    \"markdown\": \">>- one\\n>>\\n  >  > two\\n\",\n    \"html\": \"<blockquote>\\n<blockquote>\\n<ul>\\n<li>one</li>\\n</ul>\\n<p>two</p>\\n</blockquote>\\n</blockquote>\\n\",\n    \"example\": 260,\n    \"start_line\": 4278,\n    \"end_line\": 4291,\n    \"section\": \"List items\"\n  },\n  {\n    \"markdown\": \"-one\\n\\n2.two\\n\",\n    \"html\": \"<p>-one</p>\\n<p>2.two</p>\\n\",\n    \"example\": 261,\n    \"start_line\": 4297,\n    \"end_line\": 4304,\n    \"section\": \"List items\"\n  },\n  {\n    \"markdown\": \"- foo\\n\\n\\n  bar\\n\",\n    \"html\": \"<ul>\\n<li>\\n<p>foo</p>\\n<p>bar</p>\\n</li>\\n</ul>\\n\",\n    \"example\": 262,\n    \"start_line\": 4310,\n    \"end_line\": 4322,\n    \"section\": \"List items\"\n  },\n  {\n    \"markdown\": \"1.  foo\\n\\n    ```\\n    bar\\n    ```\\n\\n    baz\\n\\n    > bam\\n\",\n    \"html\": \"<ol>\\n<li>\\n<p>foo</p>\\n<pre><code>bar\\n</code></pre>\\n<p>baz</p>\\n<blockquote>\\n<p>bam</p>\\n</blockquote>\\n</li>\\n</ol>\\n\",\n    \"example\": 263,\n    \"start_line\": 4327,\n    \"end_line\": 4349,\n    \"section\": \"List items\"\n  },\n  {\n    \"markdown\": \"- Foo\\n\\n      bar\\n\\n\\n      baz\\n\",\n    \"html\": \"<ul>\\n<li>\\n<p>Foo</p>\\n<pre><code>bar\\n\\n\\nbaz\\n</code></pre>\\n</li>\\n</ul>\\n\",\n    \"example\": 264,\n    \"start_line\": 4355,\n    \"end_line\": 4373,\n    \"section\": \"List items\"\n  },\n  {\n    \"markdown\": \"123456789. ok\\n\",\n    \"html\": \"<ol start=\\\"123456789\\\">\\n<li>ok</li>\\n</ol>\\n\",\n    \"example\": 265,\n    \"start_line\": 4377,\n    \"end_line\": 4383,\n    \"section\": \"List items\"\n  },\n  {\n    \"markdown\": \"1234567890. not ok\\n\",\n    \"html\": \"<p>1234567890. not ok</p>\\n\",\n    \"example\": 266,\n    \"start_line\": 4386,\n    \"end_line\": 4390,\n    \"section\": \"List items\"\n  },\n  {\n    \"markdown\": \"0. ok\\n\",\n    \"html\": \"<ol start=\\\"0\\\">\\n<li>ok</li>\\n</ol>\\n\",\n    \"example\": 267,\n    \"start_line\": 4395,\n    \"end_line\": 4401,\n    \"section\": \"List items\"\n  },\n  {\n    \"markdown\": \"003. ok\\n\",\n    \"html\": \"<ol start=\\\"3\\\">\\n<li>ok</li>\\n</ol>\\n\",\n    \"example\": 268,\n    \"start_line\": 4404,\n    \"end_line\": 4410,\n    \"section\": \"List items\"\n  },\n  {\n    \"markdown\": \"-1. not ok\\n\",\n    \"html\": \"<p>-1. not ok</p>\\n\",\n    \"example\": 269,\n    \"start_line\": 4415,\n    \"end_line\": 4419,\n    \"section\": \"List items\"\n  },\n  {\n    \"markdown\": \"- foo\\n\\n      bar\\n\",\n    \"html\": \"<ul>\\n<li>\\n<p>foo</p>\\n<pre><code>bar\\n</code></pre>\\n</li>\\n</ul>\\n\",\n    \"example\": 270,\n    \"start_line\": 4438,\n    \"end_line\": 4450,\n    \"section\": \"List items\"\n  },\n  {\n    \"markdown\": \"  10.  foo\\n\\n           bar\\n\",\n    \"html\": \"<ol start=\\\"10\\\">\\n<li>\\n<p>foo</p>\\n<pre><code>bar\\n</code></pre>\\n</li>\\n</ol>\\n\",\n    \"example\": 271,\n    \"start_line\": 4455,\n    \"end_line\": 4467,\n    \"section\": \"List items\"\n  },\n  {\n    \"markdown\": \"    indented code\\n\\nparagraph\\n\\n    more code\\n\",\n    \"html\": \"<pre><code>indented code\\n</code></pre>\\n<p>paragraph</p>\\n<pre><code>more code\\n</code></pre>\\n\",\n    \"example\": 272,\n    \"start_line\": 4474,\n    \"end_line\": 4486,\n    \"section\": \"List items\"\n  },\n  {\n    \"markdown\": \"1.     indented code\\n\\n   paragraph\\n\\n       more code\\n\",\n    \"html\": \"<ol>\\n<li>\\n<pre><code>indented code\\n</code></pre>\\n<p>paragraph</p>\\n<pre><code>more code\\n</code></pre>\\n</li>\\n</ol>\\n\",\n    \"example\": 273,\n    \"start_line\": 4489,\n    \"end_line\": 4505,\n    \"section\": \"List items\"\n  },\n  {\n    \"markdown\": \"1.      indented code\\n\\n   paragraph\\n\\n       more code\\n\",\n    \"html\": \"<ol>\\n<li>\\n<pre><code> indented code\\n</code></pre>\\n<p>paragraph</p>\\n<pre><code>more code\\n</code></pre>\\n</li>\\n</ol>\\n\",\n    \"example\": 274,\n    \"start_line\": 4511,\n    \"end_line\": 4527,\n    \"section\": \"List items\"\n  },\n  {\n    \"markdown\": \"   foo\\n\\nbar\\n\",\n    \"html\": \"<p>foo</p>\\n<p>bar</p>\\n\",\n    \"example\": 275,\n    \"start_line\": 4538,\n    \"end_line\": 4545,\n    \"section\": \"List items\"\n  },\n  {\n    \"markdown\": \"-    foo\\n\\n  bar\\n\",\n    \"html\": \"<ul>\\n<li>foo</li>\\n</ul>\\n<p>bar</p>\\n\",\n    \"example\": 276,\n    \"start_line\": 4548,\n    \"end_line\": 4557,\n    \"section\": \"List items\"\n  },\n  {\n    \"markdown\": \"-  foo\\n\\n   bar\\n\",\n    \"html\": \"<ul>\\n<li>\\n<p>foo</p>\\n<p>bar</p>\\n</li>\\n</ul>\\n\",\n    \"example\": 277,\n    \"start_line\": 4565,\n    \"end_line\": 4576,\n    \"section\": \"List items\"\n  },\n  {\n    \"markdown\": \"-\\n  foo\\n-\\n  ```\\n  bar\\n  ```\\n-\\n      baz\\n\",\n    \"html\": \"<ul>\\n<li>foo</li>\\n<li>\\n<pre><code>bar\\n</code></pre>\\n</li>\\n<li>\\n<pre><code>baz\\n</code></pre>\\n</li>\\n</ul>\\n\",\n    \"example\": 278,\n    \"start_line\": 4592,\n    \"end_line\": 4613,\n    \"section\": \"List items\"\n  },\n  {\n    \"markdown\": \"-   \\n  foo\\n\",\n    \"html\": \"<ul>\\n<li>foo</li>\\n</ul>\\n\",\n    \"example\": 279,\n    \"start_line\": 4618,\n    \"end_line\": 4625,\n    \"section\": \"List items\"\n  },\n  {\n    \"markdown\": \"-\\n\\n  foo\\n\",\n    \"html\": \"<ul>\\n<li></li>\\n</ul>\\n<p>foo</p>\\n\",\n    \"example\": 280,\n    \"start_line\": 4632,\n    \"end_line\": 4641,\n    \"section\": \"List items\"\n  },\n  {\n    \"markdown\": \"- foo\\n-\\n- bar\\n\",\n    \"html\": \"<ul>\\n<li>foo</li>\\n<li></li>\\n<li>bar</li>\\n</ul>\\n\",\n    \"example\": 281,\n    \"start_line\": 4646,\n    \"end_line\": 4656,\n    \"section\": \"List items\"\n  },\n  {\n    \"markdown\": \"- foo\\n-   \\n- bar\\n\",\n    \"html\": \"<ul>\\n<li>foo</li>\\n<li></li>\\n<li>bar</li>\\n</ul>\\n\",\n    \"example\": 282,\n    \"start_line\": 4661,\n    \"end_line\": 4671,\n    \"section\": \"List items\"\n  },\n  {\n    \"markdown\": \"1. foo\\n2.\\n3. bar\\n\",\n    \"html\": \"<ol>\\n<li>foo</li>\\n<li></li>\\n<li>bar</li>\\n</ol>\\n\",\n    \"example\": 283,\n    \"start_line\": 4676,\n    \"end_line\": 4686,\n    \"section\": \"List items\"\n  },\n  {\n    \"markdown\": \"*\\n\",\n    \"html\": \"<ul>\\n<li></li>\\n</ul>\\n\",\n    \"example\": 284,\n    \"start_line\": 4691,\n    \"end_line\": 4697,\n    \"section\": \"List items\"\n  },\n  {\n    \"markdown\": \"foo\\n*\\n\\nfoo\\n1.\\n\",\n    \"html\": \"<p>foo\\n*</p>\\n<p>foo\\n1.</p>\\n\",\n    \"example\": 285,\n    \"start_line\": 4701,\n    \"end_line\": 4712,\n    \"section\": \"List items\"\n  },\n  {\n    \"markdown\": \" 1.  A paragraph\\n     with two lines.\\n\\n         indented code\\n\\n     > A block quote.\\n\",\n    \"html\": \"<ol>\\n<li>\\n<p>A paragraph\\nwith two lines.</p>\\n<pre><code>indented code\\n</code></pre>\\n<blockquote>\\n<p>A block quote.</p>\\n</blockquote>\\n</li>\\n</ol>\\n\",\n    \"example\": 286,\n    \"start_line\": 4723,\n    \"end_line\": 4742,\n    \"section\": \"List items\"\n  },\n  {\n    \"markdown\": \"  1.  A paragraph\\n      with two lines.\\n\\n          indented code\\n\\n      > A block quote.\\n\",\n    \"html\": \"<ol>\\n<li>\\n<p>A paragraph\\nwith two lines.</p>\\n<pre><code>indented code\\n</code></pre>\\n<blockquote>\\n<p>A block quote.</p>\\n</blockquote>\\n</li>\\n</ol>\\n\",\n    \"example\": 287,\n    \"start_line\": 4747,\n    \"end_line\": 4766,\n    \"section\": \"List items\"\n  },\n  {\n    \"markdown\": \"   1.  A paragraph\\n       with two lines.\\n\\n           indented code\\n\\n       > A block quote.\\n\",\n    \"html\": \"<ol>\\n<li>\\n<p>A paragraph\\nwith two lines.</p>\\n<pre><code>indented code\\n</code></pre>\\n<blockquote>\\n<p>A block quote.</p>\\n</blockquote>\\n</li>\\n</ol>\\n\",\n    \"example\": 288,\n    \"start_line\": 4771,\n    \"end_line\": 4790,\n    \"section\": \"List items\"\n  },\n  {\n    \"markdown\": \"    1.  A paragraph\\n        with two lines.\\n\\n            indented code\\n\\n        > A block quote.\\n\",\n    \"html\": \"<pre><code>1.  A paragraph\\n    with two lines.\\n\\n        indented code\\n\\n    &gt; A block quote.\\n</code></pre>\\n\",\n    \"example\": 289,\n    \"start_line\": 4795,\n    \"end_line\": 4810,\n    \"section\": \"List items\"\n  },\n  {\n    \"markdown\": \"  1.  A paragraph\\nwith two lines.\\n\\n          indented code\\n\\n      > A block quote.\\n\",\n    \"html\": \"<ol>\\n<li>\\n<p>A paragraph\\nwith two lines.</p>\\n<pre><code>indented code\\n</code></pre>\\n<blockquote>\\n<p>A block quote.</p>\\n</blockquote>\\n</li>\\n</ol>\\n\",\n    \"example\": 290,\n    \"start_line\": 4825,\n    \"end_line\": 4844,\n    \"section\": \"List items\"\n  },\n  {\n    \"markdown\": \"  1.  A paragraph\\n    with two lines.\\n\",\n    \"html\": \"<ol>\\n<li>A paragraph\\nwith two lines.</li>\\n</ol>\\n\",\n    \"example\": 291,\n    \"start_line\": 4849,\n    \"end_line\": 4857,\n    \"section\": \"List items\"\n  },\n  {\n    \"markdown\": \"> 1. > Blockquote\\ncontinued here.\\n\",\n    \"html\": \"<blockquote>\\n<ol>\\n<li>\\n<blockquote>\\n<p>Blockquote\\ncontinued here.</p>\\n</blockquote>\\n</li>\\n</ol>\\n</blockquote>\\n\",\n    \"example\": 292,\n    \"start_line\": 4862,\n    \"end_line\": 4876,\n    \"section\": \"List items\"\n  },\n  {\n    \"markdown\": \"> 1. > Blockquote\\n> continued here.\\n\",\n    \"html\": \"<blockquote>\\n<ol>\\n<li>\\n<blockquote>\\n<p>Blockquote\\ncontinued here.</p>\\n</blockquote>\\n</li>\\n</ol>\\n</blockquote>\\n\",\n    \"example\": 293,\n    \"start_line\": 4879,\n    \"end_line\": 4893,\n    \"section\": \"List items\"\n  },\n  {\n    \"markdown\": \"- foo\\n  - bar\\n    - baz\\n      - boo\\n\",\n    \"html\": \"<ul>\\n<li>foo\\n<ul>\\n<li>bar\\n<ul>\\n<li>baz\\n<ul>\\n<li>boo</li>\\n</ul>\\n</li>\\n</ul>\\n</li>\\n</ul>\\n</li>\\n</ul>\\n\",\n    \"example\": 294,\n    \"start_line\": 4907,\n    \"end_line\": 4928,\n    \"section\": \"List items\"\n  },\n  {\n    \"markdown\": \"- foo\\n - bar\\n  - baz\\n   - boo\\n\",\n    \"html\": \"<ul>\\n<li>foo</li>\\n<li>bar</li>\\n<li>baz</li>\\n<li>boo</li>\\n</ul>\\n\",\n    \"example\": 295,\n    \"start_line\": 4933,\n    \"end_line\": 4945,\n    \"section\": \"List items\"\n  },\n  {\n    \"markdown\": \"10) foo\\n    - bar\\n\",\n    \"html\": \"<ol start=\\\"10\\\">\\n<li>foo\\n<ul>\\n<li>bar</li>\\n</ul>\\n</li>\\n</ol>\\n\",\n    \"example\": 296,\n    \"start_line\": 4950,\n    \"end_line\": 4961,\n    \"section\": \"List items\"\n  },\n  {\n    \"markdown\": \"10) foo\\n   - bar\\n\",\n    \"html\": \"<ol start=\\\"10\\\">\\n<li>foo</li>\\n</ol>\\n<ul>\\n<li>bar</li>\\n</ul>\\n\",\n    \"example\": 297,\n    \"start_line\": 4966,\n    \"end_line\": 4976,\n    \"section\": \"List items\"\n  },\n  {\n    \"markdown\": \"- - foo\\n\",\n    \"html\": \"<ul>\\n<li>\\n<ul>\\n<li>foo</li>\\n</ul>\\n</li>\\n</ul>\\n\",\n    \"example\": 298,\n    \"start_line\": 4981,\n    \"end_line\": 4991,\n    \"section\": \"List items\"\n  },\n  {\n    \"markdown\": \"1. - 2. foo\\n\",\n    \"html\": \"<ol>\\n<li>\\n<ul>\\n<li>\\n<ol start=\\\"2\\\">\\n<li>foo</li>\\n</ol>\\n</li>\\n</ul>\\n</li>\\n</ol>\\n\",\n    \"example\": 299,\n    \"start_line\": 4994,\n    \"end_line\": 5008,\n    \"section\": \"List items\"\n  },\n  {\n    \"markdown\": \"- # Foo\\n- Bar\\n  ---\\n  baz\\n\",\n    \"html\": \"<ul>\\n<li>\\n<h1>Foo</h1>\\n</li>\\n<li>\\n<h2>Bar</h2>\\nbaz</li>\\n</ul>\\n\",\n    \"example\": 300,\n    \"start_line\": 5013,\n    \"end_line\": 5027,\n    \"section\": \"List items\"\n  },\n  {\n    \"markdown\": \"- foo\\n- bar\\n+ baz\\n\",\n    \"html\": \"<ul>\\n<li>foo</li>\\n<li>bar</li>\\n</ul>\\n<ul>\\n<li>baz</li>\\n</ul>\\n\",\n    \"example\": 301,\n    \"start_line\": 5249,\n    \"end_line\": 5261,\n    \"section\": \"Lists\"\n  },\n  {\n    \"markdown\": \"1. foo\\n2. bar\\n3) baz\\n\",\n    \"html\": \"<ol>\\n<li>foo</li>\\n<li>bar</li>\\n</ol>\\n<ol start=\\\"3\\\">\\n<li>baz</li>\\n</ol>\\n\",\n    \"example\": 302,\n    \"start_line\": 5264,\n    \"end_line\": 5276,\n    \"section\": \"Lists\"\n  },\n  {\n    \"markdown\": \"Foo\\n- bar\\n- baz\\n\",\n    \"html\": \"<p>Foo</p>\\n<ul>\\n<li>bar</li>\\n<li>baz</li>\\n</ul>\\n\",\n    \"example\": 303,\n    \"start_line\": 5283,\n    \"end_line\": 5293,\n    \"section\": \"Lists\"\n  },\n  {\n    \"markdown\": \"The number of windows in my house is\\n14.  The number of doors is 6.\\n\",\n    \"html\": \"<p>The number of windows in my house is\\n14.  The number of doors is 6.</p>\\n\",\n    \"example\": 304,\n    \"start_line\": 5360,\n    \"end_line\": 5366,\n    \"section\": \"Lists\"\n  },\n  {\n    \"markdown\": \"The number of windows in my house is\\n1.  The number of doors is 6.\\n\",\n    \"html\": \"<p>The number of windows in my house is</p>\\n<ol>\\n<li>The number of doors is 6.</li>\\n</ol>\\n\",\n    \"example\": 305,\n    \"start_line\": 5370,\n    \"end_line\": 5378,\n    \"section\": \"Lists\"\n  },\n  {\n    \"markdown\": \"- foo\\n\\n- bar\\n\\n\\n- baz\\n\",\n    \"html\": \"<ul>\\n<li>\\n<p>foo</p>\\n</li>\\n<li>\\n<p>bar</p>\\n</li>\\n<li>\\n<p>baz</p>\\n</li>\\n</ul>\\n\",\n    \"example\": 306,\n    \"start_line\": 5384,\n    \"end_line\": 5403,\n    \"section\": \"Lists\"\n  },\n  {\n    \"markdown\": \"- foo\\n  - bar\\n    - baz\\n\\n\\n      bim\\n\",\n    \"html\": \"<ul>\\n<li>foo\\n<ul>\\n<li>bar\\n<ul>\\n<li>\\n<p>baz</p>\\n<p>bim</p>\\n</li>\\n</ul>\\n</li>\\n</ul>\\n</li>\\n</ul>\\n\",\n    \"example\": 307,\n    \"start_line\": 5405,\n    \"end_line\": 5427,\n    \"section\": \"Lists\"\n  },\n  {\n    \"markdown\": \"- foo\\n- bar\\n\\n<!-- -->\\n\\n- baz\\n- bim\\n\",\n    \"html\": \"<ul>\\n<li>foo</li>\\n<li>bar</li>\\n</ul>\\n<!-- -->\\n<ul>\\n<li>baz</li>\\n<li>bim</li>\\n</ul>\\n\",\n    \"example\": 308,\n    \"start_line\": 5435,\n    \"end_line\": 5453,\n    \"section\": \"Lists\"\n  },\n  {\n    \"markdown\": \"-   foo\\n\\n    notcode\\n\\n-   foo\\n\\n<!-- -->\\n\\n    code\\n\",\n    \"html\": \"<ul>\\n<li>\\n<p>foo</p>\\n<p>notcode</p>\\n</li>\\n<li>\\n<p>foo</p>\\n</li>\\n</ul>\\n<!-- -->\\n<pre><code>code\\n</code></pre>\\n\",\n    \"example\": 309,\n    \"start_line\": 5456,\n    \"end_line\": 5479,\n    \"section\": \"Lists\"\n  },\n  {\n    \"markdown\": \"- a\\n - b\\n  - c\\n   - d\\n  - e\\n - f\\n- g\\n\",\n    \"html\": \"<ul>\\n<li>a</li>\\n<li>b</li>\\n<li>c</li>\\n<li>d</li>\\n<li>e</li>\\n<li>f</li>\\n<li>g</li>\\n</ul>\\n\",\n    \"example\": 310,\n    \"start_line\": 5487,\n    \"end_line\": 5505,\n    \"section\": \"Lists\"\n  },\n  {\n    \"markdown\": \"1. a\\n\\n  2. b\\n\\n   3. c\\n\",\n    \"html\": \"<ol>\\n<li>\\n<p>a</p>\\n</li>\\n<li>\\n<p>b</p>\\n</li>\\n<li>\\n<p>c</p>\\n</li>\\n</ol>\\n\",\n    \"example\": 311,\n    \"start_line\": 5508,\n    \"end_line\": 5526,\n    \"section\": \"Lists\"\n  },\n  {\n    \"markdown\": \"- a\\n - b\\n  - c\\n   - d\\n    - e\\n\",\n    \"html\": \"<ul>\\n<li>a</li>\\n<li>b</li>\\n<li>c</li>\\n<li>d\\n- e</li>\\n</ul>\\n\",\n    \"example\": 312,\n    \"start_line\": 5532,\n    \"end_line\": 5546,\n    \"section\": \"Lists\"\n  },\n  {\n    \"markdown\": \"1. a\\n\\n  2. b\\n\\n    3. c\\n\",\n    \"html\": \"<ol>\\n<li>\\n<p>a</p>\\n</li>\\n<li>\\n<p>b</p>\\n</li>\\n</ol>\\n<pre><code>3. c\\n</code></pre>\\n\",\n    \"example\": 313,\n    \"start_line\": 5552,\n    \"end_line\": 5569,\n    \"section\": \"Lists\"\n  },\n  {\n    \"markdown\": \"- a\\n- b\\n\\n- c\\n\",\n    \"html\": \"<ul>\\n<li>\\n<p>a</p>\\n</li>\\n<li>\\n<p>b</p>\\n</li>\\n<li>\\n<p>c</p>\\n</li>\\n</ul>\\n\",\n    \"example\": 314,\n    \"start_line\": 5575,\n    \"end_line\": 5592,\n    \"section\": \"Lists\"\n  },\n  {\n    \"markdown\": \"* a\\n*\\n\\n* c\\n\",\n    \"html\": \"<ul>\\n<li>\\n<p>a</p>\\n</li>\\n<li></li>\\n<li>\\n<p>c</p>\\n</li>\\n</ul>\\n\",\n    \"example\": 315,\n    \"start_line\": 5597,\n    \"end_line\": 5612,\n    \"section\": \"Lists\"\n  },\n  {\n    \"markdown\": \"- a\\n- b\\n\\n  c\\n- d\\n\",\n    \"html\": \"<ul>\\n<li>\\n<p>a</p>\\n</li>\\n<li>\\n<p>b</p>\\n<p>c</p>\\n</li>\\n<li>\\n<p>d</p>\\n</li>\\n</ul>\\n\",\n    \"example\": 316,\n    \"start_line\": 5619,\n    \"end_line\": 5638,\n    \"section\": \"Lists\"\n  },\n  {\n    \"markdown\": \"- a\\n- b\\n\\n  [ref]: /url\\n- d\\n\",\n    \"html\": \"<ul>\\n<li>\\n<p>a</p>\\n</li>\\n<li>\\n<p>b</p>\\n</li>\\n<li>\\n<p>d</p>\\n</li>\\n</ul>\\n\",\n    \"example\": 317,\n    \"start_line\": 5641,\n    \"end_line\": 5659,\n    \"section\": \"Lists\"\n  },\n  {\n    \"markdown\": \"- a\\n- ```\\n  b\\n\\n\\n  ```\\n- c\\n\",\n    \"html\": \"<ul>\\n<li>a</li>\\n<li>\\n<pre><code>b\\n\\n\\n</code></pre>\\n</li>\\n<li>c</li>\\n</ul>\\n\",\n    \"example\": 318,\n    \"start_line\": 5664,\n    \"end_line\": 5683,\n    \"section\": \"Lists\"\n  },\n  {\n    \"markdown\": \"- a\\n  - b\\n\\n    c\\n- d\\n\",\n    \"html\": \"<ul>\\n<li>a\\n<ul>\\n<li>\\n<p>b</p>\\n<p>c</p>\\n</li>\\n</ul>\\n</li>\\n<li>d</li>\\n</ul>\\n\",\n    \"example\": 319,\n    \"start_line\": 5690,\n    \"end_line\": 5708,\n    \"section\": \"Lists\"\n  },\n  {\n    \"markdown\": \"* a\\n  > b\\n  >\\n* c\\n\",\n    \"html\": \"<ul>\\n<li>a\\n<blockquote>\\n<p>b</p>\\n</blockquote>\\n</li>\\n<li>c</li>\\n</ul>\\n\",\n    \"example\": 320,\n    \"start_line\": 5714,\n    \"end_line\": 5728,\n    \"section\": \"Lists\"\n  },\n  {\n    \"markdown\": \"- a\\n  > b\\n  ```\\n  c\\n  ```\\n- d\\n\",\n    \"html\": \"<ul>\\n<li>a\\n<blockquote>\\n<p>b</p>\\n</blockquote>\\n<pre><code>c\\n</code></pre>\\n</li>\\n<li>d</li>\\n</ul>\\n\",\n    \"example\": 321,\n    \"start_line\": 5734,\n    \"end_line\": 5752,\n    \"section\": \"Lists\"\n  },\n  {\n    \"markdown\": \"- a\\n\",\n    \"html\": \"<ul>\\n<li>a</li>\\n</ul>\\n\",\n    \"example\": 322,\n    \"start_line\": 5757,\n    \"end_line\": 5763,\n    \"section\": \"Lists\"\n  },\n  {\n    \"markdown\": \"- a\\n  - b\\n\",\n    \"html\": \"<ul>\\n<li>a\\n<ul>\\n<li>b</li>\\n</ul>\\n</li>\\n</ul>\\n\",\n    \"example\": 323,\n    \"start_line\": 5766,\n    \"end_line\": 5777,\n    \"section\": \"Lists\"\n  },\n  {\n    \"markdown\": \"1. ```\\n   foo\\n   ```\\n\\n   bar\\n\",\n    \"html\": \"<ol>\\n<li>\\n<pre><code>foo\\n</code></pre>\\n<p>bar</p>\\n</li>\\n</ol>\\n\",\n    \"example\": 324,\n    \"start_line\": 5783,\n    \"end_line\": 5797,\n    \"section\": \"Lists\"\n  },\n  {\n    \"markdown\": \"* foo\\n  * bar\\n\\n  baz\\n\",\n    \"html\": \"<ul>\\n<li>\\n<p>foo</p>\\n<ul>\\n<li>bar</li>\\n</ul>\\n<p>baz</p>\\n</li>\\n</ul>\\n\",\n    \"example\": 325,\n    \"start_line\": 5802,\n    \"end_line\": 5817,\n    \"section\": \"Lists\"\n  },\n  {\n    \"markdown\": \"- a\\n  - b\\n  - c\\n\\n- d\\n  - e\\n  - f\\n\",\n    \"html\": \"<ul>\\n<li>\\n<p>a</p>\\n<ul>\\n<li>b</li>\\n<li>c</li>\\n</ul>\\n</li>\\n<li>\\n<p>d</p>\\n<ul>\\n<li>e</li>\\n<li>f</li>\\n</ul>\\n</li>\\n</ul>\\n\",\n    \"example\": 326,\n    \"start_line\": 5820,\n    \"end_line\": 5845,\n    \"section\": \"Lists\"\n  },\n  {\n    \"markdown\": \"`hi`lo`\\n\",\n    \"html\": \"<p><code>hi</code>lo`</p>\\n\",\n    \"example\": 327,\n    \"start_line\": 5854,\n    \"end_line\": 5858,\n    \"section\": \"Inlines\"\n  },\n  {\n    \"markdown\": \"`foo`\\n\",\n    \"html\": \"<p><code>foo</code></p>\\n\",\n    \"example\": 328,\n    \"start_line\": 5886,\n    \"end_line\": 5890,\n    \"section\": \"Code spans\"\n  },\n  {\n    \"markdown\": \"`` foo ` bar ``\\n\",\n    \"html\": \"<p><code>foo ` bar</code></p>\\n\",\n    \"example\": 329,\n    \"start_line\": 5897,\n    \"end_line\": 5901,\n    \"section\": \"Code spans\"\n  },\n  {\n    \"markdown\": \"` `` `\\n\",\n    \"html\": \"<p><code>``</code></p>\\n\",\n    \"example\": 330,\n    \"start_line\": 5907,\n    \"end_line\": 5911,\n    \"section\": \"Code spans\"\n  },\n  {\n    \"markdown\": \"`  ``  `\\n\",\n    \"html\": \"<p><code> `` </code></p>\\n\",\n    \"example\": 331,\n    \"start_line\": 5915,\n    \"end_line\": 5919,\n    \"section\": \"Code spans\"\n  },\n  {\n    \"markdown\": \"` a`\\n\",\n    \"html\": \"<p><code> a</code></p>\\n\",\n    \"example\": 332,\n    \"start_line\": 5924,\n    \"end_line\": 5928,\n    \"section\": \"Code spans\"\n  },\n  {\n    \"markdown\": \"` b `\\n\",\n    \"html\": \"<p><code> b </code></p>\\n\",\n    \"example\": 333,\n    \"start_line\": 5933,\n    \"end_line\": 5937,\n    \"section\": \"Code spans\"\n  },\n  {\n    \"markdown\": \"` `\\n`  `\\n\",\n    \"html\": \"<p><code> </code>\\n<code>  </code></p>\\n\",\n    \"example\": 334,\n    \"start_line\": 5941,\n    \"end_line\": 5947,\n    \"section\": \"Code spans\"\n  },\n  {\n    \"markdown\": \"``\\nfoo\\nbar  \\nbaz\\n``\\n\",\n    \"html\": \"<p><code>foo bar   baz</code></p>\\n\",\n    \"example\": 335,\n    \"start_line\": 5952,\n    \"end_line\": 5960,\n    \"section\": \"Code spans\"\n  },\n  {\n    \"markdown\": \"``\\nfoo \\n``\\n\",\n    \"html\": \"<p><code>foo </code></p>\\n\",\n    \"example\": 336,\n    \"start_line\": 5962,\n    \"end_line\": 5968,\n    \"section\": \"Code spans\"\n  },\n  {\n    \"markdown\": \"`foo   bar \\nbaz`\\n\",\n    \"html\": \"<p><code>foo   bar  baz</code></p>\\n\",\n    \"example\": 337,\n    \"start_line\": 5973,\n    \"end_line\": 5978,\n    \"section\": \"Code spans\"\n  },\n  {\n    \"markdown\": \"`foo\\\\`bar`\\n\",\n    \"html\": \"<p><code>foo\\\\</code>bar`</p>\\n\",\n    \"example\": 338,\n    \"start_line\": 5990,\n    \"end_line\": 5994,\n    \"section\": \"Code spans\"\n  },\n  {\n    \"markdown\": \"``foo`bar``\\n\",\n    \"html\": \"<p><code>foo`bar</code></p>\\n\",\n    \"example\": 339,\n    \"start_line\": 6001,\n    \"end_line\": 6005,\n    \"section\": \"Code spans\"\n  },\n  {\n    \"markdown\": \"` foo `` bar `\\n\",\n    \"html\": \"<p><code>foo `` bar</code></p>\\n\",\n    \"example\": 340,\n    \"start_line\": 6007,\n    \"end_line\": 6011,\n    \"section\": \"Code spans\"\n  },\n  {\n    \"markdown\": \"*foo`*`\\n\",\n    \"html\": \"<p>*foo<code>*</code></p>\\n\",\n    \"example\": 341,\n    \"start_line\": 6019,\n    \"end_line\": 6023,\n    \"section\": \"Code spans\"\n  },\n  {\n    \"markdown\": \"[not a `link](/foo`)\\n\",\n    \"html\": \"<p>[not a <code>link](/foo</code>)</p>\\n\",\n    \"example\": 342,\n    \"start_line\": 6028,\n    \"end_line\": 6032,\n    \"section\": \"Code spans\"\n  },\n  {\n    \"markdown\": \"`<a href=\\\"`\\\">`\\n\",\n    \"html\": \"<p><code>&lt;a href=&quot;</code>&quot;&gt;`</p>\\n\",\n    \"example\": 343,\n    \"start_line\": 6038,\n    \"end_line\": 6042,\n    \"section\": \"Code spans\"\n  },\n  {\n    \"markdown\": \"<a href=\\\"`\\\">`\\n\",\n    \"html\": \"<p><a href=\\\"`\\\">`</p>\\n\",\n    \"example\": 344,\n    \"start_line\": 6047,\n    \"end_line\": 6051,\n    \"section\": \"Code spans\"\n  },\n  {\n    \"markdown\": \"`<https://foo.bar.`baz>`\\n\",\n    \"html\": \"<p><code>&lt;https://foo.bar.</code>baz&gt;`</p>\\n\",\n    \"example\": 345,\n    \"start_line\": 6056,\n    \"end_line\": 6060,\n    \"section\": \"Code spans\"\n  },\n  {\n    \"markdown\": \"<https://foo.bar.`baz>`\\n\",\n    \"html\": \"<p><a href=\\\"https://foo.bar.%60baz\\\">https://foo.bar.`baz</a>`</p>\\n\",\n    \"example\": 346,\n    \"start_line\": 6065,\n    \"end_line\": 6069,\n    \"section\": \"Code spans\"\n  },\n  {\n    \"markdown\": \"```foo``\\n\",\n    \"html\": \"<p>```foo``</p>\\n\",\n    \"example\": 347,\n    \"start_line\": 6075,\n    \"end_line\": 6079,\n    \"section\": \"Code spans\"\n  },\n  {\n    \"markdown\": \"`foo\\n\",\n    \"html\": \"<p>`foo</p>\\n\",\n    \"example\": 348,\n    \"start_line\": 6082,\n    \"end_line\": 6086,\n    \"section\": \"Code spans\"\n  },\n  {\n    \"markdown\": \"`foo``bar``\\n\",\n    \"html\": \"<p>`foo<code>bar</code></p>\\n\",\n    \"example\": 349,\n    \"start_line\": 6091,\n    \"end_line\": 6095,\n    \"section\": \"Code spans\"\n  },\n  {\n    \"markdown\": \"*foo bar*\\n\",\n    \"html\": \"<p><em>foo bar</em></p>\\n\",\n    \"example\": 350,\n    \"start_line\": 6308,\n    \"end_line\": 6312,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"a * foo bar*\\n\",\n    \"html\": \"<p>a * foo bar*</p>\\n\",\n    \"example\": 351,\n    \"start_line\": 6318,\n    \"end_line\": 6322,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"a*\\\"foo\\\"*\\n\",\n    \"html\": \"<p>a*&quot;foo&quot;*</p>\\n\",\n    \"example\": 352,\n    \"start_line\": 6329,\n    \"end_line\": 6333,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"* a *\\n\",\n    \"html\": \"<p>* a *</p>\\n\",\n    \"example\": 353,\n    \"start_line\": 6338,\n    \"end_line\": 6342,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"*$*alpha.\\n\\n*£*bravo.\\n\\n*€*charlie.\\n\",\n    \"html\": \"<p>*$*alpha.</p>\\n<p>*£*bravo.</p>\\n<p>*€*charlie.</p>\\n\",\n    \"example\": 354,\n    \"start_line\": 6347,\n    \"end_line\": 6357,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"foo*bar*\\n\",\n    \"html\": \"<p>foo<em>bar</em></p>\\n\",\n    \"example\": 355,\n    \"start_line\": 6362,\n    \"end_line\": 6366,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"5*6*78\\n\",\n    \"html\": \"<p>5<em>6</em>78</p>\\n\",\n    \"example\": 356,\n    \"start_line\": 6369,\n    \"end_line\": 6373,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"_foo bar_\\n\",\n    \"html\": \"<p><em>foo bar</em></p>\\n\",\n    \"example\": 357,\n    \"start_line\": 6378,\n    \"end_line\": 6382,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"_ foo bar_\\n\",\n    \"html\": \"<p>_ foo bar_</p>\\n\",\n    \"example\": 358,\n    \"start_line\": 6388,\n    \"end_line\": 6392,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"a_\\\"foo\\\"_\\n\",\n    \"html\": \"<p>a_&quot;foo&quot;_</p>\\n\",\n    \"example\": 359,\n    \"start_line\": 6398,\n    \"end_line\": 6402,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"foo_bar_\\n\",\n    \"html\": \"<p>foo_bar_</p>\\n\",\n    \"example\": 360,\n    \"start_line\": 6407,\n    \"end_line\": 6411,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"5_6_78\\n\",\n    \"html\": \"<p>5_6_78</p>\\n\",\n    \"example\": 361,\n    \"start_line\": 6414,\n    \"end_line\": 6418,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"пристаням_стремятся_\\n\",\n    \"html\": \"<p>пристаням_стремятся_</p>\\n\",\n    \"example\": 362,\n    \"start_line\": 6421,\n    \"end_line\": 6425,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"aa_\\\"bb\\\"_cc\\n\",\n    \"html\": \"<p>aa_&quot;bb&quot;_cc</p>\\n\",\n    \"example\": 363,\n    \"start_line\": 6431,\n    \"end_line\": 6435,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"foo-_(bar)_\\n\",\n    \"html\": \"<p>foo-<em>(bar)</em></p>\\n\",\n    \"example\": 364,\n    \"start_line\": 6442,\n    \"end_line\": 6446,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"_foo*\\n\",\n    \"html\": \"<p>_foo*</p>\\n\",\n    \"example\": 365,\n    \"start_line\": 6454,\n    \"end_line\": 6458,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"*foo bar *\\n\",\n    \"html\": \"<p>*foo bar *</p>\\n\",\n    \"example\": 366,\n    \"start_line\": 6464,\n    \"end_line\": 6468,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"*foo bar\\n*\\n\",\n    \"html\": \"<p>*foo bar\\n*</p>\\n\",\n    \"example\": 367,\n    \"start_line\": 6473,\n    \"end_line\": 6479,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"*(*foo)\\n\",\n    \"html\": \"<p>*(*foo)</p>\\n\",\n    \"example\": 368,\n    \"start_line\": 6486,\n    \"end_line\": 6490,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"*(*foo*)*\\n\",\n    \"html\": \"<p><em>(<em>foo</em>)</em></p>\\n\",\n    \"example\": 369,\n    \"start_line\": 6496,\n    \"end_line\": 6500,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"*foo*bar\\n\",\n    \"html\": \"<p><em>foo</em>bar</p>\\n\",\n    \"example\": 370,\n    \"start_line\": 6505,\n    \"end_line\": 6509,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"_foo bar _\\n\",\n    \"html\": \"<p>_foo bar _</p>\\n\",\n    \"example\": 371,\n    \"start_line\": 6518,\n    \"end_line\": 6522,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"_(_foo)\\n\",\n    \"html\": \"<p>_(_foo)</p>\\n\",\n    \"example\": 372,\n    \"start_line\": 6528,\n    \"end_line\": 6532,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"_(_foo_)_\\n\",\n    \"html\": \"<p><em>(<em>foo</em>)</em></p>\\n\",\n    \"example\": 373,\n    \"start_line\": 6537,\n    \"end_line\": 6541,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"_foo_bar\\n\",\n    \"html\": \"<p>_foo_bar</p>\\n\",\n    \"example\": 374,\n    \"start_line\": 6546,\n    \"end_line\": 6550,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"_пристаням_стремятся\\n\",\n    \"html\": \"<p>_пристаням_стремятся</p>\\n\",\n    \"example\": 375,\n    \"start_line\": 6553,\n    \"end_line\": 6557,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"_foo_bar_baz_\\n\",\n    \"html\": \"<p><em>foo_bar_baz</em></p>\\n\",\n    \"example\": 376,\n    \"start_line\": 6560,\n    \"end_line\": 6564,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"_(bar)_.\\n\",\n    \"html\": \"<p><em>(bar)</em>.</p>\\n\",\n    \"example\": 377,\n    \"start_line\": 6571,\n    \"end_line\": 6575,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"**foo bar**\\n\",\n    \"html\": \"<p><strong>foo bar</strong></p>\\n\",\n    \"example\": 378,\n    \"start_line\": 6580,\n    \"end_line\": 6584,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"** foo bar**\\n\",\n    \"html\": \"<p>** foo bar**</p>\\n\",\n    \"example\": 379,\n    \"start_line\": 6590,\n    \"end_line\": 6594,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"a**\\\"foo\\\"**\\n\",\n    \"html\": \"<p>a**&quot;foo&quot;**</p>\\n\",\n    \"example\": 380,\n    \"start_line\": 6601,\n    \"end_line\": 6605,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"foo**bar**\\n\",\n    \"html\": \"<p>foo<strong>bar</strong></p>\\n\",\n    \"example\": 381,\n    \"start_line\": 6610,\n    \"end_line\": 6614,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"__foo bar__\\n\",\n    \"html\": \"<p><strong>foo bar</strong></p>\\n\",\n    \"example\": 382,\n    \"start_line\": 6619,\n    \"end_line\": 6623,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"__ foo bar__\\n\",\n    \"html\": \"<p>__ foo bar__</p>\\n\",\n    \"example\": 383,\n    \"start_line\": 6629,\n    \"end_line\": 6633,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"__\\nfoo bar__\\n\",\n    \"html\": \"<p>__\\nfoo bar__</p>\\n\",\n    \"example\": 384,\n    \"start_line\": 6637,\n    \"end_line\": 6643,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"a__\\\"foo\\\"__\\n\",\n    \"html\": \"<p>a__&quot;foo&quot;__</p>\\n\",\n    \"example\": 385,\n    \"start_line\": 6649,\n    \"end_line\": 6653,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"foo__bar__\\n\",\n    \"html\": \"<p>foo__bar__</p>\\n\",\n    \"example\": 386,\n    \"start_line\": 6658,\n    \"end_line\": 6662,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"5__6__78\\n\",\n    \"html\": \"<p>5__6__78</p>\\n\",\n    \"example\": 387,\n    \"start_line\": 6665,\n    \"end_line\": 6669,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"пристаням__стремятся__\\n\",\n    \"html\": \"<p>пристаням__стремятся__</p>\\n\",\n    \"example\": 388,\n    \"start_line\": 6672,\n    \"end_line\": 6676,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"__foo, __bar__, baz__\\n\",\n    \"html\": \"<p><strong>foo, <strong>bar</strong>, baz</strong></p>\\n\",\n    \"example\": 389,\n    \"start_line\": 6679,\n    \"end_line\": 6683,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"foo-__(bar)__\\n\",\n    \"html\": \"<p>foo-<strong>(bar)</strong></p>\\n\",\n    \"example\": 390,\n    \"start_line\": 6690,\n    \"end_line\": 6694,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"**foo bar **\\n\",\n    \"html\": \"<p>**foo bar **</p>\\n\",\n    \"example\": 391,\n    \"start_line\": 6703,\n    \"end_line\": 6707,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"**(**foo)\\n\",\n    \"html\": \"<p>**(**foo)</p>\\n\",\n    \"example\": 392,\n    \"start_line\": 6716,\n    \"end_line\": 6720,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"*(**foo**)*\\n\",\n    \"html\": \"<p><em>(<strong>foo</strong>)</em></p>\\n\",\n    \"example\": 393,\n    \"start_line\": 6726,\n    \"end_line\": 6730,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"**Gomphocarpus (*Gomphocarpus physocarpus*, syn.\\n*Asclepias physocarpa*)**\\n\",\n    \"html\": \"<p><strong>Gomphocarpus (<em>Gomphocarpus physocarpus</em>, syn.\\n<em>Asclepias physocarpa</em>)</strong></p>\\n\",\n    \"example\": 394,\n    \"start_line\": 6733,\n    \"end_line\": 6739,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"**foo \\\"*bar*\\\" foo**\\n\",\n    \"html\": \"<p><strong>foo &quot;<em>bar</em>&quot; foo</strong></p>\\n\",\n    \"example\": 395,\n    \"start_line\": 6742,\n    \"end_line\": 6746,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"**foo**bar\\n\",\n    \"html\": \"<p><strong>foo</strong>bar</p>\\n\",\n    \"example\": 396,\n    \"start_line\": 6751,\n    \"end_line\": 6755,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"__foo bar __\\n\",\n    \"html\": \"<p>__foo bar __</p>\\n\",\n    \"example\": 397,\n    \"start_line\": 6763,\n    \"end_line\": 6767,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"__(__foo)\\n\",\n    \"html\": \"<p>__(__foo)</p>\\n\",\n    \"example\": 398,\n    \"start_line\": 6773,\n    \"end_line\": 6777,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"_(__foo__)_\\n\",\n    \"html\": \"<p><em>(<strong>foo</strong>)</em></p>\\n\",\n    \"example\": 399,\n    \"start_line\": 6783,\n    \"end_line\": 6787,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"__foo__bar\\n\",\n    \"html\": \"<p>__foo__bar</p>\\n\",\n    \"example\": 400,\n    \"start_line\": 6792,\n    \"end_line\": 6796,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"__пристаням__стремятся\\n\",\n    \"html\": \"<p>__пристаням__стремятся</p>\\n\",\n    \"example\": 401,\n    \"start_line\": 6799,\n    \"end_line\": 6803,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"__foo__bar__baz__\\n\",\n    \"html\": \"<p><strong>foo__bar__baz</strong></p>\\n\",\n    \"example\": 402,\n    \"start_line\": 6806,\n    \"end_line\": 6810,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"__(bar)__.\\n\",\n    \"html\": \"<p><strong>(bar)</strong>.</p>\\n\",\n    \"example\": 403,\n    \"start_line\": 6817,\n    \"end_line\": 6821,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"*foo [bar](/url)*\\n\",\n    \"html\": \"<p><em>foo <a href=\\\"/url\\\">bar</a></em></p>\\n\",\n    \"example\": 404,\n    \"start_line\": 6829,\n    \"end_line\": 6833,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"*foo\\nbar*\\n\",\n    \"html\": \"<p><em>foo\\nbar</em></p>\\n\",\n    \"example\": 405,\n    \"start_line\": 6836,\n    \"end_line\": 6842,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"_foo __bar__ baz_\\n\",\n    \"html\": \"<p><em>foo <strong>bar</strong> baz</em></p>\\n\",\n    \"example\": 406,\n    \"start_line\": 6848,\n    \"end_line\": 6852,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"_foo _bar_ baz_\\n\",\n    \"html\": \"<p><em>foo <em>bar</em> baz</em></p>\\n\",\n    \"example\": 407,\n    \"start_line\": 6855,\n    \"end_line\": 6859,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"__foo_ bar_\\n\",\n    \"html\": \"<p><em><em>foo</em> bar</em></p>\\n\",\n    \"example\": 408,\n    \"start_line\": 6862,\n    \"end_line\": 6866,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"*foo *bar**\\n\",\n    \"html\": \"<p><em>foo <em>bar</em></em></p>\\n\",\n    \"example\": 409,\n    \"start_line\": 6869,\n    \"end_line\": 6873,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"*foo **bar** baz*\\n\",\n    \"html\": \"<p><em>foo <strong>bar</strong> baz</em></p>\\n\",\n    \"example\": 410,\n    \"start_line\": 6876,\n    \"end_line\": 6880,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"*foo**bar**baz*\\n\",\n    \"html\": \"<p><em>foo<strong>bar</strong>baz</em></p>\\n\",\n    \"example\": 411,\n    \"start_line\": 6882,\n    \"end_line\": 6886,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"*foo**bar*\\n\",\n    \"html\": \"<p><em>foo**bar</em></p>\\n\",\n    \"example\": 412,\n    \"start_line\": 6906,\n    \"end_line\": 6910,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"***foo** bar*\\n\",\n    \"html\": \"<p><em><strong>foo</strong> bar</em></p>\\n\",\n    \"example\": 413,\n    \"start_line\": 6919,\n    \"end_line\": 6923,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"*foo **bar***\\n\",\n    \"html\": \"<p><em>foo <strong>bar</strong></em></p>\\n\",\n    \"example\": 414,\n    \"start_line\": 6926,\n    \"end_line\": 6930,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"*foo**bar***\\n\",\n    \"html\": \"<p><em>foo<strong>bar</strong></em></p>\\n\",\n    \"example\": 415,\n    \"start_line\": 6933,\n    \"end_line\": 6937,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"foo***bar***baz\\n\",\n    \"html\": \"<p>foo<em><strong>bar</strong></em>baz</p>\\n\",\n    \"example\": 416,\n    \"start_line\": 6944,\n    \"end_line\": 6948,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"foo******bar*********baz\\n\",\n    \"html\": \"<p>foo<strong><strong><strong>bar</strong></strong></strong>***baz</p>\\n\",\n    \"example\": 417,\n    \"start_line\": 6950,\n    \"end_line\": 6954,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"*foo **bar *baz* bim** bop*\\n\",\n    \"html\": \"<p><em>foo <strong>bar <em>baz</em> bim</strong> bop</em></p>\\n\",\n    \"example\": 418,\n    \"start_line\": 6959,\n    \"end_line\": 6963,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"*foo [*bar*](/url)*\\n\",\n    \"html\": \"<p><em>foo <a href=\\\"/url\\\"><em>bar</em></a></em></p>\\n\",\n    \"example\": 419,\n    \"start_line\": 6966,\n    \"end_line\": 6970,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"** is not an empty emphasis\\n\",\n    \"html\": \"<p>** is not an empty emphasis</p>\\n\",\n    \"example\": 420,\n    \"start_line\": 6975,\n    \"end_line\": 6979,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"**** is not an empty strong emphasis\\n\",\n    \"html\": \"<p>**** is not an empty strong emphasis</p>\\n\",\n    \"example\": 421,\n    \"start_line\": 6982,\n    \"end_line\": 6986,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"**foo [bar](/url)**\\n\",\n    \"html\": \"<p><strong>foo <a href=\\\"/url\\\">bar</a></strong></p>\\n\",\n    \"example\": 422,\n    \"start_line\": 6995,\n    \"end_line\": 6999,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"**foo\\nbar**\\n\",\n    \"html\": \"<p><strong>foo\\nbar</strong></p>\\n\",\n    \"example\": 423,\n    \"start_line\": 7002,\n    \"end_line\": 7008,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"__foo _bar_ baz__\\n\",\n    \"html\": \"<p><strong>foo <em>bar</em> baz</strong></p>\\n\",\n    \"example\": 424,\n    \"start_line\": 7014,\n    \"end_line\": 7018,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"__foo __bar__ baz__\\n\",\n    \"html\": \"<p><strong>foo <strong>bar</strong> baz</strong></p>\\n\",\n    \"example\": 425,\n    \"start_line\": 7021,\n    \"end_line\": 7025,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"____foo__ bar__\\n\",\n    \"html\": \"<p><strong><strong>foo</strong> bar</strong></p>\\n\",\n    \"example\": 426,\n    \"start_line\": 7028,\n    \"end_line\": 7032,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"**foo **bar****\\n\",\n    \"html\": \"<p><strong>foo <strong>bar</strong></strong></p>\\n\",\n    \"example\": 427,\n    \"start_line\": 7035,\n    \"end_line\": 7039,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"**foo *bar* baz**\\n\",\n    \"html\": \"<p><strong>foo <em>bar</em> baz</strong></p>\\n\",\n    \"example\": 428,\n    \"start_line\": 7042,\n    \"end_line\": 7046,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"**foo*bar*baz**\\n\",\n    \"html\": \"<p><strong>foo<em>bar</em>baz</strong></p>\\n\",\n    \"example\": 429,\n    \"start_line\": 7049,\n    \"end_line\": 7053,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"***foo* bar**\\n\",\n    \"html\": \"<p><strong><em>foo</em> bar</strong></p>\\n\",\n    \"example\": 430,\n    \"start_line\": 7056,\n    \"end_line\": 7060,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"**foo *bar***\\n\",\n    \"html\": \"<p><strong>foo <em>bar</em></strong></p>\\n\",\n    \"example\": 431,\n    \"start_line\": 7063,\n    \"end_line\": 7067,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"**foo *bar **baz**\\nbim* bop**\\n\",\n    \"html\": \"<p><strong>foo <em>bar <strong>baz</strong>\\nbim</em> bop</strong></p>\\n\",\n    \"example\": 432,\n    \"start_line\": 7072,\n    \"end_line\": 7078,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"**foo [*bar*](/url)**\\n\",\n    \"html\": \"<p><strong>foo <a href=\\\"/url\\\"><em>bar</em></a></strong></p>\\n\",\n    \"example\": 433,\n    \"start_line\": 7081,\n    \"end_line\": 7085,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"__ is not an empty emphasis\\n\",\n    \"html\": \"<p>__ is not an empty emphasis</p>\\n\",\n    \"example\": 434,\n    \"start_line\": 7090,\n    \"end_line\": 7094,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"____ is not an empty strong emphasis\\n\",\n    \"html\": \"<p>____ is not an empty strong emphasis</p>\\n\",\n    \"example\": 435,\n    \"start_line\": 7097,\n    \"end_line\": 7101,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"foo ***\\n\",\n    \"html\": \"<p>foo ***</p>\\n\",\n    \"example\": 436,\n    \"start_line\": 7107,\n    \"end_line\": 7111,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"foo *\\\\**\\n\",\n    \"html\": \"<p>foo <em>*</em></p>\\n\",\n    \"example\": 437,\n    \"start_line\": 7114,\n    \"end_line\": 7118,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"foo *_*\\n\",\n    \"html\": \"<p>foo <em>_</em></p>\\n\",\n    \"example\": 438,\n    \"start_line\": 7121,\n    \"end_line\": 7125,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"foo *****\\n\",\n    \"html\": \"<p>foo *****</p>\\n\",\n    \"example\": 439,\n    \"start_line\": 7128,\n    \"end_line\": 7132,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"foo **\\\\***\\n\",\n    \"html\": \"<p>foo <strong>*</strong></p>\\n\",\n    \"example\": 440,\n    \"start_line\": 7135,\n    \"end_line\": 7139,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"foo **_**\\n\",\n    \"html\": \"<p>foo <strong>_</strong></p>\\n\",\n    \"example\": 441,\n    \"start_line\": 7142,\n    \"end_line\": 7146,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"**foo*\\n\",\n    \"html\": \"<p>*<em>foo</em></p>\\n\",\n    \"example\": 442,\n    \"start_line\": 7153,\n    \"end_line\": 7157,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"*foo**\\n\",\n    \"html\": \"<p><em>foo</em>*</p>\\n\",\n    \"example\": 443,\n    \"start_line\": 7160,\n    \"end_line\": 7164,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"***foo**\\n\",\n    \"html\": \"<p>*<strong>foo</strong></p>\\n\",\n    \"example\": 444,\n    \"start_line\": 7167,\n    \"end_line\": 7171,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"****foo*\\n\",\n    \"html\": \"<p>***<em>foo</em></p>\\n\",\n    \"example\": 445,\n    \"start_line\": 7174,\n    \"end_line\": 7178,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"**foo***\\n\",\n    \"html\": \"<p><strong>foo</strong>*</p>\\n\",\n    \"example\": 446,\n    \"start_line\": 7181,\n    \"end_line\": 7185,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"*foo****\\n\",\n    \"html\": \"<p><em>foo</em>***</p>\\n\",\n    \"example\": 447,\n    \"start_line\": 7188,\n    \"end_line\": 7192,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"foo ___\\n\",\n    \"html\": \"<p>foo ___</p>\\n\",\n    \"example\": 448,\n    \"start_line\": 7198,\n    \"end_line\": 7202,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"foo _\\\\__\\n\",\n    \"html\": \"<p>foo <em>_</em></p>\\n\",\n    \"example\": 449,\n    \"start_line\": 7205,\n    \"end_line\": 7209,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"foo _*_\\n\",\n    \"html\": \"<p>foo <em>*</em></p>\\n\",\n    \"example\": 450,\n    \"start_line\": 7212,\n    \"end_line\": 7216,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"foo _____\\n\",\n    \"html\": \"<p>foo _____</p>\\n\",\n    \"example\": 451,\n    \"start_line\": 7219,\n    \"end_line\": 7223,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"foo __\\\\___\\n\",\n    \"html\": \"<p>foo <strong>_</strong></p>\\n\",\n    \"example\": 452,\n    \"start_line\": 7226,\n    \"end_line\": 7230,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"foo __*__\\n\",\n    \"html\": \"<p>foo <strong>*</strong></p>\\n\",\n    \"example\": 453,\n    \"start_line\": 7233,\n    \"end_line\": 7237,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"__foo_\\n\",\n    \"html\": \"<p>_<em>foo</em></p>\\n\",\n    \"example\": 454,\n    \"start_line\": 7240,\n    \"end_line\": 7244,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"_foo__\\n\",\n    \"html\": \"<p><em>foo</em>_</p>\\n\",\n    \"example\": 455,\n    \"start_line\": 7251,\n    \"end_line\": 7255,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"___foo__\\n\",\n    \"html\": \"<p>_<strong>foo</strong></p>\\n\",\n    \"example\": 456,\n    \"start_line\": 7258,\n    \"end_line\": 7262,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"____foo_\\n\",\n    \"html\": \"<p>___<em>foo</em></p>\\n\",\n    \"example\": 457,\n    \"start_line\": 7265,\n    \"end_line\": 7269,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"__foo___\\n\",\n    \"html\": \"<p><strong>foo</strong>_</p>\\n\",\n    \"example\": 458,\n    \"start_line\": 7272,\n    \"end_line\": 7276,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"_foo____\\n\",\n    \"html\": \"<p><em>foo</em>___</p>\\n\",\n    \"example\": 459,\n    \"start_line\": 7279,\n    \"end_line\": 7283,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"**foo**\\n\",\n    \"html\": \"<p><strong>foo</strong></p>\\n\",\n    \"example\": 460,\n    \"start_line\": 7289,\n    \"end_line\": 7293,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"*_foo_*\\n\",\n    \"html\": \"<p><em><em>foo</em></em></p>\\n\",\n    \"example\": 461,\n    \"start_line\": 7296,\n    \"end_line\": 7300,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"__foo__\\n\",\n    \"html\": \"<p><strong>foo</strong></p>\\n\",\n    \"example\": 462,\n    \"start_line\": 7303,\n    \"end_line\": 7307,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"_*foo*_\\n\",\n    \"html\": \"<p><em><em>foo</em></em></p>\\n\",\n    \"example\": 463,\n    \"start_line\": 7310,\n    \"end_line\": 7314,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"****foo****\\n\",\n    \"html\": \"<p><strong><strong>foo</strong></strong></p>\\n\",\n    \"example\": 464,\n    \"start_line\": 7320,\n    \"end_line\": 7324,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"____foo____\\n\",\n    \"html\": \"<p><strong><strong>foo</strong></strong></p>\\n\",\n    \"example\": 465,\n    \"start_line\": 7327,\n    \"end_line\": 7331,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"******foo******\\n\",\n    \"html\": \"<p><strong><strong><strong>foo</strong></strong></strong></p>\\n\",\n    \"example\": 466,\n    \"start_line\": 7338,\n    \"end_line\": 7342,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"***foo***\\n\",\n    \"html\": \"<p><em><strong>foo</strong></em></p>\\n\",\n    \"example\": 467,\n    \"start_line\": 7347,\n    \"end_line\": 7351,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"_____foo_____\\n\",\n    \"html\": \"<p><em><strong><strong>foo</strong></strong></em></p>\\n\",\n    \"example\": 468,\n    \"start_line\": 7354,\n    \"end_line\": 7358,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"*foo _bar* baz_\\n\",\n    \"html\": \"<p><em>foo _bar</em> baz_</p>\\n\",\n    \"example\": 469,\n    \"start_line\": 7363,\n    \"end_line\": 7367,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"*foo __bar *baz bim__ bam*\\n\",\n    \"html\": \"<p><em>foo <strong>bar *baz bim</strong> bam</em></p>\\n\",\n    \"example\": 470,\n    \"start_line\": 7370,\n    \"end_line\": 7374,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"**foo **bar baz**\\n\",\n    \"html\": \"<p>**foo <strong>bar baz</strong></p>\\n\",\n    \"example\": 471,\n    \"start_line\": 7379,\n    \"end_line\": 7383,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"*foo *bar baz*\\n\",\n    \"html\": \"<p>*foo <em>bar baz</em></p>\\n\",\n    \"example\": 472,\n    \"start_line\": 7386,\n    \"end_line\": 7390,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"*[bar*](/url)\\n\",\n    \"html\": \"<p>*<a href=\\\"/url\\\">bar*</a></p>\\n\",\n    \"example\": 473,\n    \"start_line\": 7395,\n    \"end_line\": 7399,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"_foo [bar_](/url)\\n\",\n    \"html\": \"<p>_foo <a href=\\\"/url\\\">bar_</a></p>\\n\",\n    \"example\": 474,\n    \"start_line\": 7402,\n    \"end_line\": 7406,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"*<img src=\\\"foo\\\" title=\\\"*\\\"/>\\n\",\n    \"html\": \"<p>*<img src=\\\"foo\\\" title=\\\"*\\\"/></p>\\n\",\n    \"example\": 475,\n    \"start_line\": 7409,\n    \"end_line\": 7413,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"**<a href=\\\"**\\\">\\n\",\n    \"html\": \"<p>**<a href=\\\"**\\\"></p>\\n\",\n    \"example\": 476,\n    \"start_line\": 7416,\n    \"end_line\": 7420,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"__<a href=\\\"__\\\">\\n\",\n    \"html\": \"<p>__<a href=\\\"__\\\"></p>\\n\",\n    \"example\": 477,\n    \"start_line\": 7423,\n    \"end_line\": 7427,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"*a `*`*\\n\",\n    \"html\": \"<p><em>a <code>*</code></em></p>\\n\",\n    \"example\": 478,\n    \"start_line\": 7430,\n    \"end_line\": 7434,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"_a `_`_\\n\",\n    \"html\": \"<p><em>a <code>_</code></em></p>\\n\",\n    \"example\": 479,\n    \"start_line\": 7437,\n    \"end_line\": 7441,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"**a<https://foo.bar/?q=**>\\n\",\n    \"html\": \"<p>**a<a href=\\\"https://foo.bar/?q=**\\\">https://foo.bar/?q=**</a></p>\\n\",\n    \"example\": 480,\n    \"start_line\": 7444,\n    \"end_line\": 7448,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"__a<https://foo.bar/?q=__>\\n\",\n    \"html\": \"<p>__a<a href=\\\"https://foo.bar/?q=__\\\">https://foo.bar/?q=__</a></p>\\n\",\n    \"example\": 481,\n    \"start_line\": 7451,\n    \"end_line\": 7455,\n    \"section\": \"Emphasis and strong emphasis\"\n  },\n  {\n    \"markdown\": \"[link](/uri \\\"title\\\")\\n\",\n    \"html\": \"<p><a href=\\\"/uri\\\" title=\\\"title\\\">link</a></p>\\n\",\n    \"example\": 482,\n    \"start_line\": 7539,\n    \"end_line\": 7543,\n    \"section\": \"Links\"\n  },\n  {\n    \"markdown\": \"[link](/uri)\\n\",\n    \"html\": \"<p><a href=\\\"/uri\\\">link</a></p>\\n\",\n    \"example\": 483,\n    \"start_line\": 7549,\n    \"end_line\": 7553,\n    \"section\": \"Links\"\n  },\n  {\n    \"markdown\": \"[](./target.md)\\n\",\n    \"html\": \"<p><a href=\\\"./target.md\\\"></a></p>\\n\",\n    \"example\": 484,\n    \"start_line\": 7555,\n    \"end_line\": 7559,\n    \"section\": \"Links\"\n  },\n  {\n    \"markdown\": \"[link]()\\n\",\n    \"html\": \"<p><a href=\\\"\\\">link</a></p>\\n\",\n    \"example\": 485,\n    \"start_line\": 7562,\n    \"end_line\": 7566,\n    \"section\": \"Links\"\n  },\n  {\n    \"markdown\": \"[link](<>)\\n\",\n    \"html\": \"<p><a href=\\\"\\\">link</a></p>\\n\",\n    \"example\": 486,\n    \"start_line\": 7569,\n    \"end_line\": 7573,\n    \"section\": \"Links\"\n  },\n  {\n    \"markdown\": \"[]()\\n\",\n    \"html\": \"<p><a href=\\\"\\\"></a></p>\\n\",\n    \"example\": 487,\n    \"start_line\": 7576,\n    \"end_line\": 7580,\n    \"section\": \"Links\"\n  },\n  {\n    \"markdown\": \"[link](/my uri)\\n\",\n    \"html\": \"<p>[link](/my uri)</p>\\n\",\n    \"example\": 488,\n    \"start_line\": 7585,\n    \"end_line\": 7589,\n    \"section\": \"Links\"\n  },\n  {\n    \"markdown\": \"[link](</my uri>)\\n\",\n    \"html\": \"<p><a href=\\\"/my%20uri\\\">link</a></p>\\n\",\n    \"example\": 489,\n    \"start_line\": 7591,\n    \"end_line\": 7595,\n    \"section\": \"Links\"\n  },\n  {\n    \"markdown\": \"[link](foo\\nbar)\\n\",\n    \"html\": \"<p>[link](foo\\nbar)</p>\\n\",\n    \"example\": 490,\n    \"start_line\": 7600,\n    \"end_line\": 7606,\n    \"section\": \"Links\"\n  },\n  {\n    \"markdown\": \"[link](<foo\\nbar>)\\n\",\n    \"html\": \"<p>[link](<foo\\nbar>)</p>\\n\",\n    \"example\": 491,\n    \"start_line\": 7608,\n    \"end_line\": 7614,\n    \"section\": \"Links\"\n  },\n  {\n    \"markdown\": \"[a](<b)c>)\\n\",\n    \"html\": \"<p><a href=\\\"b)c\\\">a</a></p>\\n\",\n    \"example\": 492,\n    \"start_line\": 7619,\n    \"end_line\": 7623,\n    \"section\": \"Links\"\n  },\n  {\n    \"markdown\": \"[link](<foo\\\\>)\\n\",\n    \"html\": \"<p>[link](&lt;foo&gt;)</p>\\n\",\n    \"example\": 493,\n    \"start_line\": 7627,\n    \"end_line\": 7631,\n    \"section\": \"Links\"\n  },\n  {\n    \"markdown\": \"[a](<b)c\\n[a](<b)c>\\n[a](<b>c)\\n\",\n    \"html\": \"<p>[a](&lt;b)c\\n[a](&lt;b)c&gt;\\n[a](<b>c)</p>\\n\",\n    \"example\": 494,\n    \"start_line\": 7636,\n    \"end_line\": 7644,\n    \"section\": \"Links\"\n  },\n  {\n    \"markdown\": \"[link](\\\\(foo\\\\))\\n\",\n    \"html\": \"<p><a href=\\\"(foo)\\\">link</a></p>\\n\",\n    \"example\": 495,\n    \"start_line\": 7648,\n    \"end_line\": 7652,\n    \"section\": \"Links\"\n  },\n  {\n    \"markdown\": \"[link](foo(and(bar)))\\n\",\n    \"html\": \"<p><a href=\\\"foo(and(bar))\\\">link</a></p>\\n\",\n    \"example\": 496,\n    \"start_line\": 7657,\n    \"end_line\": 7661,\n    \"section\": \"Links\"\n  },\n  {\n    \"markdown\": \"[link](foo(and(bar))\\n\",\n    \"html\": \"<p>[link](foo(and(bar))</p>\\n\",\n    \"example\": 497,\n    \"start_line\": 7666,\n    \"end_line\": 7670,\n    \"section\": \"Links\"\n  },\n  {\n    \"markdown\": \"[link](foo\\\\(and\\\\(bar\\\\))\\n\",\n    \"html\": \"<p><a href=\\\"foo(and(bar)\\\">link</a></p>\\n\",\n    \"example\": 498,\n    \"start_line\": 7673,\n    \"end_line\": 7677,\n    \"section\": \"Links\"\n  },\n  {\n    \"markdown\": \"[link](<foo(and(bar)>)\\n\",\n    \"html\": \"<p><a href=\\\"foo(and(bar)\\\">link</a></p>\\n\",\n    \"example\": 499,\n    \"start_line\": 7680,\n    \"end_line\": 7684,\n    \"section\": \"Links\"\n  },\n  {\n    \"markdown\": \"[link](foo\\\\)\\\\:)\\n\",\n    \"html\": \"<p><a href=\\\"foo):\\\">link</a></p>\\n\",\n    \"example\": 500,\n    \"start_line\": 7690,\n    \"end_line\": 7694,\n    \"section\": \"Links\"\n  },\n  {\n    \"markdown\": \"[link](#fragment)\\n\\n[link](https://example.com#fragment)\\n\\n[link](https://example.com?foo=3#frag)\\n\",\n    \"html\": \"<p><a href=\\\"#fragment\\\">link</a></p>\\n<p><a href=\\\"https://example.com#fragment\\\">link</a></p>\\n<p><a href=\\\"https://example.com?foo=3#frag\\\">link</a></p>\\n\",\n    \"example\": 501,\n    \"start_line\": 7699,\n    \"end_line\": 7709,\n    \"section\": \"Links\"\n  },\n  {\n    \"markdown\": \"[link](foo\\\\bar)\\n\",\n    \"html\": \"<p><a href=\\\"foo%5Cbar\\\">link</a></p>\\n\",\n    \"example\": 502,\n    \"start_line\": 7715,\n    \"end_line\": 7719,\n    \"section\": \"Links\"\n  },\n  {\n    \"markdown\": \"[link](foo%20b&auml;)\\n\",\n    \"html\": \"<p><a href=\\\"foo%20b%C3%A4\\\">link</a></p>\\n\",\n    \"example\": 503,\n    \"start_line\": 7731,\n    \"end_line\": 7735,\n    \"section\": \"Links\",\n    \"shouldFail\": true\n  },\n  {\n    \"markdown\": \"[link](\\\"title\\\")\\n\",\n    \"html\": \"<p><a href=\\\"%22title%22\\\">link</a></p>\\n\",\n    \"example\": 504,\n    \"start_line\": 7742,\n    \"end_line\": 7746,\n    \"section\": \"Links\"\n  },\n  {\n    \"markdown\": \"[link](/url \\\"title\\\")\\n[link](/url 'title')\\n[link](/url (title))\\n\",\n    \"html\": \"<p><a href=\\\"/url\\\" title=\\\"title\\\">link</a>\\n<a href=\\\"/url\\\" title=\\\"title\\\">link</a>\\n<a href=\\\"/url\\\" title=\\\"title\\\">link</a></p>\\n\",\n    \"example\": 505,\n    \"start_line\": 7751,\n    \"end_line\": 7759,\n    \"section\": \"Links\"\n  },\n  {\n    \"markdown\": \"[link](/url \\\"title \\\\\\\"&quot;\\\")\\n\",\n    \"html\": \"<p><a href=\\\"/url\\\" title=\\\"title &quot;&quot;\\\">link</a></p>\\n\",\n    \"example\": 506,\n    \"start_line\": 7765,\n    \"end_line\": 7769,\n    \"section\": \"Links\"\n  },\n  {\n    \"markdown\": \"[link](/url \\\"title\\\")\\n\",\n    \"html\": \"<p><a href=\\\"/url%C2%A0%22title%22\\\">link</a></p>\\n\",\n    \"example\": 507,\n    \"start_line\": 7776,\n    \"end_line\": 7780,\n    \"section\": \"Links\"\n  },\n  {\n    \"markdown\": \"[link](/url \\\"title \\\"and\\\" title\\\")\\n\",\n    \"html\": \"<p>[link](/url &quot;title &quot;and&quot; title&quot;)</p>\\n\",\n    \"example\": 508,\n    \"start_line\": 7785,\n    \"end_line\": 7789,\n    \"section\": \"Links\"\n  },\n  {\n    \"markdown\": \"[link](/url 'title \\\"and\\\" title')\\n\",\n    \"html\": \"<p><a href=\\\"/url\\\" title=\\\"title &quot;and&quot; title\\\">link</a></p>\\n\",\n    \"example\": 509,\n    \"start_line\": 7794,\n    \"end_line\": 7798,\n    \"section\": \"Links\"\n  },\n  {\n    \"markdown\": \"[link](   /uri\\n  \\\"title\\\"  )\\n\",\n    \"html\": \"<p><a href=\\\"/uri\\\" title=\\\"title\\\">link</a></p>\\n\",\n    \"example\": 510,\n    \"start_line\": 7819,\n    \"end_line\": 7824,\n    \"section\": \"Links\"\n  },\n  {\n    \"markdown\": \"[link] (/uri)\\n\",\n    \"html\": \"<p>[link] (/uri)</p>\\n\",\n    \"example\": 511,\n    \"start_line\": 7830,\n    \"end_line\": 7834,\n    \"section\": \"Links\"\n  },\n  {\n    \"markdown\": \"[link [foo [bar]]](/uri)\\n\",\n    \"html\": \"<p><a href=\\\"/uri\\\">link [foo [bar]]</a></p>\\n\",\n    \"example\": 512,\n    \"start_line\": 7840,\n    \"end_line\": 7844,\n    \"section\": \"Links\",\n    \"shouldFail\": true\n  },\n  {\n    \"markdown\": \"[link] bar](/uri)\\n\",\n    \"html\": \"<p>[link] bar](/uri)</p>\\n\",\n    \"example\": 513,\n    \"start_line\": 7847,\n    \"end_line\": 7851,\n    \"section\": \"Links\"\n  },\n  {\n    \"markdown\": \"[link [bar](/uri)\\n\",\n    \"html\": \"<p>[link <a href=\\\"/uri\\\">bar</a></p>\\n\",\n    \"example\": 514,\n    \"start_line\": 7854,\n    \"end_line\": 7858,\n    \"section\": \"Links\"\n  },\n  {\n    \"markdown\": \"[link \\\\[bar](/uri)\\n\",\n    \"html\": \"<p><a href=\\\"/uri\\\">link [bar</a></p>\\n\",\n    \"example\": 515,\n    \"start_line\": 7861,\n    \"end_line\": 7865,\n    \"section\": \"Links\"\n  },\n  {\n    \"markdown\": \"[link *foo **bar** `#`*](/uri)\\n\",\n    \"html\": \"<p><a href=\\\"/uri\\\">link <em>foo <strong>bar</strong> <code>#</code></em></a></p>\\n\",\n    \"example\": 516,\n    \"start_line\": 7870,\n    \"end_line\": 7874,\n    \"section\": \"Links\"\n  },\n  {\n    \"markdown\": \"[![moon](moon.jpg)](/uri)\\n\",\n    \"html\": \"<p><a href=\\\"/uri\\\"><img src=\\\"moon.jpg\\\" alt=\\\"moon\\\" /></a></p>\\n\",\n    \"example\": 517,\n    \"start_line\": 7877,\n    \"end_line\": 7881,\n    \"section\": \"Links\"\n  },\n  {\n    \"markdown\": \"[foo [bar](/uri)](/uri)\\n\",\n    \"html\": \"<p>[foo <a href=\\\"/uri\\\">bar</a>](/uri)</p>\\n\",\n    \"example\": 518,\n    \"start_line\": 7886,\n    \"end_line\": 7890,\n    \"section\": \"Links\",\n    \"shouldFail\": true\n  },\n  {\n    \"markdown\": \"[foo *[bar [baz](/uri)](/uri)*](/uri)\\n\",\n    \"html\": \"<p>[foo <em>[bar <a href=\\\"/uri\\\">baz</a>](/uri)</em>](/uri)</p>\\n\",\n    \"example\": 519,\n    \"start_line\": 7893,\n    \"end_line\": 7897,\n    \"section\": \"Links\",\n    \"shouldFail\": true\n  },\n  {\n    \"markdown\": \"![[[foo](uri1)](uri2)](uri3)\\n\",\n    \"html\": \"<p><img src=\\\"uri3\\\" alt=\\\"[foo](uri2)\\\" /></p>\\n\",\n    \"example\": 520,\n    \"start_line\": 7900,\n    \"end_line\": 7904,\n    \"section\": \"Links\",\n    \"shouldFail\": true\n  },\n  {\n    \"markdown\": \"*[foo*](/uri)\\n\",\n    \"html\": \"<p>*<a href=\\\"/uri\\\">foo*</a></p>\\n\",\n    \"example\": 521,\n    \"start_line\": 7910,\n    \"end_line\": 7914,\n    \"section\": \"Links\"\n  },\n  {\n    \"markdown\": \"[foo *bar](baz*)\\n\",\n    \"html\": \"<p><a href=\\\"baz*\\\">foo *bar</a></p>\\n\",\n    \"example\": 522,\n    \"start_line\": 7917,\n    \"end_line\": 7921,\n    \"section\": \"Links\"\n  },\n  {\n    \"markdown\": \"*foo [bar* baz]\\n\",\n    \"html\": \"<p><em>foo [bar</em> baz]</p>\\n\",\n    \"example\": 523,\n    \"start_line\": 7927,\n    \"end_line\": 7931,\n    \"section\": \"Links\"\n  },\n  {\n    \"markdown\": \"[foo <bar attr=\\\"](baz)\\\">\\n\",\n    \"html\": \"<p>[foo <bar attr=\\\"](baz)\\\"></p>\\n\",\n    \"example\": 524,\n    \"start_line\": 7937,\n    \"end_line\": 7941,\n    \"section\": \"Links\",\n    \"shouldFail\": true\n  },\n  {\n    \"markdown\": \"[foo`](/uri)`\\n\",\n    \"html\": \"<p>[foo<code>](/uri)</code></p>\\n\",\n    \"example\": 525,\n    \"start_line\": 7944,\n    \"end_line\": 7948,\n    \"section\": \"Links\"\n  },\n  {\n    \"markdown\": \"[foo<https://example.com/?search=](uri)>\\n\",\n    \"html\": \"<p>[foo<a href=\\\"https://example.com/?search=%5D(uri)\\\">https://example.com/?search=](uri)</a></p>\\n\",\n    \"example\": 526,\n    \"start_line\": 7951,\n    \"end_line\": 7955,\n    \"section\": \"Links\",\n    \"shouldFail\": true\n  },\n  {\n    \"markdown\": \"[foo][bar]\\n\\n[bar]: /url \\\"title\\\"\\n\",\n    \"html\": \"<p><a href=\\\"/url\\\" title=\\\"title\\\">foo</a></p>\\n\",\n    \"example\": 527,\n    \"start_line\": 7989,\n    \"end_line\": 7995,\n    \"section\": \"Links\"\n  },\n  {\n    \"markdown\": \"[link [foo [bar]]][ref]\\n\\n[ref]: /uri\\n\",\n    \"html\": \"<p><a href=\\\"/uri\\\">link [foo [bar]]</a></p>\\n\",\n    \"example\": 528,\n    \"start_line\": 8004,\n    \"end_line\": 8010,\n    \"section\": \"Links\",\n    \"shouldFail\": true\n  },\n  {\n    \"markdown\": \"[link \\\\[bar][ref]\\n\\n[ref]: /uri\\n\",\n    \"html\": \"<p><a href=\\\"/uri\\\">link [bar</a></p>\\n\",\n    \"example\": 529,\n    \"start_line\": 8013,\n    \"end_line\": 8019,\n    \"section\": \"Links\"\n  },\n  {\n    \"markdown\": \"[link *foo **bar** `#`*][ref]\\n\\n[ref]: /uri\\n\",\n    \"html\": \"<p><a href=\\\"/uri\\\">link <em>foo <strong>bar</strong> <code>#</code></em></a></p>\\n\",\n    \"example\": 530,\n    \"start_line\": 8024,\n    \"end_line\": 8030,\n    \"section\": \"Links\"\n  },\n  {\n    \"markdown\": \"[![moon](moon.jpg)][ref]\\n\\n[ref]: /uri\\n\",\n    \"html\": \"<p><a href=\\\"/uri\\\"><img src=\\\"moon.jpg\\\" alt=\\\"moon\\\" /></a></p>\\n\",\n    \"example\": 531,\n    \"start_line\": 8033,\n    \"end_line\": 8039,\n    \"section\": \"Links\"\n  },\n  {\n    \"markdown\": \"[foo [bar](/uri)][ref]\\n\\n[ref]: /uri\\n\",\n    \"html\": \"<p>[foo <a href=\\\"/uri\\\">bar</a>]<a href=\\\"/uri\\\">ref</a></p>\\n\",\n    \"example\": 532,\n    \"start_line\": 8044,\n    \"end_line\": 8050,\n    \"section\": \"Links\",\n    \"shouldFail\": true\n  },\n  {\n    \"markdown\": \"[foo *bar [baz][ref]*][ref]\\n\\n[ref]: /uri\\n\",\n    \"html\": \"<p>[foo <em>bar <a href=\\\"/uri\\\">baz</a></em>]<a href=\\\"/uri\\\">ref</a></p>\\n\",\n    \"example\": 533,\n    \"start_line\": 8053,\n    \"end_line\": 8059,\n    \"section\": \"Links\",\n    \"shouldFail\": true\n  },\n  {\n    \"markdown\": \"*[foo*][ref]\\n\\n[ref]: /uri\\n\",\n    \"html\": \"<p>*<a href=\\\"/uri\\\">foo*</a></p>\\n\",\n    \"example\": 534,\n    \"start_line\": 8068,\n    \"end_line\": 8074,\n    \"section\": \"Links\"\n  },\n  {\n    \"markdown\": \"[foo *bar][ref]*\\n\\n[ref]: /uri\\n\",\n    \"html\": \"<p><a href=\\\"/uri\\\">foo *bar</a>*</p>\\n\",\n    \"example\": 535,\n    \"start_line\": 8077,\n    \"end_line\": 8083,\n    \"section\": \"Links\"\n  },\n  {\n    \"markdown\": \"[foo <bar attr=\\\"][ref]\\\">\\n\\n[ref]: /uri\\n\",\n    \"html\": \"<p>[foo <bar attr=\\\"][ref]\\\"></p>\\n\",\n    \"example\": 536,\n    \"start_line\": 8089,\n    \"end_line\": 8095,\n    \"section\": \"Links\",\n    \"shouldFail\": true\n  },\n  {\n    \"markdown\": \"[foo`][ref]`\\n\\n[ref]: /uri\\n\",\n    \"html\": \"<p>[foo<code>][ref]</code></p>\\n\",\n    \"example\": 537,\n    \"start_line\": 8098,\n    \"end_line\": 8104,\n    \"section\": \"Links\"\n  },\n  {\n    \"markdown\": \"[foo<https://example.com/?search=][ref]>\\n\\n[ref]: /uri\\n\",\n    \"html\": \"<p>[foo<a href=\\\"https://example.com/?search=%5D%5Bref%5D\\\">https://example.com/?search=][ref]</a></p>\\n\",\n    \"example\": 538,\n    \"start_line\": 8107,\n    \"end_line\": 8113,\n    \"section\": \"Links\",\n    \"shouldFail\": true\n  },\n  {\n    \"markdown\": \"[foo][BaR]\\n\\n[bar]: /url \\\"title\\\"\\n\",\n    \"html\": \"<p><a href=\\\"/url\\\" title=\\\"title\\\">foo</a></p>\\n\",\n    \"example\": 539,\n    \"start_line\": 8118,\n    \"end_line\": 8124,\n    \"section\": \"Links\"\n  },\n  {\n    \"markdown\": \"[ẞ]\\n\\n[SS]: /url\\n\",\n    \"html\": \"<p><a href=\\\"/url\\\">ẞ</a></p>\\n\",\n    \"example\": 540,\n    \"start_line\": 8129,\n    \"end_line\": 8135,\n    \"section\": \"Links\",\n    \"shouldFail\": true\n  },\n  {\n    \"markdown\": \"[Foo\\n  bar]: /url\\n\\n[Baz][Foo bar]\\n\",\n    \"html\": \"<p><a href=\\\"/url\\\">Baz</a></p>\\n\",\n    \"example\": 541,\n    \"start_line\": 8141,\n    \"end_line\": 8148,\n    \"section\": \"Links\"\n  },\n  {\n    \"markdown\": \"[foo] [bar]\\n\\n[bar]: /url \\\"title\\\"\\n\",\n    \"html\": \"<p>[foo] <a href=\\\"/url\\\" title=\\\"title\\\">bar</a></p>\\n\",\n    \"example\": 542,\n    \"start_line\": 8154,\n    \"end_line\": 8160,\n    \"section\": \"Links\"\n  },\n  {\n    \"markdown\": \"[foo]\\n[bar]\\n\\n[bar]: /url \\\"title\\\"\\n\",\n    \"html\": \"<p>[foo]\\n<a href=\\\"/url\\\" title=\\\"title\\\">bar</a></p>\\n\",\n    \"example\": 543,\n    \"start_line\": 8163,\n    \"end_line\": 8171,\n    \"section\": \"Links\"\n  },\n  {\n    \"markdown\": \"[foo]: /url1\\n\\n[foo]: /url2\\n\\n[bar][foo]\\n\",\n    \"html\": \"<p><a href=\\\"/url1\\\">bar</a></p>\\n\",\n    \"example\": 544,\n    \"start_line\": 8204,\n    \"end_line\": 8212,\n    \"section\": \"Links\"\n  },\n  {\n    \"markdown\": \"[bar][foo\\\\!]\\n\\n[foo!]: /url\\n\",\n    \"html\": \"<p>[bar][foo!]</p>\\n\",\n    \"example\": 545,\n    \"start_line\": 8219,\n    \"end_line\": 8225,\n    \"section\": \"Links\"\n  },\n  {\n    \"markdown\": \"[foo][ref[]\\n\\n[ref[]: /uri\\n\",\n    \"html\": \"<p>[foo][ref[]</p>\\n<p>[ref[]: /uri</p>\\n\",\n    \"example\": 546,\n    \"start_line\": 8231,\n    \"end_line\": 8238,\n    \"section\": \"Links\"\n  },\n  {\n    \"markdown\": \"[foo][ref[bar]]\\n\\n[ref[bar]]: /uri\\n\",\n    \"html\": \"<p>[foo][ref[bar]]</p>\\n<p>[ref[bar]]: /uri</p>\\n\",\n    \"example\": 547,\n    \"start_line\": 8241,\n    \"end_line\": 8248,\n    \"section\": \"Links\"\n  },\n  {\n    \"markdown\": \"[[[foo]]]\\n\\n[[[foo]]]: /url\\n\",\n    \"html\": \"<p>[[[foo]]]</p>\\n<p>[[[foo]]]: /url</p>\\n\",\n    \"example\": 548,\n    \"start_line\": 8251,\n    \"end_line\": 8258,\n    \"section\": \"Links\"\n  },\n  {\n    \"markdown\": \"[foo][ref\\\\[]\\n\\n[ref\\\\[]: /uri\\n\",\n    \"html\": \"<p><a href=\\\"/uri\\\">foo</a></p>\\n\",\n    \"example\": 549,\n    \"start_line\": 8261,\n    \"end_line\": 8267,\n    \"section\": \"Links\"\n  },\n  {\n    \"markdown\": \"[bar\\\\\\\\]: /uri\\n\\n[bar\\\\\\\\]\\n\",\n    \"html\": \"<p><a href=\\\"/uri\\\">bar\\\\</a></p>\\n\",\n    \"example\": 550,\n    \"start_line\": 8272,\n    \"end_line\": 8278,\n    \"section\": \"Links\"\n  },\n  {\n    \"markdown\": \"[]\\n\\n[]: /uri\\n\",\n    \"html\": \"<p>[]</p>\\n<p>[]: /uri</p>\\n\",\n    \"example\": 551,\n    \"start_line\": 8284,\n    \"end_line\": 8291,\n    \"section\": \"Links\"\n  },\n  {\n    \"markdown\": \"[\\n ]\\n\\n[\\n ]: /uri\\n\",\n    \"html\": \"<p>[\\n]</p>\\n<p>[\\n]: /uri</p>\\n\",\n    \"example\": 552,\n    \"start_line\": 8294,\n    \"end_line\": 8305,\n    \"section\": \"Links\"\n  },\n  {\n    \"markdown\": \"[foo][]\\n\\n[foo]: /url \\\"title\\\"\\n\",\n    \"html\": \"<p><a href=\\\"/url\\\" title=\\\"title\\\">foo</a></p>\\n\",\n    \"example\": 553,\n    \"start_line\": 8317,\n    \"end_line\": 8323,\n    \"section\": \"Links\"\n  },\n  {\n    \"markdown\": \"[*foo* bar][]\\n\\n[*foo* bar]: /url \\\"title\\\"\\n\",\n    \"html\": \"<p><a href=\\\"/url\\\" title=\\\"title\\\"><em>foo</em> bar</a></p>\\n\",\n    \"example\": 554,\n    \"start_line\": 8326,\n    \"end_line\": 8332,\n    \"section\": \"Links\"\n  },\n  {\n    \"markdown\": \"[Foo][]\\n\\n[foo]: /url \\\"title\\\"\\n\",\n    \"html\": \"<p><a href=\\\"/url\\\" title=\\\"title\\\">Foo</a></p>\\n\",\n    \"example\": 555,\n    \"start_line\": 8337,\n    \"end_line\": 8343,\n    \"section\": \"Links\"\n  },\n  {\n    \"markdown\": \"[foo] \\n[]\\n\\n[foo]: /url \\\"title\\\"\\n\",\n    \"html\": \"<p><a href=\\\"/url\\\" title=\\\"title\\\">foo</a>\\n[]</p>\\n\",\n    \"example\": 556,\n    \"start_line\": 8350,\n    \"end_line\": 8358,\n    \"section\": \"Links\"\n  },\n  {\n    \"markdown\": \"[foo]\\n\\n[foo]: /url \\\"title\\\"\\n\",\n    \"html\": \"<p><a href=\\\"/url\\\" title=\\\"title\\\">foo</a></p>\\n\",\n    \"example\": 557,\n    \"start_line\": 8370,\n    \"end_line\": 8376,\n    \"section\": \"Links\"\n  },\n  {\n    \"markdown\": \"[*foo* bar]\\n\\n[*foo* bar]: /url \\\"title\\\"\\n\",\n    \"html\": \"<p><a href=\\\"/url\\\" title=\\\"title\\\"><em>foo</em> bar</a></p>\\n\",\n    \"example\": 558,\n    \"start_line\": 8379,\n    \"end_line\": 8385,\n    \"section\": \"Links\"\n  },\n  {\n    \"markdown\": \"[[*foo* bar]]\\n\\n[*foo* bar]: /url \\\"title\\\"\\n\",\n    \"html\": \"<p>[<a href=\\\"/url\\\" title=\\\"title\\\"><em>foo</em> bar</a>]</p>\\n\",\n    \"example\": 559,\n    \"start_line\": 8388,\n    \"end_line\": 8394,\n    \"section\": \"Links\"\n  },\n  {\n    \"markdown\": \"[[bar [foo]\\n\\n[foo]: /url\\n\",\n    \"html\": \"<p>[[bar <a href=\\\"/url\\\">foo</a></p>\\n\",\n    \"example\": 560,\n    \"start_line\": 8397,\n    \"end_line\": 8403,\n    \"section\": \"Links\"\n  },\n  {\n    \"markdown\": \"[Foo]\\n\\n[foo]: /url \\\"title\\\"\\n\",\n    \"html\": \"<p><a href=\\\"/url\\\" title=\\\"title\\\">Foo</a></p>\\n\",\n    \"example\": 561,\n    \"start_line\": 8408,\n    \"end_line\": 8414,\n    \"section\": \"Links\"\n  },\n  {\n    \"markdown\": \"[foo] bar\\n\\n[foo]: /url\\n\",\n    \"html\": \"<p><a href=\\\"/url\\\">foo</a> bar</p>\\n\",\n    \"example\": 562,\n    \"start_line\": 8419,\n    \"end_line\": 8425,\n    \"section\": \"Links\"\n  },\n  {\n    \"markdown\": \"\\\\[foo]\\n\\n[foo]: /url \\\"title\\\"\\n\",\n    \"html\": \"<p>[foo]</p>\\n\",\n    \"example\": 563,\n    \"start_line\": 8431,\n    \"end_line\": 8437,\n    \"section\": \"Links\"\n  },\n  {\n    \"markdown\": \"[foo*]: /url\\n\\n*[foo*]\\n\",\n    \"html\": \"<p>*<a href=\\\"/url\\\">foo*</a></p>\\n\",\n    \"example\": 564,\n    \"start_line\": 8443,\n    \"end_line\": 8449,\n    \"section\": \"Links\"\n  },\n  {\n    \"markdown\": \"[foo][bar]\\n\\n[foo]: /url1\\n[bar]: /url2\\n\",\n    \"html\": \"<p><a href=\\\"/url2\\\">foo</a></p>\\n\",\n    \"example\": 565,\n    \"start_line\": 8455,\n    \"end_line\": 8462,\n    \"section\": \"Links\"\n  },\n  {\n    \"markdown\": \"[foo][]\\n\\n[foo]: /url1\\n\",\n    \"html\": \"<p><a href=\\\"/url1\\\">foo</a></p>\\n\",\n    \"example\": 566,\n    \"start_line\": 8464,\n    \"end_line\": 8470,\n    \"section\": \"Links\"\n  },\n  {\n    \"markdown\": \"[foo]()\\n\\n[foo]: /url1\\n\",\n    \"html\": \"<p><a href=\\\"\\\">foo</a></p>\\n\",\n    \"example\": 567,\n    \"start_line\": 8474,\n    \"end_line\": 8480,\n    \"section\": \"Links\"\n  },\n  {\n    \"markdown\": \"[foo](not a link)\\n\\n[foo]: /url1\\n\",\n    \"html\": \"<p><a href=\\\"/url1\\\">foo</a>(not a link)</p>\\n\",\n    \"example\": 568,\n    \"start_line\": 8482,\n    \"end_line\": 8488,\n    \"section\": \"Links\"\n  },\n  {\n    \"markdown\": \"[foo][bar][baz]\\n\\n[baz]: /url\\n\",\n    \"html\": \"<p>[foo]<a href=\\\"/url\\\">bar</a></p>\\n\",\n    \"example\": 569,\n    \"start_line\": 8493,\n    \"end_line\": 8499,\n    \"section\": \"Links\"\n  },\n  {\n    \"markdown\": \"[foo][bar][baz]\\n\\n[baz]: /url1\\n[bar]: /url2\\n\",\n    \"html\": \"<p><a href=\\\"/url2\\\">foo</a><a href=\\\"/url1\\\">baz</a></p>\\n\",\n    \"example\": 570,\n    \"start_line\": 8505,\n    \"end_line\": 8512,\n    \"section\": \"Links\"\n  },\n  {\n    \"markdown\": \"[foo][bar][baz]\\n\\n[baz]: /url1\\n[foo]: /url2\\n\",\n    \"html\": \"<p>[foo]<a href=\\\"/url1\\\">bar</a></p>\\n\",\n    \"example\": 571,\n    \"start_line\": 8518,\n    \"end_line\": 8525,\n    \"section\": \"Links\"\n  },\n  {\n    \"markdown\": \"![foo](/url \\\"title\\\")\\n\",\n    \"html\": \"<p><img src=\\\"/url\\\" alt=\\\"foo\\\" title=\\\"title\\\" /></p>\\n\",\n    \"example\": 572,\n    \"start_line\": 8541,\n    \"end_line\": 8545,\n    \"section\": \"Images\"\n  },\n  {\n    \"markdown\": \"![foo *bar*]\\n\\n[foo *bar*]: train.jpg \\\"train & tracks\\\"\\n\",\n    \"html\": \"<p><img src=\\\"train.jpg\\\" alt=\\\"foo bar\\\" title=\\\"train &amp; tracks\\\" /></p>\\n\",\n    \"example\": 573,\n    \"start_line\": 8548,\n    \"end_line\": 8554,\n    \"section\": \"Images\"\n  },\n  {\n    \"markdown\": \"![foo ![bar](/url)](/url2)\\n\",\n    \"html\": \"<p><img src=\\\"/url2\\\" alt=\\\"foo bar\\\" /></p>\\n\",\n    \"example\": 574,\n    \"start_line\": 8557,\n    \"end_line\": 8561,\n    \"section\": \"Images\"\n  },\n  {\n    \"markdown\": \"![foo [bar](/url)](/url2)\\n\",\n    \"html\": \"<p><img src=\\\"/url2\\\" alt=\\\"foo bar\\\" /></p>\\n\",\n    \"example\": 575,\n    \"start_line\": 8564,\n    \"end_line\": 8568,\n    \"section\": \"Images\"\n  },\n  {\n    \"markdown\": \"![foo *bar*][]\\n\\n[foo *bar*]: train.jpg \\\"train & tracks\\\"\\n\",\n    \"html\": \"<p><img src=\\\"train.jpg\\\" alt=\\\"foo bar\\\" title=\\\"train &amp; tracks\\\" /></p>\\n\",\n    \"example\": 576,\n    \"start_line\": 8578,\n    \"end_line\": 8584,\n    \"section\": \"Images\"\n  },\n  {\n    \"markdown\": \"![foo *bar*][foobar]\\n\\n[FOOBAR]: train.jpg \\\"train & tracks\\\"\\n\",\n    \"html\": \"<p><img src=\\\"train.jpg\\\" alt=\\\"foo bar\\\" title=\\\"train &amp; tracks\\\" /></p>\\n\",\n    \"example\": 577,\n    \"start_line\": 8587,\n    \"end_line\": 8593,\n    \"section\": \"Images\"\n  },\n  {\n    \"markdown\": \"![foo](train.jpg)\\n\",\n    \"html\": \"<p><img src=\\\"train.jpg\\\" alt=\\\"foo\\\" /></p>\\n\",\n    \"example\": 578,\n    \"start_line\": 8596,\n    \"end_line\": 8600,\n    \"section\": \"Images\"\n  },\n  {\n    \"markdown\": \"My ![foo bar](/path/to/train.jpg  \\\"title\\\"   )\\n\",\n    \"html\": \"<p>My <img src=\\\"/path/to/train.jpg\\\" alt=\\\"foo bar\\\" title=\\\"title\\\" /></p>\\n\",\n    \"example\": 579,\n    \"start_line\": 8603,\n    \"end_line\": 8607,\n    \"section\": \"Images\"\n  },\n  {\n    \"markdown\": \"![foo](<url>)\\n\",\n    \"html\": \"<p><img src=\\\"url\\\" alt=\\\"foo\\\" /></p>\\n\",\n    \"example\": 580,\n    \"start_line\": 8610,\n    \"end_line\": 8614,\n    \"section\": \"Images\"\n  },\n  {\n    \"markdown\": \"![](/url)\\n\",\n    \"html\": \"<p><img src=\\\"/url\\\" alt=\\\"\\\" /></p>\\n\",\n    \"example\": 581,\n    \"start_line\": 8617,\n    \"end_line\": 8621,\n    \"section\": \"Images\"\n  },\n  {\n    \"markdown\": \"![foo][bar]\\n\\n[bar]: /url\\n\",\n    \"html\": \"<p><img src=\\\"/url\\\" alt=\\\"foo\\\" /></p>\\n\",\n    \"example\": 582,\n    \"start_line\": 8626,\n    \"end_line\": 8632,\n    \"section\": \"Images\"\n  },\n  {\n    \"markdown\": \"![foo][bar]\\n\\n[BAR]: /url\\n\",\n    \"html\": \"<p><img src=\\\"/url\\\" alt=\\\"foo\\\" /></p>\\n\",\n    \"example\": 583,\n    \"start_line\": 8635,\n    \"end_line\": 8641,\n    \"section\": \"Images\"\n  },\n  {\n    \"markdown\": \"![foo][]\\n\\n[foo]: /url \\\"title\\\"\\n\",\n    \"html\": \"<p><img src=\\\"/url\\\" alt=\\\"foo\\\" title=\\\"title\\\" /></p>\\n\",\n    \"example\": 584,\n    \"start_line\": 8646,\n    \"end_line\": 8652,\n    \"section\": \"Images\"\n  },\n  {\n    \"markdown\": \"![*foo* bar][]\\n\\n[*foo* bar]: /url \\\"title\\\"\\n\",\n    \"html\": \"<p><img src=\\\"/url\\\" alt=\\\"foo bar\\\" title=\\\"title\\\" /></p>\\n\",\n    \"example\": 585,\n    \"start_line\": 8655,\n    \"end_line\": 8661,\n    \"section\": \"Images\"\n  },\n  {\n    \"markdown\": \"![Foo][]\\n\\n[foo]: /url \\\"title\\\"\\n\",\n    \"html\": \"<p><img src=\\\"/url\\\" alt=\\\"Foo\\\" title=\\\"title\\\" /></p>\\n\",\n    \"example\": 586,\n    \"start_line\": 8666,\n    \"end_line\": 8672,\n    \"section\": \"Images\"\n  },\n  {\n    \"markdown\": \"![foo] \\n[]\\n\\n[foo]: /url \\\"title\\\"\\n\",\n    \"html\": \"<p><img src=\\\"/url\\\" alt=\\\"foo\\\" title=\\\"title\\\" />\\n[]</p>\\n\",\n    \"example\": 587,\n    \"start_line\": 8678,\n    \"end_line\": 8686,\n    \"section\": \"Images\"\n  },\n  {\n    \"markdown\": \"![foo]\\n\\n[foo]: /url \\\"title\\\"\\n\",\n    \"html\": \"<p><img src=\\\"/url\\\" alt=\\\"foo\\\" title=\\\"title\\\" /></p>\\n\",\n    \"example\": 588,\n    \"start_line\": 8691,\n    \"end_line\": 8697,\n    \"section\": \"Images\"\n  },\n  {\n    \"markdown\": \"![*foo* bar]\\n\\n[*foo* bar]: /url \\\"title\\\"\\n\",\n    \"html\": \"<p><img src=\\\"/url\\\" alt=\\\"foo bar\\\" title=\\\"title\\\" /></p>\\n\",\n    \"example\": 589,\n    \"start_line\": 8700,\n    \"end_line\": 8706,\n    \"section\": \"Images\"\n  },\n  {\n    \"markdown\": \"![[foo]]\\n\\n[[foo]]: /url \\\"title\\\"\\n\",\n    \"html\": \"<p>![[foo]]</p>\\n<p>[[foo]]: /url &quot;title&quot;</p>\\n\",\n    \"example\": 590,\n    \"start_line\": 8711,\n    \"end_line\": 8718,\n    \"section\": \"Images\"\n  },\n  {\n    \"markdown\": \"![Foo]\\n\\n[foo]: /url \\\"title\\\"\\n\",\n    \"html\": \"<p><img src=\\\"/url\\\" alt=\\\"Foo\\\" title=\\\"title\\\" /></p>\\n\",\n    \"example\": 591,\n    \"start_line\": 8723,\n    \"end_line\": 8729,\n    \"section\": \"Images\"\n  },\n  {\n    \"markdown\": \"!\\\\[foo]\\n\\n[foo]: /url \\\"title\\\"\\n\",\n    \"html\": \"<p>![foo]</p>\\n\",\n    \"example\": 592,\n    \"start_line\": 8735,\n    \"end_line\": 8741,\n    \"section\": \"Images\"\n  },\n  {\n    \"markdown\": \"\\\\![foo]\\n\\n[foo]: /url \\\"title\\\"\\n\",\n    \"html\": \"<p>!<a href=\\\"/url\\\" title=\\\"title\\\">foo</a></p>\\n\",\n    \"example\": 593,\n    \"start_line\": 8747,\n    \"end_line\": 8753,\n    \"section\": \"Images\"\n  },\n  {\n    \"markdown\": \"<http://foo.bar.baz>\\n\",\n    \"html\": \"<p><a href=\\\"http://foo.bar.baz\\\">http://foo.bar.baz</a></p>\\n\",\n    \"example\": 594,\n    \"start_line\": 8780,\n    \"end_line\": 8784,\n    \"section\": \"Autolinks\"\n  },\n  {\n    \"markdown\": \"<https://foo.bar.baz/test?q=hello&id=22&boolean>\\n\",\n    \"html\": \"<p><a href=\\\"https://foo.bar.baz/test?q=hello&amp;id=22&amp;boolean\\\">https://foo.bar.baz/test?q=hello&amp;id=22&amp;boolean</a></p>\\n\",\n    \"example\": 595,\n    \"start_line\": 8787,\n    \"end_line\": 8791,\n    \"section\": \"Autolinks\"\n  },\n  {\n    \"markdown\": \"<irc://foo.bar:2233/baz>\\n\",\n    \"html\": \"<p><a href=\\\"irc://foo.bar:2233/baz\\\">irc://foo.bar:2233/baz</a></p>\\n\",\n    \"example\": 596,\n    \"start_line\": 8794,\n    \"end_line\": 8798,\n    \"section\": \"Autolinks\"\n  },\n  {\n    \"markdown\": \"<MAILTO:FOO@BAR.BAZ>\\n\",\n    \"html\": \"<p><a href=\\\"MAILTO:FOO@BAR.BAZ\\\">MAILTO:FOO@BAR.BAZ</a></p>\\n\",\n    \"example\": 597,\n    \"start_line\": 8803,\n    \"end_line\": 8807,\n    \"section\": \"Autolinks\"\n  },\n  {\n    \"markdown\": \"<a+b+c:d>\\n\",\n    \"html\": \"<p><a href=\\\"a+b+c:d\\\">a+b+c:d</a></p>\\n\",\n    \"example\": 598,\n    \"start_line\": 8815,\n    \"end_line\": 8819,\n    \"section\": \"Autolinks\"\n  },\n  {\n    \"markdown\": \"<made-up-scheme://foo,bar>\\n\",\n    \"html\": \"<p><a href=\\\"made-up-scheme://foo,bar\\\">made-up-scheme://foo,bar</a></p>\\n\",\n    \"example\": 599,\n    \"start_line\": 8822,\n    \"end_line\": 8826,\n    \"section\": \"Autolinks\"\n  },\n  {\n    \"markdown\": \"<https://../>\\n\",\n    \"html\": \"<p><a href=\\\"https://../\\\">https://../</a></p>\\n\",\n    \"example\": 600,\n    \"start_line\": 8829,\n    \"end_line\": 8833,\n    \"section\": \"Autolinks\"\n  },\n  {\n    \"markdown\": \"<localhost:5001/foo>\\n\",\n    \"html\": \"<p><a href=\\\"localhost:5001/foo\\\">localhost:5001/foo</a></p>\\n\",\n    \"example\": 601,\n    \"start_line\": 8836,\n    \"end_line\": 8840,\n    \"section\": \"Autolinks\"\n  },\n  {\n    \"markdown\": \"<https://foo.bar/baz bim>\\n\",\n    \"html\": \"<p>&lt;https://foo.bar/baz bim&gt;</p>\\n\",\n    \"example\": 602,\n    \"start_line\": 8845,\n    \"end_line\": 8849,\n    \"section\": \"Autolinks\",\n    \"shouldFail\": true\n  },\n  {\n    \"markdown\": \"<https://example.com/\\\\[\\\\>\\n\",\n    \"html\": \"<p><a href=\\\"https://example.com/%5C%5B%5C\\\">https://example.com/\\\\[\\\\</a></p>\\n\",\n    \"example\": 603,\n    \"start_line\": 8854,\n    \"end_line\": 8858,\n    \"section\": \"Autolinks\"\n  },\n  {\n    \"markdown\": \"<foo@bar.example.com>\\n\",\n    \"html\": \"<p><a href=\\\"mailto:foo@bar.example.com\\\">foo@bar.example.com</a></p>\\n\",\n    \"example\": 604,\n    \"start_line\": 8876,\n    \"end_line\": 8880,\n    \"section\": \"Autolinks\"\n  },\n  {\n    \"markdown\": \"<foo+special@Bar.baz-bar0.com>\\n\",\n    \"html\": \"<p><a href=\\\"mailto:foo+special@Bar.baz-bar0.com\\\">foo+special@Bar.baz-bar0.com</a></p>\\n\",\n    \"example\": 605,\n    \"start_line\": 8883,\n    \"end_line\": 8887,\n    \"section\": \"Autolinks\"\n  },\n  {\n    \"markdown\": \"<foo\\\\+@bar.example.com>\\n\",\n    \"html\": \"<p>&lt;foo+@bar.example.com&gt;</p>\\n\",\n    \"example\": 606,\n    \"start_line\": 8892,\n    \"end_line\": 8896,\n    \"section\": \"Autolinks\"\n  },\n  {\n    \"markdown\": \"<>\\n\",\n    \"html\": \"<p>&lt;&gt;</p>\\n\",\n    \"example\": 607,\n    \"start_line\": 8901,\n    \"end_line\": 8905,\n    \"section\": \"Autolinks\"\n  },\n  {\n    \"markdown\": \"< https://foo.bar >\\n\",\n    \"html\": \"<p>&lt; https://foo.bar &gt;</p>\\n\",\n    \"example\": 608,\n    \"start_line\": 8908,\n    \"end_line\": 8912,\n    \"section\": \"Autolinks\",\n    \"shouldFail\": true\n  },\n  {\n    \"markdown\": \"<m:abc>\\n\",\n    \"html\": \"<p>&lt;m:abc&gt;</p>\\n\",\n    \"example\": 609,\n    \"start_line\": 8915,\n    \"end_line\": 8919,\n    \"section\": \"Autolinks\"\n  },\n  {\n    \"markdown\": \"<foo.bar.baz>\\n\",\n    \"html\": \"<p>&lt;foo.bar.baz&gt;</p>\\n\",\n    \"example\": 610,\n    \"start_line\": 8922,\n    \"end_line\": 8926,\n    \"section\": \"Autolinks\"\n  },\n  {\n    \"markdown\": \"https://example.com\\n\",\n    \"html\": \"<p>https://example.com</p>\\n\",\n    \"example\": 611,\n    \"start_line\": 8929,\n    \"end_line\": 8933,\n    \"section\": \"Autolinks\",\n    \"shouldFail\": true\n  },\n  {\n    \"markdown\": \"foo@bar.example.com\\n\",\n    \"html\": \"<p>foo@bar.example.com</p>\\n\",\n    \"example\": 612,\n    \"start_line\": 8936,\n    \"end_line\": 8940,\n    \"section\": \"Autolinks\",\n    \"shouldFail\": true\n  },\n  {\n    \"markdown\": \"<a><bab><c2c>\\n\",\n    \"html\": \"<p><a><bab><c2c></p>\\n\",\n    \"example\": 613,\n    \"start_line\": 9016,\n    \"end_line\": 9020,\n    \"section\": \"Raw HTML\"\n  },\n  {\n    \"markdown\": \"<a/><b2/>\\n\",\n    \"html\": \"<p><a/><b2/></p>\\n\",\n    \"example\": 614,\n    \"start_line\": 9025,\n    \"end_line\": 9029,\n    \"section\": \"Raw HTML\"\n  },\n  {\n    \"markdown\": \"<a  /><b2\\ndata=\\\"foo\\\" >\\n\",\n    \"html\": \"<p><a  /><b2\\ndata=\\\"foo\\\" ></p>\\n\",\n    \"example\": 615,\n    \"start_line\": 9034,\n    \"end_line\": 9040,\n    \"section\": \"Raw HTML\"\n  },\n  {\n    \"markdown\": \"<a foo=\\\"bar\\\" bam = 'baz <em>\\\"</em>'\\n_boolean zoop:33=zoop:33 />\\n\",\n    \"html\": \"<p><a foo=\\\"bar\\\" bam = 'baz <em>\\\"</em>'\\n_boolean zoop:33=zoop:33 /></p>\\n\",\n    \"example\": 616,\n    \"start_line\": 9045,\n    \"end_line\": 9051,\n    \"section\": \"Raw HTML\"\n  },\n  {\n    \"markdown\": \"Foo <responsive-image src=\\\"foo.jpg\\\" />\\n\",\n    \"html\": \"<p>Foo <responsive-image src=\\\"foo.jpg\\\" /></p>\\n\",\n    \"example\": 617,\n    \"start_line\": 9056,\n    \"end_line\": 9060,\n    \"section\": \"Raw HTML\"\n  },\n  {\n    \"markdown\": \"<33> <__>\\n\",\n    \"html\": \"<p>&lt;33&gt; &lt;__&gt;</p>\\n\",\n    \"example\": 618,\n    \"start_line\": 9065,\n    \"end_line\": 9069,\n    \"section\": \"Raw HTML\"\n  },\n  {\n    \"markdown\": \"<a h*#ref=\\\"hi\\\">\\n\",\n    \"html\": \"<p>&lt;a h*#ref=&quot;hi&quot;&gt;</p>\\n\",\n    \"example\": 619,\n    \"start_line\": 9074,\n    \"end_line\": 9078,\n    \"section\": \"Raw HTML\"\n  },\n  {\n    \"markdown\": \"<a href=\\\"hi'> <a href=hi'>\\n\",\n    \"html\": \"<p>&lt;a href=&quot;hi'&gt; &lt;a href=hi'&gt;</p>\\n\",\n    \"example\": 620,\n    \"start_line\": 9083,\n    \"end_line\": 9087,\n    \"section\": \"Raw HTML\"\n  },\n  {\n    \"markdown\": \"< a><\\nfoo><bar/ >\\n<foo bar=baz\\nbim!bop />\\n\",\n    \"html\": \"<p>&lt; a&gt;&lt;\\nfoo&gt;&lt;bar/ &gt;\\n&lt;foo bar=baz\\nbim!bop /&gt;</p>\\n\",\n    \"example\": 621,\n    \"start_line\": 9092,\n    \"end_line\": 9102,\n    \"section\": \"Raw HTML\"\n  },\n  {\n    \"markdown\": \"<a href='bar'title=title>\\n\",\n    \"html\": \"<p>&lt;a href='bar'title=title&gt;</p>\\n\",\n    \"example\": 622,\n    \"start_line\": 9107,\n    \"end_line\": 9111,\n    \"section\": \"Raw HTML\"\n  },\n  {\n    \"markdown\": \"</a></foo >\\n\",\n    \"html\": \"<p></a></foo ></p>\\n\",\n    \"example\": 623,\n    \"start_line\": 9116,\n    \"end_line\": 9120,\n    \"section\": \"Raw HTML\"\n  },\n  {\n    \"markdown\": \"</a href=\\\"foo\\\">\\n\",\n    \"html\": \"<p>&lt;/a href=&quot;foo&quot;&gt;</p>\\n\",\n    \"example\": 624,\n    \"start_line\": 9125,\n    \"end_line\": 9129,\n    \"section\": \"Raw HTML\"\n  },\n  {\n    \"markdown\": \"foo <!-- this is a --\\ncomment - with hyphens -->\\n\",\n    \"html\": \"<p>foo <!-- this is a --\\ncomment - with hyphens --></p>\\n\",\n    \"example\": 625,\n    \"start_line\": 9134,\n    \"end_line\": 9140,\n    \"section\": \"Raw HTML\"\n  },\n  {\n    \"markdown\": \"foo <!--> foo -->\\n\\nfoo <!---> foo -->\\n\",\n    \"html\": \"<p>foo <!--> foo --&gt;</p>\\n<p>foo <!---> foo --&gt;</p>\\n\",\n    \"example\": 626,\n    \"start_line\": 9142,\n    \"end_line\": 9149,\n    \"section\": \"Raw HTML\"\n  },\n  {\n    \"markdown\": \"foo <?php echo $a; ?>\\n\",\n    \"html\": \"<p>foo <?php echo $a; ?></p>\\n\",\n    \"example\": 627,\n    \"start_line\": 9154,\n    \"end_line\": 9158,\n    \"section\": \"Raw HTML\"\n  },\n  {\n    \"markdown\": \"foo <!ELEMENT br EMPTY>\\n\",\n    \"html\": \"<p>foo <!ELEMENT br EMPTY></p>\\n\",\n    \"example\": 628,\n    \"start_line\": 9163,\n    \"end_line\": 9167,\n    \"section\": \"Raw HTML\"\n  },\n  {\n    \"markdown\": \"foo <![CDATA[>&<]]>\\n\",\n    \"html\": \"<p>foo <![CDATA[>&<]]></p>\\n\",\n    \"example\": 629,\n    \"start_line\": 9172,\n    \"end_line\": 9176,\n    \"section\": \"Raw HTML\"\n  },\n  {\n    \"markdown\": \"foo <a href=\\\"&ouml;\\\">\\n\",\n    \"html\": \"<p>foo <a href=\\\"&ouml;\\\"></p>\\n\",\n    \"example\": 630,\n    \"start_line\": 9182,\n    \"end_line\": 9186,\n    \"section\": \"Raw HTML\"\n  },\n  {\n    \"markdown\": \"foo <a href=\\\"\\\\*\\\">\\n\",\n    \"html\": \"<p>foo <a href=\\\"\\\\*\\\"></p>\\n\",\n    \"example\": 631,\n    \"start_line\": 9191,\n    \"end_line\": 9195,\n    \"section\": \"Raw HTML\"\n  },\n  {\n    \"markdown\": \"<a href=\\\"\\\\\\\"\\\">\\n\",\n    \"html\": \"<p>&lt;a href=&quot;&quot;&quot;&gt;</p>\\n\",\n    \"example\": 632,\n    \"start_line\": 9198,\n    \"end_line\": 9202,\n    \"section\": \"Raw HTML\"\n  },\n  {\n    \"markdown\": \"foo  \\nbaz\\n\",\n    \"html\": \"<p>foo<br />\\nbaz</p>\\n\",\n    \"example\": 633,\n    \"start_line\": 9212,\n    \"end_line\": 9218,\n    \"section\": \"Hard line breaks\"\n  },\n  {\n    \"markdown\": \"foo\\\\\\nbaz\\n\",\n    \"html\": \"<p>foo<br />\\nbaz</p>\\n\",\n    \"example\": 634,\n    \"start_line\": 9224,\n    \"end_line\": 9230,\n    \"section\": \"Hard line breaks\"\n  },\n  {\n    \"markdown\": \"foo       \\nbaz\\n\",\n    \"html\": \"<p>foo<br />\\nbaz</p>\\n\",\n    \"example\": 635,\n    \"start_line\": 9235,\n    \"end_line\": 9241,\n    \"section\": \"Hard line breaks\"\n  },\n  {\n    \"markdown\": \"foo  \\n     bar\\n\",\n    \"html\": \"<p>foo<br />\\nbar</p>\\n\",\n    \"example\": 636,\n    \"start_line\": 9246,\n    \"end_line\": 9252,\n    \"section\": \"Hard line breaks\"\n  },\n  {\n    \"markdown\": \"foo\\\\\\n     bar\\n\",\n    \"html\": \"<p>foo<br />\\nbar</p>\\n\",\n    \"example\": 637,\n    \"start_line\": 9255,\n    \"end_line\": 9261,\n    \"section\": \"Hard line breaks\"\n  },\n  {\n    \"markdown\": \"*foo  \\nbar*\\n\",\n    \"html\": \"<p><em>foo<br />\\nbar</em></p>\\n\",\n    \"example\": 638,\n    \"start_line\": 9267,\n    \"end_line\": 9273,\n    \"section\": \"Hard line breaks\"\n  },\n  {\n    \"markdown\": \"*foo\\\\\\nbar*\\n\",\n    \"html\": \"<p><em>foo<br />\\nbar</em></p>\\n\",\n    \"example\": 639,\n    \"start_line\": 9276,\n    \"end_line\": 9282,\n    \"section\": \"Hard line breaks\"\n  },\n  {\n    \"markdown\": \"`code  \\nspan`\\n\",\n    \"html\": \"<p><code>code   span</code></p>\\n\",\n    \"example\": 640,\n    \"start_line\": 9287,\n    \"end_line\": 9292,\n    \"section\": \"Hard line breaks\"\n  },\n  {\n    \"markdown\": \"`code\\\\\\nspan`\\n\",\n    \"html\": \"<p><code>code\\\\ span</code></p>\\n\",\n    \"example\": 641,\n    \"start_line\": 9295,\n    \"end_line\": 9300,\n    \"section\": \"Hard line breaks\"\n  },\n  {\n    \"markdown\": \"<a href=\\\"foo  \\nbar\\\">\\n\",\n    \"html\": \"<p><a href=\\\"foo  \\nbar\\\"></p>\\n\",\n    \"example\": 642,\n    \"start_line\": 9305,\n    \"end_line\": 9311,\n    \"section\": \"Hard line breaks\"\n  },\n  {\n    \"markdown\": \"<a href=\\\"foo\\\\\\nbar\\\">\\n\",\n    \"html\": \"<p><a href=\\\"foo\\\\\\nbar\\\"></p>\\n\",\n    \"example\": 643,\n    \"start_line\": 9314,\n    \"end_line\": 9320,\n    \"section\": \"Hard line breaks\"\n  },\n  {\n    \"markdown\": \"foo\\\\\\n\",\n    \"html\": \"<p>foo\\\\</p>\\n\",\n    \"example\": 644,\n    \"start_line\": 9327,\n    \"end_line\": 9331,\n    \"section\": \"Hard line breaks\"\n  },\n  {\n    \"markdown\": \"foo  \\n\",\n    \"html\": \"<p>foo</p>\\n\",\n    \"example\": 645,\n    \"start_line\": 9334,\n    \"end_line\": 9338,\n    \"section\": \"Hard line breaks\"\n  },\n  {\n    \"markdown\": \"### foo\\\\\\n\",\n    \"html\": \"<h3>foo\\\\</h3>\\n\",\n    \"example\": 646,\n    \"start_line\": 9341,\n    \"end_line\": 9345,\n    \"section\": \"Hard line breaks\"\n  },\n  {\n    \"markdown\": \"### foo  \\n\",\n    \"html\": \"<h3>foo</h3>\\n\",\n    \"example\": 647,\n    \"start_line\": 9348,\n    \"end_line\": 9352,\n    \"section\": \"Hard line breaks\"\n  },\n  {\n    \"markdown\": \"foo\\nbaz\\n\",\n    \"html\": \"<p>foo\\nbaz</p>\\n\",\n    \"example\": 648,\n    \"start_line\": 9363,\n    \"end_line\": 9369,\n    \"section\": \"Soft line breaks\"\n  },\n  {\n    \"markdown\": \"foo \\n baz\\n\",\n    \"html\": \"<p>foo\\nbaz</p>\\n\",\n    \"example\": 649,\n    \"start_line\": 9375,\n    \"end_line\": 9381,\n    \"section\": \"Soft line breaks\"\n  },\n  {\n    \"markdown\": \"hello $.;'there\\n\",\n    \"html\": \"<p>hello $.;'there</p>\\n\",\n    \"example\": 650,\n    \"start_line\": 9395,\n    \"end_line\": 9399,\n    \"section\": \"Textual content\"\n  },\n  {\n    \"markdown\": \"Foo χρῆν\\n\",\n    \"html\": \"<p>Foo χρῆν</p>\\n\",\n    \"example\": 651,\n    \"start_line\": 9402,\n    \"end_line\": 9406,\n    \"section\": \"Textual content\"\n  },\n  {\n    \"markdown\": \"Multiple     spaces\\n\",\n    \"html\": \"<p>Multiple     spaces</p>\\n\",\n    \"example\": 652,\n    \"start_line\": 9411,\n    \"end_line\": 9415,\n    \"section\": \"Textual content\"\n  }\n]\n"
  },
  {
    "path": "test/specs/gfm/gfm.0.29.json",
    "content": "[\n  {\n    \"section\": \"[extension] Tables\",\n    \"html\": \"<table>\\n<thead>\\n<tr>\\n<th>foo</th>\\n<th>bar</th>\\n</tr>\\n</thead>\\n<tbody>\\n<tr>\\n<td>baz</td>\\n<td>bim</td>\\n</tr>\\n</tbody>\\n</table>\",\n    \"markdown\": \"| foo | bar |\\n| --- | --- |\\n| baz | bim |\",\n    \"example\": 198\n  },\n  {\n    \"section\": \"[extension] Tables\",\n    \"html\": \"<table>\\n<thead>\\n<tr>\\n<th align=\\\"center\\\">abc</th>\\n<th align=\\\"right\\\">defghi</th>\\n</tr>\\n</thead>\\n<tbody>\\n<tr>\\n<td align=\\\"center\\\">bar</td>\\n<td align=\\\"right\\\">baz</td>\\n</tr>\\n</tbody>\\n</table>\",\n    \"markdown\": \"| abc | defghi |\\n:-: | -----------:\\nbar | baz\",\n    \"example\": 199\n  },\n  {\n    \"section\": \"[extension] Tables\",\n    \"html\": \"<table>\\n<thead>\\n<tr>\\n<th>f|oo</th>\\n</tr>\\n</thead>\\n<tbody>\\n<tr>\\n<td>b <code>|</code> az</td>\\n</tr>\\n<tr>\\n<td>b <strong>|</strong> im</td>\\n</tr>\\n</tbody>\\n</table>\",\n    \"markdown\": \"| f\\\\|oo  |\\n| ------ |\\n| b `\\\\|` az |\\n| b **\\\\|** im |\",\n    \"example\": 200\n  },\n  {\n    \"section\": \"[extension] Tables\",\n    \"html\": \"<table>\\n<thead>\\n<tr>\\n<th>abc</th>\\n<th>def</th>\\n</tr>\\n</thead>\\n<tbody>\\n<tr>\\n<td>bar</td>\\n<td>baz</td>\\n</tr>\\n</tbody>\\n</table>\\n<blockquote>\\n<p>bar</p>\\n</blockquote>\",\n    \"markdown\": \"| abc | def |\\n| --- | --- |\\n| bar | baz |\\n> bar\",\n    \"example\": 201\n  },\n  {\n    \"section\": \"[extension] Tables\",\n    \"html\": \"<table>\\n<thead>\\n<tr>\\n<th>abc</th>\\n<th>def</th>\\n</tr>\\n</thead>\\n<tbody>\\n<tr>\\n<td>bar</td>\\n<td>baz</td>\\n</tr>\\n<tr>\\n<td>bar</td>\\n<td></td>\\n</tr>\\n</tbody>\\n</table>\\n<p>bar</p>\",\n    \"markdown\": \"| abc | def |\\n| --- | --- |\\n| bar | baz |\\nbar\\n\\nbar\",\n    \"example\": 202\n  },\n  {\n    \"section\": \"[extension] Tables\",\n    \"html\": \"<p>| abc | def |\\n| --- |\\n| bar |</p>\",\n    \"markdown\": \"| abc | def |\\n| --- |\\n| bar |\",\n    \"example\": 203\n  },\n  {\n    \"section\": \"[extension] Tables\",\n    \"html\": \"<table>\\n<thead>\\n<tr>\\n<th>abc</th>\\n<th>def</th>\\n</tr>\\n</thead>\\n<tbody>\\n<tr>\\n<td>bar</td>\\n<td></td>\\n</tr>\\n<tr>\\n<td>bar</td>\\n<td>baz</td>\\n</tr>\\n</tbody>\\n</table>\",\n    \"markdown\": \"| abc | def |\\n| --- | --- |\\n| bar |\\n| bar | baz | boo |\",\n    \"example\": 204\n  },\n  {\n    \"section\": \"[extension] Tables\",\n    \"html\": \"<table>\\n<thead>\\n<tr>\\n<th>abc</th>\\n<th>def</th>\\n</tr>\\n</thead>\\n</table>\",\n    \"markdown\": \"| abc | def |\\n| --- | --- |\",\n    \"example\": 205\n  },\n  {\n    \"section\": \"[extension] Task list items\",\n    \"html\": \"<ul>\\n<li><input disabled=\\\"\\\" type=\\\"checkbox\\\"> foo</li>\\n<li><input checked=\\\"\\\" disabled=\\\"\\\" type=\\\"checkbox\\\"> bar</li>\\n</ul>\",\n    \"markdown\": \"- [ ] foo\\n- [x] bar\",\n    \"example\": 279\n  },\n  {\n    \"section\": \"[extension] Task list items\",\n    \"html\": \"<ul>\\n<li><input checked=\\\"\\\" disabled=\\\"\\\" type=\\\"checkbox\\\"> foo\\n<ul>\\n<li><input disabled=\\\"\\\" type=\\\"checkbox\\\"> bar</li>\\n<li><input checked=\\\"\\\" disabled=\\\"\\\" type=\\\"checkbox\\\"> baz</li>\\n</ul>\\n</li>\\n<li><input disabled=\\\"\\\" type=\\\"checkbox\\\"> bim</li>\\n</ul>\",\n    \"markdown\": \"- [x] foo\\n  - [ ] bar\\n  - [x] baz\\n- [ ] bim\",\n    \"example\": 280\n  },\n  {\n    \"section\": \"[extension] Strikethrough\",\n    \"html\": \"<p><del>Hi</del> Hello, <del>there</del> world!</p>\",\n    \"markdown\": \"~~Hi~~ Hello, ~there~ world!\",\n    \"example\": 491\n  },\n  {\n    \"section\": \"[extension] Strikethrough\",\n    \"html\": \"<p>This ~~has a</p>\\n<p>new paragraph~~.</p>\",\n    \"markdown\": \"This ~~has a\\n\\nnew paragraph~~.\",\n    \"example\": 492\n  },\n  {\n    \"section\": \"[extension] Strikethrough\",\n    \"html\": \"<p>This will ~~~not~~~ strike.</p>\",\n    \"markdown\": \"This will ~~~not~~~ strike.\",\n    \"example\": 493\n  },\n  {\n    \"section\": \"[extension] Autolinks\",\n    \"html\": \"<p><a href=\\\"http://www.commonmark.org\\\">www.commonmark.org</a></p>\",\n    \"markdown\": \"www.commonmark.org\",\n    \"example\": 622\n  },\n  {\n    \"section\": \"[extension] Autolinks\",\n    \"html\": \"<p>Visit <a href=\\\"http://www.commonmark.org/help\\\">www.commonmark.org/help</a> for more information.</p>\",\n    \"markdown\": \"Visit www.commonmark.org/help for more information.\",\n    \"example\": 623\n  },\n  {\n    \"section\": \"[extension] Autolinks\",\n    \"html\": \"<p>Visit <a href=\\\"http://www.commonmark.org\\\">www.commonmark.org</a>.</p>\\n<p>Visit <a href=\\\"http://www.commonmark.org/a.b\\\">www.commonmark.org/a.b</a>.</p>\",\n    \"markdown\": \"Visit www.commonmark.org.\\n\\nVisit www.commonmark.org/a.b.\",\n    \"example\": 624\n  },\n  {\n    \"section\": \"[extension] Autolinks\",\n    \"html\": \"<p><a href=\\\"http://www.google.com/search?q=Markup+(business)\\\">www.google.com/search?q=Markup+(business)</a></p>\\n<p><a href=\\\"http://www.google.com/search?q=Markup+(business)\\\">www.google.com/search?q=Markup+(business)</a>))</p>\\n<p>(<a href=\\\"http://www.google.com/search?q=Markup+(business)\\\">www.google.com/search?q=Markup+(business)</a>)</p>\\n<p>(<a href=\\\"http://www.google.com/search?q=Markup+(business)\\\">www.google.com/search?q=Markup+(business)</a></p>\",\n    \"markdown\": \"www.google.com/search?q=Markup+(business)\\n\\nwww.google.com/search?q=Markup+(business)))\\n\\n(www.google.com/search?q=Markup+(business))\\n\\n(www.google.com/search?q=Markup+(business)\",\n    \"example\": 625\n  },\n  {\n    \"section\": \"[extension] Autolinks\",\n    \"html\": \"<p><a href=\\\"http://www.google.com/search?q=(business))+ok\\\">www.google.com/search?q=(business))+ok</a></p>\",\n    \"markdown\": \"www.google.com/search?q=(business))+ok\",\n    \"example\": 626\n  },\n  {\n    \"section\": \"[extension] Autolinks\",\n    \"html\": \"<p><a href=\\\"http://www.google.com/search?q=commonmark&amp;hl=en\\\">www.google.com/search?q=commonmark&amp;hl=en</a></p>\\n<p><a href=\\\"http://www.google.com/search?q=commonmark\\\">www.google.com/search?q=commonmark</a>&amp;hl;</p>\",\n    \"markdown\": \"www.google.com/search?q=commonmark&hl=en\\n\\nwww.google.com/search?q=commonmark&hl;\",\n    \"example\": 627\n  },\n  {\n    \"section\": \"[extension] Autolinks\",\n    \"html\": \"<p><a href=\\\"http://www.commonmark.org/he\\\">www.commonmark.org/he</a>&lt;lp</p>\",\n    \"markdown\": \"www.commonmark.org/he<lp\",\n    \"example\": 628\n  },\n  {\n    \"section\": \"[extension] Autolinks\",\n    \"html\": \"<p><a href=\\\"http://commonmark.org\\\">http://commonmark.org</a></p>\\n<p>(Visit <a href=\\\"https://encrypted.google.com/search?q=Markup+(business)\\\">https://encrypted.google.com/search?q=Markup+(business)</a>)</p>\",\n    \"markdown\": \"http://commonmark.org\\n\\n(Visit https://encrypted.google.com/search?q=Markup+(business))\",\n    \"example\": 629\n  },\n  {\n    \"section\": \"[extension] Autolinks\",\n    \"html\": \"<p><a href=\\\"mailto:foo@bar.baz\\\">foo@bar.baz</a></p>\",\n    \"markdown\": \"foo@bar.baz\",\n    \"example\": 630\n  },\n  {\n    \"section\": \"[extension] Autolinks\",\n    \"html\": \"<p>hello@mail+xyz.example isn't valid, but <a href=\\\"mailto:hello+xyz@mail.example\\\">hello+xyz@mail.example</a> is.</p>\",\n    \"markdown\": \"hello@mail+xyz.example isn't valid, but hello+xyz@mail.example is.\",\n    \"example\": 631\n  },\n  {\n    \"section\": \"[extension] Autolinks\",\n    \"html\": \"<p><a href=\\\"mailto:a.b-c_d@a.b\\\">a.b-c_d@a.b</a></p>\\n<p><a href=\\\"mailto:a.b-c_d@a.b\\\">a.b-c_d@a.b</a>.</p>\\n<p>a.b-c_d@a.b-</p>\\n<p>a.b-c_d@a.b_</p>\",\n    \"markdown\": \"a.b-c_d@a.b\\n\\na.b-c_d@a.b.\\n\\na.b-c_d@a.b-\\n\\na.b-c_d@a.b_\",\n    \"example\": 632\n  },\n  {\n    \"section\": \"[extension] Autolinks\",\n    \"html\": \"<p><a href=\\\"mailto:foo@bar.baz\\\">mailto:foo@bar.baz</a></p>\\n<p><a href=\\\"mailto:a.b-c_d@a.b\\\">mailto:a.b-c_d@a.b</a></p>\\n<p><a href=\\\"mailto:a.b-c_d@a.b\\\">mailto:a.b-c_d@a.b</a>.</p>\\n<p><a href=\\\"mailto:a.b-c_d@a.b\\\">mailto:a.b-c_d@a.b</a>/</p>\\n<p>mailto:a.b-c_d@a.b-</p>\\n<p>mailto:a.b-c_d@a.b_</p>\\n<p><a href=\\\"xmpp:foo@bar.baz\\\">xmpp:foo@bar.baz</a></p>\\n<p><a href=\\\"xmpp:foo@bar.baz\\\">xmpp:foo@bar.baz</a>.</p>\",\n    \"markdown\": \"mailto:foo@bar.baz\\n\\nmailto:a.b-c_d@a.b\\n\\nmailto:a.b-c_d@a.b.\\n\\nmailto:a.b-c_d@a.b/\\n\\nmailto:a.b-c_d@a.b-\\n\\nmailto:a.b-c_d@a.b_\\n\\nxmpp:foo@bar.baz\\n\\nxmpp:foo@bar.baz.\",\n    \"example\": 633,\n    \"shouldFail\": true\n  },\n  {\n    \"section\": \"[extension] Autolinks\",\n    \"html\": \"<p><a href=\\\"xmpp:foo@bar.baz/txt\\\">xmpp:foo@bar.baz/txt</a></p>\\n<p><a href=\\\"xmpp:foo@bar.baz/txt@bin\\\">xmpp:foo@bar.baz/txt@bin</a></p>\\n<p><a href=\\\"xmpp:foo@bar.baz/txt@bin.com\\\">xmpp:foo@bar.baz/txt@bin.com</a></p>\",\n    \"markdown\": \"xmpp:foo@bar.baz/txt\\n\\nxmpp:foo@bar.baz/txt@bin\\n\\nxmpp:foo@bar.baz/txt@bin.com\",\n    \"example\": 634,\n    \"shouldFail\": true\n  },\n  {\n    \"section\": \"[extension] Autolinks\",\n    \"html\": \"<p><a href=\\\"xmpp:foo@bar.baz/txt\\\">xmpp:foo@bar.baz/txt</a>/bin</p>\",\n    \"markdown\": \"xmpp:foo@bar.baz/txt/bin\",\n    \"example\": 635,\n    \"shouldFail\": true\n  },\n  {\n    \"section\": \"[extension] Disallowed Raw HTML\",\n    \"html\": \"<p><strong> &lt;title> &lt;style> <em></p>\\n<blockquote>\\n  &lt;xmp> is disallowed.  &lt;XMP> is also disallowed.\\n</blockquote>\",\n    \"markdown\": \"<strong> <title> <style> <em>\\n\\n<blockquote>\\n  <xmp> is disallowed.  <XMP> is also disallowed.\\n</blockquote>\",\n    \"example\": 657,\n    \"shouldFail\": true\n  }\n]\n"
  },
  {
    "path": "test/specs/new/adjacent_lists.html",
    "content": "<ul>\n<li>This should be</li>\n<li>An unordered list</li>\n</ul>\n\n<ol>\n<li>This should be</li>\n<li>An unordered list</li>\n</ol>\n"
  },
  {
    "path": "test/specs/new/adjacent_lists.md",
    "content": "* This should be\n* An unordered list\n\n1. This should be\n2. An unordered list\n"
  },
  {
    "path": "test/specs/new/angle_brackets.html",
    "content": "<p>1 &lt; 2 <strong>OR</strong> 4 &gt; 3</p>\n"
  },
  {
    "path": "test/specs/new/angle_brackets.md",
    "content": "1 < 2 **OR** 4 > 3\n"
  },
  {
    "path": "test/specs/new/autolink_after_link.html",
    "content": "<p><a href=\"https://github.com\">Github</a></p>\n\n<p><a href=\"https://github.com\">https://github.com</a></p>\n"
  },
  {
    "path": "test/specs/new/autolink_after_link.md",
    "content": "---\ngfm: true\n---\n[Github](https://github.com)\n\nhttps://github.com\n"
  },
  {
    "path": "test/specs/new/autolink_lines.html",
    "content": "<p>hello world\n<a href=\"http://example.com\">http://example.com</a>\n</p>\n"
  },
  {
    "path": "test/specs/new/autolink_lines.md",
    "content": "hello world\n<http://example.com>\n"
  },
  {
    "path": "test/specs/new/autolinks.html",
    "content": "<p>(See <a href=\"https://www.example.com/fhqwhgads\">https://www.example.com/fhqwhgads</a>.)</p>\n\n<p>((<a href=\"http://foo.com\">http://foo.com</a>))</p>\n\n<p>((<a href=\"http://foo.com\">http://foo.com</a>.))</p>\n\n<p><a href=\"HTTP://FOO.COM\">HTTP://FOO.COM</a></p>\n\n<p><a href=\"hTtP://fOo.CoM\">hTtP://fOo.CoM</a></p>\n\n<p><del><a href=\"mailto:hello@email.com\">hello@email.com</a></del></p>\n\n<p><strong><a href=\"mailto:me@example.com\">me@example.com</a></strong></p>\n\n<p><strong><a href=\"mailto:test@test.com\">test@test.com</a></strong></p>\n\n<p><a href=\"http://www.example.com\">www.example.com</a></p>\n\n<p>Www.example.com</p>\n\n<p>WWW.example.com</p>\n\n<p>(See <a href=\"hTtPS://example.com/fhqwhgads\">hTtPS://example.com/fhqwhgads</a>.)</p>\n"
  },
  {
    "path": "test/specs/new/autolinks.md",
    "content": "(See https://www.example.com/fhqwhgads.)\n\n((http://foo.com))\n\n((http://foo.com.))\n\nHTTP://FOO.COM\n\nhTtP://fOo.CoM\n\n~~hello@email.com~~\n\n**me@example.com**\n\n__test@test.com__\n\nwww.example.com\n\nWww.example.com\n\nWWW.example.com\n\n(See hTtPS://example.com/fhqwhgads.)\n"
  },
  {
    "path": "test/specs/new/autolinks_quotes.html",
    "content": "<p>&quot;<a href=\"https://www.example.com?test=quote-in-%22-url\">https://www.example.com?test=quote-in-&quot;-url</a>&quot;</p>\n\n<p>&#39;<a href=\"https://www.example.com?test=quote-in-'-url\">https://www.example.com?test=quote-in-&#39;-url</a>&#39;</p>\n"
  },
  {
    "path": "test/specs/new/autolinks_quotes.md",
    "content": "\"https://www.example.com?test=quote-in-\"-url\"\n\n'https://www.example.com?test=quote-in-'-url'\n"
  },
  {
    "path": "test/specs/new/backtick_precedence.html",
    "content": "<p>**You might think this should be bold, but: <code>**</code></p>\n<p>**You might think this should be bold, but: <code>**</code></p>\n<p>**You might think this should be bold, but: <code>**</code></p>\n<p>**You might think this should be bold, but: <code>**</code></p>\n<p><strong>This should be bold</strong> and <code>this should be code</code></p>\n<p><strong>start <code>contains **</code> end</strong></p>\n<p><strong>This should be bold ``</strong>`</p>\n<p><strong>This should be bold `</strong>``</p>\n<p><strong>start <code>contains **</code> end</strong></p>\n"
  },
  {
    "path": "test/specs/new/backtick_precedence.md",
    "content": "**You might think this should be bold, but: `**`\n\n**You might think this should be bold, but: ``**``\n\n**You might think this should be bold, but: ```**```\n\n**You might think this should be bold, but: ````**````\n\n**This should be bold** and `this should be code`\n\n**start `contains **` end**\n\n**This should be bold ``**`\n\n**This should be bold `**``\n\n**start ``contains **`` end**\n"
  },
  {
    "path": "test/specs/new/backticks_in_links.html",
    "content": "<p><a href=\"https://example.com\"><code>this is a backtick ` and it breaks stuff</code></a></p>\n"
  },
  {
    "path": "test/specs/new/backticks_in_links.md",
    "content": "[`` this is a backtick ` and it breaks stuff ``](https://example.com)\n"
  },
  {
    "path": "test/specs/new/blockquote_following_nptable.html",
    "content": "<table>\n  <thead>\n    <tr>\n      <th>abc</th>\n      <th>def</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <td>bar</td>\n      <td>foo</td>\n    </tr>\n    <tr>\n      <td>baz</td>\n      <td>boo</td>\n    </tr>\n  </tbody>\n</table>\n<blockquote><p>a blockquote</p></blockquote>\n<table>\n  <thead>\n    <tr>\n      <th>abc</th>\n      <th>def</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <td>bar</td>\n      <td>foo</td>\n    </tr>\n    <tr>\n      <td>baz</td>\n      <td>boo</td>\n    </tr>\n  </tbody>\n</table>\n<blockquote><p>a blockquote</p></blockquote>\n"
  },
  {
    "path": "test/specs/new/blockquote_following_nptable.md",
    "content": " abc | def\n --- | ---\n bar | foo\n baz | boo\n> a blockquote\n\n abc | def\n --- | ---\n bar | foo\n baz | boo\n   > a blockquote\n"
  },
  {
    "path": "test/specs/new/blockquote_following_table.html",
    "content": "<table>\n  <thead>\n    <tr>\n      <th>abc</th>\n      <th>def</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <td>bar</td>\n      <td>foo</td>\n    </tr>\n    <tr>\n      <td>baz</td>\n      <td>boo</td>\n    </tr>\n  </tbody>\n</table>\n<blockquote><p>a blockquote</p></blockquote>\n<table>\n  <thead>\n    <tr>\n      <th>abc</th>\n      <th>def</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <td>bar</td>\n      <td>foo</td>\n    </tr>\n    <tr>\n      <td>baz</td>\n      <td>boo</td>\n    </tr>\n  </tbody>\n</table>\n<blockquote><p>a blockquote</p></blockquote>\n"
  },
  {
    "path": "test/specs/new/blockquote_following_table.md",
    "content": "| abc | def |\n| --- | --- |\n| bar | foo |\n| baz | boo |\n> a blockquote\n\n| abc | def |\n| --- | --- |\n| bar | foo |\n| baz | boo |\n   > a blockquote\n"
  },
  {
    "path": "test/specs/new/blockquote_list_item.html",
    "content": "<p>This fails in markdown.pl and upskirt:</p>\n\n<ul><li>hello<blockquote><p>world</p></blockquote></li></ul>\n"
  },
  {
    "path": "test/specs/new/blockquote_list_item.md",
    "content": "This fails in markdown.pl and upskirt:\n\n* hello\n  > world\n"
  },
  {
    "path": "test/specs/new/blockquote_setext.html",
    "content": "<blockquote>\n  <p>not heading 1 ==</p>\n</blockquote>\n\n<blockquote>\n  <p>not heading 2 --</p>\n</blockquote>\n\n<blockquote>\n  <h1>heading 1</h1>\n</blockquote>\n\n<blockquote>\n  <h2>heading 2</h2>\n</blockquote>\n\n<blockquote>\n  <p>not heading 1 == not heading 2 with br<br />--</p>\n</blockquote>\n"
  },
  {
    "path": "test/specs/new/blockquote_setext.md",
    "content": "> not heading 1\n==\n\n> not heading 2\n--\n\n> heading 1\n> ==\n\n> heading 2\n> --\n\n> not heading 1\n==\n> not heading 2 with br  \n--\n"
  },
  {
    "path": "test/specs/new/breakline.html",
    "content": "<p>A<br>break line test<br>Special <code>code</code>A<br>break line test</p>   \n"
  },
  {
    "path": "test/specs/new/breakline.md",
    "content": "A  \nbreak line test  \nSpecial `code`A  \nbreak line test"
  },
  {
    "path": "test/specs/new/breaks.html",
    "content": "<p>A<br>B</p>\n"
  },
  {
    "path": "test/specs/new/breaks.md",
    "content": "---\nbreaks: true\ngfm: true\n---\nA\nB\n"
  },
  {
    "path": "test/specs/new/case_insensitive_refs.html",
    "content": "<p><a href=\"/url\">hi</a></p>\n"
  },
  {
    "path": "test/specs/new/case_insensitive_refs.md",
    "content": "[hi]\n\n[HI]: /url\n"
  },
  {
    "path": "test/specs/new/code_block_no_ending_newline.html",
    "content": "<pre>\n  <code>\n    no newline at end of file\n  </code>\n</pre>\n"
  },
  {
    "path": "test/specs/new/code_block_no_ending_newline.md",
    "content": "```\nno newline at end of file"
  },
  {
    "path": "test/specs/new/code_compensation_indent.html",
    "content": "<p>This is some text.</p>\n<ol>\n<li><p>This is a list element.</p>\n<pre><code>const x = 5;\nconst y = x + 5;\n</code></pre>\n</li>\n</ol>\n"
  },
  {
    "path": "test/specs/new/code_compensation_indent.md",
    "content": "---\nrenderExact: true\n---\nThis is some text.\n\n1. This is a list element.\n\n\t```\n\tconst x = 5;\n\tconst y = x + 5;\n\t```"
  },
  {
    "path": "test/specs/new/code_consistent_newline.html",
    "content": "<pre><code class=\"language-js\">const value = 42;\n</code></pre>\n<pre><code>const value = 42;\n</code></pre>\n<p>Code blocks contain trailing new line.</p>\n"
  },
  {
    "path": "test/specs/new/code_consistent_newline.md",
    "content": "---\nrenderExact: true\n---\n```js\nconst value = 42;\n```\n\n    const value = 42;\n\nCode blocks contain trailing new line.\n"
  },
  {
    "path": "test/specs/new/code_following_nptable.html",
    "content": "<table>\n  <thead>\n    <tr>\n      <th>abc</th>\n      <th>def</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <td>bar</td>\n      <td>foo</td>\n    </tr>\n    <tr>\n      <td>baz</td>\n      <td>boo</td>\n    </tr>\n  </tbody>\n</table>\n<pre><code>a simple\n *indented* code block\n</code></pre>\n\n<table>\n  <thead>\n    <tr>\n      <th>abc</th>\n      <th>def</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <td>bar</td>\n      <td>foo</td>\n    </tr>\n    <tr>\n      <td>baz</td>\n      <td>boo</td>\n    </tr>\n  </tbody>\n</table>\n<pre><code>a simple\n *indented* code block\n</code></pre>\n"
  },
  {
    "path": "test/specs/new/code_following_nptable.md",
    "content": "abc | def\n--- | ---\nbar | foo\nbaz | boo\n    a simple\n      *indented* code block\n\n   abc | def\n   --- | ---\n   bar | foo\n   baz | boo\n    a simple\n      *indented* code block\n"
  },
  {
    "path": "test/specs/new/code_following_table.html",
    "content": "<table>\n  <thead>\n    <tr>\n      <th>abc</th>\n      <th>def</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <td>bar</td>\n      <td>foo</td>\n    </tr>\n    <tr>\n      <td>baz</td>\n      <td>boo</td>\n    </tr>\n  </tbody>\n</table>\n<pre><code>a simple\n *indented* code block\n</code></pre>\n\n<table>\n  <thead>\n    <tr>\n      <th>abc</th>\n      <th>def</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <td>bar</td>\n      <td>foo</td>\n    </tr>\n    <tr>\n      <td>baz</td>\n      <td>boo</td>\n    </tr>\n  </tbody>\n</table>\n<pre><code>a simple\n *indented* code block\n</code></pre>\n"
  },
  {
    "path": "test/specs/new/code_following_table.md",
    "content": "| abc | def |\n| --- | --- |\n| bar | foo |\n| baz | boo |\n    a simple\n      *indented* code block\n\n   | abc | def |\n   | --- | --- |\n   | bar | foo |\n   | baz | boo |\n    a simple\n      *indented* code block\n"
  },
  {
    "path": "test/specs/new/code_spans.html",
    "content": "<p><code>someone@example.com</code></p>\n\n<p>``<em>test`</em></p>"
  },
  {
    "path": "test/specs/new/code_spans.md",
    "content": "`someone@example.com`\n\n``*test`*"
  },
  {
    "path": "test/specs/new/codespan_newline.html",
    "content": "<p><code>code code</code></p>\n\n<ul>\n<li><code>code code</code></li>\n</ul>\n"
  },
  {
    "path": "test/specs/new/codespan_newline.md",
    "content": "`code\ncode`\n\n- `code\ncode`\n"
  },
  {
    "path": "test/specs/new/def_blocks.html",
    "content": "<blockquote>\n  <p>hello\n[1]: hello</p>\n</blockquote>\n\n<hr>\n\n<blockquote>\n  <p>hello\n[2]: hello</p>\n</blockquote>\n\n\n<ul>\n<li>\n  <p>hello</p>\n</li>\n<li></li>\n<li>\n  <p>hello\n[4]: hello</p>\n</li>\n</ul>\n\n\n<blockquote>\n  <p>foo\nbar\n[5]: foo\nbar</p>\n</blockquote>\n"
  },
  {
    "path": "test/specs/new/def_blocks.md",
    "content": "> hello\n> [1]: hello\n\n* * *\n\n> hello\n[2]: hello\n\n\n* hello\n* [3]: hello\n\n\n* hello\n[4]: hello\n\n\n> foo\n> bar\n[5]: foo\n> bar\n"
  },
  {
    "path": "test/specs/new/del_flanking.html",
    "content": "<p>~1,~2</p>\n<p>Between ~1.34 and ~5.4</p>\n<p>Between (~1.34) and (~5.4)</p>\n<p>~ test~</p>\n<p>~test ~</p>\n"
  },
  {
    "path": "test/specs/new/del_flanking.md",
    "content": "~1,~2\n\nBetween ~1.34 and ~5.4\n\nBetween (~1.34) and (~5.4)\n\n~ test~\n\n~test ~\n"
  },
  {
    "path": "test/specs/new/del_strikethrough.html",
    "content": "<p><del>test</del></p>\n\n<p>~~test~</p>\n\n<p>~test~~</p>\n\n<p><del>test</del></p>\n\n<p><del>test\ntest</del></p>\n\n<p>~~test</p>\n\n<p>test~~</p>\n\n<pre><code class=\"language-test~~~\"></code></pre>\n"
  },
  {
    "path": "test/specs/new/del_strikethrough.md",
    "content": "~~test~~\n\n~~test~\n\n~test~~\n\n~test~\n\n~~test\ntest~~\n\n~~test\n\ntest~~\n\n~~~test~~~\n"
  },
  {
    "path": "test/specs/new/double_link.html",
    "content": "<p>Already linked: <a href=\"http://example.com/\">http://example.com/</a>.</p>\n\n<p>Already linked: <a href=\"http://example.com/\">http://example.com/</a>.</p>\n\n<p>Already linked: <a href=\"http://example.com/\">http://example.com/</a>.</p>\n\n<p>Already linked: <a href=\"http://example.com/\"><strong>http://example.com/</strong></a>.</p>\n\n<p>Already linked: <a href=\"http://example.com/\"><em>http://example.com/</em></a>.</p>\n\n<p>Already linked: <a href=\"http://example.com/\"><del>http://example.com/</del></a>.</p>\n\n<p>Already linked: <a href=\"http://example.com/\">http://example.com/</a>.</p>\n\n<p>Already linked: <a href=\"http://example.com/\">http://example.com/</a>.</p>\n"
  },
  {
    "path": "test/specs/new/double_link.md",
    "content": "<p>Already linked: <a href=\"http://example.com/\">http://example.com/</a>.</p>\n\nAlready linked: [http://example.com/](http://example.com/).\n\nAlready linked: <a href=\"http://example.com/\">http://example.com/</a>.\n\nAlready linked: <a href=\"http://example.com/\">**http://example.com/**</a>.\n\nAlready linked: <a href=\"http://example.com/\">*http://example.com/*</a>.\n\nAlready linked: <a href=\"http://example.com/\">~~http://example.com/~~</a>.\n\nAlready linked: [http://example.com/].\n\nAlready linked: [http://example.com/][].\n\n[http://example.com/]: http://example.com/\n"
  },
  {
    "path": "test/specs/new/em_2char.html",
    "content": "<p><em>123</em></p>\n\n<p><em>123</em></p>\n\n<p><em>12</em></p>\n\n<p><em>12</em></p>\n\n<p><em>1</em></p>\n\n<p><em>1</em></p>\n\n<p>__</p>\n\n<p>**</p>\n\n<p>_123 _</p>\n\n<p>*123 *</p>\n\n<p>_ 123_</p>\n\n<p>It’s levi<em>OH</em>sa, not levio<em>SAH.</em></p>\n\n<p>__ test <a href=\"https://test.com/_\">test</a></p>\n"
  },
  {
    "path": "test/specs/new/em_2char.md",
    "content": "_123_\n\n*123*\n\n_12_\n\n*12*\n\n_1_\n\n*1*\n\n__\n\n**\n\n_123 _\n\n*123 *\n\n_ 123_\n\nIt’s levi*OH*sa, not levio*SAH.*\n\n__ test [test](https://test.com/_)\n"
  },
  {
    "path": "test/specs/new/em_after_inline.html",
    "content": "<p>a<br><em>@</em></p>\n\n<p>a<em>a</em><em>a</em><em>@</em></p>\n\n<p>a<strong>a</strong><em>a</em><em>@</em></p>\n\n<p>a<del>a</del><em>@</em></p>\n\n<p>a<code>a</code><em>@</em></p>\n\n<p>a<a href=\"http://a.com\">http://a.com</a><em>@</em></p>\n\n<p>a<a href=\"a\">a</a><em>@</em></p>\n\n<p>a<a><em>@</em></p>\n"
  },
  {
    "path": "test/specs/new/em_after_inline.md",
    "content": "a\\\n*@*\n\na*a*_a_*@*\n\na**a**_a_*@*\n\na~a~*@*\n\na`a`*@*\n\na<http://a.com>*@*\n\na[a](a)*@*\n\na<a>*@*\n"
  },
  {
    "path": "test/specs/new/em_and_reflinks.html",
    "content": "<p><em>Hello<a href=\"theaddress\">reflink*top</a>guys</em>!</p>\n<p><em>Hello [not</em>reflink] guys*!</p>\n<p><em>Hello [not</em>a<em>reflink] guys</em>!</p>\n<p><em>Hello<a href=\"theaddress\">reflink*bottom</a>guys</em>!</p>\n<p><em>Hello<a href=\"theaddress\">reflinknoem</a>guys</em>!</p>\n"
  },
  {
    "path": "test/specs/new/em_and_reflinks.md",
    "content": "[reflink*top]: theaddress\n\n*Hello [reflink*top] guys*!\n\n*Hello [not*reflink] guys*!\n\n*Hello [not*a*reflink] guys*!\n\n*Hello [reflink*bottom] guys*!\n\n*Hello [reflinknoem] guys*!\n\n[reflink*bottom]: theaddress\n\n[reflinknoem]: theaddress\n"
  },
  {
    "path": "test/specs/new/em_link_brackets.html",
    "content": "<p><em><a href=\"http://example.com/_/path\"><code>a[b]c</code></a></em></p>"
  },
  {
    "path": "test/specs/new/em_link_brackets.md",
    "content": "_[`a[b]c`](http://example.com/_/path)_"
  },
  {
    "path": "test/specs/new/em_list_links.html",
    "content": "<ul>\n<li>italic<ul>\n<li><a href=\"https://www.google.com\"><em>named link</em></a></li>\n<li><em><a href=\"https://www.google.com\">named link</a></em></li>\n<li><a href=\"https://www.google.com\"><em>named link</em></a></li>\n<li><em><a href=\"https://www.google.com\">named link</a></em></li>\n</ul>\n</li>\n<li>bold<ul>\n<li><a href=\"https://www.google.com\"><strong>named link</strong></a></li>\n<li><strong><a href=\"https://www.google.com\">named link</a></strong></li>\n<li><a href=\"https://www.google.com\"><strong>named link</strong></a></li>\n<li><strong><a href=\"https://www.google.com\">named link</a></strong></li>\n</ul>\n</li>\n<li>bold italic<ul>\n<li><a href=\"https://www.google.com\"><em><strong>named link</strong></em></a></li>\n<li><em><strong><a href=\"https://www.google.com\">named link</a></strong></em></li>\n<li><a href=\"https://www.google.com\"><em><strong>named link</strong></em></a></li>\n<li><em><strong><a href=\"https://www.google.com\">named link</a></strong></em></li>\n<li><a href=\"https://www.google.com\"><em><strong>named link</strong></em></a></li>\n<li><a href=\"https://www.google.com\"><strong><em>named link</em></strong></a></li>\n<li><strong><em><a href=\"https://www.google.com\">named link</a></em></strong></li>\n</ul>\n</li>\n<li>code<ul>\n<li><a href=\"https://www.google.com\"><code>named link</code></a></li>\n</ul>\n</li>\n<li>code italic<ul>\n<li><em><a href=\"https://www.google.com\"><code>named link</code></a></em></li>\n<li><a href=\"https://www.google.com\"><em><code>named link</code></em></a></li>\n<li><em><a href=\"https://www.google.com\"><code>named link</code></a></em></li>\n<li><a href=\"https://www.google.com\"><em><code>named link</code></em></a></li>\n</ul>\n</li>\n<li>code bold<ul>\n<li><strong><a href=\"https://www.google.com\"><code>named link</code></a></strong></li>\n<li><a href=\"https://www.google.com\"><strong><code>named link</code></strong></a></li>\n<li><strong><a href=\"https://www.google.com\"><code>named link</code></a></strong></li>\n<li><a href=\"https://www.google.com\"><strong><code>named link</code></strong></a></li>\n</ul>\n</li>\n<li>code bold italic<ul>\n<li><a href=\"https://www.google.com\"><em><strong><code>named link</code></strong></em></a></li>\n<li><em><strong><a href=\"https://www.google.com\"><code>named link</code></a></strong></em></li>\n<li><a href=\"https://www.google.com\"><em><strong><code>named link</code></strong></em></a></li>\n<li><em><strong><a href=\"https://www.google.com\"><code>named link</code></a></strong></em></li>\n<li><a href=\"https://www.google.com\"><em><strong><code>named link</code></strong></em></a></li>\n<li><a href=\"https://www.google.com\"><strong><em><code>named link</code></em></strong></a></li>\n<li><strong><em><a href=\"https://www.google.com\"><code>named link</code></a></em></strong></li>\n</ul>\n</li>\n</ul>\n"
  },
  {
    "path": "test/specs/new/em_list_links.md",
    "content": "- italic\n  - [*named link*][some-url]\n  - *[named link][some-url]*\n  - [_named link_][some-url]\n  - _[named link][some-url]_\n- bold\n  - [**named link**][some-url]\n  - **[named link][some-url]**\n  - [__named link__][some-url]\n  - __[named link][some-url]__\n- bold italic\n  - [***named link***][some-url]\n  - ***[named link][some-url]***\n  - [___named link___][some-url]\n  - ___[named link][some-url]___\n  - [*__named link__*][some-url]\n  - [__*named link*__][some-url]\n  - __*[named link][some-url]*__\n- code\n  - [`named link`][some-url]\n- code italic\n  - *[`named link`][some-url]*\n  - [*`named link`*][some-url]\n  - _[`named link`][some-url]_\n  - [_`named link`_][some-url]\n- code bold\n  - **[`named link`][some-url]**\n  - [**`named link`**][some-url]\n  - __[`named link`][some-url]__\n  - [__`named link`__][some-url]\n- code bold italic\n  - [***`named link`***][some-url]\n  - ***[`named link`][some-url]***\n  - [___`named link`___][some-url]\n  - ___[`named link`][some-url]___\n  - [*__`named link`__*][some-url]\n  - [__*`named link`*__][some-url]\n  - __*[`named link`][some-url]*__\n\n[some-url]: https://www.google.com"
  },
  {
    "path": "test/specs/new/em_strong_adjacent.html",
    "content": "<p><em>te</em><em>st</em></p>\n\n<p><em>te</em><strong>st</strong></p>\n\n<p><em>te</em><em>st</em></p>\n\n<p><em>te</em><strong>st</strong></p>\n\n<p><strong>te</strong><em>st</em></p>\n\n<p><strong>te</strong><strong>st</strong></p>\n\n<p><strong>te</strong><em>st</em></p>\n\n<p><strong>te</strong><strong>st</strong></p>\n"
  },
  {
    "path": "test/specs/new/em_strong_adjacent.md",
    "content": "_te_*st*\n\n_te_**st**\n\n*te*_st_\n\n*te*__st__\n\n__te__*st*\n\n__te__**st**\n\n**te**_st_\n\n**te**__st__\n"
  },
  {
    "path": "test/specs/new/em_strong_adjacent_mixed.html",
    "content": "<p><em><strong>foo</strong></em> <strong>bar</strong></p>\n\n<p><em><strong>foo</strong></em> <strong>bar</strong> <em><strong>foo</strong></em></p>\n\n<p><em><strong>foo</strong></em> <strong>bar</strong></p>\n\n<p><em><strong>foo</strong></em> <strong>bar</strong> <em><strong>foo</strong></em></p>\n"
  },
  {
    "path": "test/specs/new/em_strong_adjacent_mixed.md",
    "content": "_**foo**_ **bar**\n\n_**foo**_ **bar** _**foo**_\n\n*__foo__* __bar__\n\n*__foo__* __bar__ *__foo__*\n"
  },
  {
    "path": "test/specs/new/em_strong_complex_nesting.html",
    "content": "<p><strong>E<em>mp</em><em><strong>ha</strong></em><em>si</em>s</strong></p>\n"
  },
  {
    "path": "test/specs/new/em_strong_complex_nesting.md",
    "content": "**E*mp****ha****si*s**\n"
  },
  {
    "path": "test/specs/new/em_strong_multiline.html",
    "content": "<p><em>italic <strong>bold</strong> italic</em>\n<em>italic <strong>bold</strong> italic</em>\n<em>italic <strong>bold</strong> italic</em></p>\n"
  },
  {
    "path": "test/specs/new/em_strong_multiline.md",
    "content": "_italic **bold** italic_\n_italic **bold** italic_\n_italic **bold** italic_\n"
  },
  {
    "path": "test/specs/new/em_strong_orphaned_nesting.html",
    "content": "<p><em><strong>foo_bar</strong></em></p>\n"
  },
  {
    "path": "test/specs/new/em_strong_orphaned_nesting.md",
    "content": "_**foo_bar**_\n"
  },
  {
    "path": "test/specs/new/email_after_space.html",
    "content": "<p><a href=\"mailto:info@email.io\">info@email.io</a></p>\n"
  },
  {
    "path": "test/specs/new/email_after_space.md",
    "content": " info@email.io\n"
  },
  {
    "path": "test/specs/new/emoji_inline.html",
    "content": "<p>Situations where it fails:</p>\n<p><strong>test 💁</strong></p>\n<p><strong>💁 test</strong></p>\n<p><strong>🤓 test</strong></p>\n<p><strong>🏖️ test</strong></p>\n<p><strong>🏖️🤓💁 test</strong></p>\n<p><strong>💁 test</strong> test</p>\n<p>test <strong>💁 test</strong></p>\n<p>test <strong>💁 test</strong> test</p>\n<p><em><strong>test 💁</strong></em></p>\n<p><em><strong>💁 test</strong></em></p>\n<p><em><strong>💁 test</strong></em> test</p>\n<p>test <em><strong>💁 test</strong></em></p>\n<p>test <em><strong>💁 test</strong></em> test</p>\n<p><strong><strong>💁 test</strong></strong></p>\n<p>Situations where it works:</p>\n<p>**💁 **</p>\n<p><strong>⚠️ test</strong></p>\n<p>Here, the emoji rendering works, but the text doesn't get rendered in italic.</p>\n<p><em>💁 test</em></p>\n<p><em>t💁t</em> test</p>\n<p><strong>t💁t</strong> test</p>\n"
  },
  {
    "path": "test/specs/new/emoji_inline.md",
    "content": "Situations where it fails:\n\n**test 💁**\n\n**💁 test**\n\n**🤓 test**\n\n**🏖️ test**\n\n**🏖️🤓💁 test**\n\n**💁 test** test\n\ntest **💁 test**\n\ntest **💁 test** test\n\n***test 💁***\n\n***💁 test***\n\n***💁 test*** test\n\ntest ***💁 test***\n\ntest ***💁 test*** test\n\n****💁 test****\n\nSituations where it works:\n\n**💁 **\n\n**⚠️ test**\n\nHere, the emoji rendering works, but the text doesn't get rendered in italic.\n\n*💁 test*\n\n*t💁t* test\n\n**t💁t** test\n"
  },
  {
    "path": "test/specs/new/emoji_strikethrough.html",
    "content": "<p><del>test 💁</del></p>\n<p><del>💁 test</del></p>\n<p><del>🤓 test</del></p>\n<p><del>🏖️ test</del></p>\n<p><del>🏖️🤓💁 test</del></p>\n<p><del>💁 test</del> test</p>\n<p>test <del>💁 test</del></p>\n<p>test <del>💁 test</del> test</p>\n<p>~~💁 ~~</p>\n<p>~~ 💁~~</p>\n<p><del>⚠️ test</del></p>\n<p><del>💁 test</del></p>\n<p><del>t💁t</del> test</p>\n<p><del>t💁t</del> test</p>\n<p>~1 😁~2</p>\n<p><del>🏴‍☠️</del>  test</p>"
  },
  {
    "path": "test/specs/new/emoji_strikethrough.md",
    "content": "~~test 💁~~\n\n~~💁 test~~\n\n~~🤓 test~~\n\n~~🏖️ test~~\n\n~~🏖️🤓💁 test~~\n\n~~💁 test~~ test\n\ntest ~~💁 test~~\n\ntest ~~💁 test~~ test\n\n~~💁 ~~\n\n~~ 💁~~\n\n~~⚠️ test~~\n\n~💁 test~\n\n~t💁t~ test\n\n~~t💁t~~ test\n\n~1 😁~2\n\n~~🏴‍☠️~~ test\n"
  },
  {
    "path": "test/specs/new/emphasis_extra tests.html",
    "content": "<p><em>test</em>. <em>test</em>: <em>test</em>! <em>test</em>? <em>test</em>- <em>test</em>,</p>\n"
  },
  {
    "path": "test/specs/new/emphasis_extra tests.md",
    "content": "_test_.\n_test_:\n_test_!\n_test_?\n_test_-\n_test_,\n"
  },
  {
    "path": "test/specs/new/empty_heading_following_paragraph.html",
    "content": "<p>Newline after heading</p>\n<h2></h2>\n\n<p>No newline at the end</p>\n<h2></h2>\n"
  },
  {
    "path": "test/specs/new/empty_heading_following_paragraph.md",
    "content": "Newline after heading\n##\n\nNo newline at the end\n##"
  },
  {
    "path": "test/specs/new/empty_heading_following_paragraph_nogfm.html",
    "content": "<p>Newline after heading</p>\n<h2></h2>\n\n<p>No newline at the end</p>\n<h2></h2>\n"
  },
  {
    "path": "test/specs/new/empty_heading_following_paragraph_nogfm.md",
    "content": "---\ngfm: false\n---\nNewline after heading\n##\n\nNo newline at the end\n##"
  },
  {
    "path": "test/specs/new/empty_heading_following_table.html",
    "content": "<table>\n  <thead>\n    <tr>\n      <th>a</th>\n      <th>b</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <td>1</td>\n      <td>2</td>\n    </tr>\n    <tr>\n      <td>3</td>\n      <td>4</td>\n    </tr>\n  </tbody>\n</table>\n<h2></h2>\n\n<p>No newline at the end</p>\n\n<table>\n  <thead>\n    <tr>\n      <th>a</th>\n      <th>b</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <td>1</td>\n      <td>2</td>\n    </tr>\n    <tr>\n      <td>3</td>\n      <td>4</td>\n    </tr>\n  </tbody>\n</table>\n<h2></h2>\n"
  },
  {
    "path": "test/specs/new/empty_heading_following_table.md",
    "content": "| a | b |\n| - | - |\n| 1 | 2 |\n| 3 | 4 |\n##\n\nNo newline at the end\n\n| a | b |\n| - | - |\n| 1 | 2 |\n| 3 | 4 |\n##"
  },
  {
    "path": "test/specs/new/escape_newline.html",
    "content": "<p>\n  <a href=\"https://example.com\">foo<br />\nbar</a>\n</p>\n\n<p>\n  <a href=\"https://example2.com\">foo2<br />\nbar2</a>\n</p>\n\n<p>\n  <a href=\"https://example.com\">foo3<br />\nbar3</a>\n</p>\n"
  },
  {
    "path": "test/specs/new/escape_newline.md",
    "content": "[foo\\\nbar]\n\n[foo\\\nbar]: https://example.com\n\n[foo2\\\nbar2](https://example2.com)\n\n[foo3\\\nbar3][foo\\\nbar]\n"
  },
  {
    "path": "test/specs/new/escape_tick.html",
    "content": "<p><em>italics</em></p>\n<p><strong>bold</strong></p>\n<p><em><strong>bold italics</strong></em></p>\n<p><code>*quoted italics*</code></p>\n<p><code>**quoted bold**</code></p>\n<p><code>***quoted bold italics***</code></p>\n<p>`<em>escaped quoted italics</em>`</p>\n<p>`<strong>escaped quoted bold</strong>`</p>\n<p>`<em><strong>escaped quoted bold italics</strong></em>`</p>\n"
  },
  {
    "path": "test/specs/new/escape_tick.md",
    "content": "*italics*\n\n**bold**\n\n***bold italics***\n\n`*quoted italics*`\n\n`**quoted bold**`\n\n`***quoted bold italics***`\n\n\\`*escaped quoted italics*\\`\n\n\\`**escaped quoted bold**\\`\n\n\\`***escaped quoted bold italics***\\`\n"
  },
  {
    "path": "test/specs/new/escape_within_del.html",
    "content": "<p><del>\\</del></p>\n<p>~\\~</p>\n<p><del>~</del></p>\n<p>~\\~~</p>\n<p>~~ ~</p>\n<p>~ ~~</p>\n"
  },
  {
    "path": "test/specs/new/escape_within_del.md",
    "content": "~\\\\~\n\n~\\\\\\~\n\n~\\~~\n\n~\\\\~~\n\n~\\~ ~\n\n~ \\~~\n"
  },
  {
    "path": "test/specs/new/escape_within_emphasis.html",
    "content": "<p><strong>strong text[</strong>]</p>\n\n<p><strong>strong text\\[</strong>]</p>\n\n<p><strong>strong text\\[</strong>]</p>\n\n<p><strong>strong text\\\\[</strong>]</p>\n\n<p><strong>strong text[</strong>]</p>\n\n<p><strong>strong text\\[</strong>]</p>\n\n<p><strong>strong text\\[</strong>]</p>\n\n<p><strong>strong text\\\\[</strong>]</p>\n\n<p><em>em[pha](sis)</em></p>\n\n<p><em>em[pha](sis)</em></p>\n\n<p><em>\\</em></p>\n\n<p><em>\\</em></p>"
  },
  {
    "path": "test/specs/new/escape_within_emphasis.md",
    "content": "**strong text\\[**\\]\n\n**strong text\\\\[**\\]\n\n**strong text\\\\\\[**\\]\n\n**strong text\\\\\\\\[**\\]\n\n__strong text\\[__\\]\n\n__strong text\\\\[__\\]\n\n__strong text\\\\\\[__\\]\n\n__strong text\\\\\\\\[__\\]\n\n*em\\[pha\\]\\(sis\\)*\n\n_em\\[pha\\]\\(sis\\)_\n\n*\\\\*\n\n_\\\\_\n\n\n"
  },
  {
    "path": "test/specs/new/escaped_angles.html",
    "content": "<p>&gt;</p>\n"
  },
  {
    "path": "test/specs/new/escaped_angles.md",
    "content": "\\>\n"
  },
  {
    "path": "test/specs/new/fences_breaking_paragraphs.html",
    "content": "<p>A paragraph</p>\n<pre><code class=\"language-A\">Here is code in\nbacktick fences</code></pre>\n<p>B paragraph</p>\n<pre><code class=\"language-B\">Here is code in\ntilde fences</code></pre>\n<p>C paragraph</p>\n<pre><code class=\"language-`C~\">Alternative\ntilde fences</code></pre>\n<p>D paragraph ```~D` Invalid use of backtick fences</p>\n<pre><code>\nThis will be read as\npart of a codeblock\nthat ends with the file</code></pre>\n"
  },
  {
    "path": "test/specs/new/fences_breaking_paragraphs.md",
    "content": "A paragraph\n```A\nHere is code in\nbacktick fences\n```\n\nB paragraph\n~~~B\nHere is code in\ntilde fences\n~~~\n\nC paragraph\n~~~`C~\nAlternative\ntilde fences\n~~~\n\nD paragraph\n```~D`\nInvalid use of\nbacktick fences\n```\n\nThis will be read as\npart of a codeblock\nthat ends with the file\n"
  },
  {
    "path": "test/specs/new/fences_following_list.html",
    "content": "<ol>\n<li>abcd</li>\n</ol>\n<pre><code>if {\n\n}\n</code></pre>\n"
  },
  {
    "path": "test/specs/new/fences_following_list.md",
    "content": "1. abcd\n```\nif {\n}\n```\n"
  },
  {
    "path": "test/specs/new/fences_following_nptable.html",
    "content": "<table>\n  <thead>\n    <tr>\n      <th>abc</th>\n      <th>def</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <td>bar</td>\n      <td>foo</td>\n    </tr>\n    <tr>\n      <td>baz</td>\n      <td>boo</td>\n    </tr>\n  </tbody>\n</table>\n<pre><code>foobar()</code></pre>\n"
  },
  {
    "path": "test/specs/new/fences_following_nptable.md",
    "content": " abc | def\n --- | ---\n bar | foo\n baz | boo\n```\nfoobar()\n```\n"
  },
  {
    "path": "test/specs/new/fences_following_table.html",
    "content": "<table>\n  <thead>\n    <tr>\n      <th>abc</th>\n      <th>def</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <td>bar</td>\n      <td>foo</td>\n    </tr>\n    <tr>\n      <td>baz</td>\n      <td>boo</td>\n    </tr>\n  </tbody>\n</table>\n<pre><code>foobar()</code></pre>\n"
  },
  {
    "path": "test/specs/new/fences_following_table.md",
    "content": "| abc | def |\n| --- | --- |\n| bar | foo |\n| baz | boo |\n```\nfoobar()\n```\n"
  },
  {
    "path": "test/specs/new/fences_with_blankline_following_list_0.html",
    "content": "<ol>\n<li>code with blankline</li>\n</ol>\n<pre><code>if {\n\n}\n</code></pre>\n<ol start=\"2\">\n<li>code and text</li>\n</ol>\n<pre><code>if {\n\n}\n</code></pre>\n<p>text after fenced code block.</p>\n<ol start=\"3\">\n<li>tilde</li>\n</ol>\n<pre><code>if {\n\n\n}\n</code></pre>\n"
  },
  {
    "path": "test/specs/new/fences_with_blankline_following_list_0.md",
    "content": "1. code with blankline\n```\nif {\n\n}\n```\n\n2. code and text\n```\nif {\n\n\n}\n```\ntext after fenced code block.\n\n3. tilde\n~~~\nif {\n\n}\n~~~\n"
  },
  {
    "path": "test/specs/new/fences_with_blankline_following_list_1.html",
    "content": "<ol>\n<li><p>code with blankline</p>\n<pre><code>if {\n\n}\n</code></pre>\n</li>\n<li><p>code and text</p>\n<pre><code>if {\n\n}\n</code></pre>\n<p>text after fenced code block.</p>\n</li>\n<li><p>tilde</p>\n<pre><code>if {\n\n\n}\n</code></pre>\n</li>\n</ol>\n"
  },
  {
    "path": "test/specs/new/fences_with_blankline_following_list_1.md",
    "content": "1. code with blankline\n   ```\n   if {\n   \n   }\n   ```\n\n2. code and text\n   ```\n   if {\n   \n   \n   }\n   ```\n   text after fenced code block.\n\n3. tilde\n   ~~~\n   if {\n   \n   }\n   ~~~\n\n"
  },
  {
    "path": "test/specs/new/heading_following_list.html",
    "content": "<h1>level1</h1>\n<h2>level2</h2>\n<h3>level3</h3>\n<ul>\n  <li>foo=bar</li>\n  <li>foo2=bar2</li>\n</ul>\n<h3>level3</h3>\n"
  },
  {
    "path": "test/specs/new/heading_following_list.md",
    "content": "# level1\n## level2\n### level3\n- foo=bar\n- foo2=bar2\n### level3\n"
  },
  {
    "path": "test/specs/new/heading_following_nptable.html",
    "content": "<table>\n  <thead>\n    <tr>\n      <th>abc</th>\n      <th>def</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <td>bar</td>\n      <td>foo</td>\n    </tr>\n    <tr>\n      <td>baz</td>\n      <td>boo</td>\n    </tr>\n  </tbody>\n</table>\n<h1>title</h1>\n"
  },
  {
    "path": "test/specs/new/heading_following_nptable.md",
    "content": " abc | def\n --- | ---\n bar | foo\n baz | boo\n# title\n"
  },
  {
    "path": "test/specs/new/heading_following_table.html",
    "content": "<table>\n  <thead>\n    <tr>\n      <th>abc</th>\n      <th>def</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <td>bar</td>\n      <td>foo</td>\n    </tr>\n    <tr>\n      <td>baz</td>\n      <td>boo</td>\n    </tr>\n  </tbody>\n</table>\n<h1>title</h1>\n"
  },
  {
    "path": "test/specs/new/heading_following_table.md",
    "content": "| abc | def |\n| --- | --- |\n| bar | foo |\n| baz | boo |\n# title\n"
  },
  {
    "path": "test/specs/new/hr_following_nptables.html",
    "content": "<table>\n  <thead>\n    <tr>\n      <th>abc</th>\n      <th>def</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <td>bar</td>\n      <td>foo</td>\n    </tr>\n    <tr>\n      <td>baz</td>\n      <td>boo</td>\n    </tr>\n  </tbody>\n</table>\n<hr>\n\n<table>\n  <thead>\n    <tr>\n      <th>abc</th>\n      <th>def</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <td>bar</td>\n      <td>foo</td>\n    </tr>\n    <tr>\n      <td>baz</td>\n      <td>boo</td>\n    </tr>\n  </tbody>\n</table>\n<hr>\n\n<p>text then table</p>\n<table>\n  <thead>\n    <tr>\n      <th>abc</th>\n      <th>def</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <td>bar</td>\n      <td>foo</td>\n    </tr>\n    <tr>\n      <td>baz</td>\n      <td>boo</td>\n    </tr>\n  </tbody>\n</table>\n<hr>\n"
  },
  {
    "path": "test/specs/new/hr_following_nptables.md",
    "content": " abc | def\n --- | ---\n bar | foo\n baz | boo\n___\n\n abc | def\n --- | ---\n bar | foo\n baz | boo\n---\n\ntext then table\n abc | def\n --- | ---\n bar | foo\n baz | boo\n---\n"
  },
  {
    "path": "test/specs/new/hr_following_tables.html",
    "content": "<table>\n  <thead>\n    <tr>\n      <th>abc</th>\n      <th>def</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <td>bar</td>\n      <td>foo</td>\n    </tr>\n    <tr>\n      <td>baz</td>\n      <td>boo</td>\n    </tr>\n  </tbody>\n</table>\n<hr>\n\n<table>\n  <thead>\n    <tr>\n      <th>abc</th>\n      <th>def</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <td>bar</td>\n      <td>foo</td>\n    </tr>\n    <tr>\n      <td>baz</td>\n      <td>boo</td>\n    </tr>\n  </tbody>\n</table>\n<hr>\n\n<p>text then table</p>\n<table>\n  <thead>\n    <tr>\n      <th>abc</th>\n      <th>def</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <td>bar</td>\n      <td>foo</td>\n    </tr>\n    <tr>\n      <td>baz</td>\n      <td>boo</td>\n    </tr>\n  </tbody>\n</table>\n<hr>\n"
  },
  {
    "path": "test/specs/new/hr_following_tables.md",
    "content": "| abc | def |\n| --- | --- |\n| bar | foo |\n| baz | boo |\n___\n\n| abc | def |\n| --- | --- |\n| bar | foo |\n| baz | boo |\n---\n\ntext then table\n| abc | def |\n| --- | --- |\n| bar | foo |\n| baz | boo |\n---\n"
  },
  {
    "path": "test/specs/new/hr_list_break.html",
    "content": "<ul>\n<li>hello\nworld</li>\n<li>how\nare</li>\n</ul>\n\n<hr>\n\n<p>you today?</p>\n"
  },
  {
    "path": "test/specs/new/hr_list_break.md",
    "content": "* hello\nworld\n* how\nare\n* * *\nyou today?\n"
  },
  {
    "path": "test/specs/new/html_comments.html",
    "content": "<h3>Example 1</h3>\n\n<!-- comment -->\n\n<h3>Example 2</h3>\n\n<!---->\n\n<h3>Example 3</h3>\n\n<!-- -->\n\n<h3>Example 4</h3>\n\n<!-- - -->\n\n<h3>Example 5</h3>\n\n<!-- -- -->\n\n<h3>Example 6</h3>\n\n<!-- --->\n\n<h3>Example 7</h3>\n\n<!----->\n\n<h3>Example 8</h3>\n\n<!------>\n\n<h3>Example 9</h3>\n\n<!-- My favorite operators are > and <!-->\n\n<h3>Example 10</h3>\n\n<!-- multi\nline\ncomment\n-->\n\n<h3>Example 11</h3>\n\n   <!-- indented comment -->\n\n<pre><code>&lt;!-- too much indentation --&gt;\n</code></pre>\n\n<h3>Example 12</h3>\n\n<!--> a comment --&gt;\n\n<!---> a comment --&gt;\n\n<!-- <!-- a comment? --> -->\n\n<h3>Example 13</h3>\n\n<!-- block ends at the end of the document since --!>\n\n*is not a valid comment ending*\n"
  },
  {
    "path": "test/specs/new/html_comments.md",
    "content": "### Example 1\n\n<!-- comment -->\n\n### Example 2\n\n<!---->\n\n### Example 3\n\n<!-- -->\n\n### Example 4\n\n<!-- - -->\n\n### Example 5\n\n<!-- -- -->\n\n### Example 6\n\n<!-- --->\n\n### Example 7\n\n<!----->\n\n### Example 8\n\n<!------>\n\n### Example 9\n\n<!-- My favorite operators are > and <!-->\n\n### Example 10\n\n<!-- multi\nline\ncomment\n-->\n\n### Example 11\n\n   <!-- indented comment -->\n\n    <!-- too much indentation -->\n\n### Example 12\n\n<!--> a comment -->\n\n<!---> a comment -->\n\n<!-- <!-- a comment? --> -->\n\n### Example 13\n\n<!-- block ends at the end of the document since --!>\n\n*is not a valid comment ending*\n"
  },
  {
    "path": "test/specs/new/html_following_list.html",
    "content": "<ul>\n  <li>list item 1</li>\n  <li>list item 2</li>\n</ul>\n<div class=\"some-class\">\nContent\n</div>\n\n<ul>\n  <li>list item 1</li>\n  <li>list item 2</li>\n</ul>\n<!--\nComment\n-->\n"
  },
  {
    "path": "test/specs/new/html_following_list.md",
    "content": "- list item 1\n- list item 2\n<div class=\"some-class\">\nContent\n</div>\n\n- list item 1\n- list item 2\n<!--\nComment\n-->\n"
  },
  {
    "path": "test/specs/new/html_following_nptable.html",
    "content": "<table>\n  <thead>\n    <tr>\n      <th>abc</th>\n      <th>def</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <td>bar</td>\n      <td>foo</td>\n    </tr>\n    <tr>\n      <td>baz</td>\n      <td>boo</td>\n    </tr>\n  </tbody>\n</table>\n<div>Some HTML</div>\n"
  },
  {
    "path": "test/specs/new/html_following_nptable.md",
    "content": " abc | def\n --- | ---\n bar | foo\n baz | boo\n<div>Some HTML</div>\n"
  },
  {
    "path": "test/specs/new/html_following_table.html",
    "content": "<table>\n  <thead>\n    <tr>\n      <th>abc</th>\n      <th>def</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <td>bar</td>\n      <td>foo</td>\n    </tr>\n    <tr>\n      <td>baz</td>\n      <td>boo</td>\n    </tr>\n  </tbody>\n</table>\n<div>Some HTML</div>\n"
  },
  {
    "path": "test/specs/new/html_following_table.md",
    "content": "| abc | def |\n| --- | --- |\n| bar | foo |\n| baz | boo |\n<div>Some HTML</div>\n"
  },
  {
    "path": "test/specs/new/html_no_new_line.html",
    "content": "<img src='sdfg'>"
  },
  {
    "path": "test/specs/new/html_no_new_line.md",
    "content": "<img src='sdfg'>"
  },
  {
    "path": "test/specs/new/image_alt.html",
    "content": "<p><img src=\"https://example.com/404.jpg\" alt=\"&quot; onerror=&quot;alert('XSS')&quot;\" /></p>\n"
  },
  {
    "path": "test/specs/new/image_alt.md",
    "content": "![\" onerror=\"alert('XSS')\"](https://example.com/404.jpg)\n"
  },
  {
    "path": "test/specs/new/image_links.html",
    "content": "<p>\n\t<a href=\"https://example.com/\">\n\t\t<img src=\"https://example.com/image.jpg\" alt=\"test\" title=\"title\" />\n\t</a>\n</p>\n\n<p>\n\t<a href=\"https://example.com/\">\n\t\t<img src=\"https://example.com/image.jpg\" alt=\"[test]\" title=\"[title]\" />\n\t</a>\n</p>\n"
  },
  {
    "path": "test/specs/new/image_links.md",
    "content": "[![test](https://example.com/image.jpg \"title\")](https://example.com/)\n\n[![\\[test\\]](https://example.com/image.jpg \"[title]\")](https://example.com/)\n"
  },
  {
    "path": "test/specs/new/image_paren.html",
    "content": "<p><img src=\"img1.svg\" alt=\"\"> (or <img src=\"img2.svg\" alt=\"\">)</p>\n\n<p><img src=\"img1.svg\" alt=\"one\"> (or <img src=\"img2.svg\" alt=\"two\">)</p>\n"
  },
  {
    "path": "test/specs/new/image_paren.md",
    "content": "![](img1.svg) (or ![](img2.svg))\n\n![one](img1.svg) (or ![two](img2.svg))\n"
  },
  {
    "path": "test/specs/new/incorrectly_formatted_list_and_hr.html",
    "content": "<ul>\n  <li>this is a list, not a heading</li>\n</ul>\n<hr />\n\n<ol>\n  <li>this is also a list</li>\n</ol>\n<ul>\n  <li>it should be a list</li>\n</ul>\n<ul>\n  <li>not heading</li>\n</ul>\n<hr />\n\n<p><s>not heading</s></p>\n<ul>\n  <li>this is also a list, not a multiline heading</li>\n</ul>\n<hr />\n\n<p><a href=\"/index.jpg\">click here</a></p>\n<ul>\n  <li>this has to be a list</li>\n  <li>true...</li>\n</ul>\n<hr />\n\n<h2>\n  <b>heading</b> -this one is a heading\n</h2>\n\n<h2>\n  <b>heading</b> - this is a heading too\n</h2>\n"
  },
  {
    "path": "test/specs/new/incorrectly_formatted_list_and_hr.md",
    "content": "- this is a list, not a heading\n-----\n\n1) this is also a list\n* it should be a list\n- not heading\n-----\n\n<s>not heading</s>\n- this is also a list, not a multiline heading\n*****\n\n[click here](/index.jpg)\n- this has to be a list\n- true...\n_____\n\n<b>heading</b>\n-this one is a heading\n-----\n\n<b>heading</b> - this is a heading too\n-----\n"
  },
  {
    "path": "test/specs/new/indented_details.html",
    "content": "<details>\n\n<h2>Heading</h2>\n</details>\n\n<h2>Heading</h2>\n<custom-tag>\n\n<h2>Heading</h2>\n</custom-tag>\n\n<h2>Heading</h2>\n<details>\n\n<pre><code>## Heading</code></pre>\n</details>\n\n<pre><code>## Heading</code></pre>\n<custom-tag>\n\n<pre><code>## Heading</code></pre>\n</custom-tag>\n\n<pre><code>## Heading</code></pre>\n"
  },
  {
    "path": "test/specs/new/indented_details.md",
    "content": "<details>\n  \n  ## Heading\n</details>\n  \n  ## Heading\n<custom-tag>\n  \n  ## Heading\n</custom-tag>\n  \n  ## Heading\n<details>\n\t\n\t## Heading\n</details>\n\t\n\t## Heading\n<custom-tag>\n\t\n\t## Heading\n</custom-tag>\n\t\n\t## Heading\n"
  },
  {
    "path": "test/specs/new/indented_tables.html",
    "content": "<p>\n| abc | def |\n| --- | --- |\n| bar | foo |\n| baz | boo |\n</p>\n"
  },
  {
    "path": "test/specs/new/indented_tables.md",
    "content": "| abc | def |\n            | --- | --- |\n            | bar | foo |\n            | baz | boo |\n"
  },
  {
    "path": "test/specs/new/inlinecode_following_nptables.html",
    "content": "<table>\n  <thead>\n    <tr>\n      <th>abc</th>\n      <th>def</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <td>bar</td>\n      <td>foo</td>\n    </tr>\n    <tr>\n      <td>baz</td>\n      <td>boo</td>\n    </tr>\n    <tr>\n      <td><code>hello</code></td>\n      <td></td>\n    </tr>\n  </tbody>\n</table>\n"
  },
  {
    "path": "test/specs/new/inlinecode_following_nptables.md",
    "content": " abc | def\n --- | ---\n bar | foo\n baz | boo\n`hello`\n"
  },
  {
    "path": "test/specs/new/inlinecode_following_tables.html",
    "content": "<table>\n  <thead>\n    <tr>\n      <th>abc</th>\n      <th>def</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <td>bar</td>\n      <td>foo</td>\n    </tr>\n    <tr>\n      <td>baz</td>\n      <td>boo</td>\n    </tr>\n    <tr>\n      <td><code>hello</code></td>\n      <td></td>\n    </tr>\n  </tbody>\n</table>\n"
  },
  {
    "path": "test/specs/new/inlinecode_following_tables.md",
    "content": "| abc | def |\n| --- | --- |\n| bar | foo |\n| baz | boo |\n`hello`\n"
  },
  {
    "path": "test/specs/new/lazy_blockquotes.html",
    "content": "<blockquote>\n  <p>hi there\nbud</p>\n</blockquote>\n"
  },
  {
    "path": "test/specs/new/lazy_blockquotes.md",
    "content": "> hi there\nbud\n"
  },
  {
    "path": "test/specs/new/lheading_following_nptable.html",
    "content": "<table>\n  <thead>\n    <tr>\n      <th>abc</th>\n      <th>def</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <td>bar</td>\n      <td>foo</td>\n    </tr>\n    <tr>\n      <td>baz</td>\n      <td>boo</td>\n    </tr>\n    <tr>\n      <td>title</td>\n      <td></td>\n    </tr>\n    <tr>\n      <td>=====</td>\n      <td></td>\n    </tr>\n  </tbody>\n</table>\n"
  },
  {
    "path": "test/specs/new/lheading_following_nptable.md",
    "content": " abc | def\n --- | ---\n bar | foo\n baz | boo\ntitle\n=====\n"
  },
  {
    "path": "test/specs/new/lheading_following_table.html",
    "content": "<table>\n  <thead>\n    <tr>\n      <th>abc</th>\n      <th>def</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <td>bar</td>\n      <td>foo</td>\n    </tr>\n    <tr>\n      <td>baz</td>\n      <td>boo</td>\n    </tr>\n    <tr>\n      <td>title</td>\n      <td></td>\n    </tr>\n    <tr>\n      <td>=====</td>\n      <td></td>\n    </tr>\n  </tbody>\n</table>\n"
  },
  {
    "path": "test/specs/new/lheading_following_table.md",
    "content": "| abc | def |\n| --- | --- |\n| bar | foo |\n| baz | boo |\ntitle\n=====\n"
  },
  {
    "path": "test/specs/new/link_lt.html",
    "content": "<p><a href=\"test\">URL</a></p>\n\n<p><a href=\"test%5C\">URL</a></p>\n"
  },
  {
    "path": "test/specs/new/link_lt.md",
    "content": "---\npedantic: true\n---\n[URL](<test)\n\n[URL](<test\\>)\n"
  },
  {
    "path": "test/specs/new/link_tick_redos.html",
    "content": "<p>dash_capstyle: [&#39;butt&#39; | &#39;round&#39; | &#39;projecting&#39;]\ndash_joinstyle: [&#39;miter&#39; | &#39;round&#39; | &#39;bevel&#39;]\ndashes: sequence of on/off ink in points\ndrawstyle: [&#39;default&#39; | &#39;steps&#39; | &#39;steps-pre&#39; | &#39;steps-mid&#39; | &#39;steps-post&#39;]\nfigure: a <code>~.Figure</code> instance\nfillstyle: [&#39;full&#39; | &#39;left&#39; | &#39;right&#39; | &#39;bottom&#39; | &#39;top&#39; | &#39;none&#39;]\ngid: an id string\nlabel: object\nlinestyle or ls: [&#39;solid&#39; | &#39;dashed&#39;, &#39;dashdot&#39;, &#39;dotted&#39; | (offset, on-off-dash-seq) | <code>&#39;-&#39;</code> | <code>&#39;--&#39;</code> | <code>&#39;-.&#39;</code> | <code>&#39;:&#39;</code> | <code>&#39;None&#39;</code> | <code>&#39; &#39;</code> | <code>&#39;&#39;</code>]\nlinewidth or lw: float value in points\nmarker: :mod:<code>A valid marker style &lt;matplotlib.markers&gt;</code>\nmarkeredgecolor or mec: any matplotlib color\nmarkeredgewidth or mew: float value in points\nmarkerfacecolor or mfc: any matplotlib color\nmarkerfacecoloralt or mfcalt: any matplotlib color\nmarkersize or ms: float\nmarkevery: [None | int | length-2 tuple of int | slice | list/array of int | float | length-2 tuple of float]\npath_effects: <code>~.AbstractPathEffect</code>\npicker: float distance in points or callable pick function <code>fn(artist, event)</code>\npickradius: float distance in points\nrasterized: bool or None\nsketch_params: (scale: float, length: float, randomness: float)\nsnap: bool or None\nsolid_capstyle: [&#39;butt&#39; | &#39;round&#39; |  &#39;projecting&#39;]\nsolid_joinstyle: [&#39;miter&#39; | &#39;round&#39; | &#39;bevel&#39;]\ntransform: a :class:<code>matplotlib.transforms.Transform</code> instance\nurl: a url string\nvisible: bool\nxdata: 1D array\nydata: 1D array\nzorder: float</p>\n"
  },
  {
    "path": "test/specs/new/link_tick_redos.md",
    "content": "  dash_capstyle: ['butt' | 'round' | 'projecting']\n  dash_joinstyle: ['miter' | 'round' | 'bevel']\n  dashes: sequence of on/off ink in points\n  drawstyle: ['default' | 'steps' | 'steps-pre' | 'steps-mid' | 'steps-post']\n  figure: a `~.Figure` instance\n  fillstyle: ['full' | 'left' | 'right' | 'bottom' | 'top' | 'none']\n  gid: an id string\n  label: object\n  linestyle or ls: ['solid' | 'dashed', 'dashdot', 'dotted' | (offset, on-off-dash-seq) | ``'-'`` | ``'--'`` | ``'-.'`` | ``':'`` | ``'None'`` | ``' '`` | ``''``]\n  linewidth or lw: float value in points\n  marker: :mod:`A valid marker style <matplotlib.markers>`\n  markeredgecolor or mec: any matplotlib color\n  markeredgewidth or mew: float value in points\n  markerfacecolor or mfc: any matplotlib color\n  markerfacecoloralt or mfcalt: any matplotlib color\n  markersize or ms: float\n  markevery: [None | int | length-2 tuple of int | slice | list/array of int | float | length-2 tuple of float]\n  path_effects: `~.AbstractPathEffect`\n  picker: float distance in points or callable pick function ``fn(artist, event)``\n  pickradius: float distance in points\n  rasterized: bool or None\n  sketch_params: (scale: float, length: float, randomness: float)\n  snap: bool or None\n  solid_capstyle: ['butt' | 'round' |  'projecting']\n  solid_joinstyle: ['miter' | 'round' | 'bevel']\n  transform: a :class:`matplotlib.transforms.Transform` instance\n  url: a url string\n  visible: bool\n  xdata: 1D array\n  ydata: 1D array\n  zorder: float\n"
  },
  {
    "path": "test/specs/new/link_unbalanced.html",
    "content": "<p>[link](foo(bar())</p>\n\n<p><a href=\"foo(bar()\">link</a></p>\n\n<p><a href=\"foo(bar()\">link</a></p>\n\n<p>[link](foo(bar\\())</p>\n"
  },
  {
    "path": "test/specs/new/link_unbalanced.md",
    "content": "[link](foo(bar())\n\n[link](foo\\(bar())\n\n[link](foo(bar\\())\n\n[link](foo(bar\\\\())\n"
  },
  {
    "path": "test/specs/new/links.html",
    "content": "<p>Link: <a href=\"https://example.org/\">constructor</a>.</p>\n\n<p><a href=\"https://example.com/1\">One</a> (<a href=\"https://example.com/2\">Two</a>) <a href=\"https://example.com/3\">Three</a></p>\n"
  },
  {
    "path": "test/specs/new/links.md",
    "content": "Link: [constructor][].\n\n[One](https://example.com/1) ([Two](https://example.com/2)) [Three](https://example.com/3)\n\n[constructor]: https://example.org/\n"
  },
  {
    "path": "test/specs/new/links_paren.html",
    "content": "<p>(<a href=\"http://example.com/1\">one</a>) (<a href=\"http://example.com/2\">two</a>)</p>\n\n<p>(<a href=\"http://example.com/1\">one</a>) (<a href=\"http://example.com/2\">two</a>)</p>\n\n<p>(<a href=\"http://example.com/1\" title=\"a\">one</a>) (<a href=\"http://example.com/2\" title=\"b\">two</a>)</p>\n"
  },
  {
    "path": "test/specs/new/links_paren.md",
    "content": "([one](http://example.com/1)) ([two](http://example.com/2))\n\n([one](http://example.com/1))  ([two](http://example.com/2))\n\n([one](http://example.com/1 \"a\")) ([two](http://example.com/2 \"b\"))\n"
  },
  {
    "path": "test/specs/new/list_align_number.html",
    "content": "<pre><code>1. Item 1\n</code></pre>\n<ol start=\"10\">\n<li>Item 10</li>\n<li>Item 100</li>\n<li>Item 1000</li>\n<li>Item 10000</li>\n</ol>\n"
  },
  {
    "path": "test/specs/new/list_align_number.md",
    "content": "    1. Item 1\n   10. Item 10\n  100. Item 100\n 1000. Item 1000\n10000. Item 10000\n"
  },
  {
    "path": "test/specs/new/list_align_pedantic.html",
    "content": "<ul>\n\t<li>one\n\t\t<ul>\n\t\t\t<li>two</li>\n\t\t\t<li>three</li>\n\t\t\t<li>four\n\t\t\t\t<ul>\n\t\t\t\t\t<li>five</li>\n\t\t\t\t\t<li>six</li>\n\t\t\t\t\t<li>seven</li>\n\t\t\t\t</ul>\n\t\t\t</li>\n\t\t</ul>\n\t</li>\n</ul>\n"
  },
  {
    "path": "test/specs/new/list_align_pedantic.md",
    "content": "---\npedantic: true\n---\n- one\n - two\n  - three\n    - four\n     - five\n      - six\n       - seven\n"
  },
  {
    "path": "test/specs/new/list_code_header.html",
    "content": "<ul>\n  <li>list <h1>header</h1></li>\n</ul>\n"
  },
  {
    "path": "test/specs/new/list_code_header.md",
    "content": "- list\n  # header\n"
  },
  {
    "path": "test/specs/new/list_following_nptable.html",
    "content": "<table>\n  <thead>\n    <tr>\n      <th>abc</th>\n      <th>def</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <td>bar</td>\n      <td>foo</td>\n    </tr>\n    <tr>\n      <td>baz</td>\n      <td>boo</td>\n    </tr>\n  </tbody>\n</table>\n<ul>\n  <li>foo</li>\n  <li>bar</li>\n  <li>baz</li>\n</ul>\n"
  },
  {
    "path": "test/specs/new/list_following_nptable.md",
    "content": " abc | def\n --- | ---\n bar | foo\n baz | boo\n- foo\n- bar\n- baz\n"
  },
  {
    "path": "test/specs/new/list_following_table.html",
    "content": "<table>\n  <thead>\n    <tr>\n      <th>abc</th>\n      <th>def</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <td>bar</td>\n      <td>foo</td>\n    </tr>\n    <tr>\n      <td>baz</td>\n      <td>boo</td>\n    </tr>\n  </tbody>\n</table>\n<ul>\n  <li>foo</li>\n  <li>bar</li>\n  <li>baz</li>\n</ul>\n"
  },
  {
    "path": "test/specs/new/list_following_table.md",
    "content": "| abc | def |\n| --- | --- |\n| bar | foo |\n| baz | boo |\n- foo\n- bar\n- baz\n"
  },
  {
    "path": "test/specs/new/list_item_empty.html",
    "content": "<ul>\n<li>\n<h2>title</h2>\n</li>\n</ul>\n<hr />\n<ul>\n<li>title\n<ul>\n<li>desc</li>\n<li></li>\n</ul>\n</li>\n</ul>\n"
  },
  {
    "path": "test/specs/new/list_item_empty.md",
    "content": "- title\n    -\n\n---\n\n- title\n    - desc\n    -\n"
  },
  {
    "path": "test/specs/new/list_item_tabs.html",
    "content": "<ul>\n<li>A</li>\n<li>B</li>\n<li>C</li>\n<li>D</li>\n<li>E</li>\n<li>F</li>\n</ul>\n<ol>\n<li>A</li>\n<li>B</li>\n<li>C</li>\n<li>D</li>\n<li>E</li>\n<li>F</li>\n</ol>\n<p>I am using spaces after the number:</p>\n<ol>\n<li>Some Text</li>\n<li>Some Text</li>\n<li>Some Text</li>\n</ol>\n<p>I am using tabs after the number:</p>\n<ol>\n<li>SomeText</li>\n<li>SomeText</li>\n<li>SomeText</li>\n</ol>\n<p>I am using tabs after the number and have a space:</p>\n<ol>\n<li>SomeText</li>\n<li>SomeText</li>\n<li>SomeText</li>\n</ol>\n<p>I am using space after the number and have a tab:</p>\n<ol>\n<li>SomeText</li>\n<li>SomeText</li>\n<li>SomeText</li>\n</ol>\n<p>I am using spaces after the bullet:</p>\n<ul>\n<li>Some Text</li>\n<li>Some Text</li>\n<li>Some Text</li>\n</ul>\n<p>I am using tabs after the bullet:</p>\n<ul>\n<li>SomeText</li>\n<li>SomeText</li>\n<li>SomeText</li>\n</ul>\n<p>I am using tabs after the bullet and have a space:</p>\n<ul>\n<li>SomeText</li>\n<li>SomeText</li>\n<li>SomeText</li>\n</ul>\n<p>I am using space after the bullet and have a tab:</p>\n<ul>\n<li>SomeText</li>\n<li>SomeText</li>\n<li>SomeText</li>\n</ul>\n"
  },
  {
    "path": "test/specs/new/list_item_tabs.md",
    "content": "- A\n-   B\n-\tC\n-\tD\n-\tE\n-\tF\n\n1. A\n2.   B\n3.\tC\n4.\tD\n5.\tE\n6.\tF\n\nI am using spaces after the number:\n1.  Some Text\n3.  Some Text\n4.  Some Text\n\nI am using tabs after the number:\n1.\tSomeText\n2.\tSomeText\n3.\tSomeText\n\nI am using tabs after the number and have a space:\n\n1.\t SomeText\n2.\t SomeText\n3.\t SomeText\n\nI am using space after the number and have a tab:\n\n1. \tSomeText\n2. \tSomeText\n3. \tSomeText\n\nI am using spaces after the bullet:\n-  Some Text\n-  Some Text\n-  Some Text\n\nI am using tabs after the bullet:\n-\tSomeText\n-\tSomeText\n-\tSomeText\n\nI am using tabs after the bullet and have a space:\n\n-\t SomeText\n-\t SomeText\n-\t SomeText\n\nI am using space after the bullet and have a tab:\n\n- \tSomeText\n- \tSomeText\n- \tSomeText\n"
  },
  {
    "path": "test/specs/new/list_item_text.html",
    "content": "<ul><li><p>item1</p>  <ul><li>item2 </li></ul> <p>text</p> </li></ul>\n"
  },
  {
    "path": "test/specs/new/list_item_text.md",
    "content": "---\npedantic: true\n---\n  * item1\n\n    * item2\n\n  text\n"
  },
  {
    "path": "test/specs/new/list_item_unindented_asterisk.html",
    "content": "<h2>*list</h2>\n<ul>\n  <li>list1\n    *Not list(without space)</li>\n  <li>list2</li>\n</ul>\n<h2>+list</h2>\n<ul>\n  <li>list1\n    +Not list(without space)</li>\n  <li>list2</li>\n</ul>\n<h2>-list</h2>\n<ul>\n  <li>list1\n    -Not list(without space)</li>\n  <li>list2</li>\n</ul>\n<h2>number(1.)list</h2>\n<ol>\n  <li>list\n    1.Notlist(without space)</li>\n  <li>list</li>\n</ol>\n"
  },
  {
    "path": "test/specs/new/list_item_unindented_asterisk.md",
    "content": "## *list\n\n* list1\n*Not list(without space)\n* list2\n\n## +list\n\n+ list1\n+Not list(without space)\n+ list2\n\n## -list\n\n- list1\n-Not list(without space)\n- list2\n\n## number(1.)list\n1. list\n1.Notlist(without space)\n1. list\n"
  },
  {
    "path": "test/specs/new/list_loose.html",
    "content": "<ul>\n  <li>\n    <p>item 1</p>\n  </li>\n  <li>\n    <p>item 2</p>\n    <p>still item 2</p>\n  </li>\n</ul>\n"
  },
  {
    "path": "test/specs/new/list_loose.md",
    "content": "- item 1\n-\n  item 2\n\n  still item 2\n"
  },
  {
    "path": "test/specs/new/list_loose_tasks.html",
    "content": "<ul>\n<li>\n<p>Tasks</p>\n</li>\n<li>\n<p><input type=\"checkbox\" checked=\"\" disabled=\"\"> Task1</p>\n</li>\n<li>\n<p><input type=\"checkbox\" disabled=\"\"> <pre>Task2</pre></p>\n</li>\n<li>\n<p>[ ]</p>\n</li>\n</ul>\n"
  },
  {
    "path": "test/specs/new/list_loose_tasks.md",
    "content": "- Tasks\n- [x] Task1\n\n- [ ] <pre>Task2</pre>\n\n- [ ] \n"
  },
  {
    "path": "test/specs/new/list_paren_delimiter.html",
    "content": "<ol>\n<li>one</li>\n<li>two</li>\n<li>three</li>\n</ol>\n\n<hr>\n\n<ol start=\"2\">\n<li>two</li>\n<li>three</li>\n<li>four</li>\n</ol>\n"
  },
  {
    "path": "test/specs/new/list_paren_delimiter.md",
    "content": "1) one\n2) two\n3) three\n\n***\n\n2) two\n3) three\n4) four\n"
  },
  {
    "path": "test/specs/new/list_table.html",
    "content": "<ul>\n\t<li>\n\t\t<p>Table in list:</p>\n\t\t<table>\n\t\t\t<thead>\n\t\t\t\t<tr>\n\t\t\t\t\t<th>column1</th>\n\t\t\t\t\t<th>column2</th>\n\t\t\t\t</tr>\n\t\t\t</thead>\n\t\t\t<tbody>\n\t\t\t\t<tr>\n\t\t\t\t\t<td>value1</td>\n\t\t\t\t\t<td>value2</td>\n\t\t\t\t</tr>\n\t\t\t\t<tr>\n\t\t\t\t\t<td>value3</td>\n\t\t\t\t\t<td>value4</td>\n\t\t\t\t</tr>\n\t\t\t</tbody>\n\t\t</table>\n\t</li>\n\t<li>\n\t\t<p>No leading pipe table in list:</p>\n\t\t<table>\n\t\t\t<thead>\n\t\t\t\t<tr>\n\t\t\t\t\t<th>column1</th>\n\t\t\t\t\t<th>column2</th>\n\t\t\t\t</tr>\n\t\t\t</thead>\n\t\t\t<tbody>\n\t\t\t\t<tr>\n\t\t\t\t\t<td>value1</td>\n\t\t\t\t\t<td>value2</td>\n\t\t\t\t</tr>\n\t\t\t\t<tr>\n\t\t\t\t\t<td>value3</td>\n\t\t\t\t\t<td>value4</td>\n\t\t\t\t</tr>\n\t\t\t</tbody>\n\t\t</table>\n\t</li>\n</ul>\n"
  },
  {
    "path": "test/specs/new/list_table.md",
    "content": "* Table in list:\n\n  | column1 | column2 |\n  |---------|---------|\n  | value1  | value2  |\n  | value3  | value4  |\n\n* No leading pipe table in list:\n\n  column1 | column2\n  --------|--------\n  value1  | value2\n  value3  | value4\n"
  },
  {
    "path": "test/specs/new/list_tasks_non_gfm.html",
    "content": "<ul>\n<li>[ ] A</li>\n<li>[x] B</li>\n<li>[ ] C</li>\n</ul>\n"
  },
  {
    "path": "test/specs/new/list_tasks_non_gfm.md",
    "content": "---\ngfm: false\ndescription: Task lists are ignored when not using GFM\n---\n- [ ] A\n- [x] B\n- [ ] C"
  },
  {
    "path": "test/specs/new/list_with_line_break.html",
    "content": "<ol>\n<li></li>\n</ol>\n<p>Monday\n2.\nTuesday\n3.\nWednesday</p>\n"
  },
  {
    "path": "test/specs/new/list_with_line_break.md",
    "content": "1.\nMonday\n2.\nTuesday\n3.\nWednesday\n"
  },
  {
    "path": "test/specs/new/list_wrong_indent.html",
    "content": "<ul>\n<li>\n<p><strong>Header</strong>:<br />\nnew line</p>\n<p>two space\none space\nno space</p>\n</li>\n</ul>\n<p>new line</p>"
  },
  {
    "path": "test/specs/new/list_wrong_indent.md",
    "content": "- **Header**:  \n  new line\n\n  two space\n one space\nno space\n\nnew line\n"
  },
  {
    "path": "test/specs/new/multiple_sub_lists.html",
    "content": "<ol>\n<li><p>list item one</p>\n<ol>\n<li>sublist item one</li>\n<li>sublist item two</li>\n</ol>\n</li>\n<li><p>list item two</p>\n<ol>\n<li>sublist item one</li>\n<li>sublist item two</li>\n</ol>\n</li>\n<li><p>list item three</p>\n<ol>\n<li>sublist item one</li>\n<li>sublist item two</li>\n</ol>\n</li>\n<li><p>list item four</p>\n<ol>\n<li>sublist item one</li>\n<li>sublist item two</li>\n</ol>\n</li>\n</ol>\n"
  },
  {
    "path": "test/specs/new/multiple_sub_lists.md",
    "content": "1. list item one\n    1. sublist item one\n    2. sublist item two\n\n2. list item two\n    1. sublist item one\n    2. sublist item two\n\n3. list item three\n    1. sublist item one\n    2. sublist item two\n\n4. list item four\n    1. sublist item one\n    2. sublist item two\n"
  },
  {
    "path": "test/specs/new/nbsp_following_tables.html",
    "content": "<table>\n  <thead>\n    <tr>\n      <th>abc</th>\n      <th>def</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <td>bar</td>\n      <td>foo</td>\n    </tr>\n    <tr>\n      <td>baz</td>\n      <td>boo</td>\n    </tr>\n    <tr>\n      <td></td>\n      <td></td>\n    </tr>\n  </tbody>\n</table>\n"
  },
  {
    "path": "test/specs/new/nbsp_following_tables.md",
    "content": "| abc | def |\n| --- | --- |\n| bar | foo |\n| baz | boo |\n \n"
  },
  {
    "path": "test/specs/new/nested_blockquote_in_list.html",
    "content": "<h3>Child</h3>\n<ul>\n<li>list item\n<ul>\n<li>nested list item\n<blockquote>\n<p>quoteblock</p>\n</blockquote>\n</li>\n</ul>\n</li>\n</ul>\n<h3>Sibling</h3>\n<ul>\n<li>list item\n<ul>\n<li>nested list item</li>\n</ul>\n<blockquote>\n<p>quoteblock</p>\n</blockquote>\n</li>\n</ul>\n<h3>Parent level</h3>\n<ul>\n<li>list item\n<ul>\n<li>nested list item</li>\n</ul>\n</li>\n</ul>\n<blockquote>\n<p>quote block</p>\n</blockquote>\n"
  },
  {
    "path": "test/specs/new/nested_blockquote_in_list.md",
    "content": "### Child\n- list item\n  - nested list item\n    > quoteblock\n\n### Sibling\n- list item\n  - nested list item\n  > quoteblock\n\n### Parent level\n- list item\n  - nested list item\n> quote block\n"
  },
  {
    "path": "test/specs/new/nested_code.html",
    "content": "<p><code>hi ther `` ok ```</code></p>\n\n<p><code>`</code></p>\n\n<p><code>There is a literal backtick (`) here.</code></p>\n\n<p>A backtick-delimited string in a code span: <code>`foo`</code></p>\n\n<p>Please don&#39;t use any <code>&lt;blink&gt;</code> tags.</p>"
  },
  {
    "path": "test/specs/new/nested_code.md",
    "content": "````` hi ther `` ok ``` `````\n\n`` ` ``\n\n``There is a literal backtick (`) here.``\n\nA backtick-delimited string in a code span: `` `foo` ``\n\nPlease don't use any `<blink>` tags."
  },
  {
    "path": "test/specs/new/nested_em.html",
    "content": "<p><em>test <strong>test</strong> test</em></p>\n\n<p><em>test <strong>test</strong> test</em></p>\n"
  },
  {
    "path": "test/specs/new/nested_em.md",
    "content": "*test **test** test*\n\n_test __test__ test_\n"
  },
  {
    "path": "test/specs/new/nested_square_link.html",
    "content": "<p><a href=\"/url\">the <code>]</code> character</a></p>\n\n<p><a href=\"/url\">the ` character</a></p>\n"
  },
  {
    "path": "test/specs/new/nested_square_link.md",
    "content": "[the `]` character](/url)\n\n[the \\` character](/url)\n"
  },
  {
    "path": "test/specs/new/nogfm_hashtag.html",
    "content": "<h1>header</h1>\n\n<h1>header1</h1>\n\n<h1>header2</h1>\n"
  },
  {
    "path": "test/specs/new/nogfm_hashtag.md",
    "content": "---\ngfm: false\npedantic: true\n---\n#header\n\n# header1\n\n#  header2\n"
  },
  {
    "path": "test/specs/new/not_a_link.html",
    "content": "<p>[test](not a link)</p>\n"
  },
  {
    "path": "test/specs/new/not_a_link.md",
    "content": "\\[test](not a link)\n"
  },
  {
    "path": "test/specs/new/paragraph-after-list-item.html",
    "content": "<ul>\n  <li>\n    <hr />\n  </li>\n</ul>\n<p>paragraph</p>\n<ul>\n  <li>\n    <h1>heading</h1>\n  </li>\n</ul>\n<p>paragraph</p>\n<ul>\n  <li>\n  <pre><code>indented code</code></pre>\n  </li>\n</ul>\n<p>paragraph</p>\n<ul>\n  <li>\n    <pre><code>fenced code</code></pre>\n  </li>\n</ul>\n<p>paragraph</p>\n"
  },
  {
    "path": "test/specs/new/paragraph-after-list-item.md",
    "content": "- ***\nparagraph\n- # heading\nparagraph\n-     indented code\nparagraph\n- ```\n  fenced code\n  ```\nparagraph\n"
  },
  {
    "path": "test/specs/new/pedantic_heading.html",
    "content": "<h1>h1</h1>\n\n<h1>h1</h1>\n\n<h1>h1 #</h1>\n\n<h1>h1</h1>\n\n<p># h1</p>\n"
  },
  {
    "path": "test/specs/new/pedantic_heading.md",
    "content": "---\npedantic: true\n---\n#h1\n\n#h1#\n\n#h1 # #\n\n#h1####\n\n # h1\n"
  },
  {
    "path": "test/specs/new/pedantic_heading_interrupts_paragraph.html",
    "content": "<p>paragraph before head with hash</p>\n<h1>how are you</h1>\n\n<p>paragraph before head with equals</p>\n<h1>how are you again</h1>\n"
  },
  {
    "path": "test/specs/new/pedantic_heading_interrupts_paragraph.md",
    "content": "---\npedantic: true\n---\n\nparagraph before head with hash\n#how are you\n\nparagraph before head with equals\nhow are you again\n===========\n"
  },
  {
    "path": "test/specs/new/ref_paren.html",
    "content": "<p><a href=\"/url\" title=\"there\">hi</a></p>\n"
  },
  {
    "path": "test/specs/new/ref_paren.md",
    "content": "[hi]\n\n[hi]: /url (there)\n"
  },
  {
    "path": "test/specs/new/same_bullet.html",
    "content": "<ul>\n<li>test</li>\n<li>test</li>\n<li>test</li>\n</ul>\n"
  },
  {
    "path": "test/specs/new/same_bullet.md",
    "content": "---\npedantic: true\n---\n* test\n+ test\n- test\n"
  },
  {
    "path": "test/specs/new/setext_blankline.html",
    "content": "<p>a</p>\n<p>b</p>\n<p>=</p>\n\n<p>a</p>\n<p>b</p>\n<ul>\n  <li></li>\n</ul>\n"
  },
  {
    "path": "test/specs/new/setext_blankline.md",
    "content": "a\n \nb\n \n=\n\na\n \nb\n \n-\n"
  },
  {
    "path": "test/specs/new/setext_no_blankline.html",
    "content": "<pre><code>indented code block\n</code></pre>\n<p>=</p>\n<p>fenced code block</p>\n<pre><code>=\n</code></pre>\n<h3>heading</h3>\n<p>=</p>\n<html>\n=\n"
  },
  {
    "path": "test/specs/new/setext_no_blankline.md",
    "content": "    indented code block\n=\n\nfenced code block\n```\n=\n```\n\n### heading\n=\n\n<html>\n=\n"
  },
  {
    "path": "test/specs/new/space_after_table.html",
    "content": "<table>\n  <thead>\n    <tr>\n      <th>a</th>\n      <th>b</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <td>1</td>\n      <td>2</td>\n    </tr>\n  </tbody>\n</table>\n\n<p>there should be a single space at the end of every line above</p>\n"
  },
  {
    "path": "test/specs/new/space_after_table.md",
    "content": "---\ngfm: true\n---\n| a | b | \n|---|---| \n| 1 | 2 | \n \nthere should be a single space at the end of every line above\n"
  },
  {
    "path": "test/specs/new/strikethrough_in_em_strong.html",
    "content": "<p><em><del>a</del></em>b</p>\n\n<p><em><del>a</del></em>b</p>\n\n<p><strong><del>a</del></strong>b</p>\n\n<p><strong><del>a</del></strong>b</p>\n\n<p>_<del>a</del>_b</p>\n\n<p>_<del>a</del>_b</p>\n\n<p>__<del>a</del>__b</p>\n\n<p>__<del>a</del>__b</p>\n\n<p>b<em><del>a</del></em></p>\n\n<p>b<em><del>a</del></em></p>\n\n<p>b<strong><del>a</del></strong></p>\n\n<p>b<strong><del>a</del></strong></p>\n\n<p>b_<del>a</del>_</p>\n\n<p>b_<del>a</del>_</p>\n\n<p>b__<del>a</del>__</p>\n\n<p>b__<del>a</del>__</p>\n\n<p>b<em><del>a</del></em>b</p>\n\n<p>b<em><del>a</del></em>b</p>\n\n<p>b<strong><del>a</del></strong>b</p>\n\n<p>b<strong><del>a</del></strong>b</p>\n\n<p>b_<del>a</del>_b</p>\n\n<p>b_<del>a</del>_b</p>\n\n<p>b__<del>a</del>__b</p>\n\n<p>b__<del>a</del>__b</p>\n"
  },
  {
    "path": "test/specs/new/strikethrough_in_em_strong.md",
    "content": "*~a~*b\n\n*~~a~~*b\n\n**~a~**b\n\n**~~a~~**b\n\n_~a~_b\n\n_~~a~~_b\n\n__~a~__b\n\n__~~a~~__b\n\nb*~a~*\n\nb*~~a~~*\n\nb**~a~**\n\nb**~~a~~**\n\nb_~a~_\n\nb_~~a~~_\n\nb__~a~__\n\nb__~~a~~__\n\nb*~a~*b\n\nb*~~a~~*b\n\nb**~a~**b\n\nb**~~a~~**b\n\nb_~a~_b\n\nb_~~a~~_b\n\nb__~a~__b\n\nb__~~a~~__b\n"
  },
  {
    "path": "test/specs/new/strong_following_nptables.html",
    "content": "<table>\n  <thead>\n    <tr>\n      <th>abc</th>\n      <th>def</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <td>bar</td>\n      <td>foo</td>\n    </tr>\n    <tr>\n      <td>baz</td>\n      <td>boo</td>\n    </tr>\n    <tr>\n      <td><strong>strong</strong></td>\n      <td></td>\n    </tr>\n  </tbody>\n</table>\n"
  },
  {
    "path": "test/specs/new/strong_following_nptables.md",
    "content": " abc | def\n --- | ---\n bar | foo\n baz | boo\n**strong**\n"
  },
  {
    "path": "test/specs/new/strong_following_tables.html",
    "content": "<table>\n  <thead>\n    <tr>\n      <th>abc</th>\n      <th>def</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <td>bar</td>\n      <td>foo</td>\n    </tr>\n    <tr>\n      <td>baz</td>\n      <td>boo</td>\n    </tr>\n    <tr>\n      <td><strong>strong</strong></td>\n      <td></td>\n    </tr>\n  </tbody>\n</table>\n"
  },
  {
    "path": "test/specs/new/strong_following_tables.md",
    "content": "| abc | def |\n| --- | --- |\n| bar | foo |\n| baz | boo |\n**strong**\n"
  },
  {
    "path": "test/specs/new/substitutions.html",
    "content": "<p>foo␤␤bar</p>\n\n<p>* a *</p>\n"
  },
  {
    "path": "test/specs/new/substitutions.md",
    "content": "foo␤␤bar\n\n* a *\n"
  },
  {
    "path": "test/specs/new/tab_after_blockquote.html",
    "content": "<blockquote><p>test</p></blockquote>"
  },
  {
    "path": "test/specs/new/tab_after_blockquote.md",
    "content": ">\ttest"
  },
  {
    "path": "test/specs/new/tab_newline.html",
    "content": "<table>\n    <thead>\n        <tr>\n            <th>y</th>\n        </tr>\n    </thead>\n    <tbody>\n    <tr>\n        <td>x</td>\n    </tr>\n    </tbody>\n</table>\n<table>\n    <thead>\n    <tr>\n        <th>y</th>\n    </tr>\n    </thead>\n    <tbody>\n    <tr>\n        <td>x</td>\n    </tr>\n    </tbody>\n</table>\n<table>\n    <thead>\n    <tr>\n        <th>y</th>\n    </tr>\n    </thead>\n    <tbody>\n    <tr>\n        <td>x</td>\n    </tr>\n    </tbody>\n</table>\n<pre><code>code\n</code></pre>\n<table>\n    <thead>\n    <tr>\n        <th>y</th>\n    </tr>\n    </thead>\n</table>\n"
  },
  {
    "path": "test/specs/new/tab_newline.md",
    "content": "| y |\n| - |\n| x |\n \n| y |\n| - |\n| x |\n    \n| y |\n| - |\n| x |\n    code\n| y |\n| - |\n "
  },
  {
    "path": "test/specs/new/table_cells.html",
    "content": "<table><thead><tr><th>1</th></tr></thead><tbody><tr><td>1</td></tr></tbody></table>\n\n<table><thead><tr><th>1</th></tr></thead><tbody><tr><td>|</td></tr></tbody></table>\n\n<table><thead><tr><th>1</th></tr></thead><tbody><tr><td>1\\1</td></tr></tbody></table>\n\n<table><thead><tr><th>1</th></tr></thead><tbody><tr><td>\\\\</td></tr></tbody></table>\n\n<table><thead><tr><th>1</th></tr></thead><tbody><tr><td>\\\\|</td></tr></tbody></table>\n\n<table><thead><tr><th>1</th><th>2</th></tr></thead><tbody><tr><td></td><td>2</td></tr></tbody></table>\n\n<table><thead><tr><th>1</th><th>2</th></tr></thead><tbody><tr><td>1|\\</td><td>2|\\</td></tr></tbody></table>\n\n<table><thead><tr><th>1</th><th>2</th></tr></thead><tbody><tr><td></td><td>2</td></tr></tbody></table>\n\n<table><thead><tr><th>1</th><th>2</th></tr></thead><tbody><tr><td>1|\\</td><td>2|\\</td></tr></tbody></table>\n\n<table><thead><tr><th>1</th><th>2</th></tr></thead><tbody><tr><td>2</td><td></td></tr></tbody></table>\n\n<table><thead><tr><th>1</th><th>2</th></tr></thead><tbody><tr><td>1</td><td>2|</td></tr></tbody></table>\n\n<table><thead><tr><th>1</th><th>2</th></tr></thead><tbody><tr><td>1</td><td>2|</td></tr></tbody></table>\n\n<table><thead><tr><th>1</th><th>2</th></tr></thead><tbody><tr><td>1</td><td>2|</td></tr></tbody></table>\n\n<table><thead><tr><th>1</th><th>2</th></tr></thead><tbody><tr><td>1</td><td>2|</td></tr></tbody></table>\n"
  },
  {
    "path": "test/specs/new/table_cells.md",
    "content": "|1|\n|-|\n|1|\n\n|1|\n|-|\n|\\||\n\n|1|\n|-|\n|1\\\\1|\n\n|1|\n|-|\n|\\\\\\\\||\n\n|1|\n|-|\n|\\\\\\\\\\||\n\n|1|2|\n|-|-|\n||2|\n\n|1|2|\n|-|-|\n|1\\|\\\\|2\\|\\\\|\n\n|1|2|\n|-|-|\n| |2|\n\n1|2\n-|-\n1\\|\\\\|2\\|\\\\\n\n1|2\n-|-\n |2\n\n1|2\n-|-\n1|2\\|\n\n1|2\n-|-\n1|2\\|\n\n|1|2|\n|-|-|\n|1|2\\||\n\n|1|2|\n|-|-|\n|1|2\\||\n"
  },
  {
    "path": "test/specs/new/table_following_text.html",
    "content": "<p>hello world</p>\n<table>\n    <thead>\n    <tr>\n        <th>abc</th>\n        <th>def</th>\n    </tr>\n    </thead>\n    <tbody>\n    <tr>\n        <td>bar</td>\n        <td>foo</td>\n    </tr>\n    <tr>\n        <td>baz</td>\n        <td>boo</td>\n    </tr>\n    </tbody>\n</table>\n<p>hello world with empty line</p>\n<table>\n    <thead>\n    <tr>\n        <th>abc</th>\n        <th>def</th>\n    </tr>\n    </thead>\n    <tbody>\n    <tr>\n        <td>bar</td>\n        <td>foo</td>\n    </tr>\n    <tr>\n        <td>baz</td>\n        <td>boo</td>\n    </tr>\n    </tbody>\n</table>\n"
  },
  {
    "path": "test/specs/new/table_following_text.md",
    "content": "---\ngfm: true\n---\nhello world\n| abc | def |\n| --- | --- |\n| bar | foo |\n| baz | boo |\n\nhello world with empty line\n\n| abc | def |\n| --- | --- |\n| bar | foo |\n| baz | boo |\n"
  },
  {
    "path": "test/specs/new/table_reference_link.html",
    "content": "<table>\n\t<thead>\n\t\t<tr>\n\t\t\t<th>a</th>\n\t\t</tr>\n\t</thead>\n\t<tbody>\n\t\t<tr>\n\t\t\t<td><a href=\"https://www.google.com\">d</a></td>\n\t\t</tr>\n\t</tbody>\n</table>\n"
  },
  {
    "path": "test/specs/new/table_reference_link.md",
    "content": "|   a    |\n| ------ |\n| [d][c] |\n\n[c]: https://www.google.com\n"
  },
  {
    "path": "test/specs/new/table_vs_setext.html",
    "content": "<h2>| setext |</h2>\n<p>| setext |</p>\n\n<h2>setext</h2>\n<p>setext</p>\n\n<table>\n  <thead>\n    <tr>\n      <th align=\"left\">table</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <td align=\"left\">table</td>\n    </tr>\n  </tbody>\n</table>\n\n<table>\n  <thead>\n    <tr>\n      <th align=\"left\">table</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <td align=\"left\">table</td>\n    </tr>\n  </tbody>\n</table>\n\n<table>\n  <thead>\n    <tr>\n      <th>table</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <td>table</td>\n    </tr>\n  </tbody>\n</table>\n\n\n"
  },
  {
    "path": "test/specs/new/table_vs_setext.md",
    "content": "---\ngfm: true\n---\n| setext |\n----------\n| setext |\n\nsetext\n------\nsetext\n\n| table |\n:--------\n| table |\n\ntable\n:----\ntable\n\n| table |\n|--------\n| table |\n"
  },
  {
    "path": "test/specs/new/tabs_code.html",
    "content": "<pre><code>\ttab\n</code></pre>\n"
  },
  {
    "path": "test/specs/new/tabs_code.md",
    "content": "---\nrenderExact: true\n---\n```\n\ttab\n```\n"
  },
  {
    "path": "test/specs/new/tasklist_blocks.html",
    "content": "<h1>tight</h1>\n<ul>\n<li><input checked=\"\" disabled=\"\" type=\"checkbox\"> # heading</li>\n<li><input checked=\"\" disabled=\"\" type=\"checkbox\"> - list</li>\n<li><input checked=\"\" disabled=\"\" type=\"checkbox\"> &gt; blockquote</li>\n<li><input checked=\"\" disabled=\"\" type=\"checkbox\"> ---</li>\n<li><input checked=\"\" disabled=\"\" type=\"checkbox\"> ```\n<pre><code></code></pre>\n</li>\n<li><input checked=\"\" disabled=\"\" type=\"checkbox\"> [def]: <a href=\"https://example.com\">https://example.com</a></li>\n<li><input checked=\"\" disabled=\"\" type=\"checkbox\"> <div>\n<em>html</em>\n</div>\n*html*\n</li>\n<li><input checked=\"\" disabled=\"\" type=\"checkbox\"> | a | b |\n|---|---|\n| 1 | 1 |</li>\n</ul>\n<h1>loose</h1>\n<ul>\n<li>\n<p><input checked=\"\" disabled=\"\" type=\"checkbox\"> # heading</p>\n</li>\n<li>\n<p><input checked=\"\" disabled=\"\" type=\"checkbox\"> - list</p>\n</li>\n<li>\n<p><input checked=\"\" disabled=\"\" type=\"checkbox\"> &gt; blockquote</p>\n</li>\n<li>\n<p><input checked=\"\" disabled=\"\" type=\"checkbox\"> ---</p>\n</li>\n<li>\n<p><input checked=\"\" disabled=\"\" type=\"checkbox\"> ```</p>\n<pre><code>\n</code></pre>\n</li>\n<li>\n<p><input checked=\"\" disabled=\"\" type=\"checkbox\"> [def]: <a href=\"https://example.com\">https://example.com</a></p>\n</li>\n<li>\n<p><input checked=\"\" disabled=\"\" type=\"checkbox\"> <div>\n<em>html</em></p>\n</div>\n*html*\n</li>\n<li>\n<p><input checked=\"\" disabled=\"\" type=\"checkbox\"> | a | b |\n|---|---|\n| 1 | 1 |</p>\n</li>\n</ul>\n"
  },
  {
    "path": "test/specs/new/tasklist_blocks.md",
    "content": "# tight\n\n- [x] # heading\n- [x] - list\n- [x] > blockquote\n- [x] ---\n- [x] ```\n  ```\n- [x] [def]: https://example.com\n- [x] <div>\n  *html*\n  </div>\n  *html*\n- [x] | a | b |\n  |---|---|\n  | 1 | 1 |\n\n# loose\n\n- [x] # heading\n\n- [x] - list\n\n- [x] > blockquote\n\n- [x] ---\n\n- [x] ```\n  ```\n\n- [x] [def]: https://example.com\n\n- [x] <div>\n  *html*\n  </div>\n  *html*\n\n- [x] | a | b |\n  |---|---|\n  | 1 | 1 |\n"
  },
  {
    "path": "test/specs/new/text_following_nptables.html",
    "content": "<table>\n  <thead>\n    <tr>\n      <th>abc</th>\n      <th>def</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <td>bar</td>\n      <td>foo</td>\n    </tr>\n    <tr>\n      <td>baz</td>\n      <td>boo</td>\n    </tr>\n    <tr>\n      <td>hello</td>\n      <td></td>\n    </tr>\n  </tbody>\n</table>\n"
  },
  {
    "path": "test/specs/new/text_following_nptables.md",
    "content": " abc | def\n --- | ---\n bar | foo\n baz | boo\nhello\n"
  },
  {
    "path": "test/specs/new/text_following_tables.html",
    "content": "<table>\n  <thead>\n    <tr>\n      <th>abc</th>\n      <th>def</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <td>bar</td>\n      <td>foo</td>\n    </tr>\n    <tr>\n      <td>baz</td>\n      <td>boo</td>\n    </tr>\n    <tr>\n      <td>hello</td>\n      <td></td>\n    </tr>\n  </tbody>\n</table>\n"
  },
  {
    "path": "test/specs/new/text_following_tables.md",
    "content": "| abc | def |\n| --- | --- |\n| bar | foo |\n| baz | boo |\nhello\n"
  },
  {
    "path": "test/specs/new/toplevel_paragraphs.html",
    "content": "<p>hello world\n    text after spaces\n    text after spaces</p>\n\n<p>paragraph before code</p>\n<pre><code>text inside block code</code></pre>\n\n<p>paragraph before hr</p>\n<hr>\n\n<p>paragraph before blockquote</p>\n<blockquote><p>text for blockquote</p></blockquote>\n\n<p>paragraph before list</p>\n<ul><li>text inside list</li></ul>\n\n<p>paragraph before div</p>\n<div>text inside div</div>\n\n<p>paragraph with span\n<span>text inside span</span></p>\n\n<p>hello <a href=\"/are/you\">world</a>\n</p>\n\n<div>hello</div>\n\n<p><span>hello</span></p>\n"
  },
  {
    "path": "test/specs/new/toplevel_paragraphs.md",
    "content": "---\ngfm: true\n---\nhello world\n    text after spaces\n    text after spaces\n\nparagraph before code\n```\ntext inside block code\n```\n\nparagraph before hr\n* * *\n\nparagraph before blockquote\n> text for blockquote\n\nparagraph before list\n* text inside list\n\nparagraph before div\n<div>text inside div</div>\n\nparagraph with span\n<span>text inside span</span>\n\nhello [world][how]\n\n[how]: /are/you\n\n<div>hello</div>\n\n<span>hello</span>\n"
  },
  {
    "path": "test/specs/new/tricky_list.html",
    "content": "<p><strong>hello</strong> <em>world</em></p>\n\n<ul>\n<li>hello world</li>\n</ul>\n\n<p><strong>hello</strong> <em>world</em></p>\n\n<ul>\n<li>hello world</li>\n</ul>\n\n<p><strong>hello</strong> <em>world</em></p>\n\n<ul>\n<li>Hello world</li>\n</ul>\n\n<p><strong>hello</strong> <em>world</em></p>\n\n<ul>\n<li>hello world</li>\n</ul>\n"
  },
  {
    "path": "test/specs/new/tricky_list.md",
    "content": "**hello** _world_\n\n* hello world\n\n**hello** _world_\n\n* hello world\n\n**hello** _world_\n\n* Hello world\n\n**hello** _world_\n\n* hello world\n"
  },
  {
    "path": "test/specs/new/underscore_link.html",
    "content": "<p><em><a href=\"https://example.com?link=with_(underscore)\">test</a></em></p>\n"
  },
  {
    "path": "test/specs/new/underscore_link.md",
    "content": "_[test](https://example.com?link=with_(underscore))_\n"
  },
  {
    "path": "test/specs/new/unicode_punctuation.html",
    "content": "<p>Ideographic comma:</p>\n\n<ul>\n  <li>\n    <p>\n      ×: あれ、<strong><code>foo</code>これ</strong>、それ\n    </p>\n  </li>\n  <li>\n    <p>\n      ○: あれ、 <strong><code>foo</code>これ</strong>、それ\n    </p>\n  </li>\n  <li>\n    <p>\n      ×: あれ、<strong><code>foo</code>これ</strong> 、それ\n    </p>\n  </li>\n  <li><p>○: あれ、<strong>fooこれ</strong>、それ</p></li>\n  <li>\n    <p>○: あれ、 <strong>fooこれ</strong>、それ</p>\n  </li>\n  <li>\n    <p>○: あれ、<strong>fooこれ</strong> 、それ</p>\n  </li>\n</ul>\n\n<p><strong>Fullwidth colon</strong>：\\uFF1A</p>\n"
  },
  {
    "path": "test/specs/new/unicode_punctuation.md",
    "content": "Ideographic comma:\n\n* ×: あれ、**`foo`これ**、それ\n* ○: あれ、 **`foo`これ**、それ\n* ×: あれ、**`foo`これ** 、それ\n\n* ○: あれ、**fooこれ**、それ\n* ○: あれ、 **fooこれ**、それ\n* ○: あれ、**fooこれ** 、それ\n\n__Fullwidth colon__：\\uFF1A\n"
  },
  {
    "path": "test/specs/new/whiltespace_lines.html",
    "content": "<p>paragraph</p>\n<p>test</p>\n<pre><code>a\n  \nb\n\nc\n</code></pre>\n<pre><code>a\n  \nb\n</code></pre>\n"
  },
  {
    "path": "test/specs/new/whiltespace_lines.md",
    "content": "---\nrenderExact: true\n---\nparagraph\n  \ntest\n\n    a\n      \n    b\n  \n    c\n\n```\na\n  \nb\n```\n"
  },
  {
    "path": "test/specs/original/amps_and_angles_encoding.html",
    "content": "<p>AT&amp;T has an ampersand in their name.</p>\n\n<p>AT&amp;T is another way to write it.</p>\n\n<p>This &amp; that.</p>\n\n<p>4 &lt; 5.</p>\n\n<p>6 > 5.</p>\n\n<p>Here's a <a href=\"http://example.com/?foo=1&amp;bar=2\">link</a> with an ampersand in the URL.</p>\n\n<p>Here's a link with an amersand in the link text: <a href=\"http://att.com/\" title=\"AT&amp;T\">AT&amp;T</a>.</p>\n\n<p>Here's an inline <a href=\"/script?foo=1&amp;bar=2\">link</a>.</p>\n\n<p>Here's an inline <a href=\"/script?foo=1&amp;bar=2\">link</a>.</p>\n"
  },
  {
    "path": "test/specs/original/amps_and_angles_encoding.md",
    "content": "---\npedantic: true\n---\n\nAT&T has an ampersand in their name.\n\nAT&amp;T is another way to write it.\n\nThis & that.\n\n4 < 5.\n\n6 > 5.\n\nHere's a [link] [1] with an ampersand in the URL.\n\nHere's a link with an amersand in the link text: [AT&T] [2].\n\nHere's an inline [link](/script?foo=1&bar=2).\n\nHere's an inline [link](</script?foo=1&bar=2>).\n\n\n[1]: http://example.com/?foo=1&bar=2\n[2]: http://att.com/  \"AT&T\"\n"
  },
  {
    "path": "test/specs/original/auto_links.html",
    "content": "<p>Link: <a href=\"http://example.com/\">http://example.com/</a>.</p>\n\n<p>With an ampersand: <a href=\"http://example.com/?foo=1&amp;bar=2\">http://example.com/?foo=1&amp;bar=2</a></p>\n\n<ul>\n<li>In a list?</li>\n<li><a href=\"http://example.com/\">http://example.com/</a></li>\n<li>It should.</li>\n</ul>\n\n<blockquote>\n  <p>Blockquoted: <a href=\"http://example.com/\">http://example.com/</a></p>\n</blockquote>\n\n<p>Auto-links should not occur here: <code>&lt;http://example.com/&gt;</code></p>\n\n<pre><code>or here: &lt;http://example.com/&gt;\n</code></pre>\n"
  },
  {
    "path": "test/specs/original/auto_links.md",
    "content": "Link: <http://example.com/>.\n\nWith an ampersand: <http://example.com/?foo=1&bar=2>\n\n* In a list?\n* <http://example.com/>\n* It should.\n\n> Blockquoted: <http://example.com/>\n\nAuto-links should not occur here: `<http://example.com/>`\n\n\tor here: <http://example.com/>\n"
  },
  {
    "path": "test/specs/original/backslash_escapes.html",
    "content": "<p>These should all get escaped:</p>\n\n<p>Backslash: \\</p>\n\n<p>Backtick: `</p>\n\n<p>Asterisk: *</p>\n\n<p>Underscore: _</p>\n\n<p>Left brace: {</p>\n\n<p>Right brace: }</p>\n\n<p>Left bracket: [</p>\n\n<p>Right bracket: ]</p>\n\n<p>Left paren: (</p>\n\n<p>Right paren: )</p>\n\n<p>Greater-than: &gt;</p>\n\n<p>Hash: #</p>\n\n<p>Period: .</p>\n\n<p>Bang: !</p>\n\n<p>Plus: +</p>\n\n<p>Minus: -</p>\n\n<p>These should not, because they occur within a code block:</p>\n\n<pre><code>Backslash: \\\\\n\nBacktick: \\`\n\nAsterisk: \\*\n\nUnderscore: \\_\n\nLeft brace: \\{\n\nRight brace: \\}\n\nLeft bracket: \\[\n\nRight bracket: \\]\n\nLeft paren: \\(\n\nRight paren: \\)\n\nGreater-than: \\&gt;\n\nHash: \\#\n\nPeriod: \\.\n\nBang: \\!\n\nPlus: \\+\n\nMinus: \\-\n</code></pre>\n\n<p>Nor should these, which occur in code spans:</p>\n\n<p>Backslash: <code>\\\\</code></p>\n\n<p>Backtick: <code>\\`</code></p>\n\n<p>Asterisk: <code>\\*</code></p>\n\n<p>Underscore: <code>\\_</code></p>\n\n<p>Left brace: <code>\\{</code></p>\n\n<p>Right brace: <code>\\}</code></p>\n\n<p>Left bracket: <code>\\[</code></p>\n\n<p>Right bracket: <code>\\]</code></p>\n\n<p>Left paren: <code>\\(</code></p>\n\n<p>Right paren: <code>\\)</code></p>\n\n<p>Greater-than: <code>\\&gt;</code></p>\n\n<p>Hash: <code>\\#</code></p>\n\n<p>Period: <code>\\.</code></p>\n\n<p>Bang: <code>\\!</code></p>\n\n<p>Plus: <code>\\+</code></p>\n\n<p>Minus: <code>\\-</code></p>\n\n\n<p>These should get escaped, even though they're matching pairs for\nother Markdown constructs:</p>\n\n<p>*asterisks*</p>\n\n<p>_underscores_</p>\n\n<p>`backticks`</p>\n\n<p>This is a code span with a literal backslash-backtick sequence: <code>\\`</code></p>\n\n<p>This is a tag with unescaped backticks <span attr='`ticks`'>bar</span>.</p>\n\n<p>This is a tag with backslashes <span attr='\\\\backslashes\\\\'>bar</span>.</p>\n"
  },
  {
    "path": "test/specs/original/backslash_escapes.md",
    "content": "These should all get escaped:\n\nBackslash: \\\\\n\nBacktick: \\`\n\nAsterisk: \\*\n\nUnderscore: \\_\n\nLeft brace: \\{\n\nRight brace: \\}\n\nLeft bracket: \\[\n\nRight bracket: \\]\n\nLeft paren: \\(\n\nRight paren: \\)\n\nGreater-than: \\>\n\nHash: \\#\n\nPeriod: \\.\n\nBang: \\!\n\nPlus: \\+\n\nMinus: \\-\n\n\n\nThese should not, because they occur within a code block:\n\n\tBackslash: \\\\\n\n\tBacktick: \\`\n\n\tAsterisk: \\*\n\n\tUnderscore: \\_\n\n\tLeft brace: \\{\n\n\tRight brace: \\}\n\n\tLeft bracket: \\[\n\n\tRight bracket: \\]\n\n\tLeft paren: \\(\n\n\tRight paren: \\)\n\n\tGreater-than: \\>\n\n\tHash: \\#\n\n\tPeriod: \\.\n\n\tBang: \\!\n\n\tPlus: \\+\n\n\tMinus: \\-\n\n\nNor should these, which occur in code spans:\n\nBackslash: `\\\\`\n\nBacktick: `` \\` ``\n\nAsterisk: `\\*`\n\nUnderscore: `\\_`\n\nLeft brace: `\\{`\n\nRight brace: `\\}`\n\nLeft bracket: `\\[`\n\nRight bracket: `\\]`\n\nLeft paren: `\\(`\n\nRight paren: `\\)`\n\nGreater-than: `\\>`\n\nHash: `\\#`\n\nPeriod: `\\.`\n\nBang: `\\!`\n\nPlus: `\\+`\n\nMinus: `\\-`\n\n\nThese should get escaped, even though they're matching pairs for\nother Markdown constructs:\n\n\\*asterisks\\*\n\n\\_underscores\\_\n\n\\`backticks\\`\n\nThis is a code span with a literal backslash-backtick sequence: `` \\` ``\n\nThis is a tag with unescaped backticks <span attr='`ticks`'>bar</span>.\n\nThis is a tag with backslashes <span attr='\\\\backslashes\\\\'>bar</span>.\n"
  },
  {
    "path": "test/specs/original/blockquotes_with_code_blocks.html",
    "content": "<blockquote>\n  <p>Example:</p>\n\n<pre><code>sub status {\n    print \"working\";\n}\n</code></pre>\n  \n  <p>Or:</p>\n\n<pre><code>sub status {\n    return \"working\";\n}\n</code></pre>\n</blockquote>\n"
  },
  {
    "path": "test/specs/original/blockquotes_with_code_blocks.md",
    "content": "> Example:\n> \n>     sub status {\n>         print \"working\";\n>     }\n> \n> Or:\n> \n>     sub status {\n>         return \"working\";\n>     }\n"
  },
  {
    "path": "test/specs/original/code_blocks.html",
    "content": "<pre><code>code block on the first line\n</code></pre>\n\n<p>Regular text.</p>\n\n<pre><code>code block indented by spaces\n</code></pre>\n\n<p>Regular text.</p>\n\n<pre><code>the lines in this block  \nall contain trailing spaces  \n</code></pre>\n\n<p>Regular Text.</p>\n\n<pre><code>code block on the last line\n</code></pre>\n"
  },
  {
    "path": "test/specs/original/code_blocks.md",
    "content": "\tcode block on the first line\n\t\nRegular text.\n\n    code block indented by spaces\n\nRegular text.\n\n\tthe lines in this block  \n\tall contain trailing spaces  \n\nRegular Text.\n\n\tcode block on the last line\n"
  },
  {
    "path": "test/specs/original/code_spans.html",
    "content": "<p><code>&lt;test a=\"</code> content of attribute <code>\"&gt;</code></p>\n\n<p>Fix for backticks within HTML tag: <span attr='`ticks`'>like this</span></p>\n\n<p>Here's how you put <code>`backticks`</code> in a code span.</p>\n\n"
  },
  {
    "path": "test/specs/original/code_spans.md",
    "content": "`<test a=\"` content of attribute `\">`\n\nFix for backticks within HTML tag: <span attr='`ticks`'>like this</span>\n\nHere's how you put `` `backticks` `` in a code span.\n\n"
  },
  {
    "path": "test/specs/original/hard_wrapped_paragraphs_with_list_like_lines.html",
    "content": "<p>In Markdown 1.0.0 and earlier. Version\n8. This line turns into a list item.\nBecause a hard-wrapped line in the\nmiddle of a paragraph looked like a\nlist item.</p>\n\n<p>Here's one with a bullet.\n* criminey.</p>\n"
  },
  {
    "path": "test/specs/original/hard_wrapped_paragraphs_with_list_like_lines.md",
    "content": "In Markdown 1.0.0 and earlier. Version\n8. This line turns into a list item.\nBecause a hard-wrapped line in the\nmiddle of a paragraph looked like a\nlist item.\n\nHere's one with a bullet.\n* criminey.\n"
  },
  {
    "path": "test/specs/original/horizontal_rules.html",
    "content": "<p>Dashes:</p>\n\n<hr />\n\n<hr />\n\n<hr />\n\n<hr />\n\n<pre><code>---\n</code></pre>\n\n<hr />\n\n<hr />\n\n<hr />\n\n<hr />\n\n<pre><code>- - -\n</code></pre>\n\n<p>Asterisks:</p>\n\n<hr />\n\n<hr />\n\n<hr />\n\n<hr />\n\n<pre><code>***\n</code></pre>\n\n<hr />\n\n<hr />\n\n<hr />\n\n<hr />\n\n<pre><code>* * *\n</code></pre>\n\n<p>Underscores:</p>\n\n<hr />\n\n<hr />\n\n<hr />\n\n<hr />\n\n<pre><code>___\n</code></pre>\n\n<hr />\n\n<hr />\n\n<hr />\n\n<hr />\n\n<pre><code>_ _ _\n</code></pre>\n\n<p>Not horizontal rules:</p>\n<p>--*</p>\n<p>-*-</p>\n<p>*--</p>\n<p>-_-</p>\n<p>__-</p>\n<p>-__</p>\n<pre><code>_-_\n</code></pre>\n<p>Long rules:</p>\n<hr>\n<hr>\n<hr>\n"
  },
  {
    "path": "test/specs/original/horizontal_rules.md",
    "content": "Dashes:\n\n---\n\n ---\n \n  ---\n\n   ---\n\n\t---\n\n- - -\n\n - - -\n \n  - - -\n\n   - - -\n\n\t- - -\n\n\nAsterisks:\n\n***\n\n ***\n \n  ***\n\n   ***\n\n\t***\n\n* * *\n\n * * *\n \n  * * *\n\n   * * *\n\n\t* * *\n\n\nUnderscores:\n\n___\n\n ___\n \n  ___\n\n   ___\n\n    ___\n\n_ _ _\n\n _ _ _\n \n  _ _ _\n\n   _ _ _\n\n    _ _ _\n\n\n\nNot horizontal rules:\n\n--*\n\n-*-\n\n*--\n\n -_-\n\n  __-\n\n   -__\n\n    _-_\n\n\nLong rules:\n\n-----------\n\n___________\n\n***********\n"
  },
  {
    "path": "test/specs/original/inline_html_advanced.html",
    "content": "<p>Simple block on one line:</p>\n\n<div>foo</div>\n\n<p>And nested without indentation:</p>\n\n<div>\n<div>\n<div>\nfoo\n</div>\n<div style=\">\"/>\n</div>\n<div>bar</div>\n</div>\n"
  },
  {
    "path": "test/specs/original/inline_html_advanced.md",
    "content": "Simple block on one line:\n\n<div>foo</div>\n\nAnd nested without indentation:\n\n<div>\n<div>\n<div>\nfoo\n</div>\n<div style=\">\"/>\n</div>\n<div>bar</div>\n</div>\n"
  },
  {
    "path": "test/specs/original/inline_html_comments.html",
    "content": "<p>Paragraph one.</p>\n\n<!-- This is a simple comment -->\n\n<!--\n    This is another comment.\n-->\n\n<p>Paragraph two.</p>\n\n<!-- one comment block -- -- with two comments -->\n\n<p>The end.</p>\n"
  },
  {
    "path": "test/specs/original/inline_html_comments.md",
    "content": "Paragraph one.\n\n<!-- This is a simple comment -->\n\n<!--\n\tThis is another comment.\n-->\n\nParagraph two.\n\n<!-- one comment block -- -- with two comments -->\n\nThe end.\n"
  },
  {
    "path": "test/specs/original/inline_html_simple.html",
    "content": "<p>Here's a simple block:</p>\n\n<div>\n    foo\n</div>\n\n<p>This should be a code block, though:</p>\n\n<pre><code>&lt;div&gt;\n    foo\n&lt;/div&gt;\n</code></pre>\n\n<p>As should this:</p>\n\n<pre><code>&lt;div&gt;foo&lt;/div&gt;\n</code></pre>\n\n<p>Now, nested:</p>\n\n<div>\n    <div>\n        <div>\n            foo\n        </div>\n    </div>\n</div>\n\n<p>This should just be an HTML comment:</p>\n\n<!-- Comment -->\n\n<p>Multiline:</p>\n\n<!--\nBlah\nBlah\n-->\n\n<p>Code block:</p>\n\n<pre><code>&lt;!-- Comment --&gt;\n</code></pre>\n\n<p>Just plain comment, with trailing spaces on the line:</p>\n\n<!-- foo -->   \n\n<p>Code:</p>\n\n<pre><code>&lt;hr /&gt;\n</code></pre>\n\n<p>Hr's:</p>\n\n<hr>\n\n<hr/>\n\n<hr />\n\n<hr>   \n\n<hr/>  \n\n<hr /> \n\n<hr class=\"foo\" id=\"bar\" />\n\n<hr class=\"foo\" id=\"bar\"/>\n\n<hr class=\"foo\" id=\"bar\" >\n"
  },
  {
    "path": "test/specs/original/inline_html_simple.md",
    "content": "Here's a simple block:\n\n<div>\n\tfoo\n</div>\n\nThis should be a code block, though:\n\n\t<div>\n\t\tfoo\n\t</div>\n\nAs should this:\n\n\t<div>foo</div>\n\nNow, nested:\n\n<div>\n\t<div>\n\t\t<div>\n\t\t\tfoo\n\t\t</div>\n\t</div>\n</div>\n\nThis should just be an HTML comment:\n\n<!-- Comment -->\n\nMultiline:\n\n<!--\nBlah\nBlah\n-->\n\nCode block:\n\n\t<!-- Comment -->\n\nJust plain comment, with trailing spaces on the line:\n\n<!-- foo -->   \n\nCode:\n\n\t<hr />\n\t\nHr's:\n\n<hr>\n\n<hr/>\n\n<hr />\n\n<hr>   \n\n<hr/>  \n\n<hr /> \n\n<hr class=\"foo\" id=\"bar\" />\n\n<hr class=\"foo\" id=\"bar\"/>\n\n<hr class=\"foo\" id=\"bar\" >\n\n"
  },
  {
    "path": "test/specs/original/links_inline_style.html",
    "content": "<p>Just a <a href=\"/url/\">URL</a>.</p>\n\n<p><a href=\"/url/\" title=\"title\">URL and title</a>.</p>\n\n<p><a href=\"/url/\" title=\"title preceded by two spaces\">URL and title</a>.</p>\n\n<p><a href=\"/url/\" title=\"title preceded by a tab\">URL and title</a>.</p>\n\n<p><a href=\"/url/\" title=\"title has spaces afterward\">URL and title</a>.</p>\n\n<p><a href=\"/url/has%20space\">URL and title</a>.</p>\n\n<p><a href=\"/url/has%20space/\" title=\"url has space and title\">URL and title</a>.</p>\n\n<p><a href=\"\">Empty</a>.</p>\n"
  },
  {
    "path": "test/specs/original/links_inline_style.md",
    "content": "---\npedantic: true\n---\n\nJust a [URL](/url/).\n\n[URL and title](/url/ \"title\").\n\n[URL and title](/url/  \"title preceded by two spaces\").\n\n[URL and title](/url/\t\"title preceded by a tab\").\n\n[URL and title](/url/ \"title has spaces afterward\"  ).\n\n[URL and title]( /url/has space ).\n\n[URL and title]( /url/has space/ \"url has space and title\").\n\n[Empty]().\n"
  },
  {
    "path": "test/specs/original/links_reference_style.html",
    "content": "<p>Foo <a href=\"/url/\" title=\"Title\">bar</a>.</p>\n\n<p>Foo <a href=\"/url/\" title=\"Title\">bar</a>.</p>\n\n<p>Foo <a href=\"/url/\" title=\"Title\">bar</a>.</p>\n\n<p>With <a href=\"/url/\">embedded [brackets]</a>.</p>\n\n<p>Indented <a href=\"/url\">once</a>.</p>\n\n<p>Indented <a href=\"/url\">twice</a>.</p>\n\n<p>Indented <a href=\"/url\">thrice</a>.</p>\n\n<p>Indented [four][] times.</p>\n\n<pre><code>[four]: /url\n</code></pre>\n\n<hr />\n\n<p><a href=\"foo\">this</a> should work</p>\n\n<p>So should <a href=\"foo\">this</a>.</p>\n\n<p>And <a href=\"foo\">this</a>.</p>\n\n<p>And <a href=\"foo\">this</a>.</p>\n\n<p>And <a href=\"foo\">this</a>.</p>\n\n<p>But not [that] [].</p>\n\n<p>Nor [that][].</p>\n\n<p>Nor [that].</p>\n\n<p>[Something in brackets like <a href=\"foo\">this</a> should work]</p>\n\n<p>[Same with <a href=\"foo\">this</a>.]</p>\n\n<p>In this case, <a href=\"/somethingelse/\">this</a> points to something else.</p>\n\n<p>Backslashing should suppress [this] and [this].</p>\n\n<hr />\n\n<p>Here's one where the <a href=\"/url/\">link\nbreaks</a> across lines.</p>\n\n<p>Here's another where the <a href=\"/url/\">link \nbreaks</a> across lines, but with a line-ending space.</p>\n"
  },
  {
    "path": "test/specs/original/links_reference_style.md",
    "content": "---\npedantic: true\n---\n\nFoo [bar] [1].\n\nFoo [bar][1].\n\nFoo [bar]\n[1].\n\n[1]: /url/  \"Title\"\n\n\nWith [embedded [brackets]] [b].\n\n\nIndented [once][].\n\nIndented [twice][].\n\nIndented [thrice][].\n\nIndented [four][] times.\n\n [once]: /url\n\n  [twice]: /url\n\n   [thrice]: /url\n\n    [four]: /url\n\n\n[b]: /url/\n\n* * *\n\n[this] [this] should work\n\nSo should [this][this].\n\nAnd [this] [].\n\nAnd [this][].\n\nAnd [this].\n\nBut not [that] [].\n\nNor [that][].\n\nNor [that].\n\n[Something in brackets like [this][] should work]\n\n[Same with [this].]\n\nIn this case, [this](/somethingelse/) points to something else.\n\nBackslashing should suppress \\[this] and [this\\].\n\n[this]: foo\n\n\n* * *\n\nHere's one where the [link\nbreaks] across lines.\n\nHere's another where the [link \nbreaks] across lines, but with a line-ending space.\n\n\n[link breaks]: /url/\n"
  },
  {
    "path": "test/specs/original/links_shortcut_references.html",
    "content": "<p>This is the <a href=\"/simple\">simple case</a>.</p>\n\n<p>This one has a <a href=\"/foo\">line\nbreak</a>.</p>\n\n<p>This one has a <a href=\"/foo\">line \nbreak</a> with a line-ending space.</p>\n\n<p><a href=\"/that\">this</a> and the <a href=\"/other\">other</a></p>\n"
  },
  {
    "path": "test/specs/original/links_shortcut_references.md",
    "content": "---\npedantic: true\n---\n\nThis is the [simple case].\n\n[simple case]: /simple\n\n\n\nThis one has a [line\nbreak].\n\nThis one has a [line \nbreak] with a line-ending space.\n\n[line break]: /foo\n\n\n[this] [that] and the [other]\n\n[this]: /this\n[that]: /that\n[other]: /other\n"
  },
  {
    "path": "test/specs/original/literal_quotes_in_titles.html",
    "content": "<p>Foo <a href=\"/url/\" title=\"Title with &quot;quotes&quot; inside\">bar</a>.</p>\n\n<p>Foo <a href=\"/url/\" title=\"Title with &quot;quotes&quot; inside\">bar</a>.</p>\n"
  },
  {
    "path": "test/specs/original/literal_quotes_in_titles.md",
    "content": "---\npedantic: true\n---\n\nFoo [bar][].\n\nFoo [bar](/url/ \"Title with \"quotes\" inside\").\n\n\n  [bar]: /url/ \"Title with \"quotes\" inside\"\n"
  },
  {
    "path": "test/specs/original/markdown_documentation_basics.html",
    "content": "<h1>Markdown: Basics</h1>\n\n<ul id=\"ProjectSubmenu\">\n    <li><a href=\"/projects/markdown/\" title=\"Markdown Project Page\">Main</a></li>\n    <li><a class=\"selected\" title=\"Markdown Basics\">Basics</a></li>\n    <li><a href=\"/projects/markdown/syntax\" title=\"Markdown Syntax Documentation\">Syntax</a></li>\n    <li><a href=\"/projects/markdown/license\" title=\"Pricing and License Information\">License</a></li>\n    <li><a href=\"/projects/markdown/dingus\" title=\"Online Markdown Web Form\">Dingus</a></li>\n</ul>\n\n<h2>Getting the Gist of Markdown's Formatting Syntax</h2>\n\n<p>This page offers a brief overview of what it's like to use Markdown.\nThe <a href=\"/projects/markdown/syntax\" title=\"Markdown Syntax\">syntax page</a> provides complete, detailed documentation for\nevery feature, but Markdown should be very easy to pick up simply by\nlooking at a few examples of it in action. The examples on this page\nare written in a before/after style, showing example syntax and the\nHTML output produced by Markdown.</p>\n\n<p>It's also helpful to simply try Markdown out; the <a href=\"/projects/markdown/dingus\" title=\"Markdown Dingus\">Dingus</a> is a\nweb application that allows you type your own Markdown-formatted text\nand translate it to XHTML.</p>\n\n<p><strong>Note:</strong> This document is itself written using Markdown; you\ncan <a href=\"/projects/markdown/basics.text\">see the source for it by adding '.text' to the URL</a>.</p>\n\n<h2>Paragraphs, Headers, Blockquotes</h2>\n\n<p>A paragraph is simply one or more consecutive lines of text, separated\nby one or more blank lines. (A blank line is any line that looks like a\nblank line -- a line containing nothing spaces or tabs is considered\nblank.) Normal paragraphs should not be intended with spaces or tabs.</p>\n\n<p>Markdown offers two styles of headers: <em>Setext</em> and <em>atx</em>.\nSetext-style headers for <code>&lt;h1&gt;</code> and <code>&lt;h2&gt;</code> are created by\n\"underlining\" with equal signs (<code>=</code>) and hyphens (<code>-</code>), respectively.\nTo create an atx-style header, you put 1-6 hash marks (<code>#</code>) at the\nbeginning of the line -- the number of hashes equals the resulting\nHTML header level.</p>\n\n<p>Blockquotes are indicated using email-style '<code>&gt;</code>' angle brackets.</p>\n\n<p>Markdown:</p>\n\n<pre><code>A First Level Header\n====================\n\nA Second Level Header\n---------------------\n\nNow is the time for all good men to come to\nthe aid of their country. This is just a\nregular paragraph.\n\nThe quick brown fox jumped over the lazy\ndog's back.\n\n### Header 3\n\n&gt; This is a blockquote.\n&gt;\n&gt; This is the second paragraph in the blockquote.\n&gt;\n&gt; ## This is an H2 in a blockquote\n</code></pre>\n\n<p>Output:</p>\n\n<pre><code>&lt;h1&gt;A First Level Header&lt;/h1&gt;\n\n&lt;h2&gt;A Second Level Header&lt;/h2&gt;\n\n&lt;p&gt;Now is the time for all good men to come to\nthe aid of their country. This is just a\nregular paragraph.&lt;/p&gt;\n\n&lt;p&gt;The quick brown fox jumped over the lazy\ndog's back.&lt;/p&gt;\n\n&lt;h3&gt;Header 3&lt;/h3&gt;\n\n&lt;blockquote&gt;\n    &lt;p&gt;This is a blockquote.&lt;/p&gt;\n\n    &lt;p&gt;This is the second paragraph in the blockquote.&lt;/p&gt;\n\n    &lt;h2&gt;This is an H2 in a blockquote&lt;/h2&gt;\n&lt;/blockquote&gt;\n</code></pre>\n\n<h3>Phrase Emphasis</h3>\n\n<p>Markdown uses asterisks and underscores to indicate spans of emphasis.</p>\n\n<p>Markdown:</p>\n\n<pre><code>Some of these words *are emphasized*.\nSome of these words _are emphasized also_.\n\nUse two asterisks for **strong emphasis**.\nOr, if you prefer, __use two underscores instead__.\n</code></pre>\n\n<p>Output:</p>\n\n<pre><code>&lt;p&gt;Some of these words &lt;em&gt;are emphasized&lt;/em&gt;.\nSome of these words &lt;em&gt;are emphasized also&lt;/em&gt;.&lt;/p&gt;\n\n&lt;p&gt;Use two asterisks for &lt;strong&gt;strong emphasis&lt;/strong&gt;.\nOr, if you prefer, &lt;strong&gt;use two underscores instead&lt;/strong&gt;.&lt;/p&gt;\n</code></pre>\n\n<h2>Lists</h2>\n\n<p>Unordered (bulleted) lists use asterisks, pluses, and hyphens (<code>*</code>,\n<code>+</code>, and <code>-</code>) as list markers. These three markers are\ninterchangeable; this:</p>\n\n<pre><code>*   Candy.\n*   Gum.\n*   Booze.\n</code></pre>\n\n<p>this:</p>\n\n<pre><code>+   Candy.\n+   Gum.\n+   Booze.\n</code></pre>\n\n<p>and this:</p>\n\n<pre><code>-   Candy.\n-   Gum.\n-   Booze.\n</code></pre>\n\n<p>all produce the same output:</p>\n\n<pre><code>&lt;ul&gt;\n&lt;li&gt;Candy.&lt;/li&gt;\n&lt;li&gt;Gum.&lt;/li&gt;\n&lt;li&gt;Booze.&lt;/li&gt;\n&lt;/ul&gt;\n</code></pre>\n\n<p>Ordered (numbered) lists use regular numbers, followed by periods, as\nlist markers:</p>\n\n<pre><code>1.  Red\n2.  Green\n3.  Blue\n</code></pre>\n\n<p>Output:</p>\n\n<pre><code>&lt;ol&gt;\n&lt;li&gt;Red&lt;/li&gt;\n&lt;li&gt;Green&lt;/li&gt;\n&lt;li&gt;Blue&lt;/li&gt;\n&lt;/ol&gt;\n</code></pre>\n\n<p>If you put blank lines between items, you'll get <code>&lt;p&gt;</code> tags for the\nlist item text. You can create multi-paragraph list items by indenting\nthe paragraphs by 4 spaces or 1 tab:</p>\n\n<pre><code>*   A list item.\n\n    With multiple paragraphs.\n\n*   Another item in the list.\n</code></pre>\n\n<p>Output:</p>\n\n<pre><code>&lt;ul&gt;\n&lt;li&gt;&lt;p&gt;A list item.&lt;/p&gt;\n&lt;p&gt;With multiple paragraphs.&lt;/p&gt;&lt;/li&gt;\n&lt;li&gt;&lt;p&gt;Another item in the list.&lt;/p&gt;&lt;/li&gt;\n&lt;/ul&gt;\n</code></pre>\n\n<h3>Links</h3>\n\n<p>Markdown supports two styles for creating links: <em>inline</em> and\n<em>reference</em>. With both styles, you use square brackets to delimit the\ntext you want to turn into a link.</p>\n\n<p>Inline-style links use parentheses immediately after the link text.\nFor example:</p>\n\n<pre><code>This is an [example link](http://example.com/).\n</code></pre>\n\n<p>Output:</p>\n\n<pre><code>&lt;p&gt;This is an &lt;a href=\"http://example.com/\"&gt;\nexample link&lt;/a&gt;.&lt;/p&gt;\n</code></pre>\n\n<p>Optionally, you may include a title attribute in the parentheses:</p>\n\n<pre><code>This is an [example link](http://example.com/ \"With a Title\").\n</code></pre>\n\n<p>Output:</p>\n\n<pre><code>&lt;p&gt;This is an &lt;a href=\"http://example.com/\" title=\"With a Title\"&gt;\nexample link&lt;/a&gt;.&lt;/p&gt;\n</code></pre>\n\n<p>Reference-style links allow you to refer to your links by names, which\nyou define elsewhere in your document:</p>\n\n<pre><code>I get 10 times more traffic from [Google][1] than from\n[Yahoo][2] or [MSN][3].\n\n[1]: http://google.com/        \"Google\"\n[2]: http://search.yahoo.com/  \"Yahoo Search\"\n[3]: http://search.msn.com/    \"MSN Search\"\n</code></pre>\n\n<p>Output:</p>\n\n<pre><code>&lt;p&gt;I get 10 times more traffic from &lt;a href=\"http://google.com/\"\ntitle=\"Google\"&gt;Google&lt;/a&gt; than from &lt;a href=\"http://search.yahoo.com/\"\ntitle=\"Yahoo Search\"&gt;Yahoo&lt;/a&gt; or &lt;a href=\"http://search.msn.com/\"\ntitle=\"MSN Search\"&gt;MSN&lt;/a&gt;.&lt;/p&gt;\n</code></pre>\n\n<p>The title attribute is optional. Link names may contain letters,\nnumbers and spaces, but are <em>not</em> case sensitive:</p>\n\n<pre><code>I start my morning with a cup of coffee and\n[The New York Times][NY Times].\n\n[ny times]: http://www.nytimes.com/\n</code></pre>\n\n<p>Output:</p>\n\n<pre><code>&lt;p&gt;I start my morning with a cup of coffee and\n&lt;a href=\"http://www.nytimes.com/\"&gt;The New York Times&lt;/a&gt;.&lt;/p&gt;\n</code></pre>\n\n<h3>Images</h3>\n\n<p>Image syntax is very much like link syntax.</p>\n\n<p>Inline (titles are optional):</p>\n\n<pre><code>![alt text](/path/to/img.jpg \"Title\")\n</code></pre>\n\n<p>Reference-style:</p>\n\n<pre><code>![alt text][id]\n\n[id]: /path/to/img.jpg \"Title\"\n</code></pre>\n\n<p>Both of the above examples produce the same output:</p>\n\n<pre><code>&lt;img src=\"/path/to/img.jpg\" alt=\"alt text\" title=\"Title\" /&gt;\n</code></pre>\n\n<h3>Code</h3>\n\n<p>In a regular paragraph, you can create code span by wrapping text in\nbacktick quotes. Any ampersands (<code>&amp;</code>) and angle brackets (<code>&lt;</code> or\n<code>&gt;</code>) will automatically be translated into HTML entities. This makes\nit easy to use Markdown to write about HTML example code:</p>\n\n<pre><code>I strongly recommend against using any `&lt;blink&gt;` tags.\n\nI wish SmartyPants used named entities like `&amp;mdash;`\ninstead of decimal-encoded entities like `&amp;#8212;`.\n</code></pre>\n\n<p>Output:</p>\n\n<pre><code>&lt;p&gt;I strongly recommend against using any\n&lt;code&gt;&amp;lt;blink&amp;gt;&lt;/code&gt; tags.&lt;/p&gt;\n\n&lt;p&gt;I wish SmartyPants used named entities like\n&lt;code&gt;&amp;amp;mdash;&lt;/code&gt; instead of decimal-encoded\nentities like &lt;code&gt;&amp;amp;#8212;&lt;/code&gt;.&lt;/p&gt;\n</code></pre>\n\n<p>To specify an entire block of pre-formatted code, indent every line of\nthe block by 4 spaces or 1 tab. Just like with code spans, <code>&amp;</code>, <code>&lt;</code>,\nand <code>&gt;</code> characters will be escaped automatically.</p>\n\n<p>Markdown:</p>\n\n<pre><code>If you want your page to validate under XHTML 1.0 Strict,\nyou've got to put paragraph tags in your blockquotes:\n\n    &lt;blockquote&gt;\n        &lt;p&gt;For example.&lt;/p&gt;\n    &lt;/blockquote&gt;\n</code></pre>\n\n<p>Output:</p>\n\n<pre><code>&lt;p&gt;If you want your page to validate under XHTML 1.0 Strict,\nyou've got to put paragraph tags in your blockquotes:&lt;/p&gt;\n\n&lt;pre&gt;&lt;code&gt;&amp;lt;blockquote&amp;gt;\n    &amp;lt;p&amp;gt;For example.&amp;lt;/p&amp;gt;\n&amp;lt;/blockquote&amp;gt;\n&lt;/code&gt;&lt;/pre&gt;\n</code></pre>\n"
  },
  {
    "path": "test/specs/original/markdown_documentation_basics.md",
    "content": "---\npedantic: true\n---\n\nMarkdown: Basics\n================\n\n<ul id=\"ProjectSubmenu\">\n    <li><a href=\"/projects/markdown/\" title=\"Markdown Project Page\">Main</a></li>\n    <li><a class=\"selected\" title=\"Markdown Basics\">Basics</a></li>\n    <li><a href=\"/projects/markdown/syntax\" title=\"Markdown Syntax Documentation\">Syntax</a></li>\n    <li><a href=\"/projects/markdown/license\" title=\"Pricing and License Information\">License</a></li>\n    <li><a href=\"/projects/markdown/dingus\" title=\"Online Markdown Web Form\">Dingus</a></li>\n</ul>\n\n\nGetting the Gist of Markdown's Formatting Syntax\n------------------------------------------------\n\nThis page offers a brief overview of what it's like to use Markdown.\nThe [syntax page] [s] provides complete, detailed documentation for\nevery feature, but Markdown should be very easy to pick up simply by\nlooking at a few examples of it in action. The examples on this page\nare written in a before/after style, showing example syntax and the\nHTML output produced by Markdown.\n\nIt's also helpful to simply try Markdown out; the [Dingus] [d] is a\nweb application that allows you type your own Markdown-formatted text\nand translate it to XHTML.\n\n**Note:** This document is itself written using Markdown; you\ncan [see the source for it by adding '.text' to the URL] [src].\n\n  [s]: /projects/markdown/syntax  \"Markdown Syntax\"\n  [d]: /projects/markdown/dingus  \"Markdown Dingus\"\n  [src]: /projects/markdown/basics.text\n\n\n## Paragraphs, Headers, Blockquotes ##\n\nA paragraph is simply one or more consecutive lines of text, separated\nby one or more blank lines. (A blank line is any line that looks like a\nblank line -- a line containing nothing spaces or tabs is considered\nblank.) Normal paragraphs should not be intended with spaces or tabs.\n\nMarkdown offers two styles of headers: *Setext* and *atx*.\nSetext-style headers for `<h1>` and `<h2>` are created by\n\"underlining\" with equal signs (`=`) and hyphens (`-`), respectively.\nTo create an atx-style header, you put 1-6 hash marks (`#`) at the\nbeginning of the line -- the number of hashes equals the resulting\nHTML header level.\n\nBlockquotes are indicated using email-style '`>`' angle brackets.\n\nMarkdown:\n\n    A First Level Header\n    ====================\n\n    A Second Level Header\n    ---------------------\n\n    Now is the time for all good men to come to\n    the aid of their country. This is just a\n    regular paragraph.\n\n    The quick brown fox jumped over the lazy\n    dog's back.\n\n    ### Header 3\n\n    > This is a blockquote.\n    >\n    > This is the second paragraph in the blockquote.\n    >\n    > ## This is an H2 in a blockquote\n\n\nOutput:\n\n    <h1>A First Level Header</h1>\n\n    <h2>A Second Level Header</h2>\n\n    <p>Now is the time for all good men to come to\n    the aid of their country. This is just a\n    regular paragraph.</p>\n\n    <p>The quick brown fox jumped over the lazy\n    dog's back.</p>\n\n    <h3>Header 3</h3>\n\n    <blockquote>\n        <p>This is a blockquote.</p>\n\n        <p>This is the second paragraph in the blockquote.</p>\n\n        <h2>This is an H2 in a blockquote</h2>\n    </blockquote>\n\n\n\n### Phrase Emphasis ###\n\nMarkdown uses asterisks and underscores to indicate spans of emphasis.\n\nMarkdown:\n\n    Some of these words *are emphasized*.\n    Some of these words _are emphasized also_.\n\n    Use two asterisks for **strong emphasis**.\n    Or, if you prefer, __use two underscores instead__.\n\nOutput:\n\n    <p>Some of these words <em>are emphasized</em>.\n    Some of these words <em>are emphasized also</em>.</p>\n\n    <p>Use two asterisks for <strong>strong emphasis</strong>.\n    Or, if you prefer, <strong>use two underscores instead</strong>.</p>\n\n\n\n## Lists ##\n\nUnordered (bulleted) lists use asterisks, pluses, and hyphens (`*`,\n`+`, and `-`) as list markers. These three markers are\ninterchangeable; this:\n\n    *   Candy.\n    *   Gum.\n    *   Booze.\n\nthis:\n\n    +   Candy.\n    +   Gum.\n    +   Booze.\n\nand this:\n\n    -   Candy.\n    -   Gum.\n    -   Booze.\n\nall produce the same output:\n\n    <ul>\n    <li>Candy.</li>\n    <li>Gum.</li>\n    <li>Booze.</li>\n    </ul>\n\nOrdered (numbered) lists use regular numbers, followed by periods, as\nlist markers:\n\n    1.  Red\n    2.  Green\n    3.  Blue\n\nOutput:\n\n    <ol>\n    <li>Red</li>\n    <li>Green</li>\n    <li>Blue</li>\n    </ol>\n\nIf you put blank lines between items, you'll get `<p>` tags for the\nlist item text. You can create multi-paragraph list items by indenting\nthe paragraphs by 4 spaces or 1 tab:\n\n    *   A list item.\n\n        With multiple paragraphs.\n\n    *   Another item in the list.\n\nOutput:\n\n    <ul>\n    <li><p>A list item.</p>\n    <p>With multiple paragraphs.</p></li>\n    <li><p>Another item in the list.</p></li>\n    </ul>\n\n\n\n### Links ###\n\nMarkdown supports two styles for creating links: *inline* and\n*reference*. With both styles, you use square brackets to delimit the\ntext you want to turn into a link.\n\nInline-style links use parentheses immediately after the link text.\nFor example:\n\n    This is an [example link](http://example.com/).\n\nOutput:\n\n    <p>This is an <a href=\"http://example.com/\">\n    example link</a>.</p>\n\nOptionally, you may include a title attribute in the parentheses:\n\n    This is an [example link](http://example.com/ \"With a Title\").\n\nOutput:\n\n    <p>This is an <a href=\"http://example.com/\" title=\"With a Title\">\n    example link</a>.</p>\n\nReference-style links allow you to refer to your links by names, which\nyou define elsewhere in your document:\n\n    I get 10 times more traffic from [Google][1] than from\n    [Yahoo][2] or [MSN][3].\n\n    [1]: http://google.com/        \"Google\"\n    [2]: http://search.yahoo.com/  \"Yahoo Search\"\n    [3]: http://search.msn.com/    \"MSN Search\"\n\nOutput:\n\n    <p>I get 10 times more traffic from <a href=\"http://google.com/\"\n    title=\"Google\">Google</a> than from <a href=\"http://search.yahoo.com/\"\n    title=\"Yahoo Search\">Yahoo</a> or <a href=\"http://search.msn.com/\"\n    title=\"MSN Search\">MSN</a>.</p>\n\nThe title attribute is optional. Link names may contain letters,\nnumbers and spaces, but are *not* case sensitive:\n\n    I start my morning with a cup of coffee and\n    [The New York Times][NY Times].\n\n    [ny times]: http://www.nytimes.com/\n\nOutput:\n\n    <p>I start my morning with a cup of coffee and\n    <a href=\"http://www.nytimes.com/\">The New York Times</a>.</p>\n\n\n### Images ###\n\nImage syntax is very much like link syntax.\n\nInline (titles are optional):\n\n    ![alt text](/path/to/img.jpg \"Title\")\n\nReference-style:\n\n    ![alt text][id]\n\n    [id]: /path/to/img.jpg \"Title\"\n\nBoth of the above examples produce the same output:\n\n    <img src=\"/path/to/img.jpg\" alt=\"alt text\" title=\"Title\" />\n\n\n\n### Code ###\n\nIn a regular paragraph, you can create code span by wrapping text in\nbacktick quotes. Any ampersands (`&`) and angle brackets (`<` or\n`>`) will automatically be translated into HTML entities. This makes\nit easy to use Markdown to write about HTML example code:\n\n    I strongly recommend against using any `<blink>` tags.\n\n    I wish SmartyPants used named entities like `&mdash;`\n    instead of decimal-encoded entities like `&#8212;`.\n\nOutput:\n\n    <p>I strongly recommend against using any\n    <code>&lt;blink&gt;</code> tags.</p>\n\n    <p>I wish SmartyPants used named entities like\n    <code>&amp;mdash;</code> instead of decimal-encoded\n    entities like <code>&amp;#8212;</code>.</p>\n\n\nTo specify an entire block of pre-formatted code, indent every line of\nthe block by 4 spaces or 1 tab. Just like with code spans, `&`, `<`,\nand `>` characters will be escaped automatically.\n\nMarkdown:\n\n    If you want your page to validate under XHTML 1.0 Strict,\n    you've got to put paragraph tags in your blockquotes:\n\n        <blockquote>\n            <p>For example.</p>\n        </blockquote>\n\nOutput:\n\n    <p>If you want your page to validate under XHTML 1.0 Strict,\n    you've got to put paragraph tags in your blockquotes:</p>\n\n    <pre><code>&lt;blockquote&gt;\n        &lt;p&gt;For example.&lt;/p&gt;\n    &lt;/blockquote&gt;\n    </code></pre>\n"
  },
  {
    "path": "test/specs/original/markdown_documentation_syntax.html",
    "content": "<h1>Markdown: Syntax</h1>\n\n<ul id=\"ProjectSubmenu\">\n    <li><a href=\"/projects/markdown/\" title=\"Markdown Project Page\">Main</a></li>\n    <li><a href=\"/projects/markdown/basics\" title=\"Markdown Basics\">Basics</a></li>\n    <li><a class=\"selected\" title=\"Markdown Syntax Documentation\">Syntax</a></li>\n    <li><a href=\"/projects/markdown/license\" title=\"Pricing and License Information\">License</a></li>\n    <li><a href=\"/projects/markdown/dingus\" title=\"Online Markdown Web Form\">Dingus</a></li>\n</ul>\n\n<ul>\n<li><a href=\"#overview\">Overview</a>\n<ul>\n<li><a href=\"#philosophy\">Philosophy</a></li>\n<li><a href=\"#html\">Inline HTML</a></li>\n<li><a href=\"#autoescape\">Automatic Escaping for Special Characters</a></li>\n</ul></li>\n<li><a href=\"#block\">Block Elements</a>\n<ul>\n<li><a href=\"#p\">Paragraphs and Line Breaks</a></li>\n<li><a href=\"#header\">Headers</a></li>\n<li><a href=\"#blockquote\">Blockquotes</a></li>\n<li><a href=\"#list\">Lists</a></li>\n<li><a href=\"#precode\">Code Blocks</a></li>\n<li><a href=\"#hr\">Horizontal Rules</a></li>\n</ul></li>\n<li><a href=\"#span\">Span Elements</a>\n<ul>\n<li><a href=\"#link\">Links</a></li>\n<li><a href=\"#em\">Emphasis</a></li>\n<li><a href=\"#code\">Code</a></li>\n<li><a href=\"#img\">Images</a></li>\n</ul></li>\n<li><a href=\"#misc\">Miscellaneous</a>\n<ul>\n<li><a href=\"#backslash\">Backslash Escapes</a></li>\n<li><a href=\"#autolink\">Automatic Links</a></li>\n</ul></li>\n</ul>\n\n<p><strong>Note:</strong> This document is itself written using Markdown; you\ncan <a href=\"/projects/markdown/syntax.text\">see the source for it by adding '.text' to the URL</a>.</p>\n\n<hr />\n\n<h2 id=\"overview\">Overview</h2>\n\n<h3 id=\"philosophy\">Philosophy</h3>\n\n<p>Markdown is intended to be as easy-to-read and easy-to-write as is feasible.</p>\n\n<p>Readability, however, is emphasized above all else. A Markdown-formatted\ndocument should be publishable as-is, as plain text, without looking\nlike it's been marked up with tags or formatting instructions. While\nMarkdown's syntax has been influenced by several existing text-to-HTML\nfilters -- including <a href=\"http://docutils.sourceforge.net/mirror/setext.html\">Setext</a>, <a href=\"http://www.aaronsw.com/2002/atx/\">atx</a>, <a href=\"http://textism.com/tools/textile/\">Textile</a>, <a href=\"http://docutils.sourceforge.net/rst.html\">reStructuredText</a>,\n<a href=\"http://www.triptico.com/software/grutatxt.html\">Grutatext</a>, and <a href=\"http://ettext.taint.org/doc/\">EtText</a> -- the single biggest source of\ninspiration for Markdown's syntax is the format of plain text email.</p>\n\n<p>To this end, Markdown's syntax is comprised entirely of punctuation\ncharacters, which punctuation characters have been carefully chosen so\nas to look like what they mean. E.g., asterisks around a word actually\nlook like *emphasis*. Markdown lists look like, well, lists. Even\nblockquotes look like quoted passages of text, assuming you've ever\nused email.</p>\n\n<h3 id=\"html\">Inline HTML</h3>\n\n<p>Markdown's syntax is intended for one purpose: to be used as a\nformat for <em>writing</em> for the web.</p>\n\n<p>Markdown is not a replacement for HTML, or even close to it. Its\nsyntax is very small, corresponding only to a very small subset of\nHTML tags. The idea is <em>not</em> to create a syntax that makes it easier\nto insert HTML tags. In my opinion, HTML tags are already easy to\ninsert. The idea for Markdown is to make it easy to read, write, and\nedit prose. HTML is a <em>publishing</em> format; Markdown is a <em>writing</em>\nformat. Thus, Markdown's formatting syntax only addresses issues that\ncan be conveyed in plain text.</p>\n\n<p>For any markup that is not covered by Markdown's syntax, you simply\nuse HTML itself. There's no need to preface it or delimit it to\nindicate that you're switching from Markdown to HTML; you just use\nthe tags.</p>\n\n<p>The only restrictions are that block-level HTML elements -- e.g. <code>&lt;div&gt;</code>,\n<code>&lt;table&gt;</code>, <code>&lt;pre&gt;</code>, <code>&lt;p&gt;</code>, etc. -- must be separated from surrounding\ncontent by blank lines, and the start and end tags of the block should\nnot be indented with tabs or spaces. Markdown is smart enough not\nto add extra (unwanted) <code>&lt;p&gt;</code> tags around HTML block-level tags.</p>\n\n<p>For example, to add an HTML table to a Markdown article:</p>\n\n<pre><code>This is a regular paragraph.\n\n&lt;table&gt;\n    &lt;tr&gt;\n        &lt;td&gt;Foo&lt;/td&gt;\n    &lt;/tr&gt;\n&lt;/table&gt;\n\nThis is another regular paragraph.\n</code></pre>\n\n<p>Note that Markdown formatting syntax is not processed within block-level\nHTML tags. E.g., you can't use Markdown-style <code>*emphasis*</code> inside an\nHTML block.</p>\n\n<p>Span-level HTML tags -- e.g. <code>&lt;span&gt;</code>, <code>&lt;cite&gt;</code>, or <code>&lt;del&gt;</code> -- can be\nused anywhere in a Markdown paragraph, list item, or header. If you\nwant, you can even use HTML tags instead of Markdown formatting; e.g. if\nyou'd prefer to use HTML <code>&lt;a&gt;</code> or <code>&lt;img&gt;</code> tags instead of Markdown's\nlink or image syntax, go right ahead.</p>\n\n<p>Unlike block-level HTML tags, Markdown syntax <em>is</em> processed within\nspan-level tags.</p>\n\n<h3 id=\"autoescape\">Automatic Escaping for Special Characters</h3>\n\n<p>In HTML, there are two characters that demand special treatment: <code>&lt;</code>\nand <code>&amp;</code>. Left angle brackets are used to start tags; ampersands are\nused to denote HTML entities. If you want to use them as literal\ncharacters, you must escape them as entities, e.g. <code>&amp;lt;</code>, and\n<code>&amp;amp;</code>.</p>\n\n<p>Ampersands in particular are bedeviling for web writers. If you want to\nwrite about 'AT&amp;T', you need to write '<code>AT&amp;amp;T</code>'. You even need to\nescape ampersands within URLs. Thus, if you want to link to:</p>\n\n<pre><code>http://images.google.com/images?num=30&amp;q=larry+bird\n</code></pre>\n\n<p>you need to encode the URL as:</p>\n\n<pre><code>http://images.google.com/images?num=30&amp;amp;q=larry+bird\n</code></pre>\n\n<p>in your anchor tag <code>href</code> attribute. Needless to say, this is easy to\nforget, and is probably the single most common source of HTML validation\nerrors in otherwise well-marked-up web sites.</p>\n\n<p>Markdown allows you to use these characters naturally, taking care of\nall the necessary escaping for you. If you use an ampersand as part of\nan HTML entity, it remains unchanged; otherwise it will be translated\ninto <code>&amp;amp;</code>.</p>\n\n<p>So, if you want to include a copyright symbol in your article, you can write:</p>\n\n<pre><code>&amp;copy;\n</code></pre>\n\n<p>and Markdown will leave it alone. But if you write:</p>\n\n<pre><code>AT&amp;T\n</code></pre>\n\n<p>Markdown will translate it to:</p>\n\n<pre><code>AT&amp;amp;T\n</code></pre>\n\n<p>Similarly, because Markdown supports <a href=\"#html\">inline HTML</a>, if you use\nangle brackets as delimiters for HTML tags, Markdown will treat them as\nsuch. But if you write:</p>\n\n<pre><code>4 &lt; 5\n</code></pre>\n\n<p>Markdown will translate it to:</p>\n\n<pre><code>4 &amp;lt; 5\n</code></pre>\n\n<p>However, inside Markdown code spans and blocks, angle brackets and\nampersands are <em>always</em> encoded automatically. This makes it easy to use\nMarkdown to write about HTML code. (As opposed to raw HTML, which is a\nterrible format for writing about HTML syntax, because every single <code>&lt;</code>\nand <code>&amp;</code> in your example code needs to be escaped.)</p>\n\n<hr />\n\n<h2 id=\"block\">Block Elements</h2>\n\n<h3 id=\"p\">Paragraphs and Line Breaks</h3>\n\n<p>A paragraph is simply one or more consecutive lines of text, separated\nby one or more blank lines. (A blank line is any line that looks like a\nblank line -- a line containing nothing but spaces or tabs is considered\nblank.) Normal paragraphs should not be intended with spaces or tabs.</p>\n\n<p>The implication of the \"one or more consecutive lines of text\" rule is\nthat Markdown supports \"hard-wrapped\" text paragraphs. This differs\nsignificantly from most other text-to-HTML formatters (including Movable\nType's \"Convert Line Breaks\" option) which translate every line break\ncharacter in a paragraph into a <code>&lt;br /&gt;</code> tag.</p>\n\n<p>When you <em>do</em> want to insert a <code>&lt;br /&gt;</code> break tag using Markdown, you\nend a line with two or more spaces, then type return.</p>\n\n<p>Yes, this takes a tad more effort to create a <code>&lt;br /&gt;</code>, but a simplistic\n\"every line break is a <code>&lt;br /&gt;</code>\" rule wouldn't work for Markdown.\nMarkdown's email-style <a href=\"#blockquote\">blockquoting</a> and multi-paragraph <a href=\"#list\">list items</a>\nwork best -- and look better -- when you format them with hard breaks.</p>\n\n<h3 id=\"header\">Headers</h3>\n\n<p>Markdown supports two styles of headers, <a href=\"http://docutils.sourceforge.net/mirror/setext.html\">Setext</a> and <a href=\"http://www.aaronsw.com/2002/atx/\">atx</a>.</p>\n\n<p>Setext-style headers are \"underlined\" using equal signs (for first-level\nheaders) and dashes (for second-level headers). For example:</p>\n\n<pre><code>This is an H1\n=============\n\nThis is an H2\n-------------\n</code></pre>\n\n<p>Any number of underlining <code>=</code>'s or <code>-</code>'s will work.</p>\n\n<p>Atx-style headers use 1-6 hash characters at the start of the line,\ncorresponding to header levels 1-6. For example:</p>\n\n<pre><code># This is an H1\n\n## This is an H2\n\n###### This is an H6\n</code></pre>\n\n<p>Optionally, you may \"close\" atx-style headers. This is purely\ncosmetic -- you can use this if you think it looks better. The\nclosing hashes don't even need to match the number of hashes\nused to open the header. (The number of opening hashes\ndetermines the header level.) :</p>\n\n<pre><code># This is an H1 #\n\n## This is an H2 ##\n\n### This is an H3 ######\n</code></pre>\n\n<h3 id=\"blockquote\">Blockquotes</h3>\n\n<p>Markdown uses email-style <code>&gt;</code> characters for blockquoting. If you're\nfamiliar with quoting passages of text in an email message, then you\nknow how to create a blockquote in Markdown. It looks best if you hard\nwrap the text and put a <code>&gt;</code> before every line:</p>\n\n<pre><code>&gt; This is a blockquote with two paragraphs. Lorem ipsum dolor sit amet,\n&gt; consectetuer adipiscing elit. Aliquam hendrerit mi posuere lectus.\n&gt; Vestibulum enim wisi, viverra nec, fringilla in, laoreet vitae, risus.\n&gt; \n&gt; Donec sit amet nisl. Aliquam semper ipsum sit amet velit. Suspendisse\n&gt; id sem consectetuer libero luctus adipiscing.\n</code></pre>\n\n<p>Markdown allows you to be lazy and only put the <code>&gt;</code> before the first\nline of a hard-wrapped paragraph:</p>\n\n<pre><code>&gt; This is a blockquote with two paragraphs. Lorem ipsum dolor sit amet,\nconsectetuer adipiscing elit. Aliquam hendrerit mi posuere lectus.\nVestibulum enim wisi, viverra nec, fringilla in, laoreet vitae, risus.\n\n&gt; Donec sit amet nisl. Aliquam semper ipsum sit amet velit. Suspendisse\nid sem consectetuer libero luctus adipiscing.\n</code></pre>\n\n<p>Blockquotes can be nested (i.e. a blockquote-in-a-blockquote) by\nadding additional levels of <code>&gt;</code>:</p>\n\n<pre><code>&gt; This is the first level of quoting.\n&gt;\n&gt; &gt; This is nested blockquote.\n&gt;\n&gt; Back to the first level.\n</code></pre>\n\n<p>Blockquotes can contain other Markdown elements, including headers, lists,\nand code blocks:</p>\n\n<pre><code>&gt; ## This is a header.\n&gt; \n&gt; 1.   This is the first list item.\n&gt; 2.   This is the second list item.\n&gt; \n&gt; Here's some example code:\n&gt; \n&gt;     return shell_exec(\"echo $input | $markdown_script\");\n</code></pre>\n\n<p>Any decent text editor should make email-style quoting easy. For\nexample, with BBEdit, you can make a selection and choose Increase\nQuote Level from the Text menu.</p>\n\n<h3 id=\"list\">Lists</h3>\n\n<p>Markdown supports ordered (numbered) and unordered (bulleted) lists.</p>\n\n<p>Unordered lists use asterisks, pluses, and hyphens -- interchangeably\n-- as list markers:</p>\n\n<pre><code>*   Red\n*   Green\n*   Blue\n</code></pre>\n\n<p>is equivalent to:</p>\n\n<pre><code>+   Red\n+   Green\n+   Blue\n</code></pre>\n\n<p>and:</p>\n\n<pre><code>-   Red\n-   Green\n-   Blue\n</code></pre>\n\n<p>Ordered lists use numbers followed by periods:</p>\n\n<pre><code>1.  Bird\n2.  McHale\n3.  Parish\n</code></pre>\n\n<p>It's important to note that the actual numbers you use to mark the\nlist have no effect on the HTML output Markdown produces. The HTML\nMarkdown produces from the above list is:</p>\n\n<pre><code>&lt;ol&gt;\n&lt;li&gt;Bird&lt;/li&gt;\n&lt;li&gt;McHale&lt;/li&gt;\n&lt;li&gt;Parish&lt;/li&gt;\n&lt;/ol&gt;\n</code></pre>\n\n<p>If you instead wrote the list in Markdown like this:</p>\n\n<pre><code>1.  Bird\n1.  McHale\n1.  Parish\n</code></pre>\n\n<p>or even:</p>\n\n<pre><code>3. Bird\n1. McHale\n8. Parish\n</code></pre>\n\n<p>you'd get the exact same HTML output. The point is, if you want to,\nyou can use ordinal numbers in your ordered Markdown lists, so that\nthe numbers in your source match the numbers in your published HTML.\nBut if you want to be lazy, you don't have to.</p>\n\n<p>If you do use lazy list numbering, however, you should still start the\nlist with the number 1. At some point in the future, Markdown may support\nstarting ordered lists at an arbitrary number.</p>\n\n<p>List markers typically start at the left margin, but may be indented by\nup to three spaces. List markers must be followed by one or more spaces\nor a tab.</p>\n\n<p>To make lists look nice, you can wrap items with hanging indents:</p>\n\n<pre><code>*   Lorem ipsum dolor sit amet, consectetuer adipiscing elit.\n    Aliquam hendrerit mi posuere lectus. Vestibulum enim wisi,\n    viverra nec, fringilla in, laoreet vitae, risus.\n*   Donec sit amet nisl. Aliquam semper ipsum sit amet velit.\n    Suspendisse id sem consectetuer libero luctus adipiscing.\n</code></pre>\n\n<p>But if you want to be lazy, you don't have to:</p>\n\n<pre><code>*   Lorem ipsum dolor sit amet, consectetuer adipiscing elit.\nAliquam hendrerit mi posuere lectus. Vestibulum enim wisi,\nviverra nec, fringilla in, laoreet vitae, risus.\n*   Donec sit amet nisl. Aliquam semper ipsum sit amet velit.\nSuspendisse id sem consectetuer libero luctus adipiscing.\n</code></pre>\n\n<p>If list items are separated by blank lines, Markdown will wrap the\nitems in <code>&lt;p&gt;</code> tags in the HTML output. For example, this input:</p>\n\n<pre><code>*   Bird\n*   Magic\n</code></pre>\n\n<p>will turn into:</p>\n\n<pre><code>&lt;ul&gt;\n&lt;li&gt;Bird&lt;/li&gt;\n&lt;li&gt;Magic&lt;/li&gt;\n&lt;/ul&gt;\n</code></pre>\n\n<p>But this:</p>\n\n<pre><code>*   Bird\n\n*   Magic\n</code></pre>\n\n<p>will turn into:</p>\n\n<pre><code>&lt;ul&gt;\n&lt;li&gt;&lt;p&gt;Bird&lt;/p&gt;&lt;/li&gt;\n&lt;li&gt;&lt;p&gt;Magic&lt;/p&gt;&lt;/li&gt;\n&lt;/ul&gt;\n</code></pre>\n\n<p>List items may consist of multiple paragraphs. Each subsequent\nparagraph in a list item must be intended by either 4 spaces\nor one tab:</p>\n\n<pre><code>1.  This is a list item with two paragraphs. Lorem ipsum dolor\n    sit amet, consectetuer adipiscing elit. Aliquam hendrerit\n    mi posuere lectus.\n\n    Vestibulum enim wisi, viverra nec, fringilla in, laoreet\n    vitae, risus. Donec sit amet nisl. Aliquam semper ipsum\n    sit amet velit.\n\n2.  Suspendisse id sem consectetuer libero luctus adipiscing.\n</code></pre>\n\n<p>It looks nice if you indent every line of the subsequent\nparagraphs, but here again, Markdown will allow you to be\nlazy:</p>\n\n<pre><code>*   This is a list item with two paragraphs.\n\n    This is the second paragraph in the list item. You're\nonly required to indent the first line. Lorem ipsum dolor\nsit amet, consectetuer adipiscing elit.\n\n*   Another item in the same list.\n</code></pre>\n\n<p>To put a blockquote within a list item, the blockquote's <code>&gt;</code>\ndelimiters need to be indented:</p>\n\n<pre><code>*   A list item with a blockquote:\n\n    &gt; This is a blockquote\n    &gt; inside a list item.\n</code></pre>\n\n<p>To put a code block within a list item, the code block needs\nto be indented <em>twice</em> -- 8 spaces or two tabs:</p>\n\n<pre><code>*   A list item with a code block:\n\n        &lt;code goes here&gt;\n</code></pre>\n\n<p>It's worth noting that it's possible to trigger an ordered list by\naccident, by writing something like this:</p>\n\n<pre><code>1986. What a great season.\n</code></pre>\n\n<p>In other words, a <em>number-period-space</em> sequence at the beginning of a\nline. To avoid this, you can backslash-escape the period:</p>\n\n<pre><code>1986\\. What a great season.\n</code></pre>\n\n<h3 id=\"precode\">Code Blocks</h3>\n\n<p>Pre-formatted code blocks are used for writing about programming or\nmarkup source code. Rather than forming normal paragraphs, the lines\nof a code block are interpreted literally. Markdown wraps a code block\nin both <code>&lt;pre&gt;</code> and <code>&lt;code&gt;</code> tags.</p>\n\n<p>To produce a code block in Markdown, simply indent every line of the\nblock by at least 4 spaces or 1 tab. For example, given this input:</p>\n\n<pre><code>This is a normal paragraph:\n\n    This is a code block.\n</code></pre>\n\n<p>Markdown will generate:</p>\n\n<pre><code>&lt;p&gt;This is a normal paragraph:&lt;/p&gt;\n\n&lt;pre&gt;&lt;code&gt;This is a code block.\n&lt;/code&gt;&lt;/pre&gt;\n</code></pre>\n\n<p>One level of indentation -- 4 spaces or 1 tab -- is removed from each\nline of the code block. For example, this:</p>\n\n<pre><code>Here is an example of AppleScript:\n\n    tell application \"Foo\"\n        beep\n    end tell\n</code></pre>\n\n<p>will turn into:</p>\n\n<pre><code>&lt;p&gt;Here is an example of AppleScript:&lt;/p&gt;\n\n&lt;pre&gt;&lt;code&gt;tell application \"Foo\"\n    beep\nend tell\n&lt;/code&gt;&lt;/pre&gt;\n</code></pre>\n\n<p>A code block continues until it reaches a line that is not indented\n(or the end of the article).</p>\n\n<p>Within a code block, ampersands (<code>&amp;</code>) and angle brackets (<code>&lt;</code> and <code>&gt;</code>)\nare automatically converted into HTML entities. This makes it very\neasy to include example HTML source code using Markdown -- just paste\nit and indent it, and Markdown will handle the hassle of encoding the\nampersands and angle brackets. For example, this:</p>\n\n<pre><code>    &lt;div class=\"footer\"&gt;\n        &amp;copy; 2004 Foo Corporation\n    &lt;/div&gt;\n</code></pre>\n\n<p>will turn into:</p>\n\n<pre><code>&lt;pre&gt;&lt;code&gt;&amp;lt;div class=\"footer\"&amp;gt;\n    &amp;amp;copy; 2004 Foo Corporation\n&amp;lt;/div&amp;gt;\n&lt;/code&gt;&lt;/pre&gt;\n</code></pre>\n\n<p>Regular Markdown syntax is not processed within code blocks. E.g.,\nasterisks are just literal asterisks within a code block. This means\nit's also easy to use Markdown to write about Markdown's own syntax.</p>\n\n<h3 id=\"hr\">Horizontal Rules</h3>\n\n<p>You can produce a horizontal rule tag (<code>&lt;hr /&gt;</code>) by placing three or\nmore hyphens, asterisks, or underscores on a line by themselves. If you\nwish, you may use spaces between the hyphens or asterisks. Each of the\nfollowing lines will produce a horizontal rule:</p>\n\n<pre><code>* * *\n\n***\n\n*****\n\n- - -\n\n---------------------------------------\n\n_ _ _\n</code></pre>\n\n<hr />\n\n<h2 id=\"span\">Span Elements</h2>\n\n<h3 id=\"link\">Links</h3>\n\n<p>Markdown supports two style of links: <em>inline</em> and <em>reference</em>.</p>\n\n<p>In both styles, the link text is delimited by [square brackets].</p>\n\n<p>To create an inline link, use a set of regular parentheses immediately\nafter the link text's closing square bracket. Inside the parentheses,\nput the URL where you want the link to point, along with an <em>optional</em>\ntitle for the link, surrounded in quotes. For example:</p>\n\n<pre><code>This is [an example](http://example.com/ \"Title\") inline link.\n\n[This link](http://example.net/) has no title attribute.\n</code></pre>\n\n<p>Will produce:</p>\n\n<pre><code>&lt;p&gt;This is &lt;a href=\"http://example.com/\" title=\"Title\"&gt;\nan example&lt;/a&gt; inline link.&lt;/p&gt;\n\n&lt;p&gt;&lt;a href=\"http://example.net/\"&gt;This link&lt;/a&gt; has no\ntitle attribute.&lt;/p&gt;\n</code></pre>\n\n<p>If you're referring to a local resource on the same server, you can\nuse relative paths:</p>\n\n<pre><code>See my [About](/about/) page for details.\n</code></pre>\n\n<p>Reference-style links use a second set of square brackets, inside\nwhich you place a label of your choosing to identify the link:</p>\n\n<pre><code>This is [an example][id] reference-style link.\n</code></pre>\n\n<p>You can optionally use a space to separate the sets of brackets:</p>\n\n<pre><code>This is [an example] [id] reference-style link.\n</code></pre>\n\n<p>Then, anywhere in the document, you define your link label like this,\non a line by itself:</p>\n\n<pre><code>[id]: http://example.com/  \"Optional Title Here\"\n</code></pre>\n\n<p>That is:</p>\n\n<ul>\n<li>Square brackets containing the link identifier (optionally\nindented from the left margin using up to three spaces);</li>\n<li>followed by a colon;</li>\n<li>followed by one or more spaces (or tabs);</li>\n<li>followed by the URL for the link;</li>\n<li>optionally followed by a title attribute for the link, enclosed\nin double or single quotes.</li>\n</ul>\n\n<p>The link URL may, optionally, be surrounded by angle brackets:</p>\n\n<pre><code>[id]: &lt;http://example.com/&gt;  \"Optional Title Here\"\n</code></pre>\n\n<p>You can put the title attribute on the next line and use extra spaces\nor tabs for padding, which tends to look better with longer URLs:</p>\n\n<pre><code>[id]: http://example.com/longish/path/to/resource/here\n    \"Optional Title Here\"\n</code></pre>\n\n<p>Link definitions are only used for creating links during Markdown\nprocessing, and are stripped from your document in the HTML output.</p>\n\n<p>Link definition names may constist of letters, numbers, spaces, and punctuation -- but they are <em>not</em> case sensitive. E.g. these two links:</p>\n\n<pre><code>[link text][a]\n[link text][A]\n</code></pre>\n\n<p>are equivalent.</p>\n\n<p>The <em>implicit link name</em> shortcut allows you to omit the name of the\nlink, in which case the link text itself is used as the name.\nJust use an empty set of square brackets -- e.g., to link the word\n\"Google\" to the google.com web site, you could simply write:</p>\n\n<pre><code>[Google][]\n</code></pre>\n\n<p>And then define the link:</p>\n\n<pre><code>[Google]: http://google.com/\n</code></pre>\n\n<p>Because link names may contain spaces, this shortcut even works for\nmultiple words in the link text:</p>\n\n<pre><code>Visit [Daring Fireball][] for more information.\n</code></pre>\n\n<p>And then define the link:</p>\n\n<pre><code>[Daring Fireball]: http://daringfireball.net/\n</code></pre>\n\n<p>Link definitions can be placed anywhere in your Markdown document. I\ntend to put them immediately after each paragraph in which they're\nused, but if you want, you can put them all at the end of your\ndocument, sort of like footnotes.</p>\n\n<p>Here's an example of reference links in action:</p>\n\n<pre><code>I get 10 times more traffic from [Google] [1] than from\n[Yahoo] [2] or [MSN] [3].\n\n  [1]: http://google.com/        \"Google\"\n  [2]: http://search.yahoo.com/  \"Yahoo Search\"\n  [3]: http://search.msn.com/    \"MSN Search\"\n</code></pre>\n\n<p>Using the implicit link name shortcut, you could instead write:</p>\n\n<pre><code>I get 10 times more traffic from [Google][] than from\n[Yahoo][] or [MSN][].\n\n  [google]: http://google.com/        \"Google\"\n  [yahoo]:  http://search.yahoo.com/  \"Yahoo Search\"\n  [msn]:    http://search.msn.com/    \"MSN Search\"\n</code></pre>\n\n<p>Both of the above examples will produce the following HTML output:</p>\n\n<pre><code>&lt;p&gt;I get 10 times more traffic from &lt;a href=\"http://google.com/\"\ntitle=\"Google\"&gt;Google&lt;/a&gt; than from\n&lt;a href=\"http://search.yahoo.com/\" title=\"Yahoo Search\"&gt;Yahoo&lt;/a&gt;\nor &lt;a href=\"http://search.msn.com/\" title=\"MSN Search\"&gt;MSN&lt;/a&gt;.&lt;/p&gt;\n</code></pre>\n\n<p>For comparison, here is the same paragraph written using\nMarkdown's inline link style:</p>\n\n<pre><code>I get 10 times more traffic from [Google](http://google.com/ \"Google\")\nthan from [Yahoo](http://search.yahoo.com/ \"Yahoo Search\") or\n[MSN](http://search.msn.com/ \"MSN Search\").\n</code></pre>\n\n<p>The point of reference-style links is not that they're easier to\nwrite. The point is that with reference-style links, your document\nsource is vastly more readable. Compare the above examples: using\nreference-style links, the paragraph itself is only 81 characters\nlong; with inline-style links, it's 176 characters; and as raw HTML,\nit's 234 characters. In the raw HTML, there's more markup than there\nis text.</p>\n\n<p>With Markdown's reference-style links, a source document much more\nclosely resembles the final output, as rendered in a browser. By\nallowing you to move the markup-related metadata out of the paragraph,\nyou can add links without interrupting the narrative flow of your\nprose.</p>\n\n<h3 id=\"em\">Emphasis</h3>\n\n<p>Markdown treats asterisks (<code>*</code>) and underscores (<code>_</code>) as indicators of\nemphasis. Text wrapped with one <code>*</code> or <code>_</code> will be wrapped with an\nHTML <code>&lt;em&gt;</code> tag; double <code>*</code>'s or <code>_</code>'s will be wrapped with an HTML\n<code>&lt;strong&gt;</code> tag. E.g., this input:</p>\n\n<pre><code>*single asterisks*\n\n_single underscores_\n\n**double asterisks**\n\n__double underscores__\n</code></pre>\n\n<p>will produce:</p>\n\n<pre><code>&lt;em&gt;single asterisks&lt;/em&gt;\n\n&lt;em&gt;single underscores&lt;/em&gt;\n\n&lt;strong&gt;double asterisks&lt;/strong&gt;\n\n&lt;strong&gt;double underscores&lt;/strong&gt;\n</code></pre>\n\n<p>You can use whichever style you prefer; the lone restriction is that\nthe same character must be used to open and close an emphasis span.</p>\n\n<p>Emphasis can be used in the middle of a word:</p>\n\n<pre><code>un*fucking*believable\n</code></pre>\n\n<p>But if you surround an <code>*</code> or <code>_</code> with spaces, it'll be treated as a\nliteral asterisk or underscore.</p>\n\n<p>To produce a literal asterisk or underscore at a position where it\nwould otherwise be used as an emphasis delimiter, you can backslash\nescape it:</p>\n\n<pre><code>\\*this text is surrounded by literal asterisks\\*\n</code></pre>\n\n<h3 id=\"code\">Code</h3>\n\n<p>To indicate a span of code, wrap it with backtick quotes (<code>`</code>).\nUnlike a pre-formatted code block, a code span indicates code within a\nnormal paragraph. For example:</p>\n\n<pre><code>Use the `printf()` function.\n</code></pre>\n\n<p>will produce:</p>\n\n<pre><code>&lt;p&gt;Use the &lt;code&gt;printf()&lt;/code&gt; function.&lt;/p&gt;\n</code></pre>\n\n<p>To include a literal backtick character within a code span, you can use\nmultiple backticks as the opening and closing delimiters:</p>\n\n<pre><code>``There is a literal backtick (`) here.``\n</code></pre>\n\n<p>which will produce this:</p>\n\n<pre><code>&lt;p&gt;&lt;code&gt;There is a literal backtick (`) here.&lt;/code&gt;&lt;/p&gt;\n</code></pre>\n\n<p>The backtick delimiters surrounding a code span may include spaces --\none after the opening, one before the closing. This allows you to place\nliteral backtick characters at the beginning or end of a code span:</p>\n\n<pre><code>A single backtick in a code span: `` ` ``\n\nA backtick-delimited string in a code span: `` `foo` ``\n</code></pre>\n\n<p>will produce:</p>\n\n<pre><code>&lt;p&gt;A single backtick in a code span: &lt;code&gt;`&lt;/code&gt;&lt;/p&gt;\n\n&lt;p&gt;A backtick-delimited string in a code span: &lt;code&gt;`foo`&lt;/code&gt;&lt;/p&gt;\n</code></pre>\n\n<p>With a code span, ampersands and angle brackets are encoded as HTML\nentities automatically, which makes it easy to include example HTML\ntags. Markdown will turn this:</p>\n\n<pre><code>Please don't use any `&lt;blink&gt;` tags.\n</code></pre>\n\n<p>into:</p>\n\n<pre><code>&lt;p&gt;Please don't use any &lt;code&gt;&amp;lt;blink&amp;gt;&lt;/code&gt; tags.&lt;/p&gt;\n</code></pre>\n\n<p>You can write this:</p>\n\n<pre><code>`&amp;#8212;` is the decimal-encoded equivalent of `&amp;mdash;`.\n</code></pre>\n\n<p>to produce:</p>\n\n<pre><code>&lt;p&gt;&lt;code&gt;&amp;amp;#8212;&lt;/code&gt; is the decimal-encoded\nequivalent of &lt;code&gt;&amp;amp;mdash;&lt;/code&gt;.&lt;/p&gt;\n</code></pre>\n\n<h3 id=\"img\">Images</h3>\n\n<p>Admittedly, it's fairly difficult to devise a \"natural\" syntax for\nplacing images into a plain text document format.</p>\n\n<p>Markdown uses an image syntax that is intended to resemble the syntax\nfor links, allowing for two styles: <em>inline</em> and <em>reference</em>.</p>\n\n<p>Inline image syntax looks like this:</p>\n\n<pre><code>![Alt text](/path/to/img.jpg)\n\n![Alt text](/path/to/img.jpg \"Optional title\")\n</code></pre>\n\n<p>That is:</p>\n\n<ul>\n<li>An exclamation mark: <code>!</code>;</li>\n<li>followed by a set of square brackets, containing the <code>alt</code>\nattribute text for the image;</li>\n<li>followed by a set of parentheses, containing the URL or path to\nthe image, and an optional <code>title</code> attribute enclosed in double\nor single quotes.</li>\n</ul>\n\n<p>Reference-style image syntax looks like this:</p>\n\n<pre><code>![Alt text][id]\n</code></pre>\n\n<p>Where \"id\" is the name of a defined image reference. Image references\nare defined using syntax identical to link references:</p>\n\n<pre><code>[id]: url/to/image  \"Optional title attribute\"\n</code></pre>\n\n<p>As of this writing, Markdown has no syntax for specifying the\ndimensions of an image; if this is important to you, you can simply\nuse regular HTML <code>&lt;img&gt;</code> tags.</p>\n\n<hr />\n\n<h2 id=\"misc\">Miscellaneous</h2>\n\n<h3 id=\"autolink\">Automatic Links</h3>\n\n<p>Markdown supports a shortcut style for creating \"automatic\" links for URLs and email addresses: simply surround the URL or email address with angle brackets. What this means is that if you want to show the actual text of a URL or email address, and also have it be a clickable link, you can do this:</p>\n\n<pre><code>&lt;http://example.com/&gt;\n</code></pre>\n\n<p>Markdown will turn this into:</p>\n\n<pre><code>&lt;a href=\"http://example.com/\"&gt;http://example.com/&lt;/a&gt;\n</code></pre>\n\n<p>Automatic links for email addresses work similarly, except that\nMarkdown will also perform a bit of randomized decimal and hex\nentity-encoding to help obscure your address from address-harvesting\nspambots. For example, Markdown will turn this:</p>\n\n<pre><code>&lt;address@example.com&gt;\n</code></pre>\n\n<p>into something like this:</p>\n\n<pre><code>&lt;a href=\"&amp;#x6D;&amp;#x61;i&amp;#x6C;&amp;#x74;&amp;#x6F;:&amp;#x61;&amp;#x64;&amp;#x64;&amp;#x72;&amp;#x65;\n&amp;#115;&amp;#115;&amp;#64;&amp;#101;&amp;#120;&amp;#x61;&amp;#109;&amp;#x70;&amp;#x6C;e&amp;#x2E;&amp;#99;&amp;#111;\n&amp;#109;\"&gt;&amp;#x61;&amp;#x64;&amp;#x64;&amp;#x72;&amp;#x65;&amp;#115;&amp;#115;&amp;#64;&amp;#101;&amp;#120;&amp;#x61;\n&amp;#109;&amp;#x70;&amp;#x6C;e&amp;#x2E;&amp;#99;&amp;#111;&amp;#109;&lt;/a&gt;\n</code></pre>\n\n<p>which will render in a browser as a clickable link to \"address@example.com\".</p>\n\n<p>(This sort of entity-encoding trick will indeed fool many, if not\nmost, address-harvesting bots, but it definitely won't fool all of\nthem. It's better than nothing, but an address published in this way\nwill probably eventually start receiving spam.)</p>\n\n<h3 id=\"backslash\">Backslash Escapes</h3>\n\n<p>Markdown allows you to use backslash escapes to generate literal\ncharacters which would otherwise have special meaning in Markdown's\nformatting syntax. For example, if you wanted to surround a word with\nliteral asterisks (instead of an HTML <code>&lt;em&gt;</code> tag), you can backslashes\nbefore the asterisks, like this:</p>\n\n<pre><code>\\*literal asterisks\\*\n</code></pre>\n\n<p>Markdown provides backslash escapes for the following characters:</p>\n\n<pre><code>\\   backslash\n`   backtick\n*   asterisk\n_   underscore\n{}  curly braces\n[]  square brackets\n()  parentheses\n#   hash mark\n+   plus sign\n-   minus sign (hyphen)\n.   dot\n!   exclamation mark\n</code></pre>\n"
  },
  {
    "path": "test/specs/original/markdown_documentation_syntax.md",
    "content": "---\npedantic: true\n---\n\nMarkdown: Syntax\n================\n\n<ul id=\"ProjectSubmenu\">\n    <li><a href=\"/projects/markdown/\" title=\"Markdown Project Page\">Main</a></li>\n    <li><a href=\"/projects/markdown/basics\" title=\"Markdown Basics\">Basics</a></li>\n    <li><a class=\"selected\" title=\"Markdown Syntax Documentation\">Syntax</a></li>\n    <li><a href=\"/projects/markdown/license\" title=\"Pricing and License Information\">License</a></li>\n    <li><a href=\"/projects/markdown/dingus\" title=\"Online Markdown Web Form\">Dingus</a></li>\n</ul>\n\n\n*   [Overview](#overview)\n    *   [Philosophy](#philosophy)\n    *   [Inline HTML](#html)\n    *   [Automatic Escaping for Special Characters](#autoescape)\n*   [Block Elements](#block)\n    *   [Paragraphs and Line Breaks](#p)\n    *   [Headers](#header)\n    *   [Blockquotes](#blockquote)\n    *   [Lists](#list)\n    *   [Code Blocks](#precode)\n    *   [Horizontal Rules](#hr)\n*   [Span Elements](#span)\n    *   [Links](#link)\n    *   [Emphasis](#em)\n    *   [Code](#code)\n    *   [Images](#img)\n*   [Miscellaneous](#misc)\n    *   [Backslash Escapes](#backslash)\n    *   [Automatic Links](#autolink)\n\n\n**Note:** This document is itself written using Markdown; you\ncan [see the source for it by adding '.text' to the URL][src].\n\n  [src]: /projects/markdown/syntax.text\n\n* * *\n\n<h2 id=\"overview\">Overview</h2>\n\n<h3 id=\"philosophy\">Philosophy</h3>\n\nMarkdown is intended to be as easy-to-read and easy-to-write as is feasible.\n\nReadability, however, is emphasized above all else. A Markdown-formatted\ndocument should be publishable as-is, as plain text, without looking\nlike it's been marked up with tags or formatting instructions. While\nMarkdown's syntax has been influenced by several existing text-to-HTML\nfilters -- including [Setext] [1], [atx] [2], [Textile] [3], [reStructuredText] [4],\n[Grutatext] [5], and [EtText] [6] -- the single biggest source of\ninspiration for Markdown's syntax is the format of plain text email.\n\n  [1]: http://docutils.sourceforge.net/mirror/setext.html\n  [2]: http://www.aaronsw.com/2002/atx/\n  [3]: http://textism.com/tools/textile/\n  [4]: http://docutils.sourceforge.net/rst.html\n  [5]: http://www.triptico.com/software/grutatxt.html\n  [6]: http://ettext.taint.org/doc/\n\nTo this end, Markdown's syntax is comprised entirely of punctuation\ncharacters, which punctuation characters have been carefully chosen so\nas to look like what they mean. E.g., asterisks around a word actually\nlook like \\*emphasis\\*. Markdown lists look like, well, lists. Even\nblockquotes look like quoted passages of text, assuming you've ever\nused email.\n\n\n\n<h3 id=\"html\">Inline HTML</h3>\n\nMarkdown's syntax is intended for one purpose: to be used as a\nformat for *writing* for the web.\n\nMarkdown is not a replacement for HTML, or even close to it. Its\nsyntax is very small, corresponding only to a very small subset of\nHTML tags. The idea is *not* to create a syntax that makes it easier\nto insert HTML tags. In my opinion, HTML tags are already easy to\ninsert. The idea for Markdown is to make it easy to read, write, and\nedit prose. HTML is a *publishing* format; Markdown is a *writing*\nformat. Thus, Markdown's formatting syntax only addresses issues that\ncan be conveyed in plain text.\n\nFor any markup that is not covered by Markdown's syntax, you simply\nuse HTML itself. There's no need to preface it or delimit it to\nindicate that you're switching from Markdown to HTML; you just use\nthe tags.\n\nThe only restrictions are that block-level HTML elements -- e.g. `<div>`,\n`<table>`, `<pre>`, `<p>`, etc. -- must be separated from surrounding\ncontent by blank lines, and the start and end tags of the block should\nnot be indented with tabs or spaces. Markdown is smart enough not\nto add extra (unwanted) `<p>` tags around HTML block-level tags.\n\nFor example, to add an HTML table to a Markdown article:\n\n    This is a regular paragraph.\n\n    <table>\n        <tr>\n            <td>Foo</td>\n        </tr>\n    </table>\n\n    This is another regular paragraph.\n\nNote that Markdown formatting syntax is not processed within block-level\nHTML tags. E.g., you can't use Markdown-style `*emphasis*` inside an\nHTML block.\n\nSpan-level HTML tags -- e.g. `<span>`, `<cite>`, or `<del>` -- can be\nused anywhere in a Markdown paragraph, list item, or header. If you\nwant, you can even use HTML tags instead of Markdown formatting; e.g. if\nyou'd prefer to use HTML `<a>` or `<img>` tags instead of Markdown's\nlink or image syntax, go right ahead.\n\nUnlike block-level HTML tags, Markdown syntax *is* processed within\nspan-level tags.\n\n\n<h3 id=\"autoescape\">Automatic Escaping for Special Characters</h3>\n\nIn HTML, there are two characters that demand special treatment: `<`\nand `&`. Left angle brackets are used to start tags; ampersands are\nused to denote HTML entities. If you want to use them as literal\ncharacters, you must escape them as entities, e.g. `&lt;`, and\n`&amp;`.\n\nAmpersands in particular are bedeviling for web writers. If you want to\nwrite about 'AT&T', you need to write '`AT&amp;T`'. You even need to\nescape ampersands within URLs. Thus, if you want to link to:\n\n    http://images.google.com/images?num=30&q=larry+bird\n\nyou need to encode the URL as:\n\n    http://images.google.com/images?num=30&amp;q=larry+bird\n\nin your anchor tag `href` attribute. Needless to say, this is easy to\nforget, and is probably the single most common source of HTML validation\nerrors in otherwise well-marked-up web sites.\n\nMarkdown allows you to use these characters naturally, taking care of\nall the necessary escaping for you. If you use an ampersand as part of\nan HTML entity, it remains unchanged; otherwise it will be translated\ninto `&amp;`.\n\nSo, if you want to include a copyright symbol in your article, you can write:\n\n    &copy;\n\nand Markdown will leave it alone. But if you write:\n\n    AT&T\n\nMarkdown will translate it to:\n\n    AT&amp;T\n\nSimilarly, because Markdown supports [inline HTML](#html), if you use\nangle brackets as delimiters for HTML tags, Markdown will treat them as\nsuch. But if you write:\n\n    4 < 5\n\nMarkdown will translate it to:\n\n    4 &lt; 5\n\nHowever, inside Markdown code spans and blocks, angle brackets and\nampersands are *always* encoded automatically. This makes it easy to use\nMarkdown to write about HTML code. (As opposed to raw HTML, which is a\nterrible format for writing about HTML syntax, because every single `<`\nand `&` in your example code needs to be escaped.)\n\n\n* * *\n\n\n<h2 id=\"block\">Block Elements</h2>\n\n\n<h3 id=\"p\">Paragraphs and Line Breaks</h3>\n\nA paragraph is simply one or more consecutive lines of text, separated\nby one or more blank lines. (A blank line is any line that looks like a\nblank line -- a line containing nothing but spaces or tabs is considered\nblank.) Normal paragraphs should not be intended with spaces or tabs.\n\nThe implication of the \"one or more consecutive lines of text\" rule is\nthat Markdown supports \"hard-wrapped\" text paragraphs. This differs\nsignificantly from most other text-to-HTML formatters (including Movable\nType's \"Convert Line Breaks\" option) which translate every line break\ncharacter in a paragraph into a `<br />` tag.\n\nWhen you *do* want to insert a `<br />` break tag using Markdown, you\nend a line with two or more spaces, then type return.\n\nYes, this takes a tad more effort to create a `<br />`, but a simplistic\n\"every line break is a `<br />`\" rule wouldn't work for Markdown.\nMarkdown's email-style [blockquoting][bq] and multi-paragraph [list items][l]\nwork best -- and look better -- when you format them with hard breaks.\n\n  [bq]: #blockquote\n  [l]:  #list\n\n\n\n<h3 id=\"header\">Headers</h3>\n\nMarkdown supports two styles of headers, [Setext] [1] and [atx] [2].\n\nSetext-style headers are \"underlined\" using equal signs (for first-level\nheaders) and dashes (for second-level headers). For example:\n\n    This is an H1\n    =============\n\n    This is an H2\n    -------------\n\nAny number of underlining `=`'s or `-`'s will work.\n\nAtx-style headers use 1-6 hash characters at the start of the line,\ncorresponding to header levels 1-6. For example:\n\n    # This is an H1\n\n    ## This is an H2\n\n    ###### This is an H6\n\nOptionally, you may \"close\" atx-style headers. This is purely\ncosmetic -- you can use this if you think it looks better. The\nclosing hashes don't even need to match the number of hashes\nused to open the header. (The number of opening hashes\ndetermines the header level.) :\n\n    # This is an H1 #\n\n    ## This is an H2 ##\n\n    ### This is an H3 ######\n\n\n<h3 id=\"blockquote\">Blockquotes</h3>\n\nMarkdown uses email-style `>` characters for blockquoting. If you're\nfamiliar with quoting passages of text in an email message, then you\nknow how to create a blockquote in Markdown. It looks best if you hard\nwrap the text and put a `>` before every line:\n\n    > This is a blockquote with two paragraphs. Lorem ipsum dolor sit amet,\n    > consectetuer adipiscing elit. Aliquam hendrerit mi posuere lectus.\n    > Vestibulum enim wisi, viverra nec, fringilla in, laoreet vitae, risus.\n    >\n    > Donec sit amet nisl. Aliquam semper ipsum sit amet velit. Suspendisse\n    > id sem consectetuer libero luctus adipiscing.\n\nMarkdown allows you to be lazy and only put the `>` before the first\nline of a hard-wrapped paragraph:\n\n    > This is a blockquote with two paragraphs. Lorem ipsum dolor sit amet,\n    consectetuer adipiscing elit. Aliquam hendrerit mi posuere lectus.\n    Vestibulum enim wisi, viverra nec, fringilla in, laoreet vitae, risus.\n\n    > Donec sit amet nisl. Aliquam semper ipsum sit amet velit. Suspendisse\n    id sem consectetuer libero luctus adipiscing.\n\nBlockquotes can be nested (i.e. a blockquote-in-a-blockquote) by\nadding additional levels of `>`:\n\n    > This is the first level of quoting.\n    >\n    > > This is nested blockquote.\n    >\n    > Back to the first level.\n\nBlockquotes can contain other Markdown elements, including headers, lists,\nand code blocks:\n\n\t> ## This is a header.\n\t>\n\t> 1.   This is the first list item.\n\t> 2.   This is the second list item.\n\t>\n\t> Here's some example code:\n\t>\n\t>     return shell_exec(\"echo $input | $markdown_script\");\n\nAny decent text editor should make email-style quoting easy. For\nexample, with BBEdit, you can make a selection and choose Increase\nQuote Level from the Text menu.\n\n\n<h3 id=\"list\">Lists</h3>\n\nMarkdown supports ordered (numbered) and unordered (bulleted) lists.\n\nUnordered lists use asterisks, pluses, and hyphens -- interchangeably\n-- as list markers:\n\n    *   Red\n    *   Green\n    *   Blue\n\nis equivalent to:\n\n    +   Red\n    +   Green\n    +   Blue\n\nand:\n\n    -   Red\n    -   Green\n    -   Blue\n\nOrdered lists use numbers followed by periods:\n\n    1.  Bird\n    2.  McHale\n    3.  Parish\n\nIt's important to note that the actual numbers you use to mark the\nlist have no effect on the HTML output Markdown produces. The HTML\nMarkdown produces from the above list is:\n\n    <ol>\n    <li>Bird</li>\n    <li>McHale</li>\n    <li>Parish</li>\n    </ol>\n\nIf you instead wrote the list in Markdown like this:\n\n    1.  Bird\n    1.  McHale\n    1.  Parish\n\nor even:\n\n    3. Bird\n    1. McHale\n    8. Parish\n\nyou'd get the exact same HTML output. The point is, if you want to,\nyou can use ordinal numbers in your ordered Markdown lists, so that\nthe numbers in your source match the numbers in your published HTML.\nBut if you want to be lazy, you don't have to.\n\nIf you do use lazy list numbering, however, you should still start the\nlist with the number 1. At some point in the future, Markdown may support\nstarting ordered lists at an arbitrary number.\n\nList markers typically start at the left margin, but may be indented by\nup to three spaces. List markers must be followed by one or more spaces\nor a tab.\n\nTo make lists look nice, you can wrap items with hanging indents:\n\n    *   Lorem ipsum dolor sit amet, consectetuer adipiscing elit.\n        Aliquam hendrerit mi posuere lectus. Vestibulum enim wisi,\n        viverra nec, fringilla in, laoreet vitae, risus.\n    *   Donec sit amet nisl. Aliquam semper ipsum sit amet velit.\n        Suspendisse id sem consectetuer libero luctus adipiscing.\n\nBut if you want to be lazy, you don't have to:\n\n    *   Lorem ipsum dolor sit amet, consectetuer adipiscing elit.\n    Aliquam hendrerit mi posuere lectus. Vestibulum enim wisi,\n    viverra nec, fringilla in, laoreet vitae, risus.\n    *   Donec sit amet nisl. Aliquam semper ipsum sit amet velit.\n    Suspendisse id sem consectetuer libero luctus adipiscing.\n\nIf list items are separated by blank lines, Markdown will wrap the\nitems in `<p>` tags in the HTML output. For example, this input:\n\n    *   Bird\n    *   Magic\n\nwill turn into:\n\n    <ul>\n    <li>Bird</li>\n    <li>Magic</li>\n    </ul>\n\nBut this:\n\n    *   Bird\n\n    *   Magic\n\nwill turn into:\n\n    <ul>\n    <li><p>Bird</p></li>\n    <li><p>Magic</p></li>\n    </ul>\n\nList items may consist of multiple paragraphs. Each subsequent\nparagraph in a list item must be intended by either 4 spaces\nor one tab:\n\n    1.  This is a list item with two paragraphs. Lorem ipsum dolor\n        sit amet, consectetuer adipiscing elit. Aliquam hendrerit\n        mi posuere lectus.\n\n        Vestibulum enim wisi, viverra nec, fringilla in, laoreet\n        vitae, risus. Donec sit amet nisl. Aliquam semper ipsum\n        sit amet velit.\n\n    2.  Suspendisse id sem consectetuer libero luctus adipiscing.\n\nIt looks nice if you indent every line of the subsequent\nparagraphs, but here again, Markdown will allow you to be\nlazy:\n\n    *   This is a list item with two paragraphs.\n\n        This is the second paragraph in the list item. You're\n    only required to indent the first line. Lorem ipsum dolor\n    sit amet, consectetuer adipiscing elit.\n\n    *   Another item in the same list.\n\nTo put a blockquote within a list item, the blockquote's `>`\ndelimiters need to be indented:\n\n    *   A list item with a blockquote:\n\n        > This is a blockquote\n        > inside a list item.\n\nTo put a code block within a list item, the code block needs\nto be indented *twice* -- 8 spaces or two tabs:\n\n    *   A list item with a code block:\n\n            <code goes here>\n\n\nIt's worth noting that it's possible to trigger an ordered list by\naccident, by writing something like this:\n\n    1986. What a great season.\n\nIn other words, a *number-period-space* sequence at the beginning of a\nline. To avoid this, you can backslash-escape the period:\n\n    1986\\. What a great season.\n\n\n\n<h3 id=\"precode\">Code Blocks</h3>\n\nPre-formatted code blocks are used for writing about programming or\nmarkup source code. Rather than forming normal paragraphs, the lines\nof a code block are interpreted literally. Markdown wraps a code block\nin both `<pre>` and `<code>` tags.\n\nTo produce a code block in Markdown, simply indent every line of the\nblock by at least 4 spaces or 1 tab. For example, given this input:\n\n    This is a normal paragraph:\n\n        This is a code block.\n\nMarkdown will generate:\n\n    <p>This is a normal paragraph:</p>\n\n    <pre><code>This is a code block.\n    </code></pre>\n\nOne level of indentation -- 4 spaces or 1 tab -- is removed from each\nline of the code block. For example, this:\n\n    Here is an example of AppleScript:\n\n        tell application \"Foo\"\n            beep\n        end tell\n\nwill turn into:\n\n    <p>Here is an example of AppleScript:</p>\n\n    <pre><code>tell application \"Foo\"\n        beep\n    end tell\n    </code></pre>\n\nA code block continues until it reaches a line that is not indented\n(or the end of the article).\n\nWithin a code block, ampersands (`&`) and angle brackets (`<` and `>`)\nare automatically converted into HTML entities. This makes it very\neasy to include example HTML source code using Markdown -- just paste\nit and indent it, and Markdown will handle the hassle of encoding the\nampersands and angle brackets. For example, this:\n\n        <div class=\"footer\">\n            &copy; 2004 Foo Corporation\n        </div>\n\nwill turn into:\n\n    <pre><code>&lt;div class=\"footer\"&gt;\n        &amp;copy; 2004 Foo Corporation\n    &lt;/div&gt;\n    </code></pre>\n\nRegular Markdown syntax is not processed within code blocks. E.g.,\nasterisks are just literal asterisks within a code block. This means\nit's also easy to use Markdown to write about Markdown's own syntax.\n\n\n\n<h3 id=\"hr\">Horizontal Rules</h3>\n\nYou can produce a horizontal rule tag (`<hr />`) by placing three or\nmore hyphens, asterisks, or underscores on a line by themselves. If you\nwish, you may use spaces between the hyphens or asterisks. Each of the\nfollowing lines will produce a horizontal rule:\n\n    * * *\n\n    ***\n\n    *****\n\n    - - -\n\n    ---------------------------------------\n\n\t_ _ _\n\n\n* * *\n\n<h2 id=\"span\">Span Elements</h2>\n\n<h3 id=\"link\">Links</h3>\n\nMarkdown supports two style of links: *inline* and *reference*.\n\nIn both styles, the link text is delimited by [square brackets].\n\nTo create an inline link, use a set of regular parentheses immediately\nafter the link text's closing square bracket. Inside the parentheses,\nput the URL where you want the link to point, along with an *optional*\ntitle for the link, surrounded in quotes. For example:\n\n    This is [an example](http://example.com/ \"Title\") inline link.\n\n    [This link](http://example.net/) has no title attribute.\n\nWill produce:\n\n    <p>This is <a href=\"http://example.com/\" title=\"Title\">\n    an example</a> inline link.</p>\n\n    <p><a href=\"http://example.net/\">This link</a> has no\n    title attribute.</p>\n\nIf you're referring to a local resource on the same server, you can\nuse relative paths:\n\n    See my [About](/about/) page for details.\n\nReference-style links use a second set of square brackets, inside\nwhich you place a label of your choosing to identify the link:\n\n    This is [an example][id] reference-style link.\n\nYou can optionally use a space to separate the sets of brackets:\n\n    This is [an example] [id] reference-style link.\n\nThen, anywhere in the document, you define your link label like this,\non a line by itself:\n\n    [id]: http://example.com/  \"Optional Title Here\"\n\nThat is:\n\n*   Square brackets containing the link identifier (optionally\n    indented from the left margin using up to three spaces);\n*   followed by a colon;\n*   followed by one or more spaces (or tabs);\n*   followed by the URL for the link;\n*   optionally followed by a title attribute for the link, enclosed\n    in double or single quotes.\n\nThe link URL may, optionally, be surrounded by angle brackets:\n\n    [id]: <http://example.com/>  \"Optional Title Here\"\n\nYou can put the title attribute on the next line and use extra spaces\nor tabs for padding, which tends to look better with longer URLs:\n\n    [id]: http://example.com/longish/path/to/resource/here\n        \"Optional Title Here\"\n\nLink definitions are only used for creating links during Markdown\nprocessing, and are stripped from your document in the HTML output.\n\nLink definition names may constist of letters, numbers, spaces, and punctuation -- but they are *not* case sensitive. E.g. these two links:\n\n\t[link text][a]\n\t[link text][A]\n\nare equivalent.\n\nThe *implicit link name* shortcut allows you to omit the name of the\nlink, in which case the link text itself is used as the name.\nJust use an empty set of square brackets -- e.g., to link the word\n\"Google\" to the google.com web site, you could simply write:\n\n\t[Google][]\n\nAnd then define the link:\n\n\t[Google]: http://google.com/\n\nBecause link names may contain spaces, this shortcut even works for\nmultiple words in the link text:\n\n\tVisit [Daring Fireball][] for more information.\n\nAnd then define the link:\n\n\t[Daring Fireball]: http://daringfireball.net/\n\nLink definitions can be placed anywhere in your Markdown document. I\ntend to put them immediately after each paragraph in which they're\nused, but if you want, you can put them all at the end of your\ndocument, sort of like footnotes.\n\nHere's an example of reference links in action:\n\n    I get 10 times more traffic from [Google] [1] than from\n    [Yahoo] [2] or [MSN] [3].\n\n      [1]: http://google.com/        \"Google\"\n      [2]: http://search.yahoo.com/  \"Yahoo Search\"\n      [3]: http://search.msn.com/    \"MSN Search\"\n\nUsing the implicit link name shortcut, you could instead write:\n\n    I get 10 times more traffic from [Google][] than from\n    [Yahoo][] or [MSN][].\n\n      [google]: http://google.com/        \"Google\"\n      [yahoo]:  http://search.yahoo.com/  \"Yahoo Search\"\n      [msn]:    http://search.msn.com/    \"MSN Search\"\n\nBoth of the above examples will produce the following HTML output:\n\n    <p>I get 10 times more traffic from <a href=\"http://google.com/\"\n    title=\"Google\">Google</a> than from\n    <a href=\"http://search.yahoo.com/\" title=\"Yahoo Search\">Yahoo</a>\n    or <a href=\"http://search.msn.com/\" title=\"MSN Search\">MSN</a>.</p>\n\nFor comparison, here is the same paragraph written using\nMarkdown's inline link style:\n\n    I get 10 times more traffic from [Google](http://google.com/ \"Google\")\n    than from [Yahoo](http://search.yahoo.com/ \"Yahoo Search\") or\n    [MSN](http://search.msn.com/ \"MSN Search\").\n\nThe point of reference-style links is not that they're easier to\nwrite. The point is that with reference-style links, your document\nsource is vastly more readable. Compare the above examples: using\nreference-style links, the paragraph itself is only 81 characters\nlong; with inline-style links, it's 176 characters; and as raw HTML,\nit's 234 characters. In the raw HTML, there's more markup than there\nis text.\n\nWith Markdown's reference-style links, a source document much more\nclosely resembles the final output, as rendered in a browser. By\nallowing you to move the markup-related metadata out of the paragraph,\nyou can add links without interrupting the narrative flow of your\nprose.\n\n\n<h3 id=\"em\">Emphasis</h3>\n\nMarkdown treats asterisks (`*`) and underscores (`_`) as indicators of\nemphasis. Text wrapped with one `*` or `_` will be wrapped with an\nHTML `<em>` tag; double `*`'s or `_`'s will be wrapped with an HTML\n`<strong>` tag. E.g., this input:\n\n    *single asterisks*\n\n    _single underscores_\n\n    **double asterisks**\n\n    __double underscores__\n\nwill produce:\n\n    <em>single asterisks</em>\n\n    <em>single underscores</em>\n\n    <strong>double asterisks</strong>\n\n    <strong>double underscores</strong>\n\nYou can use whichever style you prefer; the lone restriction is that\nthe same character must be used to open and close an emphasis span.\n\nEmphasis can be used in the middle of a word:\n\n    un*fucking*believable\n\nBut if you surround an `*` or `_` with spaces, it'll be treated as a\nliteral asterisk or underscore.\n\nTo produce a literal asterisk or underscore at a position where it\nwould otherwise be used as an emphasis delimiter, you can backslash\nescape it:\n\n    \\*this text is surrounded by literal asterisks\\*\n\n\n\n<h3 id=\"code\">Code</h3>\n\nTo indicate a span of code, wrap it with backtick quotes (`` ` ``).\nUnlike a pre-formatted code block, a code span indicates code within a\nnormal paragraph. For example:\n\n    Use the `printf()` function.\n\nwill produce:\n\n    <p>Use the <code>printf()</code> function.</p>\n\nTo include a literal backtick character within a code span, you can use\nmultiple backticks as the opening and closing delimiters:\n\n    ``There is a literal backtick (`) here.``\n\nwhich will produce this:\n\n    <p><code>There is a literal backtick (`) here.</code></p>\n\nThe backtick delimiters surrounding a code span may include spaces --\none after the opening, one before the closing. This allows you to place\nliteral backtick characters at the beginning or end of a code span:\n\n\tA single backtick in a code span: `` ` ``\n\n\tA backtick-delimited string in a code span: `` `foo` ``\n\nwill produce:\n\n\t<p>A single backtick in a code span: <code>`</code></p>\n\n\t<p>A backtick-delimited string in a code span: <code>`foo`</code></p>\n\nWith a code span, ampersands and angle brackets are encoded as HTML\nentities automatically, which makes it easy to include example HTML\ntags. Markdown will turn this:\n\n    Please don't use any `<blink>` tags.\n\ninto:\n\n    <p>Please don't use any <code>&lt;blink&gt;</code> tags.</p>\n\nYou can write this:\n\n    `&#8212;` is the decimal-encoded equivalent of `&mdash;`.\n\nto produce:\n\n    <p><code>&amp;#8212;</code> is the decimal-encoded\n    equivalent of <code>&amp;mdash;</code>.</p>\n\n\n\n<h3 id=\"img\">Images</h3>\n\nAdmittedly, it's fairly difficult to devise a \"natural\" syntax for\nplacing images into a plain text document format.\n\nMarkdown uses an image syntax that is intended to resemble the syntax\nfor links, allowing for two styles: *inline* and *reference*.\n\nInline image syntax looks like this:\n\n    ![Alt text](/path/to/img.jpg)\n\n    ![Alt text](/path/to/img.jpg \"Optional title\")\n\nThat is:\n\n*   An exclamation mark: `!`;\n*   followed by a set of square brackets, containing the `alt`\n    attribute text for the image;\n*   followed by a set of parentheses, containing the URL or path to\n    the image, and an optional `title` attribute enclosed in double\n    or single quotes.\n\nReference-style image syntax looks like this:\n\n    ![Alt text][id]\n\nWhere \"id\" is the name of a defined image reference. Image references\nare defined using syntax identical to link references:\n\n    [id]: url/to/image  \"Optional title attribute\"\n\nAs of this writing, Markdown has no syntax for specifying the\ndimensions of an image; if this is important to you, you can simply\nuse regular HTML `<img>` tags.\n\n\n* * *\n\n\n<h2 id=\"misc\">Miscellaneous</h2>\n\n<h3 id=\"autolink\">Automatic Links</h3>\n\nMarkdown supports a shortcut style for creating \"automatic\" links for URLs and email addresses: simply surround the URL or email address with angle brackets. What this means is that if you want to show the actual text of a URL or email address, and also have it be a clickable link, you can do this:\n\n    <http://example.com/>\n\nMarkdown will turn this into:\n\n    <a href=\"http://example.com/\">http://example.com/</a>\n\nAutomatic links for email addresses work similarly, except that\nMarkdown will also perform a bit of randomized decimal and hex\nentity-encoding to help obscure your address from address-harvesting\nspambots. For example, Markdown will turn this:\n\n    <address@example.com>\n\ninto something like this:\n\n    <a href=\"&#x6D;&#x61;i&#x6C;&#x74;&#x6F;:&#x61;&#x64;&#x64;&#x72;&#x65;\n    &#115;&#115;&#64;&#101;&#120;&#x61;&#109;&#x70;&#x6C;e&#x2E;&#99;&#111;\n    &#109;\">&#x61;&#x64;&#x64;&#x72;&#x65;&#115;&#115;&#64;&#101;&#120;&#x61;\n    &#109;&#x70;&#x6C;e&#x2E;&#99;&#111;&#109;</a>\n\nwhich will render in a browser as a clickable link to \"address@example.com\".\n\n(This sort of entity-encoding trick will indeed fool many, if not\nmost, address-harvesting bots, but it definitely won't fool all of\nthem. It's better than nothing, but an address published in this way\nwill probably eventually start receiving spam.)\n\n\n\n<h3 id=\"backslash\">Backslash Escapes</h3>\n\nMarkdown allows you to use backslash escapes to generate literal\ncharacters which would otherwise have special meaning in Markdown's\nformatting syntax. For example, if you wanted to surround a word with\nliteral asterisks (instead of an HTML `<em>` tag), you can backslashes\nbefore the asterisks, like this:\n\n    \\*literal asterisks\\*\n\nMarkdown provides backslash escapes for the following characters:\n\n    \\   backslash\n    `   backtick\n    *   asterisk\n    _   underscore\n    {}  curly braces\n    []  square brackets\n    ()  parentheses\n    #   hash mark\n\t+\tplus sign\n\t-\tminus sign (hyphen)\n    .   dot\n    !   exclamation mark\n"
  },
  {
    "path": "test/specs/original/nested_blockquotes.html",
    "content": "<blockquote>\n  <p>foo</p>\n  \n  <blockquote>\n    <p>bar</p>\n  </blockquote>\n  \n  <p>foo</p>\n</blockquote>\n"
  },
  {
    "path": "test/specs/original/nested_blockquotes.md",
    "content": "> foo\n>\n> > bar\n>\n> foo\n"
  },
  {
    "path": "test/specs/original/ordered_and_unordered_lists.html",
    "content": "<h2>Unordered</h2>\n\n<p>Asterisks tight:</p>\n\n<ul>\n<li>asterisk 1</li>\n<li>asterisk 2</li>\n<li>asterisk 3</li>\n</ul>\n\n<p>Asterisks loose:</p>\n\n<ul>\n<li><p>asterisk 1</p></li>\n<li><p>asterisk 2</p></li>\n<li><p>asterisk 3</p></li>\n</ul>\n\n<hr />\n\n<p>Pluses tight:</p>\n\n<ul>\n<li>Plus 1</li>\n<li>Plus 2</li>\n<li>Plus 3</li>\n</ul>\n\n<p>Pluses loose:</p>\n\n<ul>\n<li><p>Plus 1</p></li>\n<li><p>Plus 2</p></li>\n<li><p>Plus 3</p></li>\n</ul>\n\n<hr />\n\n<p>Minuses tight:</p>\n\n<ul>\n<li>Minus 1</li>\n<li>Minus 2</li>\n<li>Minus 3</li>\n</ul>\n\n<p>Minuses loose:</p>\n\n<ul>\n<li><p>Minus 1</p></li>\n<li><p>Minus 2</p></li>\n<li><p>Minus 3</p></li>\n</ul>\n\n<h2>Ordered</h2>\n\n<p>Tight:</p>\n\n<ol>\n<li>First</li>\n<li>Second</li>\n<li>Third</li>\n</ol>\n\n<p>and:</p>\n\n<ol>\n<li>One</li>\n<li>Two</li>\n<li>Three</li>\n</ol>\n\n<p>Loose using tabs:</p>\n\n<ol>\n<li><p>First</p></li>\n<li><p>Second</p></li>\n<li><p>Third</p></li>\n</ol>\n\n<p>and using spaces:</p>\n\n<ol>\n<li><p>One</p></li>\n<li><p>Two</p></li>\n<li><p>Three</p></li>\n</ol>\n\n<p>Multiple paragraphs:</p>\n\n<ol>\n<li><p>Item 1, graf one.</p>\n\n<p>Item 2. graf two. The quick brown fox jumped over the lazy dog's\nback.</p></li>\n<li><p>Item 2.</p></li>\n<li><p>Item 3.</p></li>\n</ol>\n\n<h2>Nested</h2>\n\n<ul>\n<li>Tab\n<ul>\n<li>Tab\n<ul>\n<li>Tab</li>\n</ul></li>\n</ul></li>\n</ul>\n\n<p>Here's another:</p>\n\n<ol>\n<li>First</li>\n<li>Second:\n<ul>\n<li>Fee</li>\n<li>Fie</li>\n<li>Foe</li>\n</ul></li>\n<li>Third</li>\n</ol>\n\n<p>Same thing but with paragraphs:</p>\n\n<ol>\n<li><p>First</p></li>\n<li><p>Second:</p>\n\n<ul>\n<li>Fee</li>\n<li>Fie</li>\n<li>Foe</li>\n</ul></li>\n<li><p>Third</p></li>\n</ol>\n\n\n<p>This was an error in Markdown 1.0.1:</p>\n\n<ul>\n<li><p>this</p>\n\n<ul><li>sub</li></ul>\n\n<p>that</p></li>\n</ul>\n\n\n<p>Ordered lists start from initial number:</p>\n\n<ol start=\"3\">\n<li>Three</li>\n<li>Four</li>\n</ol>\n\n\n<p>Ordered lists start from initial zero:</p>\n\n<ol start=\"0\">\n<li>Zero</li>\n<li>One</li>\n</ol>\n"
  },
  {
    "path": "test/specs/original/ordered_and_unordered_lists.md",
    "content": "## Unordered\n\nAsterisks tight:\n\n*\tasterisk 1\n*\tasterisk 2\n*\tasterisk 3\n\n\nAsterisks loose:\n\n*\tasterisk 1\n\n*\tasterisk 2\n\n*\tasterisk 3\n\n* * *\n\nPluses tight:\n\n+\tPlus 1\n+\tPlus 2\n+\tPlus 3\n\n\nPluses loose:\n\n+\tPlus 1\n\n+\tPlus 2\n\n+\tPlus 3\n\n* * *\n\n\nMinuses tight:\n\n-\tMinus 1\n-\tMinus 2\n-\tMinus 3\n\n\nMinuses loose:\n\n-\tMinus 1\n\n-\tMinus 2\n\n-\tMinus 3\n\n\n## Ordered\n\nTight:\n\n1.\tFirst\n2.\tSecond\n3.\tThird\n\nand:\n\n1. One\n2. Two\n3. Three\n\n\nLoose using tabs:\n\n1.\tFirst\n\n2.\tSecond\n\n3.\tThird\n\nand using spaces:\n\n1. One\n\n2. Two\n\n3. Three\n\nMultiple paragraphs:\n\n1.\tItem 1, graf one.\n\n\tItem 2. graf two. The quick brown fox jumped over the lazy dog's\n\tback.\n\n2.\tItem 2.\n\n3.\tItem 3.\n\n\n\n## Nested\n\n*\tTab\n\t*\tTab\n\t\t*\tTab\n\nHere's another:\n\n1. First\n2. Second:\n\t* Fee\n\t* Fie\n\t* Foe\n3. Third\n\nSame thing but with paragraphs:\n\n1. First\n\n2. Second:\n\t* Fee\n\t* Fie\n\t* Foe\n\n3. Third\n\n\nThis was an error in Markdown 1.0.1:\n\n*\tthis\n\n\t*\tsub\n\n\tthat\n\nOrdered lists start from initial number:\n\n3. Three\n1. Four\n\nOrdered lists start from initial zero:\n\n0. Zero\n1. One\n"
  },
  {
    "path": "test/specs/original/tabs.html",
    "content": "<ul>\n<li><p>this is a list item\nindented with tabs</p></li>\n<li><p>this is a list item\nindented with spaces</p></li>\n</ul>\n\n<p>Code:</p>\n\n<pre><code>this code block is indented by one tab\n</code></pre>\n\n<p>And:</p>\n\n<pre><code>    this code block is indented by two tabs\n</code></pre>\n\n<p>And:</p>\n\n<pre><code>+   this is an example list item\n    indented with tabs\n\n+   this is an example list item\n    indented with spaces\n</code></pre>\n"
  },
  {
    "path": "test/specs/original/tabs.md",
    "content": "+\tthis is a list item\n\tindented with tabs\n\n+   this is a list item\n    indented with spaces\n\nCode:\n\n\tthis code block is indented by one tab\n\nAnd:\n\n\t\tthis code block is indented by two tabs\n\nAnd:\n\n\t+\tthis is an example list item\n\t\tindented with tabs\n\t\n\t+   this is an example list item\n\t    indented with spaces\n"
  },
  {
    "path": "test/specs/original/tidyness.html",
    "content": "<blockquote>\n<p>A list within a blockquote:</p>\n<ul>\n<li>asterisk 1</li>\n<li>asterisk 2</li>\n<li>asterisk 3</li>\n</ul>\n</blockquote>\n"
  },
  {
    "path": "test/specs/original/tidyness.md",
    "content": "> A list within a blockquote:\n> \n> *\tasterisk 1\n> *\tasterisk 2\n> *\tasterisk 3\n"
  },
  {
    "path": "test/specs/redos/backticks_alternating_in_link.html",
    "content": "<p><a href=\"https://example.com\"><code>a</code> a <code>a</code> a <code>a</code> a <code>a</code> a <code>a</code> a <code>a</code> a <code>a</code> a <code>a</code> a <code>a</code> a <code>a</code> a <code>a</code> a <code>a</code> a <code>a</code> a <code>a</code> a <code>a</code> a <code>a</code> a <code>a</code> a <code>a</code> a <code>a</code> a <code>a</code> a <code>a</code></a></p>\n"
  },
  {
    "path": "test/specs/redos/backticks_alternating_in_link.md",
    "content": "[` a ` a ` a ` a ` a ` a ` a ` a ` a ` a ` a ` a ` a ` a ` a ` a ` a ` a ` a ` a ` a ` a ` a ` a ` a ` a ` a ` a ` a ` a ` a ` a ` a ` a ` a ` a ` a ` a ` a ` a ` a `](https://example.com)\n"
  },
  {
    "path": "test/specs/redos/backticks_in_link_label.html",
    "content": "<p><a href=\"https://example.com\">``````````````````````````````````````````````````````````````````````````````````````````````````</a></p>"
  },
  {
    "path": "test/specs/redos/backticks_in_link_label.md",
    "content": "[``````````````````````````````````````````````````````````````````````````````````````````````````](https://example.com)\n"
  },
  {
    "path": "test/specs/redos/cubic_def.cjs",
    "content": "module.exports = {\n  markdown: `[x]:${' '.repeat(1500)}x ${' '.repeat(1500)} x`,\n  html: `<p>[x]:${' '.repeat(1500)}x ${' '.repeat(1500)} x</p>`,\n};\n"
  },
  {
    "path": "test/specs/redos/cubic_link_title.cjs",
    "content": "module.exports = {\n  markdown: 'a[b](c'.repeat(1000),\n  html: `<p>${'a[b](c'.repeat(1000)}</p>\\n`,\n};\n"
  },
  {
    "path": "test/specs/redos/link_code.html",
    "content": "<p>INDEX(string, pattern[, start)<code>: searches for the first occurrence of pattern in string, starting from start:</code>INDEX(&quot;123123&quot;, &quot;23&quot;, 3)<code>==</code>5<code></code>INSERT(new, old[, start][, length][, pad])<code>: inserts the new string into the old string after the specified position (default is 0), new string is truncated or padded (default is &quot; &quot;) to the specified length, if start is beyond the end of old old will be padded</code>LASTPOS(pattern, string[, start])<code>: searches backwards for the last occurrence of pattern in string, starting from start:</code>LASTPOS(&quot;123123&quot;, &quot;23&quot;, 4)<code>==</code>2<code></code>LINES(file)<code>: returns the number of lines typed ahead at the interactive stream:</code>push(&quot;a line&quot;); push(&quot;second line&quot;); lines(STDIN); /* == 2 */<code></code>MAX(number, number[, number,...])<code>: obvious</code>MIN(number, number[, number,...])<code>: obvious</code>OPEN(filehandle, filename[, &quot;APPEND&quot;|&quot;READ&quot;|&quot;WRITE&quot;])<code>: opens file, returns boolean for success:</code>OPEN(&quot;MyCon&quot;, &quot;CON:160/50/320/100/MyCon/CDS&quot;)<code>==</code>1<code></code>OVERLAY(new, old[, start][, length][, pad])<code>: overlays new string onto old one at start for length chars padding with pad if necessary:</code>OVERLAY(&quot;4&quot;, &quot;123&quot;, 5, 5)<code>==</code>&quot;123-4----&quot;<code></code>POS(pattern, string[, start])` : same as index</p>\n"
  },
  {
    "path": "test/specs/redos/link_code.md",
    "content": "INDEX(string, pattern[, start)` : searches for the first occurrence of pattern in string, starting from start: `INDEX(\"123123\", \"23\", 3)` == `5`\n`INSERT(new, old[, start][, length][, pad])` : inserts the new string into the old string after the specified position (default is 0), new string is truncated or padded (default is \" \") to the specified length, if start is beyond the end of old old will be padded\n`LASTPOS(pattern, string[, start])` : searches backwards for the last occurrence of pattern in string, starting from start: `LASTPOS(\"123123\", \"23\", 4)` == `2`\n`LINES(file)` : returns the number of lines typed ahead at the interactive stream: `push(\"a line\"); push(\"second line\"); lines(STDIN); /* == 2 */`\n`MAX(number, number[, number,...])` : obvious\n`MIN(number, number[, number,...])` : obvious\n`OPEN(filehandle, filename[, \"APPEND\"|\"READ\"|\"WRITE\"])` : opens file, returns boolean for success: `OPEN(\"MyCon\", \"CON:160/50/320/100/MyCon/CDS\")` == `1`\n`OVERLAY(new, old[, start][, length][, pad])` : overlays new string onto old one at start for length chars padding with pad if necessary: `OVERLAY(\"4\", \"123\", 5, 5)` == `\"123-4----\"`\n`POS(pattern, string[, start])` : same as index\n"
  },
  {
    "path": "test/specs/redos/link_redos.html",
    "content": "<ul>\n<li>伪类：<a href=\"https://developer.mozilla.org/en-US/docs/Web/CSS/:active\">:active</a>、<a href=\"https://developer.mozilla.org/en-US/docs/Web/CSS/:any-link\">:any-link</a>、<a href=\"https://developer.mozilla.org/en-US/docs/Web/CSS/:blank\">:blank</a>、<a href=\"https://developer.mozilla.org/en-US/docs/Web/CSS/:checked\">:checked</a>、<a href=\"https://developer.mozilla.org/en-US/docs/Web/CSS/:current\">:current</a>、<a href=\"https://developer.mozilla.org/en-US/docs/Web/CSS/:default\">:default</a>、<a href=\"https://developer.mozilla.org/en-US/docs/Web/CSS/:defined\">:defined</a>、<a href=\"https://developer.mozilla.org/en-US/docs/Web/CSS/:dir\">:dir()</a>、<a href=\"https://developer.mozilla.org/en-US/docs/Web/CSS/:disabled\">:disabled</a>、<a href=\"https://developer.mozilla.org/en-US/docs/Web/CSS/:drop\">:drop</a>、<a href=\"https://developer.mozilla.org/en-US/docs/Web/CSS/:empty\">:empty</a>、<a href=\"https://developer.mozilla.org/en-US/docs/Web/CSS/:enabled\">:enabled</a>、<a href=\"https://developer.mozilla.org/en-US/docs/Web/CSS/:first\">:first</a>、<a href=\"https://developer.mozilla.org/en-US/docs/Web/CSS/:first-child\">:first-child</a>、<a href=\"https://developer.mozilla.org/en-US/docs/Web/CSS/:first-of-type\">:first-of-type</a>、<a href=\"https://developer.mozilla.org/en-US/docs/Web/CSS/:fullscreen\">:fullscreen</a>、<a href=\"https://developer.mozilla.org/en-US/docs/Web/CSS/:future\">:future</a>、<a href=\"https://developer.mozilla.org/en-US/docs/Web/CSS/:focus\">:focus</a>、<a href=\"https://developer.mozilla.org/en-US/docs/Web/CSS/:focus-visible\">:focus-visible</a>、<a href=\"https://developer.mozilla.org/en-US/docs/Web/CSS/:focus-within\">:focus-within</a>、<a href=\"https://developer.mozilla.org/en-US/docs/Web/CSS/:has\">:has()</a>、<a href=\"https://developer.mozilla.org/en-US/docs/Web/CSS/:host\">:host</a>、<a href=\"https://developer.mozilla.org/en-US/docs/Web/CSS/:host()\">:host()</a>、<a href=\"https://developer.mozilla.org/en-US/docs/Web/CSS/:host-context()\">:host-context()</a>、<a href=\"https://developer.mozilla.org/en-US/docs/Web/CSS/:hover\">:hover</a>、<a href=\"https://developer.mozilla.org/en-US/docs/Web/CSS/:indeterminate\">:indeterminate</a>、<a href=\"https://developer.mozilla.org/en-US/docs/Web/CSS/:in-range\">:in-range</a>、<a href=\"https://developer.mozilla.org/en-US/docs/Web/CSS/:invalid\">:invalid</a>、<a href=\"https://developer.mozilla.org/en-US/docs/Web/CSS/:is\">:is()</a>、<a href=\"https://developer.mozilla.org/en-US/docs/Web/CSS/:lang\">:lang()</a>、<a href=\"https://developer.mozilla.org/en-US/docs/Web/CSS/:last-child\">:last-child</a>、<a href=\"https://developer.mozilla.org/en-US/docs/Web/CSS/:last-of-type\">:last-of-type</a>、<a href=\"https://developer.mozilla.org/en-US/docs/Web/CSS/:left\">:left</a>、<a href=\"https://developer.mozilla.org/en-US/docs/Web/CSS/:link\">:link</a>、<a href=\"https://developer.mozilla.org/en-US/docs/Web/CSS/:local-link\">:local-link</a>、<a href=\"https://developer.mozilla.org/en-US/docs/Web/CSS/:not\">:not()</a>、<a href=\"https://developer.mozilla.org/en-US/docs/Web/CSS/:nth-child\">:nth-child()</a>、<a href=\"https://developer.mozilla.org/en-US/docs/Web/CSS/:nth-col\">:nth-col()</a>、<a href=\"https://developer.mozilla.org/en-US/docs/Web/CSS/:nth-last-child\">:nth-last-child()</a>、<a href=\"https://developer.mozilla.org/en-US/docs/Web/CSS/:nth-last-col\">:nth-last-col()</a>、<a href=\"https://developer.mozilla.org/en-US/docs/Web/CSS/:nth-last-of-type\">:nth-last-of-type()</a>、<a href=\"https://developer.mozilla.org/en-US/docs/Web/CSS/:nth-of-type\">:nth-of-type()</a>、<a href=\"https://developer.mozilla.org/en-US/docs/Web/CSS/:only-child\">:only-child</a>、<a href=\"https://developer.mozilla.org/en-US/docs/Web/CSS/:only-of-type\">:only-of-type</a>、<a href=\"https://developer.mozilla.org/en-US/docs/Web/CSS/:optional\">:optional</a>、<a href=\"https://developer.mozilla.org/en-US/docs/Web/CSS/:out-of-range\">:out-of-range</a>、<a href=\"https://developer.mozilla.org/en-US/docs/Web/CSS/:past\">:past</a>、<a href=\"https://developer.mozilla.org/en-US/docs/Web/CSS/:placeholder-shown\">:placeholder-shown</a>、<a href=\"https://developer.mozilla.org/en-US/docs/Web/CSS/:read-only\">:read-only</a>、<a href=\"https://developer.mozilla.org/en-US/docs/Web/CSS/:read-write\">:read-write</a>、<a href=\"https://developer.mozilla.org/en-US/docs/Web/CSS/:required\">:required</a>、<a href=\"https://developer.mozilla.org/en-US/docs/Web/CSS/:right\">:right</a>、<a href=\"https://developer.mozilla.org/en-US/docs/Web/CSS/:root\">:root</a>、<a href=\"https://developer.mozilla.org/en-US/docs/Web/CSS/:scope\">:scope</a>、<a href=\"https://developer.mozilla.org/en-US/docs/Web/CSS/:target\">:target</a>、<a href=\"https://developer.mozilla.org/en-US/docs/Web/CSS/:target-within\">:target-within</a>、<a href=\"https://developer.mozilla.org/en-US/docs/Web/CSS/:user-invalid\">:user-invalid</a>、<a href=\"https://developer.mozilla.org/en-US/docs/Web/CSS/:valid\">:valid</a>、<a href=\"https://developer.mozilla.org/en-US/docs/Web/CSS/:visited\">:visited</a>、<a href=\"https://developer.mozilla.org/en-US/docs/Web/CSS/:where\">:where()</a></li>\n<li>伪元素：<a href=\"https://developer.mozilla.org/en-US/docs/Web/CSS/::after\">::after (:after)</a>、<a href=\"https://developer.mozilla.org/en-US/docs/Web/CSS/::backdrop\">::backdrop</a>、<a href=\"https://developer.mozilla.org/en-US/docs/Web/CSS/::before\">::before (:before)</a>、<a href=\"https://developer.mozilla.org/en-US/docs/Web/CSS/::cue\">::cue (:cue)</a>、<a href=\"https://developer.mozilla.org/en-US/docs/Web/CSS/::first-letter\">::first-letter (:first-letter)</a>、<a href=\"https://developer.mozilla.org/en-US/docs/Web/CSS/::first-line\">::first-line (:first-line)</a>、<a href=\"https://developer.mozilla.org/en-US/docs/Web/CSS/::grammar-error\">::grammar-error</a>、<a href=\"https://developer.mozilla.org/en-US/docs/Web/CSS/::marker\">::marker</a>、<a href=\"https://developer.mozilla.org/en-US/docs/Web/CSS/::placeholder\">::placeholder</a>、<a href=\"https://developer.mozilla.org/en-US/docs/Web/CSS/::selection\">::selection</a>、<a href=\"https://developer.mozilla.org/en-US/docs/Web/CSS/::slotted\">::slotted()</a>、<a href=\"https://developer.mozilla.org/en-US/docs/Web/CSS/::spelling-error\">::spelling-error</a> </li>\n</ul>\n\n"
  },
  {
    "path": "test/specs/redos/link_redos.md",
    "content": "* 伪类：[:active](https://developer.mozilla.org/en-US/docs/Web/CSS/:active)、[:any-link](https://developer.mozilla.org/en-US/docs/Web/CSS/:any-link)、[:blank](https://developer.mozilla.org/en-US/docs/Web/CSS/:blank)、[:checked](https://developer.mozilla.org/en-US/docs/Web/CSS/:checked)、[:current](https://developer.mozilla.org/en-US/docs/Web/CSS/:current)、[:default](https://developer.mozilla.org/en-US/docs/Web/CSS/:default)、[:defined](https://developer.mozilla.org/en-US/docs/Web/CSS/:defined)、[:dir()](https://developer.mozilla.org/en-US/docs/Web/CSS/:dir)、[:disabled](https://developer.mozilla.org/en-US/docs/Web/CSS/:disabled)、[:drop](https://developer.mozilla.org/en-US/docs/Web/CSS/:drop)、[:empty](https://developer.mozilla.org/en-US/docs/Web/CSS/:empty)、[:enabled](https://developer.mozilla.org/en-US/docs/Web/CSS/:enabled)、[:first](https://developer.mozilla.org/en-US/docs/Web/CSS/:first)、[:first-child](https://developer.mozilla.org/en-US/docs/Web/CSS/:first-child)、[:first-of-type](https://developer.mozilla.org/en-US/docs/Web/CSS/:first-of-type)、[:fullscreen](https://developer.mozilla.org/en-US/docs/Web/CSS/:fullscreen)、[:future](https://developer.mozilla.org/en-US/docs/Web/CSS/:future)、[:focus](https://developer.mozilla.org/en-US/docs/Web/CSS/:focus)、[:focus-visible](https://developer.mozilla.org/en-US/docs/Web/CSS/:focus-visible)、[:focus-within](https://developer.mozilla.org/en-US/docs/Web/CSS/:focus-within)、[:has()](https://developer.mozilla.org/en-US/docs/Web/CSS/:has)、[:host](https://developer.mozilla.org/en-US/docs/Web/CSS/:host)、[:host()](https://developer.mozilla.org/en-US/docs/Web/CSS/:host())、[:host-context()](https://developer.mozilla.org/en-US/docs/Web/CSS/:host-context())、[:hover](https://developer.mozilla.org/en-US/docs/Web/CSS/:hover)、[:indeterminate](https://developer.mozilla.org/en-US/docs/Web/CSS/:indeterminate)、[:in-range](https://developer.mozilla.org/en-US/docs/Web/CSS/:in-range)、[:invalid](https://developer.mozilla.org/en-US/docs/Web/CSS/:invalid)、[:is()](https://developer.mozilla.org/en-US/docs/Web/CSS/:is)、[:lang()](https://developer.mozilla.org/en-US/docs/Web/CSS/:lang)、[:last-child](https://developer.mozilla.org/en-US/docs/Web/CSS/:last-child)、[:last-of-type](https://developer.mozilla.org/en-US/docs/Web/CSS/:last-of-type)、[:left](https://developer.mozilla.org/en-US/docs/Web/CSS/:left)、[:link](https://developer.mozilla.org/en-US/docs/Web/CSS/:link)、[:local-link](https://developer.mozilla.org/en-US/docs/Web/CSS/:local-link)、[:not()](https://developer.mozilla.org/en-US/docs/Web/CSS/:not)、[:nth-child()](https://developer.mozilla.org/en-US/docs/Web/CSS/:nth-child)、[:nth-col()](https://developer.mozilla.org/en-US/docs/Web/CSS/:nth-col)、[:nth-last-child()](https://developer.mozilla.org/en-US/docs/Web/CSS/:nth-last-child)、[:nth-last-col()](https://developer.mozilla.org/en-US/docs/Web/CSS/:nth-last-col)、[:nth-last-of-type()](https://developer.mozilla.org/en-US/docs/Web/CSS/:nth-last-of-type)、[:nth-of-type()](https://developer.mozilla.org/en-US/docs/Web/CSS/:nth-of-type)、[:only-child](https://developer.mozilla.org/en-US/docs/Web/CSS/:only-child)、[:only-of-type](https://developer.mozilla.org/en-US/docs/Web/CSS/:only-of-type)、[:optional](https://developer.mozilla.org/en-US/docs/Web/CSS/:optional)、[:out-of-range](https://developer.mozilla.org/en-US/docs/Web/CSS/:out-of-range)、[:past](https://developer.mozilla.org/en-US/docs/Web/CSS/:past)、[:placeholder-shown](https://developer.mozilla.org/en-US/docs/Web/CSS/:placeholder-shown)、[:read-only](https://developer.mozilla.org/en-US/docs/Web/CSS/:read-only)、[:read-write](https://developer.mozilla.org/en-US/docs/Web/CSS/:read-write)、[:required](https://developer.mozilla.org/en-US/docs/Web/CSS/:required)、[:right](https://developer.mozilla.org/en-US/docs/Web/CSS/:right)、[:root](https://developer.mozilla.org/en-US/docs/Web/CSS/:root)、[:scope](https://developer.mozilla.org/en-US/docs/Web/CSS/:scope)、[:target](https://developer.mozilla.org/en-US/docs/Web/CSS/:target)、[:target-within](https://developer.mozilla.org/en-US/docs/Web/CSS/:target-within)、[:user-invalid](https://developer.mozilla.org/en-US/docs/Web/CSS/:user-invalid)、[:valid](https://developer.mozilla.org/en-US/docs/Web/CSS/:valid)、[:visited](https://developer.mozilla.org/en-US/docs/Web/CSS/:visited)、[:where()](https://developer.mozilla.org/en-US/docs/Web/CSS/:where)\n* 伪元素：[::after (:after)](https://developer.mozilla.org/en-US/docs/Web/CSS/::after)、[::backdrop](https://developer.mozilla.org/en-US/docs/Web/CSS/::backdrop)、[::before (:before)](https://developer.mozilla.org/en-US/docs/Web/CSS/::before)、[::cue (:cue)](https://developer.mozilla.org/en-US/docs/Web/CSS/::cue)、[::first-letter (:first-letter)](https://developer.mozilla.org/en-US/docs/Web/CSS/::first-letter)、[::first-line (:first-line)](https://developer.mozilla.org/en-US/docs/Web/CSS/::first-line)、[::grammar-error](https://developer.mozilla.org/en-US/docs/Web/CSS/::grammar-error)、[::marker](https://developer.mozilla.org/en-US/docs/Web/CSS/::marker)、[::placeholder](https://developer.mozilla.org/en-US/docs/Web/CSS/::placeholder)、[::selection](https://developer.mozilla.org/en-US/docs/Web/CSS/::selection)、[::slotted()](https://developer.mozilla.org/en-US/docs/Web/CSS/::slotted)、[::spelling-error](https://developer.mozilla.org/en-US/docs/Web/CSS/::spelling-error) "
  },
  {
    "path": "test/specs/redos/quadratic_br.cjs",
    "content": "module.exports = {\n  markdown: `a${' '.repeat(50000)}`,\n  html: `<p>a${' '.repeat(50000)}</p>`,\n};\n"
  },
  {
    "path": "test/specs/redos/quadratic_em_mask.cjs",
    "content": "module.exports = [\n  {\n    markdown: '['.repeat(100000),\n    html: `<p>${'['.repeat(100000)}</p>`,\n  },\n  {\n    markdown: '[.'.repeat(50000),\n    html: `<p>${'[.'.repeat(50000)}</p>`,\n  },\n  {\n    markdown: '<'.repeat(100000),\n    html: `<p>${'<'.repeat(100000)}</p>`,\n  },\n  {\n    markdown: '<.'.repeat(50000),\n    html: `<p>${'<.'.repeat(50000)}</p>`,\n  },\n];\n"
  },
  {
    "path": "test/specs/redos/quadratic_email.cjs",
    "content": "module.exports = {\n  markdown: 'a'.repeat(50000),\n  html: `<p>${'a'.repeat(50000)}</p>`,\n};\n"
  },
  {
    "path": "test/specs/redos/quadratic_heading.cjs",
    "content": "module.exports = {\n  markdown: `# #${' '.repeat(50000)}a`,\n  html: '<h1># a</h1>',\n};\n"
  },
  {
    "path": "test/specs/redos/quadratic_lists.cjs",
    "content": "module.exports = {\n  markdown: '- a\\n'.repeat(10000),\n  html: `<ul>${'<li>a</li>'.repeat(10000)}</ul>`,\n};\n"
  },
  {
    "path": "test/specs/redos/quadratic_underscores.cjs",
    "content": "module.exports = {\n  markdown: `${'_'.repeat(101)} a`,\n  html: `<p>${'_'.repeat(101)} a</p>`,\n};\n"
  },
  {
    "path": "test/specs/redos/redos_html_closing.html",
    "content": "<p>&lt;tag  &quot;&quot;  &quot;&quot;  &quot;&quot;  &quot;&quot;  &quot;&quot;  &quot;&quot;  &quot;&quot;  &quot;&quot;  &quot;&quot;  &quot;&quot;  &quot;&quot;  &quot;&quot;  &quot;&quot;  &quot;&quot;  &quot;&quot;  &quot;&quot;  &quot;&quot;  &quot;&quot;  &quot;&quot;  &quot;&quot;  &quot;&quot;  &quot;&quot;  &quot;&quot;  &quot;&quot;  &quot;&quot;  &quot;&quot;  &quot;&quot;  &quot;&quot;  &quot;&quot;  &quot;&quot;  &quot;&quot;  &quot;&quot;  &quot;&quot;  &quot;&quot;  &quot;&quot;  &quot;&quot;  &quot;&quot;  &quot;&quot;  &quot;&quot;  &quot;&quot;  &quot;&quot;  &quot;&quot;  &quot;&quot;  &quot;&quot;  &quot;&quot;  &quot;&quot;  &quot;&quot;  &quot;&quot;  &quot;&quot;  &quot;&quot;  &quot;&quot;  &quot;&quot;  &quot;&quot;  &quot;&quot;  &quot;&quot;  &quot;&quot;  &quot;&quot;  &quot;&quot;  &quot;&quot;  &quot;&quot;  &quot;&quot;  &quot;&quot;  &quot;&quot;  &quot;&quot;  &quot;&quot;  &quot;&quot;  &quot;&quot;  &quot;&quot;  &quot;&quot;  &quot;&quot;  &quot;&quot;  &quot;&quot;  &quot;&quot;  &quot;&quot;  &quot;&quot;  &quot;&quot;  &quot;&quot;  &quot;&quot;  &quot;&quot;  &quot;&quot;  &quot;&quot;  &quot;&quot;  &quot;&quot;  &quot;&quot;  &quot;&quot;  &quot;&quot;  &quot;&quot;  &quot;&quot;  &quot;&quot;  &quot;&quot;  &quot;&quot;  &quot;&quot;  &quot;&quot;  &quot;&quot;  &quot;&quot;  &quot;&quot;  &quot;&quot;  &quot;&quot;  &quot;&quot;  &quot;&quot;&lt;&quot; /&gt;a&#39;a</p>\n"
  },
  {
    "path": "test/specs/redos/redos_html_closing.md",
    "content": "<tag  \"\"  \"\"  \"\"  \"\"  \"\"  \"\"  \"\"  \"\"  \"\"  \"\"  \"\"  \"\"  \"\"  \"\"  \"\"  \"\"  \"\"  \"\"  \"\"  \"\"  \"\"  \"\"  \"\"  \"\"  \"\"  \"\"  \"\"  \"\"  \"\"  \"\"  \"\"  \"\"  \"\"  \"\"  \"\"  \"\"  \"\"  \"\"  \"\"  \"\"  \"\"  \"\"  \"\"  \"\"  \"\"  \"\"  \"\"  \"\"  \"\"  \"\"  \"\"  \"\"  \"\"  \"\"  \"\"  \"\"  \"\"  \"\"  \"\"  \"\"  \"\"  \"\"  \"\"  \"\"  \"\"  \"\"  \"\"  \"\"  \"\"  \"\"  \"\"  \"\"  \"\"  \"\"  \"\"  \"\"  \"\"  \"\"  \"\"  \"\"  \"\"  \"\"  \"\"  \"\"  \"\"  \"\"  \"\"  \"\"  \"\"  \"\"  \"\"  \"\"  \"\"  \"\"  \"\"  \"\"  \"\"  \"\"  \"\"  \"\"<\" />a'a\n"
  },
  {
    "path": "test/specs/redos/redos_nolink.html",
    "content": "<p>![[[][[][[][[][[][[][[][[][[][[][[][[][[][[][[][[][[][[][[][[][[][[][[][[][[][[][[][[][[][[][[][[][[][[][[][[][[][[][[][[][[][[][[]!\\</p>\n"
  },
  {
    "path": "test/specs/redos/redos_nolink.md",
    "content": "![\\[[]\\[[]\\[[]\\[[]\\[[]\\[[]\\[[]\\[[]\\[[]\\[[]\\[[]\\[[]\\[[]\\[[]\\[[]\\[[]\\[[]\\[[]\\[[]\\[[]\\[[]\\[[]\\[[]\\[[]\\[[]\\[[]\\[[]\\[[]\\[[]\\[[]\\[[]\\[[]\\[[]\\[[]\\[[]\\[[]\\[[]\\[[]\\[[]\\[[]\\[[]\\[[]\\[[]!\\\n"
  },
  {
    "path": "test/specs/redos/reflink_redos.html",
    "content": "<p>[[]([]([]([]([]([]([]([]([]([]([]([]([]([]([]([]([]([]([]([]([]([]([]([]([]([]([]([]([]([]([</p>\n"
  },
  {
    "path": "test/specs/redos/reflink_redos.md",
    "content": "[x]: x\n\n[\\[\\](\\[\\](\\[\\](\\[\\](\\[\\](\\[\\](\\[\\](\\[\\](\\[\\](\\[\\](\\[\\](\\[\\](\\[\\](\\[\\](\\[\\](\\[\\](\\[\\](\\[\\](\\[\\](\\[\\](\\[\\](\\[\\](\\[\\](\\[\\](\\[\\](\\[\\](\\[\\](\\[\\](\\[\\](\\[\\]([\n"
  },
  {
    "path": "test/types/marked.ts",
    "content": "/* eslint-disable */\nimport { marked } from 'marked';\n\n// other exports\n\nimport { Lexer, Parser, Tokenizer, Renderer, TextRenderer, Marked } from 'marked';\nimport type { Tokens, MarkedExtension, TokenizerAndRendererExtension, Token ,TokenizerExtension, MarkedOptions, TokensList, RendererExtension, RendererObject } from 'marked';\n\nconst tokenizer = new marked.Tokenizer();\n\ntokenizer.emStrong = function emStrong(src, _maskedSrc, _prevChar) {\n  const token: Tokens.Strong = {\n    type: 'strong',\n    text: src,\n    raw: src,\n    tokens: []\n  };\n\n  this.lexer.inline(token.text, token.tokens);\n\n  return token;\n};\n\ntokenizer.inlineText = function inlineText(...args: Parameters<Tokenizer['inlineText']>) {\n  const p = this.inlineText(...args);\n\n  if (p) p.raw = p.text;\n\n  return p;\n};\n\nlet options: MarkedOptions = {\n  gfm: true,\n  breaks: false,\n  pedantic: false,\n  silent: false,\n  tokenizer,\n  renderer: new marked.Renderer(),\n  walkTokens: token => {\n    if (token.type === 'heading') {\n      token.depth += 1;\n    }\n  }\n};\n\noptions = marked.getDefaults();\noptions = marked.defaults;\n\nlet myOldMarked: typeof marked = marked.options(options);\nmyOldMarked = marked.setOptions(options);\n\nconsole.log(marked('1) I am using __markdown__.'));\nconsole.log(marked('2) I am using __markdown__.', options));\n\nconsole.log(marked.parse('5) I am using __markdown__.'));\nconsole.log(marked.parse('6) I am using __markdown__.', options));\n\nconsole.log(marked.parseInline('9) I am using __markdown__.'));\nconsole.log(marked.parseInline('10) I am using __markdown__.', options));\n\nconst text = 'Something';\nconst raw = 'Raw';\nconst tokens: TokensList = marked.lexer(text, options);\nconsole.log(marked.parser(tokens));\n\nconst lexer = new marked.Lexer(options);\nconst tokens2 = lexer.lex(text);\nconsole.log(tokens2);\nconst tokens3 = lexer.inlineTokens(text, tokens);\nconsole.log(tokens3);\n// verifying that the second param to inlineTokens can be ignored\nconst tokens3a = lexer.inlineTokens(text);\nconsole.log(tokens3a);\nconst re: Record<string, Record<string, Record<string, RegExp>>> = marked.Lexer.rules;\nconst lexerOptions: MarkedOptions = lexer.options;\n\nconst renderer = new marked.Renderer();\nrenderer.heading = ({ text, depth }) => {\n  return text + depth.toString();\n};\nrenderer.hr = () => {\n  return `<hr>\\n`;\n};\nrenderer.checkbox = checked => {\n  return checked ? 'CHECKED' : 'UNCHECKED';\n};\n\nclass ExtendedRenderer extends marked.Renderer {\n  code = ({ type, raw,  text, codeBlockStyle, lang, escaped }: Tokens.Code): string => super.code({ type, raw, text, codeBlockStyle, lang, escaped });\n  blockquote = ({ type, raw, text, tokens }: Tokens.Blockquote): string => super.blockquote({ type, raw, text, tokens });\n  html = ({ type, raw, text, pre, block }: Tokens.HTML): string => super.html({ type, raw, text, pre, block });\n  heading = ({ type, raw, text, depth, tokens }: Tokens.Heading): string => super.heading({ type, raw, text, depth, tokens });\n  hr = ({ type, raw }: Tokens.Hr): string => super.hr({ type, raw });\n  list = ({ type, raw, ordered, start, loose, items }: Tokens.List): string => super.list({ type, raw, ordered, start, loose, items});\n  listitem = ({ type, raw, task, checked, loose, text, tokens }: Tokens.ListItem): string => super.listitem({ type, raw, task, checked, loose, text, tokens });\n  checkbox = ({ type, raw, checked }: Tokens.Checkbox): string => super.checkbox({ type, raw, checked });\n  paragraph = ({ type, raw, pre, text, tokens }: Tokens.Paragraph): string => super.paragraph({ type, raw, pre, text, tokens });\n  table = ({ type, raw, align, header, rows }: Tokens.Table): string => super.table({ type, raw, align, header, rows });\n  tablerow = ({ text }: Tokens.TableRow): string => super.tablerow({ text });\n  tablecell = ({ text, tokens, header, align }: Tokens.TableCell): string => super.tablecell({ text, tokens, header, align });\n  strong = ({ type, raw, text, tokens }: Tokens.Strong): string => super.strong({ type, raw, text, tokens });\n  em = ({ type, raw, text, tokens }: Tokens.Em): string => super.em({ type, raw, text, tokens });\n  codespan = ({ type, raw, text }: Tokens.Codespan): string => super.codespan({ type, raw, text });\n  br = ({ type, raw }: Tokens.Br): string => super.br({ type, raw });\n  del = ({ type, raw, text, tokens }: Tokens.Del): string => super.del({ type, raw, text, tokens });\n  link = ({ type, raw, href, title, text, tokens }: Tokens.Link): string => super.link({ type, raw, href, title, text, tokens });\n  image = ({ type, raw, href, title, text }: Tokens.Image): string => super.image({ type, raw, href, title, text, tokens });\n}\n\nconst rendererOptions: MarkedOptions = renderer.options;\n\nconst textRenderer = new marked.TextRenderer();\nconsole.log(textRenderer.strong({ type : 'strong', raw, text, tokens }));\n\nconst parseTestText = '- list1\\n  - list1.1\\n\\n listend';\nconst parseTestTokens: TokensList = marked.lexer(parseTestText, options);\n\nconst inlineTestText = '- list1\\n  - list1.1\\n\\n listend';\nconst inlineTestTokens: Token[] = marked.Lexer.lexInline(inlineTestText, options);\n\n/* List type is `list`. */\nconst listToken = parseTestTokens[0] as Tokens.List;\nconsole.log(listToken.type === 'list');\n\nconst parser = new marked.Parser();\nconsole.log(parser.parse(parseTestTokens));\nconsole.log(marked.Parser.parse(parseTestTokens));\nconst parserOptions: MarkedOptions = parser.options;\n\nmarked.use({ renderer }, { tokenizer });\n\nmarked.use({\n  renderer: {\n    heading({ tokens, depth }) {\n      if (depth > 3) {\n        return `<p>${this.parser.parseInline(tokens)}</p>`;\n      }\n\n      return false;\n    },\n    listitem({ text, task, checked }) {\n      if (task) return `<li class=\"task-list-item ${checked ? 'checked' : ''}\">${text}</li>\\n`;\n      else return `<li>${text}</li>\\n`;\n    }\n  },\n  tokenizer: {\n    heading(src) {\n      const cap = this.rules.block.heading.exec(src);\n      if (cap) {\n        let text = cap[2].trim();\n\n        return {\n          type: 'heading',\n          raw: cap[0],\n          depth: cap[1].length,\n          text,\n          tokens: this.lexer.inline(text)\n        };\n      }\n    },\n    codespan(src) {\n      const match = src.match(/\\$+([^\\$\\n]+?)\\$+/);\n      if (match) {\n        return {\n          type: 'codespan',\n          raw: match[0],\n          text: match[1].trim()\n        };\n      }\n\n      // return false to use original codespan tokenizer\n      return false;\n    }\n  }\n});\n\ninterface NameToken extends Tokens.Generic {\n    type: 'name';\n    raw: string;\n    text: string;\n    tokens: Token[];\n    items: Token[];\n}\n\nconst tokenizerExtension: TokenizerExtension = {\n  name: 'name',\n  level: 'block',\n  start: (src: string) => src.match(/name/)?.index,\n  tokenizer(src: string): NameToken | undefined {\n    if (src === 'name') {\n      const token: NameToken = {\n        type: 'name',\n        raw: src,\n        text: src,\n        tokens: this.lexer.inline(src),\n        items: []\n      };\n      this.lexer.inline(token.text, token.items);\n      return token;\n    }\n  },\n  childTokens: ['items']\n};\n\nconst rendererExtension: RendererExtension = {\n  name: 'name',\n  renderer(t) {\n    const token = t as NameToken;\n    if (token.text === 'name') {\n      // verifying that the second param to parseInline can be ignored\n      console.log(this.parser.parseInline(token.items));\n      return this.parser.parse(token.items);\n    }\n    return false;\n  }\n};\n\nconst tokenizerAndRendererExtension: TokenizerAndRendererExtension = {\n  name: 'name',\n  level: 'block',\n  tokenizer(src: string) {\n    if (src === 'name') {\n      const token = {\n        type: 'name',\n        raw: src\n      };\n      return token;\n    }\n  },\n  renderer(token: Tokens.Generic) {\n    if (token.raw === 'name') {\n      return 'name';\n    }\n\n    return false;\n  }\n};\n\nmarked.use({\n  extensions: [tokenizerExtension, rendererExtension, tokenizerAndRendererExtension]\n});\n\nconst asyncExtension: MarkedExtension = {\n  async: true,\n  async walkTokens(token) {\n    if (token.type === 'code') {\n      await Promise.resolve(3);\n      token.text += 'foobar';\n    }\n  }\n};\n\nmarked.use(asyncExtension);\n\n(async() => {\nconst md = '# foobar';\nconst asyncMarked: string = await marked(md, { async: true });\nconst promiseMarked: Promise<string> = marked(md, { async: true });\nconst notAsyncMarked: string = marked(md, { async: false });\n// @ts-expect-error marked can still be async if an extension sets `async: true`\nconst defaultMarked: string = marked(md);\n// as string can be used if no extensions set `async: true`\nconst stringMarked: string = marked(md) as string;\n\nconst asyncMarkedParse: string = await marked.parse(md, { async: true });\nconst promiseMarkedParse: Promise<string> = marked.parse(md, { async: true });\nconst notAsyncMarkedParse: string = marked.parse(md, { async: false });\n// @ts-expect-error marked can still be async if an extension sets `async: true`\nconst defaultMarkedParse: string = marked.parse(md);\n// as string can be used if no extensions set `async: true`\nconst stringMarkedParse: string = marked.parse(md) as string;\n})();\n\n// Tests for List and ListItem\n// Dumped from markdown list parsed data\n\nconst listAndListItemText: Tokens.List = {\n  type: 'list',\n  raw: '1. Text ...',\n  ordered: true,\n  start: 1,\n  loose: false,\n  items: [\n    {\n      type: 'list_item',\n      raw: '1. Text ...',\n      task: false,\n      loose: false,\n      text: 'Text',\n      tokens: [\n        {\n          type: 'text',\n          raw: 'Point one',\n          text: 'Point one',\n          tokens: [\n            {\n              type: 'text',\n              raw: 'Point one',\n              text: 'Point one'\n            }\n          ]\n        },\n        {\n          type: 'list',\n          raw: '',\n          ordered: false,\n          start: '',\n          loose: false,\n          items: []\n        }\n      ]\n    }\n  ]\n};\n\nconst lexer2 = new Lexer();\nconst tokens4 = lexer2.lex('# test');\nconst parser2 = new Parser();\nconsole.log(parser2.parse(tokens4));\n\nmarked.use({ renderer: new Renderer() });\nmarked.use({ renderer: new TextRenderer() });\nmarked.use({ tokenizer: new Tokenizer() });\nmarked.use({\n  hooks: {\n    preprocess(markdown) {\n      if (this.options.async) {\n        return Promise.resolve(markdown);\n      }\n      return markdown;\n    },\n    postprocess(html) {\n      return html;\n    }\n  }\n});\nmarked.use({\n  hooks: {\n    processAllTokens(tokens) {\n      return tokens;\n    }\n  }\n});\nmarked.use({\n  hooks: {\n    provideLexer() {\n      return this.block ? Lexer.lex : Lexer.lexInline;\n    },\n    provideParser() {\n      return this.block ? Parser.parse : Parser.parseInline;\n    },\n  }\n});\nmarked.use({\n  async: true,\n  hooks: {\n    async preprocess(markdown) {\n      return markdown;\n    },\n    async postprocess(html) {\n      return html;\n    },\n    async processAllTokens(tokens) {\n      return tokens;\n    }\n  }\n});\n\n// @ts-expect-error block is not exported\nimport { block } from 'marked';\n// @ts-expect-error inline is not exported\nimport { inline } from 'marked';\n// Rules is exported\nimport type { Rules } from 'marked';\n\nmarked.parse('', {\n  async: undefined,\n  breaks: undefined,\n  extensions: undefined,\n  gfm: undefined,\n  hooks: undefined,\n  pedantic: undefined,\n  renderer: undefined,\n  silent: undefined,\n  tokenizer: undefined,\n  walkTokens: undefined,\n});\n\nmarked.use({\n  async: undefined,\n  breaks: undefined,\n  extensions: undefined,\n  gfm: undefined,\n  hooks: undefined,\n  pedantic: undefined,\n  renderer: undefined,\n  silent: undefined,\n  tokenizer: undefined,\n  walkTokens: undefined,\n});\n\nconst markedNumber = new Marked<number, number>();\nconst rendererNumber = {\n  html() {\n    return 1;\n  }\n};\nfunction parserNumber(tokens: Token[], options?: MarkedOptions<number, number>){\n    return 1;\n};\nmarkedNumber.use({ renderer: rendererNumber, hooks: { provideParser() { return parserNumber; } } });\n\nconst num: number = await markedNumber.parse('');\nconsole.log(num);\n"
  },
  {
    "path": "test/umd-test.js",
    "content": "import '../lib/marked.umd.js';\n\n// eslint-disable-next-line no-undef\nif (!marked.parse('# test').includes('<h1')) {\n  throw new Error('Invalid markdown');\n}\n"
  },
  {
    "path": "test/unit/Hooks.test.js",
    "content": "import { Marked } from '../../lib/marked.esm.js';\nimport { timeout } from './utils.js';\nimport { describe, it, beforeEach } from 'node:test';\nimport assert from 'node:assert';\n\nfunction createHeadingToken(text) {\n  return {\n    type: 'heading',\n    raw: `# ${text}`,\n    depth: 1,\n    text,\n    tokens: [\n      { type: 'text', raw: text, text },\n    ],\n  };\n}\n\ndescribe('Hooks', () => {\n  let marked;\n  beforeEach(() => {\n    marked = new Marked();\n  });\n\n  it('should preprocess markdown', () => {\n    marked.use({\n      hooks: {\n        preprocess(markdown) {\n          return `# preprocess\\n\\n${markdown}`;\n        },\n      },\n    });\n    const html = marked.parse('*text*');\n    assert.strictEqual(html.trim(), '<h1>preprocess</h1>\\n<p><em>text</em></p>');\n  });\n\n  it('should preprocess async', async() => {\n    marked.use({\n      async: true,\n      hooks: {\n        async preprocess(markdown) {\n          await timeout();\n          return `# preprocess async\\n\\n${markdown}`;\n        },\n      },\n    });\n    const promise = marked.parse('*text*');\n    assert.ok(promise instanceof Promise);\n    const html = await promise;\n    assert.strictEqual(html.trim(), '<h1>preprocess async</h1>\\n<p><em>text</em></p>');\n  });\n\n  it('should preprocess options', () => {\n    marked.use({\n      hooks: {\n        preprocess(markdown) {\n          this.options.breaks = true;\n          return markdown;\n        },\n      },\n    });\n    const html = marked.parse('line1\\nline2');\n    assert.strictEqual(html.trim(), '<p>line1<br>line2</p>');\n  });\n\n  it('should preprocess options async', async() => {\n    marked.use({\n      async: true,\n      hooks: {\n        async preprocess(markdown) {\n          await timeout();\n          this.options.breaks = true;\n          return markdown;\n        },\n      },\n    });\n    const html = await marked.parse('line1\\nline2');\n    assert.strictEqual(html.trim(), '<p>line1<br>line2</p>');\n  });\n\n  it('should postprocess html', () => {\n    marked.use({\n      hooks: {\n        postprocess(html) {\n          return html + '<h1>postprocess</h1>';\n        },\n      },\n    });\n    const html = marked.parse('*text*');\n    assert.strictEqual(html.trim(), '<p><em>text</em></p>\\n<h1>postprocess</h1>');\n  });\n\n  it('should postprocess async', async() => {\n    marked.use({\n      async: true,\n      hooks: {\n        async postprocess(html) {\n          await timeout();\n          return html + '<h1>postprocess async</h1>\\n';\n        },\n      },\n    });\n    const promise = marked.parse('*text*');\n    assert.ok(promise instanceof Promise);\n    const html = await promise;\n    assert.strictEqual(html.trim(), '<p><em>text</em></p>\\n<h1>postprocess async</h1>');\n  });\n\n  it('should process tokens before walkTokens', () => {\n    marked.use({\n      hooks: {\n        processAllTokens(tokens) {\n          tokens.push(createHeadingToken('processAllTokens'));\n          return tokens;\n        },\n      },\n      walkTokens(token) {\n        if (token.type === 'heading') {\n          token.tokens[0].text += ' walked';\n        }\n        return token;\n      },\n    });\n    const html = marked.parse('*text*');\n    assert.strictEqual(html.trim(), '<p><em>text</em></p>\\n<h1>processAllTokens walked</h1>');\n  });\n\n  it('should process tokens async before walkTokens', async() => {\n    marked.use({\n      async: true,\n      hooks: {\n        async processAllTokens(tokens) {\n          await timeout();\n          tokens.push(createHeadingToken('processAllTokens async'));\n          return tokens;\n        },\n      },\n      walkTokens(token) {\n        if (token.type === 'heading') {\n          token.tokens[0].text += ' walked';\n        }\n        return token;\n      },\n    });\n    const promise = marked.parse('*text*');\n    assert.ok(promise instanceof Promise);\n    const html = await promise;\n    assert.strictEqual(html.trim(), '<p><em>text</em></p>\\n<h1>processAllTokens async walked</h1>');\n  });\n\n  it('should process all hooks in reverse', async() => {\n    marked.use({\n      hooks: {\n        preprocess(markdown) {\n          return `# preprocess1\\n\\n${markdown}`;\n        },\n        postprocess(html) {\n          return html + '<h1>postprocess1</h1>\\n';\n        },\n        processAllTokens(tokens) {\n          tokens.push(createHeadingToken('processAllTokens1'));\n          return tokens;\n        },\n      },\n    });\n    marked.use({\n      async: true,\n      hooks: {\n        preprocess(markdown) {\n          return `# preprocess2\\n\\n${markdown}`;\n        },\n        async postprocess(html) {\n          await timeout();\n          return html + '<h1>postprocess2 async</h1>\\n';\n        },\n        processAllTokens(tokens) {\n          tokens.push(createHeadingToken('processAllTokens2'));\n          return tokens;\n        },\n      },\n    });\n    const promise = marked.parse('*text*');\n    assert.ok(promise instanceof Promise);\n    const html = await promise;\n    assert.strictEqual(html.trim(), `\\\n<h1>preprocess1</h1>\n<h1>preprocess2</h1>\n<p><em>text</em></p>\n<h1>processAllTokens2</h1>\n<h1>processAllTokens1</h1>\n<h1>postprocess2 async</h1>\n<h1>postprocess1</h1>`);\n  });\n\n  it('should provide lexer', () => {\n    marked.use({\n      hooks: {\n        provideLexer() {\n          return (src) => [createHeadingToken(src)];\n        },\n      },\n    });\n    const html = marked.parse('text');\n    assert.strictEqual(html.trim(), '<h1>text</h1>');\n  });\n\n  it('should provide lexer async', async() => {\n    marked.use({\n      async: true,\n      hooks: {\n        provideLexer() {\n          return async(src) => {\n            await timeout();\n            return [createHeadingToken(src)];\n          };\n        },\n      },\n    });\n    const html = await marked.parse('text');\n    assert.strictEqual(html.trim(), '<h1>text</h1>');\n  });\n\n  it('should provide lexer async hook', async() => {\n    marked.use({\n      async: true,\n      hooks: {\n        async provideLexer() {\n          await timeout();\n          return (src) => {\n            return [createHeadingToken(src)];\n          };\n        },\n      },\n    });\n    const html = await marked.parse('text');\n    assert.strictEqual(html.trim(), '<h1>text</h1>');\n  });\n\n  it('should provide async lexer from async hook', async() => {\n    marked.use({\n      async: true,\n      hooks: {\n        async provideLexer() {\n          await timeout();\n          return async(src) => {\n            await timeout();\n            return [createHeadingToken(src)];\n          };\n        },\n      },\n    });\n    const html = await marked.parse('text');\n    assert.strictEqual(html.trim(), '<h1>text</h1>');\n  });\n\n  it('should provide parser return object', () => {\n    marked.use({\n      hooks: {\n        provideParser() {\n          return (tokens) => ({ text: 'test parser' });\n        },\n      },\n    });\n    const html = marked.parse('text');\n    assert.strictEqual(html.text, 'test parser');\n  });\n\n  it('should provide parser', () => {\n    marked.use({\n      hooks: {\n        provideParser() {\n          return (tokens) => 'test parser';\n        },\n      },\n    });\n    const html = marked.parse('text');\n    assert.strictEqual(html.trim(), 'test parser');\n  });\n\n  it('should provide parser async', async() => {\n    marked.use({\n      async: true,\n      hooks: {\n        provideParser() {\n          return async(tokens) => {\n            await timeout();\n            return 'test parser';\n          };\n        },\n      },\n    });\n    const html = await marked.parse('text');\n    assert.strictEqual(html.trim(), 'test parser');\n  });\n\n  it('should provide parser async hook', async() => {\n    marked.use({\n      async: true,\n      hooks: {\n        async provideParser() {\n          await timeout();\n          return (tokens) => {\n            return 'test parser';\n          };\n        },\n      },\n    });\n    const html = await marked.parse('text');\n    assert.strictEqual(html.trim(), 'test parser');\n  });\n\n  it('should provide async parser from async hook', async() => {\n    marked.use({\n      async: true,\n      hooks: {\n        async provideParser() {\n          await timeout();\n          return async(tokens) => {\n            await timeout();\n            return 'test parser';\n          };\n        },\n      },\n    });\n    const html = await marked.parse('text');\n    assert.strictEqual(html.trim(), 'test parser');\n  });\n});\n"
  },
  {
    "path": "test/unit/Lexer.test.js",
    "content": "import { Lexer } from '../../lib/marked.esm.js';\nimport { describe, it } from 'node:test';\nimport assert from 'node:assert';\n\nfunction expectTokens({ md, options, tokens = [], links = {}, log = false }) {\n  const lexer = new Lexer(options);\n  const actual = lexer.lex(md);\n  const expected = tokens;\n  expected.links = links;\n  if (log) {\n    console.log(JSON.stringify(\n      actual,\n      (k, v) => v === undefined ? null : v,\n      2,\n    ));\n  }\n  assert.deepEqual(actual, expected);\n}\n\nfunction expectInlineTokens({ md, options, tokens, links = {} }) {\n  const lexer = new Lexer(options);\n  lexer.tokens.links = links;\n  const outTokens = [];\n  lexer.inlineTokens(md, outTokens);\n  assert.deepEqual(outTokens, tokens);\n}\n\ndescribe('Lexer', () => {\n  describe('paragraph', () => {\n    it('space between paragraphs', () => {\n      expectTokens({\n        md: 'paragraph 1\\n\\nparagraph 2',\n        tokens: [\n          {\n            type: 'paragraph',\n            raw: 'paragraph 1',\n            text: 'paragraph 1',\n            tokens: [{ type: 'text', raw: 'paragraph 1', text: 'paragraph 1', escaped: false }],\n          },\n          { type: 'space', raw: '\\n\\n' },\n          {\n            type: 'paragraph',\n            raw: 'paragraph 2',\n            text: 'paragraph 2',\n            tokens: [{ type: 'text', raw: 'paragraph 2', text: 'paragraph 2', escaped: false }],\n          },\n        ],\n      });\n    });\n  });\n\n  describe('code', () => {\n    it('indented code', () => {\n      expectTokens({\n        md: '    code',\n        tokens: [\n          { type: 'code', raw: '    code', text: 'code', codeBlockStyle: 'indented' },\n        ],\n      });\n    });\n\n    it('fenced code', () => {\n      expectTokens({\n        md: '```\\ncode\\n```',\n        tokens: [\n          { type: 'code', raw: '```\\ncode\\n```', text: 'code', lang: '' },\n        ],\n      });\n    });\n\n    it('fenced code lang', () => {\n      expectTokens({\n        md: '```text\\ncode\\n```',\n        tokens: [\n          { type: 'code', raw: '```text\\ncode\\n```', text: 'code', lang: 'text' },\n        ],\n      });\n    });\n  });\n\n  describe('headings', () => {\n    it('depth', () => {\n      expectTokens({\n        md: `\n# heading 1\n\n## heading 2\n\n### heading 3\n\n#### heading 4\n\n##### heading 5\n\n###### heading 6\n\nlheading 1\n==========\n\nlheading 2\n----------\n`,\n        tokens: [\n          {\n            type: 'space',\n            raw: '\\n',\n          },\n          {\n            type: 'heading',\n            raw: '# heading 1\\n\\n',\n            depth: 1,\n            text: 'heading 1',\n            tokens: [{ type: 'text', raw: 'heading 1', text: 'heading 1', escaped: false }],\n          },\n          {\n            type: 'heading',\n            raw: '## heading 2\\n\\n',\n            depth: 2,\n            text: 'heading 2',\n            tokens: [{ type: 'text', raw: 'heading 2', text: 'heading 2', escaped: false }],\n          },\n          {\n            type: 'heading',\n            raw: '### heading 3\\n\\n',\n            depth: 3,\n            text: 'heading 3',\n            tokens: [{ type: 'text', raw: 'heading 3', text: 'heading 3', escaped: false }],\n          },\n          {\n            type: 'heading',\n            raw: '#### heading 4\\n\\n',\n            depth: 4,\n            text: 'heading 4',\n            tokens: [{ type: 'text', raw: 'heading 4', text: 'heading 4', escaped: false }],\n          },\n          {\n            type: 'heading',\n            raw: '##### heading 5\\n\\n',\n            depth: 5,\n            text: 'heading 5',\n            tokens: [{ type: 'text', raw: 'heading 5', text: 'heading 5', escaped: false }],\n          },\n          {\n            type: 'heading',\n            raw: '###### heading 6\\n\\n',\n            depth: 6,\n            text: 'heading 6',\n            tokens: [{ type: 'text', raw: 'heading 6', text: 'heading 6', escaped: false }],\n          },\n          {\n            type: 'heading',\n            raw: 'lheading 1\\n==========\\n\\n',\n            depth: 1,\n            text: 'lheading 1',\n            tokens: [{ type: 'text', raw: 'lheading 1', text: 'lheading 1', escaped: false }],\n          },\n          {\n            type: 'heading',\n            raw: 'lheading 2\\n----------\\n',\n            depth: 2,\n            text: 'lheading 2',\n            tokens: [{ type: 'text', raw: 'lheading 2', text: 'lheading 2', escaped: false }],\n          },\n        ],\n      });\n    });\n\n    it('should not be heading if depth > 6', () => {\n      expectTokens({\n        md: '####### heading 7',\n        tokens: [{\n          type: 'paragraph',\n          raw: '####### heading 7',\n          text: '####### heading 7',\n          tokens: [{ type: 'text', raw: '####### heading 7', text: '####### heading 7', escaped: false }],\n        }],\n      });\n    });\n  });\n\n  describe('table', () => {\n    it('pipe table', () => {\n      expectTokens({\n        md: `\n| a | b |\n|---|---|\n| 1 | 2 |\n`,\n        tokens: [{\n          type: 'space',\n          raw: '\\n',\n        }, {\n          type: 'table',\n          align: [null, null],\n          raw: '| a | b |\\n|---|---|\\n| 1 | 2 |\\n',\n          header: [\n            {\n              text: 'a',\n              tokens: [{ type: 'text', raw: 'a', text: 'a', escaped: false }],\n              header: true,\n              align: null,\n            },\n            {\n              text: 'b',\n              tokens: [{ type: 'text', raw: 'b', text: 'b', escaped: false }],\n              header: true,\n              align: null,\n            },\n          ],\n          rows: [\n            [\n              {\n                text: '1',\n                tokens: [{ type: 'text', raw: '1', text: '1', escaped: false }],\n                header: false,\n                align: null,\n              },\n              {\n                text: '2',\n                tokens: [{ type: 'text', raw: '2', text: '2', escaped: false }],\n                header: false,\n                align: null,\n              },\n            ],\n          ],\n        }],\n      });\n    });\n\n    it('table after para', () => {\n      expectTokens({\n        md: `\nparagraph 1\n| a | b |\n|---|---|\n| 1 | 2 |\n`,\n        tokens: [{\n          type: 'space',\n          raw: '\\n',\n        }, {\n          type: 'paragraph',\n          raw: 'paragraph 1\\n',\n          text: 'paragraph 1',\n          tokens: [{ type: 'text', raw: 'paragraph 1', text: 'paragraph 1', escaped: false }],\n        },\n        {\n          type: 'table',\n          align: [null, null],\n          raw: '| a | b |\\n|---|---|\\n| 1 | 2 |\\n',\n          header: [\n            {\n              text: 'a',\n              tokens: [{ type: 'text', raw: 'a', text: 'a', escaped: false }],\n              header: true,\n              align: null,\n            },\n            {\n              text: 'b',\n              tokens: [{ type: 'text', raw: 'b', text: 'b', escaped: false }],\n              header: true,\n              align: null,\n            },\n          ],\n          rows: [\n            [\n              {\n                text: '1',\n                tokens: [{ type: 'text', raw: '1', text: '1', escaped: false }],\n                header: false,\n                align: null,\n              },\n              {\n                text: '2',\n                tokens: [{ type: 'text', raw: '2', text: '2', escaped: false }],\n                header: false,\n                align: null,\n              },\n            ],\n          ],\n        },\n        ],\n      });\n    });\n\n    it('align table', () => {\n      expectTokens({\n        md: `\n| a | b | c |\n|:--|:-:|--:|\n| 1 | 2 | 3 |\n`,\n        tokens: [{\n          type: 'space',\n          raw: '\\n',\n        }, {\n          type: 'table',\n          align: ['left', 'center', 'right'],\n          raw: '| a | b | c |\\n|:--|:-:|--:|\\n| 1 | 2 | 3 |\\n',\n          header: [\n            {\n              text: 'a',\n              tokens: [{ type: 'text', raw: 'a', text: 'a', escaped: false }],\n              header: true,\n              align: 'left',\n            },\n            {\n              text: 'b',\n              tokens: [{ type: 'text', raw: 'b', text: 'b', escaped: false }],\n              header: true,\n              align: 'center',\n            },\n            {\n              text: 'c',\n              tokens: [{ type: 'text', raw: 'c', text: 'c', escaped: false }],\n              header: true,\n              align: 'right',\n            },\n          ],\n          rows: [\n            [\n              {\n                text: '1',\n                tokens: [{ type: 'text', raw: '1', text: '1', escaped: false }],\n                header: false,\n                align: 'left',\n              },\n              {\n                text: '2',\n                tokens: [{ type: 'text', raw: '2', text: '2', escaped: false }],\n                header: false,\n                align: 'center',\n              },\n              {\n                text: '3',\n                tokens: [{ type: 'text', raw: '3', text: '3', escaped: false }],\n                header: false,\n                align: 'right',\n              },\n            ],\n          ],\n        }],\n      });\n    });\n\n    it('no pipe table', () => {\n      expectTokens({\n        md: `\na | b\n--|--\n1 | 2\n`,\n        tokens: [\n          {\n            type: 'space',\n            raw: '\\n',\n          }, {\n            type: 'table',\n            align: [null, null],\n            raw: 'a | b\\n--|--\\n1 | 2\\n',\n            header: [\n              {\n                text: 'a',\n                tokens: [{ type: 'text', raw: 'a', text: 'a', escaped: false }],\n                header: true,\n                align: null,\n              },\n              {\n                text: 'b',\n                tokens: [{ type: 'text', raw: 'b', text: 'b', escaped: false }],\n                header: true,\n                align: null,\n              },\n            ],\n            rows: [\n              [\n                {\n                  text: '1',\n                  tokens: [{ type: 'text', raw: '1', text: '1', escaped: false }],\n                  header: false,\n                  align: null,\n                },\n                {\n                  text: '2',\n                  tokens: [{ type: 'text', raw: '2', text: '2', escaped: false }],\n                  header: false,\n                  align: null,\n                },\n              ],\n            ],\n          }],\n      });\n    });\n  });\n\n  describe('hr', () => {\n    it('hr', () => {\n      expectTokens({\n        md: '---',\n        tokens: [\n          { type: 'hr', raw: '---' },\n        ],\n      });\n    });\n  });\n\n  describe('blockquote', () => {\n    it('start, inner-tokens, end', () => {\n      expectTokens({\n        md: '> blockquote',\n        tokens: [\n          {\n            type: 'blockquote',\n            raw: '> blockquote',\n            text: 'blockquote',\n            tokens: [{\n              type: 'paragraph',\n              raw: 'blockquote',\n              text: 'blockquote',\n              tokens: [\n                { type: 'text', raw: 'blockquote', text: 'blockquote', escaped: false },\n              ],\n            }],\n          },\n        ],\n      });\n    });\n\n    it('trim newline in text', () => {\n      expectTokens({\n        md: '> blockquote\\n',\n        tokens: [\n          {\n            type: 'blockquote',\n            raw: '> blockquote\\n',\n            text: 'blockquote',\n            tokens: [{\n              type: 'paragraph',\n              raw: 'blockquote',\n              text: 'blockquote',\n              tokens: [\n                { type: 'text', raw: 'blockquote', text: 'blockquote', escaped: false },\n              ],\n            }],\n          },\n        ],\n      });\n    });\n\n    it('paragraph token in list', () => {\n      expectTokens({\n        md: '- > blockquote',\n        tokens: [\n          {\n            type: 'list',\n            raw: '- > blockquote',\n            ordered: false,\n            start: '',\n            loose: false,\n            items: [\n              {\n                type: 'list_item',\n                raw: '- > blockquote',\n                task: false,\n                loose: false,\n                text: '> blockquote',\n                tokens: [\n                  {\n                    type: 'blockquote',\n                    raw: '> blockquote',\n                    tokens: [\n                      {\n                        type: 'paragraph',\n                        raw: 'blockquote',\n                        text: 'blockquote',\n                        tokens: [\n                          { type: 'text', raw: 'blockquote', text: 'blockquote', escaped: false },\n                        ],\n                      },\n                    ],\n                    text: 'blockquote',\n                  },\n                ],\n              },\n            ],\n          },\n        ],\n      });\n    });\n  });\n\n  describe('list', () => {\n    it('unordered', () => {\n      expectTokens({\n        md: `\n- item 1\n- item 2\n`,\n        tokens: [\n          {\n            type: 'space',\n            raw: '\\n',\n          }, {\n            type: 'list',\n            raw: '- item 1\\n- item 2\\n',\n            ordered: false,\n            start: '',\n            loose: false,\n            items: [\n              {\n                type: 'list_item',\n                raw: '- item 1\\n',\n                task: false,\n                loose: false,\n                text: 'item 1',\n                tokens: [{\n                  type: 'text',\n                  raw: 'item 1',\n                  text: 'item 1',\n                  tokens: [{ type: 'text', raw: 'item 1', text: 'item 1', escaped: false }],\n                }],\n              },\n              {\n                type: 'list_item',\n                raw: '- item 2',\n                task: false,\n                loose: false,\n                text: 'item 2',\n                tokens: [{\n                  type: 'text',\n                  raw: 'item 2',\n                  text: 'item 2',\n                  tokens: [{ type: 'text', raw: 'item 2', text: 'item 2', escaped: false }],\n                }],\n              },\n            ],\n          },\n        ],\n      });\n    });\n\n    it('ordered', () => {\n      expectTokens({\n        md: `\n1. item 1\n2. item 2\n`,\n        tokens: [\n          {\n            type: 'space',\n            raw: '\\n',\n          },\n          {\n            type: 'list',\n            raw: '1. item 1\\n2. item 2\\n',\n            ordered: true,\n            start: 1,\n            loose: false,\n            items: [\n              {\n                type: 'list_item',\n                raw: '1. item 1\\n',\n                task: false,\n                loose: false,\n                text: 'item 1',\n                tokens: [\n                  {\n                    type: 'text',\n                    raw: 'item 1',\n                    text: 'item 1',\n                    tokens: [\n                      {\n                        type: 'text',\n                        raw: 'item 1',\n                        text: 'item 1',\n                        escaped: false,\n                      },\n                    ],\n                  },\n                ],\n              },\n              {\n                type: 'list_item',\n                raw: '2. item 2',\n                task: false,\n                loose: false,\n                text: 'item 2',\n                tokens: [\n                  {\n                    type: 'text',\n                    raw: 'item 2',\n                    text: 'item 2',\n                    tokens: [\n                      {\n                        type: 'text',\n                        raw: 'item 2',\n                        text: 'item 2',\n                        escaped: false,\n                      },\n                    ],\n                  },\n                ],\n              },\n            ],\n          },\n        ],\n      });\n    });\n\n    it('ordered with parenthesis', () => {\n      expectTokens({\n        md: `\n1) item 1\n2) item 2\n`,\n        tokens: [\n          {\n            type: 'space',\n            raw: '\\n',\n          },\n          {\n            type: 'list',\n            raw: '1) item 1\\n2) item 2\\n',\n            ordered: true,\n            start: 1,\n            loose: false,\n            items: [\n              {\n                type: 'list_item',\n                raw: '1) item 1\\n',\n                task: false,\n                loose: false,\n                text: 'item 1',\n                tokens: [\n                  {\n                    type: 'text',\n                    raw: 'item 1',\n                    text: 'item 1',\n                    tokens: [\n                      {\n                        type: 'text',\n                        raw: 'item 1',\n                        text: 'item 1',\n                        escaped: false,\n                      },\n                    ],\n                  },\n                ],\n              },\n              {\n                type: 'list_item',\n                raw: '2) item 2',\n                task: false,\n                loose: false,\n                text: 'item 2',\n                tokens: [\n                  {\n                    type: 'text',\n                    raw: 'item 2',\n                    text: 'item 2',\n                    tokens: [\n                      {\n                        type: 'text',\n                        raw: 'item 2',\n                        text: 'item 2',\n                        escaped: false,\n                      },\n                    ],\n                  },\n                ],\n              },\n            ],\n          },\n        ],\n      });\n    });\n\n    it('space after list', () => {\n      expectTokens({\n        md: `\n- item 1\n- item 2\n\nparagraph\n`,\n        tokens: [\n          {\n            type: 'space',\n            raw: '\\n',\n          },\n          {\n            type: 'list',\n            raw: '- item 1\\n- item 2',\n            ordered: false,\n            start: '',\n            loose: false,\n            items: [\n              {\n                type: 'list_item',\n                raw: '- item 1\\n',\n                task: false,\n                loose: false,\n                text: 'item 1',\n                tokens: [\n                  {\n                    type: 'text',\n                    raw: 'item 1',\n                    text: 'item 1',\n                    tokens: [\n                      {\n                        type: 'text',\n                        raw: 'item 1',\n                        text: 'item 1',\n                        escaped: false,\n                      },\n                    ],\n                  },\n                ],\n              },\n              {\n                type: 'list_item',\n                raw: '- item 2',\n                task: false,\n                loose: false,\n                text: 'item 2',\n                tokens: [\n                  {\n                    type: 'text',\n                    raw: 'item 2',\n                    text: 'item 2',\n                    tokens: [\n                      {\n                        type: 'text',\n                        raw: 'item 2',\n                        text: 'item 2',\n                        escaped: false,\n                      },\n                    ],\n                  },\n                ],\n              },\n            ],\n          },\n          {\n            type: 'space',\n            raw: '\\n\\n',\n          },\n          {\n            type: 'paragraph',\n            raw: 'paragraph\\n',\n            text: 'paragraph',\n            tokens: [\n              {\n                type: 'text',\n                raw: 'paragraph',\n                text: 'paragraph',\n                escaped: false,\n              },\n            ],\n          },\n        ],\n      });\n    });\n\n    it('start', () => {\n      expectTokens({\n        md: `\n2. item 1\n3. item 2\n`,\n        tokens: [\n          {\n            type: 'space',\n            raw: '\\n',\n          },\n          {\n            type: 'list',\n            raw: '2. item 1\\n3. item 2\\n',\n            ordered: true,\n            start: 2,\n            loose: false,\n            items: [\n              {\n                type: 'list_item',\n                raw: '2. item 1\\n',\n                task: false,\n                loose: false,\n                text: 'item 1',\n                tokens: [\n                  {\n                    type: 'text',\n                    raw: 'item 1',\n                    text: 'item 1',\n                    tokens: [\n                      {\n                        type: 'text',\n                        raw: 'item 1',\n                        text: 'item 1',\n                        escaped: false,\n                      },\n                    ],\n                  },\n                ],\n              },\n              {\n                type: 'list_item',\n                raw: '3. item 2',\n                task: false,\n                loose: false,\n                text: 'item 2',\n                tokens: [\n                  {\n                    type: 'text',\n                    raw: 'item 2',\n                    text: 'item 2',\n                    tokens: [\n                      {\n                        type: 'text',\n                        raw: 'item 2',\n                        text: 'item 2',\n                        escaped: false,\n                      },\n                    ],\n                  },\n                ],\n              },\n            ],\n          },\n        ],\n      });\n    });\n\n    it('loose', () => {\n      expectTokens({\n        md: `\n- item 1\n\n- item 2\n`,\n        tokens: [\n          {\n            type: 'space',\n            raw: '\\n',\n          },\n          {\n            type: 'list',\n            raw: '- item 1\\n\\n- item 2\\n',\n            ordered: false,\n            start: '',\n            loose: true,\n            items: [\n              {\n                type: 'list_item',\n                raw: '- item 1\\n\\n',\n                task: false,\n                loose: true,\n                text: 'item 1\\n',\n                tokens: [\n                  {\n                    type: 'paragraph',\n                    raw: 'item 1\\n',\n                    text: 'item 1',\n                    tokens: [\n                      {\n                        type: 'text',\n                        raw: 'item 1',\n                        text: 'item 1',\n                        escaped: false,\n                      },\n                    ],\n                  },\n                ],\n              },\n              {\n                type: 'list_item',\n                raw: '- item 2',\n                task: false,\n                loose: true,\n                text: 'item 2',\n                tokens: [\n                  {\n                    type: 'paragraph',\n                    raw: 'item 2',\n                    text: 'item 2',\n                    tokens: [\n                      {\n                        type: 'text',\n                        raw: 'item 2',\n                        text: 'item 2',\n                        escaped: false,\n                      },\n                    ],\n                  },\n                ],\n              },\n            ],\n          },\n        ],\n      });\n    });\n\n    it('end loose', () => {\n      expectTokens({\n        md: `\n- item 1\n- item 2\n\n  item 2a\n- item 3\n`,\n        tokens: [\n          {\n            type: 'space',\n            raw: '\\n',\n          },\n          {\n            type: 'list',\n            raw: '- item 1\\n- item 2\\n\\n  item 2a\\n- item 3\\n',\n            ordered: false,\n            start: '',\n            loose: true,\n            items: [\n              {\n                type: 'list_item',\n                raw: '- item 1\\n',\n                task: false,\n                loose: true,\n                text: 'item 1',\n                tokens: [\n                  {\n                    type: 'paragraph',\n                    raw: 'item 1',\n                    text: 'item 1',\n                    tokens: [\n                      {\n                        type: 'text',\n                        raw: 'item 1',\n                        text: 'item 1',\n                        escaped: false,\n                      },\n                    ],\n                  },\n                ],\n              },\n              {\n                type: 'list_item',\n                raw: '- item 2\\n\\n  item 2a\\n',\n                task: false,\n                loose: true,\n                text: 'item 2\\n\\nitem 2a',\n                tokens: [\n                  {\n                    type: 'paragraph',\n                    raw: 'item 2',\n                    text: 'item 2',\n                    tokens: [\n                      {\n                        type: 'text',\n                        raw: 'item 2',\n                        text: 'item 2',\n                        escaped: false,\n                      },\n                    ],\n                  },\n                  {\n                    type: 'space',\n                    raw: '\\n\\n',\n                  },\n                  {\n                    type: 'paragraph',\n                    raw: 'item 2a',\n                    text: 'item 2a',\n                    tokens: [\n                      {\n                        type: 'text',\n                        raw: 'item 2a',\n                        text: 'item 2a',\n                        escaped: false,\n                      },\n                    ],\n                  },\n                ],\n              },\n              {\n                type: 'list_item',\n                raw: '- item 3',\n                task: false,\n                loose: true,\n                text: 'item 3',\n                tokens: [\n                  {\n                    type: 'paragraph',\n                    raw: 'item 3',\n                    text: 'item 3',\n                    tokens: [\n                      {\n                        type: 'text',\n                        raw: 'item 3',\n                        text: 'item 3',\n                        escaped: false,\n                      },\n                    ],\n                  },\n                ],\n              },\n            ],\n          },\n        ],\n      });\n    });\n\n    it('not loose with spaces', () => {\n      expectTokens({\n        md: `\n- item 1\n  - item 2\n`,\n        tokens: [\n          {\n            type: 'space',\n            raw: '\\n',\n          },\n          {\n            type: 'list',\n            raw: '- item 1\\n  - item 2\\n',\n            ordered: false,\n            start: '',\n            loose: false,\n            items: [\n              {\n                type: 'list_item',\n                raw: '- item 1\\n  - item 2',\n                task: false,\n                loose: false,\n                text: 'item 1\\n- item 2',\n                tokens: [\n                  {\n                    type: 'text',\n                    raw: 'item 1\\n',\n                    text: 'item 1',\n                    tokens: [\n                      {\n                        type: 'text',\n                        raw: 'item 1',\n                        text: 'item 1',\n                        escaped: false,\n                      },\n                    ],\n                  },\n                  {\n                    type: 'list',\n                    raw: '- item 2',\n                    ordered: false,\n                    start: '',\n                    loose: false,\n                    items: [\n                      {\n                        type: 'list_item',\n                        raw: '- item 2',\n                        task: false,\n                        loose: false,\n                        text: 'item 2',\n                        tokens: [\n                          {\n                            type: 'text',\n                            raw: 'item 2',\n                            text: 'item 2',\n                            tokens: [\n                              {\n                                type: 'text',\n                                raw: 'item 2',\n                                text: 'item 2',\n                                escaped: false,\n                              },\n                            ],\n                          },\n                        ],\n                      },\n                    ],\n                  },\n                ],\n              },\n            ],\n          },\n        ],\n      });\n    });\n\n    it('task', () => {\n      expectTokens({\n        md: `\n- [ ] item 1\n- [x] item 2\n`,\n        tokens: [\n          {\n            type: 'space',\n            raw: '\\n',\n          },\n          {\n            type: 'list',\n            raw: '- [ ] item 1\\n- [x] item 2\\n',\n            ordered: false,\n            start: '',\n            loose: false,\n            items: [\n              {\n                type: 'list_item',\n                raw: '- [ ] item 1\\n',\n                task: true,\n                checked: false,\n                loose: false,\n                text: 'item 1',\n                tokens: [\n                  {\n                    type: 'checkbox',\n                    raw: '[ ] ',\n                    checked: false,\n                  },\n                  {\n                    type: 'text',\n                    raw: 'item 1',\n                    text: 'item 1',\n                    tokens: [\n                      {\n                        type: 'text',\n                        raw: 'item 1',\n                        text: 'item 1',\n                        escaped: false,\n                      },\n                    ],\n                  },\n                ],\n              },\n              {\n                type: 'list_item',\n                raw: '- [x] item 2',\n                task: true,\n                checked: true,\n                loose: false,\n                text: 'item 2',\n                tokens: [\n                  {\n                    type: 'checkbox',\n                    raw: '[x] ',\n                    checked: true,\n                  },\n                  {\n                    type: 'text',\n                    raw: 'item 2',\n                    text: 'item 2',\n                    tokens: [\n                      {\n                        type: 'text',\n                        raw: 'item 2',\n                        text: 'item 2',\n                        escaped: false,\n                      },\n                    ],\n                  },\n                ],\n              },\n            ],\n          },\n        ],\n      });\n    });\n\n    it('multiline', () => {\n      expectTokens({\n        md: `\n- line 1\n  line 2\n`,\n        tokens: [\n          {\n            type: 'space',\n            raw: '\\n',\n          }, {\n            type: 'list',\n            raw: '- line 1\\n  line 2\\n',\n            ordered: false,\n            start: '',\n            loose: false,\n            items: [\n              {\n                type: 'list_item',\n                raw: '- line 1\\n  line 2',\n                task: false,\n                loose: false,\n                text: 'line 1\\nline 2',\n                tokens: [{\n                  type: 'text',\n                  raw: 'line 1\\nline 2',\n                  text: 'line 1\\nline 2',\n                  tokens: [{ type: 'text', raw: 'line 1\\nline 2', text: 'line 1\\nline 2', escaped: false }],\n                }],\n              },\n            ],\n          },\n        ],\n      });\n    });\n\n    it('indented code after paragraph', () => {\n      expectTokens({\n        md: `\n- a\n      - b\n`,\n        tokens: [{\n          type: 'space',\n          raw: '\\n',\n        },\n        {\n          type: 'list',\n          raw: '- a\\n      - b\\n',\n          ordered: false,\n          start: '',\n          loose: false,\n          items: [\n            {\n              type: 'list_item',\n              raw: '- a\\n      - b',\n              task: false,\n              loose: false,\n              text: 'a\\n    - b',\n              tokens: [\n                {\n                  type: 'text',\n                  raw: 'a\\n    - b',\n                  text: 'a\\n- b',\n                  tokens: [\n                    { type: 'text', raw: 'a\\n- b', text: 'a\\n- b', escaped: false },\n                  ],\n                },\n              ],\n            },\n          ],\n        },\n        ],\n      });\n    });\n\n    it('def after paragraph', () => {\n      expectTokens({\n        md: `\n- hello\n[1]: hello\n`,\n        tokens: [\n          { type: 'space', raw: '\\n' },\n          {\n            type: 'list',\n            raw: '- hello\\n[1]: hello\\n',\n            ordered: false,\n            start: '',\n            loose: false,\n            items: [\n              {\n                type: 'list_item',\n                raw: '- hello\\n[1]: hello',\n                task: false,\n                loose: false,\n                text: 'hello\\n[1]: hello',\n                tokens: [\n                  {\n                    type: 'text',\n                    raw: 'hello\\n[1]: hello',\n                    text: 'hello\\n[1]: hello',\n                    tokens: [\n                      { type: 'text', raw: 'hello\\n[1]: hello', text: 'hello\\n[1]: hello', escaped: false },\n                    ],\n                  },\n                ],\n              },\n            ],\n          },\n        ],\n      });\n    });\n  });\n\n  describe('html', () => {\n    it('div', () => {\n      expectTokens({\n        md: '<div>html</div>',\n        tokens: [\n          {\n            type: 'html',\n            raw: '<div>html</div>',\n            pre: false,\n            block: true,\n            text: '<div>html</div>',\n          },\n        ],\n      });\n    });\n\n    it('pre', () => {\n      expectTokens({\n        md: '<pre>html</pre>',\n        tokens: [\n          {\n            type: 'html',\n            raw: '<pre>html</pre>',\n            pre: true,\n            block: true,\n            text: '<pre>html</pre>',\n          },\n        ],\n      });\n    });\n  });\n\n  describe('def', () => {\n    it('link', () => {\n      expectTokens({\n        md: '[link]: https://example.com',\n        links: {\n          link: { href: 'https://example.com', title: undefined },\n        },\n        tokens: [\n          {\n            type: 'def',\n            raw: '[link]: https://example.com',\n            tag: 'link',\n            href: 'https://example.com',\n            title: undefined,\n          },\n        ],\n      });\n    });\n\n    it('title', () => {\n      expectTokens({\n        md: '[link]: https://example.com \"title\"',\n        links: {\n          link: { href: 'https://example.com', title: 'title' },\n        },\n        tokens: [\n          {\n            type: 'def',\n            raw: '[link]: https://example.com \"title\"',\n            tag: 'link',\n            href: 'https://example.com',\n            title: 'title',\n          },\n        ],\n      });\n    });\n  });\n\n  describe('inline', () => {\n    describe('inlineTokens', () => {\n      it('escape', () => {\n        expectInlineTokens({\n          md: '\\\\>',\n          tokens: [\n            { type: 'escape', raw: '\\\\>', text: '>' },\n          ],\n        });\n      });\n\n      it('escaped punctuation inside emphasis', () => {\n        expectInlineTokens({\n          md: '**strong text\\\\[**\\\\]',\n          tokens: [\n            {\n              type: 'strong',\n              raw: '**strong text\\\\[**',\n              text: 'strong text\\\\[',\n              tokens: [\n                { type: 'text', raw: 'strong text', text: 'strong text', escaped: false },\n                { type: 'escape', raw: '\\\\[', text: '[' },\n              ],\n            },\n            { type: 'escape', raw: '\\\\]', text: ']' },\n          ],\n        });\n        expectInlineTokens({\n          md: '_em\\\\<pha\\\\>sis_',\n          tokens: [\n            {\n              type: 'em',\n              raw: '_em\\\\<pha\\\\>sis_',\n              text: 'em\\\\<pha\\\\>sis',\n              tokens: [\n                { type: 'text', raw: 'em', text: 'em', escaped: false },\n                { type: 'escape', raw: '\\\\<', text: '<' },\n                { type: 'text', raw: 'pha', text: 'pha', escaped: false },\n                { type: 'escape', raw: '\\\\>', text: '>' },\n                { type: 'text', raw: 'sis', text: 'sis', escaped: false },\n              ],\n            },\n          ],\n        });\n      });\n\n      it('html', () => {\n        expectInlineTokens({\n          md: '<div>html</div>',\n          tokens: [\n            { type: 'html', raw: '<div>', inLink: false, inRawBlock: false, block: false, text: '<div>' },\n            { type: 'text', raw: 'html', text: 'html', escaped: false },\n            { type: 'html', raw: '</div>', inLink: false, inRawBlock: false, block: false, text: '</div>' },\n          ],\n        });\n      });\n\n      it('link', () => {\n        expectInlineTokens({\n          md: '[link](https://example.com)',\n          tokens: [\n            {\n              type: 'link',\n              raw: '[link](https://example.com)',\n              href: 'https://example.com',\n              title: null,\n              text: 'link',\n              tokens: [\n                {\n                  type: 'text',\n                  raw: 'link',\n                  text: 'link',\n                  escaped: false,\n                },\n              ],\n            },\n          ],\n        });\n      });\n\n      it('link title', () => {\n        expectInlineTokens({\n          md: '[link](https://example.com \"title\")',\n          tokens: [\n            {\n              type: 'link',\n              raw: '[link](https://example.com \"title\")',\n              href: 'https://example.com',\n              title: 'title',\n              text: 'link',\n              tokens: [\n                {\n                  type: 'text',\n                  raw: 'link',\n                  text: 'link',\n                  escaped: false,\n                },\n              ],\n            },\n          ],\n        });\n      });\n\n      it('image', () => {\n        expectInlineTokens({\n          md: '![image](https://example.com/image.png)',\n          tokens: [\n            {\n              type: 'image',\n              raw: '![image](https://example.com/image.png)',\n              text: 'image',\n              href: 'https://example.com/image.png',\n              title: null,\n              tokens: [{\n                type: 'text',\n                raw: 'image',\n                text: 'image',\n                escaped: false,\n              }],\n            },\n          ],\n        });\n      });\n\n      it('image title', () => {\n        expectInlineTokens({\n          md: '![image](https://example.com/image.png \"title\")',\n          tokens: [\n            {\n              type: 'image',\n              raw: '![image](https://example.com/image.png \"title\")',\n              text: 'image',\n              href: 'https://example.com/image.png',\n              title: 'title',\n              tokens: [{\n                type: 'text',\n                raw: 'image',\n                text: 'image',\n                escaped: false,\n              }],\n            },\n          ],\n        });\n      });\n\n      describe('reflink', () => {\n        it('reflink', () => {\n          expectInlineTokens({\n            md: '[link][]',\n            links: {\n              link: { href: 'https://example.com', title: 'title' },\n            },\n            tokens: [\n              {\n                type: 'link',\n                raw: '[link][]',\n                href: 'https://example.com',\n                title: 'title',\n                text: 'link',\n                tokens: [{\n                  type: 'text',\n                  raw: 'link',\n                  text: 'link',\n                  escaped: false,\n                }],\n              },\n            ],\n          });\n        });\n\n        it('nolink', () => {\n          expectInlineTokens({\n            md: '[link]',\n            links: {\n              link: { href: 'https://example.com', title: 'title' },\n            },\n            tokens: [\n              {\n                type: 'link',\n                raw: '[link]',\n                href: 'https://example.com',\n                title: 'title',\n                text: 'link',\n                tokens: [{\n                  type: 'text',\n                  raw: 'link',\n                  text: 'link',\n                  escaped: false,\n                }],\n              },\n            ],\n          });\n        });\n\n        it('no def', () => {\n          expectInlineTokens({\n            md: '[link]',\n            tokens: [\n              {\n                type: 'text',\n                raw: '[link]',\n                text: '[link]',\n              },\n            ],\n          });\n        });\n      });\n\n      it('strong', () => {\n        expectInlineTokens({\n          md: '**strong**',\n          tokens: [\n            {\n              type: 'strong',\n              raw: '**strong**',\n              text: 'strong',\n              tokens: [\n                {\n                  type: 'text',\n                  raw: 'strong',\n                  text: 'strong',\n                  escaped: false,\n                },\n              ],\n            },\n          ],\n        });\n      });\n\n      it('em', () => {\n        expectInlineTokens({\n          md: '*em*',\n          tokens: [\n            {\n              type: 'em',\n              raw: '*em*',\n              text: 'em',\n              tokens: [\n                {\n                  type: 'text',\n                  raw: 'em',\n                  text: 'em',\n                  escaped: false,\n                },\n              ],\n            },\n          ],\n        });\n      });\n\n      describe('codespan', () => {\n        it('code', () => {\n          expectInlineTokens({\n            md: '`code`',\n            tokens: [\n              { type: 'codespan', raw: '`code`', text: 'code' },\n            ],\n          });\n        });\n\n        it('only spaces not stripped', () => {\n          expectInlineTokens({\n            md: '`   `',\n            tokens: [\n              { type: 'codespan', raw: '`   `', text: '   ' },\n            ],\n          });\n        });\n\n        it('beginning space only not stripped', () => {\n          expectInlineTokens({\n            md: '` a`',\n            tokens: [\n              { type: 'codespan', raw: '` a`', text: ' a' },\n            ],\n          });\n        });\n\n        it('end space only not stripped', () => {\n          expectInlineTokens({\n            md: '`a `',\n            tokens: [\n              { type: 'codespan', raw: '`a `', text: 'a ' },\n            ],\n          });\n        });\n\n        it('begin and end spaces are stripped', () => {\n          expectInlineTokens({\n            md: '` a `',\n            tokens: [\n              { type: 'codespan', raw: '` a `', text: 'a' },\n            ],\n          });\n        });\n\n        it('begin and end newlines are stripped', () => {\n          expectInlineTokens({\n            md: '`\\na\\n`',\n            tokens: [\n              { type: 'codespan', raw: '`\\na\\n`', text: 'a' },\n            ],\n          });\n        });\n\n        it('begin and end tabs are not stripped', () => {\n          expectInlineTokens({\n            md: '`\\ta\\t`',\n            tokens: [\n              { type: 'codespan', raw: '`\\ta\\t`', text: '\\ta\\t' },\n            ],\n          });\n        });\n\n        it('begin and end newlines', () => {\n          expectInlineTokens({\n            md: '`\\na\\n`',\n            tokens: [\n              { type: 'codespan', raw: '`\\na\\n`', text: 'a' },\n            ],\n          });\n        });\n\n        it('begin and end multiple spaces only one stripped', () => {\n          expectInlineTokens({\n            md: '`  a  `',\n            tokens: [\n              { type: 'codespan', raw: '`  a  `', text: ' a ' },\n            ],\n          });\n        });\n\n        it('newline to space', () => {\n          expectInlineTokens({\n            md: '`a\\nb`',\n            tokens: [\n              { type: 'codespan', raw: '`a\\nb`', text: 'a b' },\n            ],\n          });\n        });\n      });\n\n      it('br', () => {\n        expectInlineTokens({\n          md: 'a\\nb',\n          options: { gfm: true, breaks: true },\n          tokens: [\n            {\n              raw: 'a',\n              text: 'a',\n              type: 'text',\n              escaped: false,\n            },\n            {\n              raw: '\\n',\n              type: 'br',\n            },\n            {\n              raw: 'b',\n              text: 'b',\n              type: 'text',\n              escaped: false,\n            },\n          ],\n        });\n      });\n\n      it('del', () => {\n        expectInlineTokens({\n          md: '~~del~~',\n          tokens: [\n            {\n              type: 'del',\n              raw: '~~del~~',\n              text: 'del',\n              tokens: [\n                {\n                  type: 'text',\n                  raw: 'del',\n                  text: 'del',\n                  escaped: false,\n                },\n              ],\n            },\n          ],\n        });\n      });\n\n      describe('url', () => {\n        it('autolink', () => {\n          expectInlineTokens({\n            md: '<https://example.com>',\n            tokens: [\n              {\n                type: 'link',\n                raw: '<https://example.com>',\n                text: 'https://example.com',\n                href: 'https://example.com',\n                tokens: [\n                  {\n                    type: 'text',\n                    raw: 'https://example.com',\n                    text: 'https://example.com',\n                  },\n                ],\n              },\n            ],\n          });\n        });\n\n        it('autolink email', () => {\n          expectInlineTokens({\n            md: '<test@example.com>',\n            options: {},\n            tokens: [\n              {\n                type: 'link',\n                raw: '<test@example.com>',\n                text: 'test@example.com',\n                href: 'mailto:test@example.com',\n                tokens: [\n                  {\n                    type: 'text',\n                    raw: 'test@example.com',\n                    text: 'test@example.com',\n                  },\n                ],\n              },\n            ],\n          });\n        });\n\n        it('url', () => {\n          expectInlineTokens({\n            md: 'https://example.com',\n            tokens: [\n              {\n                type: 'link',\n                raw: 'https://example.com',\n                text: 'https://example.com',\n                href: 'https://example.com',\n                tokens: [\n                  {\n                    type: 'text',\n                    raw: 'https://example.com',\n                    text: 'https://example.com',\n                  },\n                ],\n              },\n            ],\n          });\n        });\n\n        it('url email', () => {\n          expectInlineTokens({\n            md: 'test@example.com',\n            options: { gfm: true },\n            tokens: [\n              {\n                type: 'link',\n                raw: 'test@example.com',\n                text: 'test@example.com',\n                href: 'mailto:test@example.com',\n                tokens: [\n                  {\n                    type: 'text',\n                    raw: 'test@example.com',\n                    text: 'test@example.com',\n                  },\n                ],\n              },\n            ],\n          });\n        });\n      });\n\n      it('text', () => {\n        expectInlineTokens({\n          md: 'text',\n          tokens: [\n            {\n              type: 'text',\n              raw: 'text',\n              text: 'text',\n              escaped: false,\n            },\n          ],\n        });\n      });\n    });\n  });\n});\n"
  },
  {
    "path": "test/unit/Parser.test.js",
    "content": "import { Parser } from '../../lib/marked.esm.js';\nimport { htmlIsEqual, firstDiff } from '@markedjs/testutils';\nimport assert from 'node:assert';\nimport { describe, it } from 'node:test';\n\nasync function expectHtml({ tokens, options, html, inline }) {\n  const parser = new Parser(options);\n  const actual = parser[inline ? 'parseInline' : 'parse'](tokens);\n  const testDiff = await firstDiff(actual, html);\n  assert.ok(await htmlIsEqual(html, actual), `Expected: ${testDiff.expected}\\n  Actual: ${testDiff.actual}`);\n}\n\ndescribe('Parser', () => {\n  describe('block', () => {\n    it('space between paragraphs', async() => {\n      await expectHtml({\n        tokens: [\n          {\n            type: 'paragraph',\n            text: 'paragraph 1',\n            tokens: [{ type: 'text', text: 'paragraph 1' }],\n          },\n          { type: 'space' },\n          {\n            type: 'paragraph',\n            text: 'paragraph 2',\n            tokens: [{ type: 'text', text: 'paragraph 2' }],\n          },\n        ],\n        html: '<p>paragraph 1</p><p>paragraph 2</p>',\n      });\n    });\n\n    it('hr', async() => {\n      await expectHtml({\n        tokens: [\n          {\n            type: 'hr',\n          },\n        ],\n        html: '<hr />',\n      });\n    });\n\n    it('heading', async() => {\n      await expectHtml({\n        tokens: [\n          {\n            type: 'heading',\n            depth: 1,\n            text: 'heading',\n            tokens: [{ type: 'text', text: 'heading' }],\n          },\n        ],\n        html: '<h1>heading</h1>',\n      });\n    });\n\n    it('code', async() => {\n      await expectHtml({\n        tokens: [\n          {\n            type: 'code',\n            text: 'code',\n          },\n        ],\n        html: '<pre><code>code</code></pre>',\n      });\n    });\n\n    it('table', async() => {\n      await expectHtml({\n        tokens: [\n          {\n            type: 'table',\n            align: ['left', 'right'],\n            header: [\n              {\n                text: 'a',\n                tokens: [{ type: 'text', raw: 'a', text: 'a' }],\n                header: true,\n                align: 'left',\n              },\n              {\n                text: 'b',\n                tokens: [{ type: 'text', raw: 'b', text: 'b' }],\n                header: true,\n                align: 'right',\n              },\n            ],\n            rows: [\n              [\n                {\n                  text: '1',\n                  tokens: [{ type: 'text', raw: '1', text: '1' }],\n                  header: false,\n                  align: 'left',\n                },\n                {\n                  text: '2',\n                  tokens: [{ type: 'text', raw: '2', text: '2' }],\n                  header: false,\n                  align: 'right',\n                },\n              ],\n            ],\n          },\n        ],\n        html: `\n<table>\n  <thead>\n    <tr>\n      <th align=\"left\">a</th>\n      <th align=\"right\">b</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <td align=\"left\">1</td>\n      <td align=\"right\">2</td>\n    </tr>\n  </tbody>\n</table>`,\n      });\n    });\n\n    it('blockquote', async() => {\n      await expectHtml({\n        tokens: [\n          {\n            type: 'blockquote',\n            tokens: [\n              {\n                type: 'paragraph',\n                text: 'blockquote',\n                tokens: [{ type: 'text', text: 'blockquote' }],\n              },\n            ],\n          },\n        ],\n        html: '<blockquote><p>blockquote</p></blockquote>',\n      });\n    });\n\n    describe('list', () => {\n      it('unordered', async() => {\n        await expectHtml({\n          tokens: [\n            {\n              type: 'list',\n              ordered: false,\n              start: '',\n              loose: false,\n              items: [\n                {\n                  task: false,\n                  checked: undefined,\n                  tokens: [\n                    {\n                      type: 'text',\n                      text: 'item 1',\n                      tokens: [{ type: 'text', text: 'item 1' }],\n                    },\n                  ],\n                },\n                {\n                  task: false,\n                  checked: undefined,\n                  tokens: [\n                    {\n                      type: 'text',\n                      text: 'item 2',\n                      tokens: [{ type: 'text', text: 'item 2' }],\n                    },\n                  ],\n                },\n              ],\n            },\n          ],\n          html: `\n<ul>\n  <li>item 1</li>\n  <li>item 2</li>\n</ul>`,\n        });\n      });\n\n      it('ordered', async() => {\n        await expectHtml({\n          tokens: [\n            {\n              type: 'list',\n              ordered: true,\n              start: 2,\n              loose: false,\n              items: [\n                {\n                  task: false,\n                  checked: undefined,\n                  tokens: [\n                    {\n                      type: 'text',\n                      text: 'item 1',\n                      tokens: [{ type: 'text', text: 'item 1' }],\n                    },\n                  ],\n                },\n                {\n                  task: false,\n                  checked: undefined,\n                  tokens: [\n                    {\n                      type: 'text',\n                      text: 'item 2',\n                      tokens: [{ type: 'text', text: 'item 2' }],\n                    },\n                  ],\n                },\n              ],\n            },\n          ],\n          html: `\n<ol start='2'>\n  <li>item 1</li>\n  <li>item 2</li>\n</ol>`,\n        });\n      });\n\n      it('tasks', async() => {\n        await expectHtml({\n          tokens: [\n            {\n              type: 'list',\n              ordered: false,\n              start: '',\n              loose: false,\n              items: [\n                {\n                  task: true,\n                  checked: false,\n                  tokens: [\n                    {\n                      type: 'checkbox',\n                      checked: false,\n                    },\n                    {\n                      type: 'text',\n                      text: 'item 1',\n                      tokens: [{ type: 'text', text: 'item 1' }],\n                    },\n                  ],\n                },\n                {\n                  task: true,\n                  checked: true,\n                  tokens: [\n                    {\n                      type: 'checkbox',\n                      checked: true,\n                    },\n                    {\n                      type: 'text',\n                      text: 'item 2',\n                      tokens: [{ type: 'text', text: 'item 2' }],\n                    },\n                  ],\n                },\n              ],\n            },\n          ],\n          html: `\n<ul>\n  <li><input disabled type=\"checkbox\"> item 1</li>\n  <li><input checked disabled type=\"checkbox\"> item 2</li>\n</ul>`,\n        });\n      });\n\n      it('loose', async() => {\n        await expectHtml({\n          tokens: [\n            {\n              type: 'list',\n              ordered: false,\n              start: '',\n              loose: true,\n              items: [\n                {\n                  task: false,\n                  checked: undefined,\n                  loose: true,\n                  tokens: [\n                    {\n                      type: 'paragraph',\n                      text: 'item 1',\n                      tokens: [{ type: 'text', text: 'item 1' }],\n                    },\n                  ],\n                },\n                {\n                  task: false,\n                  checked: undefined,\n                  loose: true,\n                  tokens: [\n                    {\n                      type: 'paragraph',\n                      text: 'item 2',\n                      tokens: [{ type: 'text', text: 'item 2' }],\n                    },\n                  ],\n                },\n              ],\n            },\n          ],\n          html: `\n  <ul>\n    <li><p>item 1</p></li>\n    <li><p>item 2</p></li>\n  </ul>`,\n        });\n      });\n    });\n\n    it('html', async() => {\n      await expectHtml({\n        tokens: [\n          {\n            type: 'html',\n            text: '<div>html</div>',\n          },\n        ],\n        html: '<div>html</div>',\n      });\n    });\n\n    it('paragraph', async() => {\n      await expectHtml({\n        tokens: [\n          {\n            type: 'paragraph',\n            text: 'paragraph 1',\n            tokens: [{ type: 'text', text: 'paragraph 1' }],\n          },\n        ],\n        html: '<p>paragraph 1</p>',\n      });\n    });\n\n    it('text', async() => {\n      await expectHtml({\n        tokens: [\n          { type: 'text', text: 'text 1' },\n          { type: 'text', text: 'text 2' },\n        ],\n        html: 'text 1text 2',\n      });\n    });\n  });\n\n  describe('inline', () => {\n    it('escape', async() => {\n      await expectHtml({\n        inline: true,\n        tokens: [{ type: 'escape', text: '&gt;' }],\n        html: '&gt;',\n      });\n    });\n\n    it('html', async() => {\n      await expectHtml({\n        inline: true,\n        tokens: [\n          { type: 'html', text: '<div>' },\n          { type: 'text', text: 'html' },\n          { type: 'html', text: '</div>' },\n        ],\n        html: '<div>html</div>',\n      });\n    });\n\n    it('link', async() => {\n      await expectHtml({\n        inline: true,\n        tokens: [\n          {\n            type: 'link',\n            text: 'link',\n            href: 'https://example.com',\n            title: 'title',\n            tokens: [{ type: 'text', text: 'link' }],\n          },\n        ],\n        html: '<a href=\"https://example.com\" title=\"title\">link</a>',\n      });\n    });\n\n    it('image', async() => {\n      await expectHtml({\n        inline: true,\n        tokens: [\n          {\n            type: 'image',\n            text: 'image',\n            href: 'image.png',\n            title: 'title',\n            tokens: [{\n              type: 'text',\n              raw: 'image',\n              text: 'image',\n              escaped: false,\n            }],\n          },\n        ],\n        html: '<img src=\"image.png\" alt=\"image\" title=\"title\">',\n      });\n    });\n\n    it('strong', async() => {\n      await expectHtml({\n        inline: true,\n        tokens: [\n          {\n            type: 'strong',\n            text: 'strong',\n            tokens: [{ type: 'text', text: 'strong' }],\n          },\n        ],\n        html: '<strong>strong</strong>',\n      });\n    });\n\n    it('em', async() => {\n      await expectHtml({\n        inline: true,\n        tokens: [\n          {\n            type: 'em',\n            text: 'em',\n            tokens: [{ type: 'text', text: 'em' }],\n          },\n        ],\n        html: '<em>em</em>',\n      });\n    });\n\n    it('codespan', async() => {\n      await expectHtml({\n        inline: true,\n        tokens: [\n          {\n            type: 'codespan',\n            text: 'code',\n          },\n        ],\n        html: '<code>code</code>',\n      });\n    });\n\n    it('br', async() => {\n      await expectHtml({\n        inline: true,\n        tokens: [\n          {\n            type: 'br',\n          },\n        ],\n        html: '<br />',\n      });\n    });\n\n    it('del', async() => {\n      await expectHtml({\n        inline: true,\n        tokens: [\n          {\n            type: 'del',\n            text: 'del',\n            tokens: [{ type: 'text', text: 'del' }],\n          },\n        ],\n        html: '<del>del</del>',\n      });\n    });\n\n    it('text', async() => {\n      await expectHtml({\n        inline: true,\n        tokens: [\n          { type: 'text', text: 'text 1' },\n          { type: 'text', text: 'text 2' },\n        ],\n        html: 'text 1text 2',\n      });\n    });\n  });\n});\n"
  },
  {
    "path": "test/unit/bin.test.js",
    "content": "import { main } from '../../bin/main.js';\nimport { htmlIsEqual } from '@markedjs/testutils';\nimport { dirname, resolve } from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport { describe, it, mock } from 'node:test';\nimport assert from 'node:assert';\n\nconst __dirname = dirname(fileURLToPath(import.meta.url));\n\nfunction createMocks() {\n  const mocks = {\n    stdout: '',\n    stderr: '',\n    code: null,\n    stdin: {\n      data: null,\n      error: null,\n      end: null,\n    },\n    process: {\n      cwd: mock.fn(() => '/cwd'),\n      env: [],\n      argv: [],\n      stdout: {\n        write: mock.fn((str) => { mocks.stdout += str; }),\n      },\n      stderr: {\n        write: mock.fn((str) => { mocks.stderr += str; }),\n      },\n      stdin: {\n        setEncoding: mock.fn(),\n        on: mock.fn((method, func) => {\n          mocks.stdin[method] = func;\n        }),\n        resume: mock.fn(),\n      },\n      exit: mock.fn((code) => { mocks.code = code; }),\n    },\n  };\n\n  return mocks;\n}\n\nfunction testInput({ args = [], stdin = '', stdinError = '', stdout = '', stderr = '', code = 0 } = {}) {\n  return async() => {\n    const mocks = createMocks();\n    mocks.process.argv = ['node', 'marked', ...args];\n    const mainPromise = main(mocks.process);\n    if (typeof mocks.stdin.end === 'function') {\n      if (stdin) {\n        mocks.stdin.data(stdin);\n      }\n      if (stdinError) {\n        mocks.stdin.error(stdinError);\n      }\n      mocks.stdin.end();\n    }\n    await mainPromise;\n\n    assert.ok(await htmlIsEqual(mocks.stdout, stdout));\n    assert.strictEqual(mocks.stderr, stderr);\n    assert.strictEqual(mocks.code, code);\n  };\n}\n\nfunction fixturePath(filePath) {\n  return resolve(__dirname, './fixtures', filePath);\n}\n\ndescribe('bin/marked', () => {\n  describe('string', () => {\n    it('-s', testInput({\n      args: ['-s', '# test'],\n      stdout: '<h1>test</h1>',\n    }));\n\n    it('--string', testInput({\n      args: ['--string', '# test'],\n      stdout: '<h1>test</h1>',\n    }));\n  });\n\n  describe('config', () => {\n    it('-c', testInput({\n      args: ['-c', fixturePath('bin-config.js'), '-s', 'line1\\nline2'],\n      stdout: '<p>line1<br>line2</p>',\n    }));\n\n    it('--config', testInput({\n      args: ['--config', fixturePath('bin-config.js'), '-s', 'line1\\nline2'],\n      stdout: '<p>line1<br>line2</p>',\n    }));\n\n    it('config not found', testInput({\n      args: ['--config', fixturePath('does-not-exist.js'), '-s', 'line1\\nline2'],\n      stderr: `Cannot load config file '${fixturePath('does-not-exist.js')}'`,\n      code: 1,\n    }));\n  });\n\n  describe('input', () => {\n    it('input file not found', testInput({\n      args: [fixturePath('does-not-exist.md')],\n      stderr: `marked: ${fixturePath('does-not-exist.md')}: No such file or directory`,\n      code: 1,\n    }));\n\n    it('input file not found --input', testInput({\n      args: ['--input', fixturePath('does-not-exist.md')],\n      stderr: `marked: ${fixturePath('does-not-exist.md')}: No such file or directory`,\n      code: 1,\n    }));\n  });\n});\n"
  },
  {
    "path": "test/unit/fixtures/bin-config.js",
    "content": "export default {\n  breaks: true,\n};\n"
  },
  {
    "path": "test/unit/instance.test.js",
    "content": "import { marked, Marked, Renderer, Tokenizer, Hooks } from '../../lib/marked.esm.js';\nimport { describe, it, beforeEach } from 'node:test';\nimport assert from 'node:assert';\n\ndescribe('Marked', () => {\n  it('should allow multiple instances', () => {\n    const marked1 = new Marked({\n      silent: true,\n      renderer: {\n        heading() {\n          return 'im marked1';\n        },\n      },\n    });\n\n    const marked2 = new Marked({\n      silent: true,\n      renderer: {\n        heading() {\n          return 'im marked2';\n        },\n      },\n    });\n\n    assert.strictEqual(marked1.parse('# header'), 'im marked1');\n    assert.strictEqual(marked2.parse('# header'), 'im marked2');\n    assert.strictEqual(marked.parse('# header'), '<h1>header</h1>\\n');\n  });\n\n  it('should work with use', () => {\n    const marked1 = new Marked();\n    marked1.use({\n      silent: true,\n      renderer: {\n        heading() {\n          return 'im marked1';\n        },\n      },\n    });\n\n    const marked2 = new Marked();\n    marked2.use({\n      silent: true,\n      renderer: {\n        heading() {\n          return 'im marked2';\n        },\n      },\n    });\n\n    assert.strictEqual(marked1.parse('# header'), 'im marked1');\n    assert.strictEqual(marked2.parse('# header'), 'im marked2');\n    assert.strictEqual(marked.parse('# header'), '<h1>header</h1>\\n');\n  });\n\n  it('should work with setOptions', () => {\n    const marked1 = new Marked();\n    const marked1Renderer = new Renderer();\n    marked1Renderer.heading = () => 'im marked1';\n    marked1.setOptions({\n      silent: true,\n      renderer: marked1Renderer,\n    });\n\n    const marked2 = new Marked();\n    const marked2Renderer = new Renderer();\n    marked2Renderer.heading = () => 'im marked2';\n    marked2.setOptions({\n      silent: true,\n      renderer: marked2Renderer,\n    });\n\n    assert.strictEqual(marked1.parse('# header'), 'im marked1');\n    assert.strictEqual(marked2.parse('# header'), 'im marked2');\n    assert.strictEqual(marked.parse('# header'), '<h1>header</h1>\\n');\n  });\n\n  it('should pass defaults to lexer and parser', () => {\n    const marked1 = new Marked();\n    marked1.use({\n      renderer: {\n        heading() {\n          return 'test';\n        },\n      },\n    });\n    const tokens = marked1.lexer('# hi');\n    const html = marked1.parser(tokens);\n\n    assert.strictEqual(html, 'test');\n  });\n\n  describe('use class objects', () => {\n    beforeEach(() => {\n      marked.setOptions(marked.getDefaults());\n    });\n\n    it('allow new Renderer()', () => {\n      const marked1 = new Marked();\n      const newRenderer = new Renderer();\n      newRenderer.heading = () => 'im marked renderer';\n\n      marked1.use({ renderer: newRenderer });\n      marked.use({ renderer: newRenderer });\n\n      assert.strictEqual(marked1.parse('# header'), 'im marked renderer');\n      assert.strictEqual(marked.parse('# header'), 'im marked renderer');\n    });\n\n    it('allow new Tokenizer()', () => {\n      const marked1 = new Marked();\n      const newTokenizer = new Tokenizer();\n      newTokenizer.heading = function(src) {\n        return {\n          type: 'heading',\n          raw: src,\n          depth: 1,\n          text: 'im marked tokenizer',\n          tokens: this.lexer.inlineTokens('im marked tokenizer'),\n        };\n      };\n\n      marked1.use({ tokenizer: newTokenizer });\n      marked.use({ tokenizer: newTokenizer });\n\n      assert.strictEqual(marked1.parse('# header'), '<h1>im marked tokenizer</h1>\\n');\n      assert.strictEqual(marked.parse('# header'), '<h1>im marked tokenizer</h1>\\n');\n    });\n\n    it('allow new Hooks()', () => {\n      const marked1 = new Marked();\n      const newHooks = new Hooks();\n      newHooks.preprocess = () => 'im marked hooks';\n\n      marked1.use({ hooks: newHooks });\n      marked.use({ hooks: newHooks });\n\n      assert.strictEqual(marked1.parse('# header'), '<p>im marked hooks</p>\\n');\n      assert.strictEqual(marked.parse('# header'), '<p>im marked hooks</p>\\n');\n    });\n  });\n});\n"
  },
  {
    "path": "test/unit/marked.test.js",
    "content": "import { Marked, Renderer, lexer, parseInline, getDefaults, walkTokens, defaults, setOptions } from '../../lib/marked.esm.js';\nimport { timeout } from './utils.js';\nimport assert from 'node:assert';\nimport { describe, it, beforeEach, mock } from 'node:test';\n\ndescribe('marked unit', () => {\n  let marked;\n  beforeEach(() => {\n    marked = new Marked();\n    setOptions(getDefaults());\n  });\n\n  describe('Test paragraph token type', () => {\n    it('should use the \"paragraph\" type on top level', () => {\n      const md = 'A Paragraph.\\n\\n> A blockquote\\n\\n- list item\\n';\n\n      const tokens = lexer(md);\n\n      assert.strictEqual(tokens[0].type, 'paragraph');\n      assert.strictEqual(tokens[2].tokens[0].type, 'paragraph');\n      assert.strictEqual(tokens[4].items[0].tokens[0].type, 'text');\n    });\n  });\n\n  describe('changeDefaults', () => {\n    it('should change global defaults', async() => {\n      const { defaults, setOptions } = await import('../../lib/marked.esm.js');\n      assert.ok(!defaults.test);\n      setOptions({ test: true });\n      assert.ok((await import('../../lib/marked.esm.js')).defaults.test);\n    });\n  });\n\n  describe('inlineLexer', () => {\n    it('should send html to renderer.html', () => {\n      const renderer = new Renderer();\n      mock.method(renderer, 'html');\n      const md = 'HTML Image: <img alt=\"MY IMAGE\" src=\"example.png\" />';\n      marked.parse(md, { renderer });\n\n      assert.strictEqual(renderer.html.mock.calls[0].arguments[0].raw, '<img alt=\"MY IMAGE\" src=\"example.png\" />');\n    });\n  });\n\n  describe('task', () => {\n    it('space after checkbox', () => {\n      const html = marked.parse('- [ ] item');\n\n      assert.strictEqual(html, '<ul>\\n<li><input disabled=\"\" type=\"checkbox\"> item</li>\\n</ul>\\n');\n    });\n\n    it('space after loose checkbox', () => {\n      const html = marked.parse('- [ ] item 1\\n\\n- [ ] item 2');\n\n      assert.strictEqual(html, '<ul>\\n<li><p><input disabled=\"\" type=\"checkbox\"> item 1</p>\\n</li>\\n<li><p><input disabled=\"\" type=\"checkbox\"> item 2</p>\\n</li>\\n</ul>\\n');\n    });\n  });\n\n  describe('parseInline', () => {\n    it('should parse inline tokens', () => {\n      const md = '**strong** _em_';\n      const html = parseInline(md);\n\n      assert.strictEqual(html, '<strong>strong</strong> <em>em</em>');\n    });\n\n    it('should not parse block tokens', () => {\n      const md = '# header\\n\\n_em_';\n      const html = parseInline(md);\n\n      assert.strictEqual(html, '# header\\n\\n<em>em</em>');\n    });\n  });\n\n  describe('use extension', () => {\n    it('should use custom block tokenizer + renderer extensions', () => {\n      const underline = {\n        name: 'underline',\n        level: 'block',\n        tokenizer(src) {\n          const rule = /^:([^\\n]*)(?:\\n|$)/;\n          const match = rule.exec(src);\n          if (match) {\n            return {\n              type: 'underline',\n              raw: match[0], // This is the text that you want your token to consume from the source\n              text: match[1].trim(), // You can add additional properties to your tokens to pass along to the renderer\n            };\n          }\n        },\n        renderer(token) {\n          return `<u>${token.text}</u>\\n`;\n        },\n      };\n      marked.use({ extensions: [underline] });\n      let html = marked.parse('Not Underlined\\n:Underlined\\nNot Underlined');\n      assert.strictEqual(html, '<p>Not Underlined\\n:Underlined\\nNot Underlined</p>\\n');\n\n      html = marked.parse('Not Underlined\\n\\n:Underlined\\n\\nNot Underlined');\n      assert.strictEqual(html, '<p>Not Underlined</p>\\n<u>Underlined</u>\\n<p>Not Underlined</p>\\n');\n    });\n\n    it('should interrupt paragraphs if using \"start\" property', () => {\n      const underline = {\n        extensions: [{\n          name: 'underline',\n          level: 'block',\n          start(src) { return src.indexOf(':'); },\n          tokenizer(src) {\n            const rule = /^:([^\\n]*):(?:\\n|$)/;\n            const match = rule.exec(src);\n            if (match) {\n              return {\n                type: 'underline',\n                raw: match[0], // This is the text that you want your token to consume from the source\n                text: match[1].trim(), // You can add additional properties to your tokens to pass along to the renderer\n              };\n            }\n          },\n          renderer(token) {\n            return `<u>${token.text}</u>\\n`;\n          },\n        }],\n      };\n      marked.use(underline);\n      const html = marked.parse('Not Underlined A\\n:Underlined B:\\nNot Underlined C\\n:Not Underlined D');\n      assert.strictEqual(html, '<p>Not Underlined A</p>\\n<u>Underlined B</u>\\n<p>Not Underlined C\\n:Not Underlined D</p>\\n');\n    });\n\n    it('should not return list if no items', () => {\n      const noHr = {\n        tokenizer: {\n          hr() {\n            return undefined;\n          },\n        },\n      };\n      marked.use(noHr);\n      const markdown = '- - -';\n      const html = marked.parse(markdown);\n      assert.strictEqual(html, '<p>- - -</p>\\n');\n    });\n\n    it('should use custom inline tokenizer + renderer extensions', () => {\n      const underline = {\n        name: 'underline',\n        level: 'inline',\n        start(src) { return src.indexOf('='); },\n        tokenizer(src) {\n          const rule = /^=([^=]+)=/;\n          const match = rule.exec(src);\n          if (match) {\n            return {\n              type: 'underline',\n              raw: match[0], // This is the text that you want your token to consume from the source\n              text: match[1].trim(), // You can add additional properties to your tokens to pass along to the renderer\n            };\n          }\n        },\n        renderer(token) {\n          return `<u>${token.text}</u>`;\n        },\n      };\n      marked.use({ extensions: [underline] });\n      const html = marked.parse('Not Underlined =Underlined= Not Underlined');\n      assert.strictEqual(html, '<p>Not Underlined <u>Underlined</u> Not Underlined</p>\\n');\n    });\n\n    it('should ignore em termination characters when emStrongMask hook is in place', () => {\n      const underline = {\n        name: 'underline',\n        level: 'inline',\n        start(src) { return src.indexOf('='); },\n        tokenizer(src) {\n          const rule = /^=([^=]+)=/;\n          const match = rule.exec(src);\n          if (match) {\n            return {\n              type: 'underline',\n              raw: match[0], // This is the text that you want your token to consume from the source\n              text: match[1].trim(), // You can add additional properties to your tokens to pass along to the renderer\n            };\n          }\n        },\n        renderer(token) {\n          return `<u>${token.text}</u>`;\n        },\n      };\n      marked.use({\n        hooks: {\n          // Underline takes priority over emphasis in this example, to mask emphasis markers inside underline tags\n          emStrongMask: (src) => src.replace(/=([^=]+)=/g, (match) => `[${'a'.repeat(match.length - 2)}]`),\n        },\n        extensions: [underline],\n      });\n      const html = marked.parse('*Not Underlined =Underlined* with *asterisk= Not Underlined*');\n      assert.strictEqual(html, '<p><em>Not Underlined <u>Underlined* with *asterisk</u> Not Underlined</em></p>\\n');\n    });\n\n    it('should combine multiple emStrongMask hooks', () => {\n      const maskEqualSign = (src) => src.replace(/=([^=]+)=/g, (match) => `[${'a'.repeat(match.length - 2)}]`);\n      const maskDollarSign = (src) => src.replace(/\\$([^$]+)\\$/g, (match) => `[${'b'.repeat(match.length - 2)}]`);\n      marked.use({ hooks: { emStrongMask: maskEqualSign } });\n      marked.use({ hooks: { emStrongMask: maskDollarSign } });\n      const html = marked.parse('*Before $dollar * dollar$ =equal * equal= after*');\n      assert.strictEqual(html, '<p><em>Before $dollar * dollar$ =equal * equal= after</em></p>\\n');\n    });\n\n    it('should handle interacting block and inline extensions', () => {\n      const descriptionlist = {\n        name: 'descriptionList',\n        level: 'block',\n        start(src) {\n          const match = src.match(/:[^:\\n]/);\n          if (match) {\n            return match.index;\n          }\n        },\n        tokenizer(src, tokens) {\n          const rule = /^(?::[^:\\n]+:[^:\\n]*(?:\\n|$))+/;\n          const match = rule.exec(src);\n          if (match) {\n            const token = {\n              type: 'descriptionList',\n              raw: match[0], // This is the text that you want your token to consume from the source\n              text: match[0].trim(), // You can add additional properties to your tokens to pass along to the renderer\n              tokens: [],\n            };\n            this.lexer.inlineTokens(token.text, token.tokens);\n            return token;\n          }\n        },\n        renderer(token) {\n          return `<dl>${this.parser.parseInline(token.tokens)}\\n</dl>`;\n        },\n      };\n\n      const description = {\n        name: 'description',\n        level: 'inline',\n        start(src) { return src.indexOf(':'); },\n        tokenizer(src, tokens) {\n          const rule = /^:([^:\\n]+):([^:\\n]*)(?:\\n|$)/;\n          const match = rule.exec(src);\n          if (match) {\n            const token = {\n              type: 'description',\n              raw: match[0],\n              dt: [],\n              dd: [],\n            };\n            this.lexer.inline(match[1].trim(), token.dt);\n            this.lexer.inline(match[2].trim(), token.dd);\n            return token;\n          }\n        },\n        renderer(token) {\n          return `\\n<dt>${this.parser.parseInline(token.dt)}</dt><dd>${this.parser.parseInline(token.dd)}</dd>`;\n        },\n      };\n      marked.use({ extensions: [descriptionlist, description] });\n      const html = marked.parse('A Description List with One Description:\\n'\n                      + ':   Topic 1   :  Description 1\\n'\n                      + ': **Topic 2** : *Description 2*');\n      assert.strictEqual(html, '<p>A Description List with One Description:</p>\\n'\n                           + '<dl>'\n                           + '\\n<dt>Topic 1</dt><dd>Description 1</dd>'\n                           + '\\n<dt><strong>Topic 2</strong></dt><dd><em>Description 2</em></dd>'\n                           + '\\n</dl>');\n    });\n\n    it('should allow other options mixed into the extension', () => {\n      const extension = {\n        name: 'underline',\n        level: 'block',\n        start(src) { return src.indexOf(':'); },\n        tokenizer(src) {\n          const rule = /^:([^\\n]*):(?:\\n|$)/;\n          const match = rule.exec(src);\n          if (match) {\n            return {\n              type: 'underline',\n              raw: match[0], // This is the text that you want your token to consume from the source\n              text: match[1].trim(), // You can add additional properties to your tokens to pass along to the renderer\n            };\n          }\n        },\n        renderer(token) {\n          return `<u>${token.text}</u>\\n`;\n        },\n      };\n      marked.use({ silent: true, extensions: [extension] });\n      const html = marked.parse(':test:\\ntest\\n<div></div>');\n      assert.strictEqual(html, '<u>test</u>\\n<p>test</p>\\n<div></div>');\n    });\n\n    it('should handle renderers that return false', () => {\n      const extension = {\n        name: 'test',\n        level: 'block',\n        tokenizer(src) {\n          const rule = /^:([^\\n]*):(?:\\n|$)/;\n          const match = rule.exec(src);\n          if (match) {\n            return {\n              type: 'test',\n              raw: match[0], // This is the text that you want your token to consume from the source\n              text: match[1].trim(), // You can add additional properties to your tokens to pass along to the renderer\n            };\n          }\n        },\n        renderer(token) {\n          if (token.text === 'test') {\n            return 'test';\n          }\n          return false;\n        },\n      };\n      const fallbackRenderer = {\n        name: 'test',\n        level: 'block',\n        renderer(token) {\n          if (token.text === 'Test') {\n            return 'fallback';\n          }\n          return false;\n        },\n      };\n      marked.use({ extensions: [fallbackRenderer, extension] });\n      const html = marked.parse(':Test:\\n\\n:test:\\n\\n:none:');\n      assert.strictEqual(html, 'fallbacktest');\n    });\n\n    it('should fall back when tokenizers return false', () => {\n      const extension = {\n        name: 'test',\n        level: 'block',\n        tokenizer(src) {\n          const rule = /^:([^\\n]*):(?:\\n|$)/;\n          const match = rule.exec(src);\n          if (match) {\n            return {\n              type: 'test',\n              raw: match[0], // This is the text that you want your token to consume from the source\n              text: match[1].trim(), // You can add additional properties to your tokens to pass along to the renderer\n            };\n          }\n          return false;\n        },\n        renderer(token) {\n          return token.text;\n        },\n      };\n      const extension2 = {\n        name: 'test',\n        level: 'block',\n        tokenizer(src) {\n          const rule = /^:([^\\n]*):(?:\\n|$)/;\n          const match = rule.exec(src);\n          if (match) {\n            if (match[1].match(/^[A-Z]/)) {\n              return {\n                type: 'test',\n                raw: match[0],\n                text: match[1].trim().toUpperCase(),\n              };\n            }\n          }\n          return false;\n        },\n      };\n      marked.use({ extensions: [extension, extension2] });\n      const html = marked.parse(':Test:\\n\\n:test:');\n      assert.strictEqual(html, 'TESTtest');\n    });\n\n    it('should override original tokenizer/renderer with same name, but fall back if returns false', () => {\n      const extension = {\n        extensions: [{\n          name: 'heading',\n          level: 'block',\n          tokenizer(src) {\n            return false; // fall back to default `heading` tokenizer\n          },\n          renderer(token) {\n            return '<h' + token.depth + '>' + token.text + ' RENDERER EXTENSION</h' + token.depth + '>\\n';\n          },\n        },\n        {\n          name: 'code',\n          level: 'block',\n          tokenizer(src) {\n            const rule = /^:([^\\n]*):(?:\\n|$)/;\n            const match = rule.exec(src);\n            if (match) {\n              return {\n                type: 'code',\n                raw: match[0],\n                text: match[1].trim() + ' TOKENIZER EXTENSION',\n              };\n            }\n          },\n          renderer(token) {\n            return false; // fall back to default `code` renderer\n          },\n        }],\n      };\n      marked.use(extension);\n      const html = marked.parse('# extension1\\n:extension2:');\n      assert.strictEqual(html, '<h1>extension1 RENDERER EXTENSION</h1>\\n<pre><code>extension2 TOKENIZER EXTENSION\\n</code></pre>\\n');\n    });\n\n    it('should walk only specified child tokens', () => {\n      const walkableDescription = {\n        extensions: [{\n          name: 'walkableDescription',\n          level: 'inline',\n          start(src) { return src.indexOf(':'); },\n          tokenizer(src, tokens) {\n            const rule = /^:([^:\\n]+):([^:\\n]*)(?:\\n|$)/;\n            const match = rule.exec(src);\n            if (match) {\n              const token = {\n                type: 'walkableDescription',\n                raw: match[0],\n                dt: this.lexer.inline(match[1].trim()),\n                dd: [],\n                tokens: [],\n              };\n              this.lexer.inline(match[2].trim(), token.dd);\n              this.lexer.inline('unwalked', token.tokens);\n              return token;\n            }\n          },\n          renderer(token) {\n            return `\\n<dt>${this.parser.parseInline(token.dt)} - ${this.parser.parseInline(token.tokens)}</dt><dd>${this.parser.parseInline(token.dd)}</dd>`;\n          },\n          childTokens: ['dd', 'dt'],\n        }],\n        walkTokens(token) {\n          if (token.type === 'text') {\n            token.text += ' walked';\n          }\n        },\n      };\n      marked.use(walkableDescription);\n      const html = marked.parse(':   Topic 1   :  Description 1\\n'\n                      + ': **Topic 2** : *Description 2*');\n      assert.strictEqual(html, '<p>\\n<dt>Topic 1 walked - unwalked</dt><dd>Description 1 walked</dd>'\n                    + '\\n<dt><strong>Topic 2 walked</strong> - unwalked</dt><dd><em>Description 2 walked</em></dd></p>\\n');\n    });\n\n    it('should walk child token arrays', () => {\n      const walkableDescription = {\n        extensions: [{\n          name: 'walkableDescription',\n          level: 'inline',\n          start(src) { return src.indexOf(':'); },\n          tokenizer(src, tokens) {\n            const rule = /^:([^:\\n]+):([^:\\n]*)(?:\\n|$)/;\n            const match = rule.exec(src);\n            if (match) {\n              const token = {\n                type: 'walkableDescription',\n                raw: match[0],\n                dt: [this.lexer.inline(match[1].trim())],\n                dd: [[this.lexer.inline(match[2].trim())]],\n              };\n              return token;\n            }\n          },\n          renderer(token) {\n            return `\\n<dt>${this.parser.parseInline(token.dt[0])}</dt><dd>${this.parser.parseInline(token.dd[0][0])}</dd>`;\n          },\n          childTokens: ['dd', 'dt'],\n        }],\n        walkTokens(token) {\n          if (token.type === 'text') {\n            token.text += ' walked';\n          }\n        },\n      };\n      marked.use(walkableDescription);\n      const html = marked.parse(':   Topic 1   :  Description 1\\n'\n                      + ': **Topic 2** : *Description 2*');\n      assert.strictEqual(html, '<p>\\n<dt>Topic 1 walked</dt><dd>Description 1 walked</dd>'\n                    + '\\n<dt><strong>Topic 2 walked</strong></dt><dd><em>Description 2 walked</em></dd></p>\\n');\n    });\n\n    describe('multiple extensions', () => {\n      function createExtension(name) {\n        return {\n          extensions: [{\n            name: `block-${name}`,\n            level: 'block',\n            start(src) { return src.indexOf('::'); },\n            tokenizer(src, tokens) {\n              if (src.startsWith(`::${name}\\n`)) {\n                const text = `:${name}`;\n                const token = {\n                  type: `block-${name}`,\n                  raw: `::${name}\\n`,\n                  text,\n                  tokens: [],\n                };\n                this.lexer.inline(token.text, token.tokens);\n                return token;\n              }\n            },\n            renderer(token) {\n              return `<${token.type}>${this.parser.parseInline(token.tokens)}</${token.type}>\\n`;\n            },\n          }, {\n            name: `inline-${name}`,\n            level: 'inline',\n            start(src) { return src.indexOf(':'); },\n            tokenizer(src, tokens) {\n              if (src.startsWith(`:${name}`)) {\n                return {\n                  type: `inline-${name}`,\n                  raw: `:${name}`,\n                  text: `used ${name}`,\n                };\n              }\n            },\n            renderer(token) {\n              return token.text;\n            },\n          }],\n          tokenizer: {\n            heading(src) {\n              if (src.startsWith(`# ${name}`)) {\n                const token = {\n                  type: 'heading',\n                  raw: `# ${name}`,\n                  text: `used ${name}`,\n                  depth: 1,\n                  tokens: [],\n                };\n                this.lexer.inline(token.text, token.tokens);\n                return token;\n              }\n              return false;\n            },\n          },\n          useNewRenderer: true,\n          renderer: {\n            heading({ text, depth }) {\n              if (text === name) {\n                return `<h${depth}>${text}</h${depth}>\\n`;\n              }\n              return false;\n            },\n          },\n          walkTokens(token) {\n            if (token.text === `used ${name}`) {\n              token.text += ' walked';\n            }\n          },\n        };\n      }\n\n      function createFalseExtension(name) {\n        return {\n          extensions: [{\n            name: `block-${name}`,\n            level: 'block',\n            start(src) { return src.indexOf('::'); },\n            tokenizer(src, tokens) {\n              return false;\n            },\n            renderer(token) {\n              return false;\n            },\n          }, {\n            name: `inline-${name}`,\n            level: 'inline',\n            start(src) { return src.indexOf(':'); },\n            tokenizer(src, tokens) {\n              return false;\n            },\n            renderer(token) {\n              return false;\n            },\n          }],\n        };\n      }\n\n      function runTest() {\n        const html = marked.parse(`\n::extension1\n::extension2\n\n:extension1\n:extension2\n\n# extension1\n\n# extension2\n\n# no extension\n`);\n\n        assert.strictEqual(`\\n${html}\\n`.replace(/\\n+/g, '\\n'), `\n<block-extension1>used extension1 walked</block-extension1>\n<block-extension2>used extension2 walked</block-extension2>\n<p>used extension1 walked\nused extension2 walked</p>\n<h1>used extension1 walked</h1>\n<h1>used extension2 walked</h1>\n<h1>no extension</h1>\n`);\n      }\n\n      it('should merge extensions when calling marked.use multiple times', () => {\n        marked.use(createExtension('extension1'));\n        marked.use(createExtension('extension2'));\n\n        runTest();\n      });\n\n      it('should merge extensions when calling marked.use with multiple extensions', () => {\n        marked.use(\n          createExtension('extension1'),\n          createExtension('extension2'),\n        );\n\n        runTest();\n      });\n\n      it('should fall back to any extensions with the same name if the first returns false', () => {\n        marked.use(\n          createExtension('extension1'),\n          createExtension('extension2'),\n          createFalseExtension('extension1'),\n          createFalseExtension('extension2'),\n        );\n\n        runTest();\n      });\n\n      it('should merge extensions correctly', () => {\n        marked.use(\n          {},\n          { tokenizer: {} },\n          { renderer: {} },\n          { walkTokens: () => {} },\n          { extensions: [] },\n        );\n\n        // should not throw\n        marked.parse('# test');\n      });\n    });\n\n    it('should be async if any extension in use args is async', () => {\n      marked.use(\n        { async: true },\n        { async: false },\n      );\n\n      assert.ok(marked.defaults.async);\n    });\n\n    it('should be async if any extension in use is async', () => {\n      marked.use({ async: true });\n      marked.use({ async: false });\n\n      assert.ok(marked.defaults.async);\n    });\n\n    it('should reset async with setOptions', () => {\n      marked.use({ async: true });\n      setOptions({ async: false });\n\n      assert.ok(!defaults.async);\n    });\n\n    it('should return Promise if async', () => {\n      assert.ok(marked.parse('test', { async: true }) instanceof Promise);\n    });\n\n    it('should return string if not async', () => {\n      assert.strictEqual(typeof marked.parse('test', { async: false }), 'string');\n    });\n\n    it('should throw an error if async is set by extension', () => {\n      marked.use({ async: true });\n\n      assert.throws(() => marked.parse('test', { async: false }));\n    });\n\n    it('should ignore em termination characters when emStrongMask hook is in place in an async context', async() => {\n      const underline = {\n        name: 'underline',\n        level: 'inline',\n        start(src) { return src.indexOf('='); },\n        tokenizer(src) {\n          const rule = /^=([^=]+)=/;\n          const match = rule.exec(src);\n          if (match) {\n            return {\n              type: 'underline',\n              raw: match[0], // This is the text that you want your token to consume from the source\n              text: match[1].trim(), // You can add additional properties to your tokens to pass along to the renderer\n            };\n          }\n        },\n        renderer(token) {\n          return `<u>${token.text}</u>`;\n        },\n      };\n      marked.use({\n        hooks: {\n          // Underline takes priority over emphasis in this example, to mask emphasis markers inside underline tags\n          emStrongMask: (src) => src.replace(/=([^=]+)=/g, (match) => `[${'a'.repeat(match.length - 2)}]`),\n        },\n        extensions: [underline],\n        async: true,\n      });\n      const html = await marked.parse('*Not Underlined =Underlined* with *asterisk= Not Underlined*');\n      assert.strictEqual(html, '<p><em>Not Underlined <u>Underlined* with *asterisk</u> Not Underlined</em></p>\\n');\n    });\n\n    it('should allow deleting/editing tokens', () => {\n      const styleTags = {\n        extensions: [{\n          name: 'inlineStyleTag',\n          level: 'inline',\n          start(src) {\n            const match = src.match(/ *{[^\\{]/);\n            if (match) {\n              return match.index;\n            }\n          },\n          tokenizer(src, tokens) {\n            const rule = /^ *{([^\\{\\}\\n]+)}$/;\n            const match = rule.exec(src);\n            if (match) {\n              return {\n                type: 'inlineStyleTag',\n                raw: match[0], // This is the text that you want your token to consume from the source\n                text: match[1],\n              };\n            }\n          },\n        },\n        {\n          name: 'styled',\n          renderer(token) {\n            token.type = token.originalType;\n            const text = this.parser.parse([token]);\n            const openingTag = /(<[^\\s<>]+)([^\\n<>]*>.*)/s.exec(text);\n            if (openingTag) {\n              return `${openingTag[1]} ${token.style}${openingTag[2]}`;\n            }\n            return text;\n          },\n        }],\n        walkTokens(token) {\n          if (token.tokens) {\n            const finalChildToken = token.tokens.at(-1);\n            if (finalChildToken?.type === 'inlineStyleTag') {\n              token.originalType = token.type;\n              token.type = 'styled';\n              token.style = `style=\"color:${finalChildToken.text};\"`;\n              token.tokens.pop();\n            }\n          }\n        },\n      };\n      marked.use(styleTags);\n      const html = marked.parse('This is a *paragraph* with blue text. {blue}\\n'\n                      + '# This is a *header* with red text {red}');\n      assert.strictEqual(html, '<p style=\"color:blue;\">This is a <em>paragraph</em> with blue text.</p>\\n'\n                           + '<h1 style=\"color:red;\">This is a <em>header</em> with red text</h1>\\n');\n    });\n\n    it('should use renderer', () => {\n      const extension = {\n        useNewRenderer: true,\n        renderer: {\n          paragraph() {\n            return 'extension';\n          },\n        },\n      };\n      mock.method(extension.renderer, 'paragraph');\n      marked.use(extension);\n      const html = marked.parse('text');\n      assert.strictEqual(extension.renderer.paragraph.mock.calls[0].arguments[0].raw, 'text');\n      assert.strictEqual(html, 'extension');\n    });\n\n    it('should use tokenizer', () => {\n      const extension = {\n        tokenizer: {\n          paragraph(text) {\n            const token = {\n              type: 'paragraph',\n              raw: text,\n              text: 'extension',\n              tokens: [],\n            };\n            this.lexer.inline(token.text, token.tokens);\n            return token;\n          },\n        },\n      };\n      mock.method(extension.tokenizer, 'paragraph');\n      marked.use(extension);\n      const html = marked.parse('text');\n      assert.strictEqual(extension.tokenizer.paragraph.mock.calls[0].arguments[0], 'text');\n      assert.strictEqual(html, '<p>extension</p>\\n');\n    });\n\n    it('should use walkTokens', () => {\n      let walked = 0;\n      const extension = {\n        walkTokens(token) {\n          walked++;\n        },\n      };\n      marked.use(extension);\n      marked.parse('text');\n      assert.strictEqual(walked, 2);\n    });\n\n    it('should use options from extension', () => {\n      const extension = {\n        breaks: true,\n      };\n      marked.use(extension);\n      const html = marked.parse('line1\\nline2');\n      assert.strictEqual(html, '<p>line1<br>line2</p>\\n');\n    });\n\n    it('should call all walkTokens in reverse order', () => {\n      let walkedOnce = 0;\n      let walkedTwice = 0;\n      const extension1 = {\n        walkTokens(token) {\n          if (token.walkedOnce) {\n            walkedTwice++;\n          }\n        },\n      };\n      const extension2 = {\n        walkTokens(token) {\n          walkedOnce++;\n          token.walkedOnce = true;\n        },\n      };\n      marked.use(extension1);\n      marked.use(extension2);\n      marked.parse('text');\n      assert.strictEqual(walkedOnce, 2);\n      assert.strictEqual(walkedTwice, 2);\n    });\n\n    it('should use last extension function and not override others', () => {\n      const extension1 = {\n        useNewRenderer: true,\n        renderer: {\n          paragraph() {\n            return 'extension1 paragraph\\n';\n          },\n          html() {\n            return 'extension1 html\\n';\n          },\n        },\n      };\n      const extension2 = {\n        useNewRenderer: true,\n        renderer: {\n          paragraph() {\n            return 'extension2 paragraph\\n';\n          },\n        },\n      };\n      marked.use(extension1);\n      marked.use(extension2);\n      const html = marked.parse(`\nparagraph\n\n<html />\n\n# heading\n`);\n      assert.strictEqual(html, 'extension2 paragraph\\nextension1 html\\n<h1>heading</h1>\\n');\n    });\n\n    it('should use previous extension when returning false', () => {\n      const extension1 = {\n        useNewRenderer: true,\n        renderer: {\n          paragraph({ text }) {\n            if (text !== 'original') {\n              return 'extension1 paragraph\\n';\n            }\n            return false;\n          },\n        },\n      };\n      const extension2 = {\n        useNewRenderer: true,\n        renderer: {\n          paragraph({ text }) {\n            if (text !== 'extension1' && text !== 'original') {\n              return 'extension2 paragraph\\n';\n            }\n            return false;\n          },\n        },\n      };\n      marked.use(extension1);\n      marked.use(extension2);\n      const html = marked.parse(`\nparagraph\n\nextension1\n\noriginal\n`);\n      assert.strictEqual(html, 'extension2 paragraph\\nextension1 paragraph\\n<p>original</p>\\n');\n    });\n\n    it('should get options with this.options', () => {\n      const extension = {\n        useNewRenderer: true,\n        renderer: {\n          heading: () => {\n            return this && this.options ? 'arrow options\\n' : 'arrow no options\\n';\n          },\n          html: function() {\n            return this.options ? 'function options\\n' : 'function no options\\n';\n          },\n          paragraph() {\n            return this.options ? 'shorthand options\\n' : 'shorthand no options\\n';\n          },\n        },\n      };\n      marked.use(extension);\n      const html = marked.parse(`\n# heading\n\n<html />\n\nparagraph\n`);\n      assert.strictEqual(html, 'arrow no options\\nfunction options\\nshorthand options\\n');\n    });\n  });\n\n  describe('walkTokens', () => {\n    it('should walk over every token', () => {\n      const markdown = `\nparagraph\n\n---\n\n# heading\n\n\\`\\`\\`\ncode\n\\`\\`\\`\n\n| a | b |\n|---|---|\n| 1 | 2 |\n| 3 | 4 |\n\n> blockquote\n\n- list\n\n<div>html</div>\n\n[link](https://example.com)\n\n![image](https://example.com/image.jpg)\n\n**strong**\n\n*em*\n\n\\`codespan\\`\n\n~~del~~\n\nbr\nbr\n`;\n      const tokens = lexer(markdown, { ...getDefaults(), breaks: true });\n      const tokensSeen = [];\n      walkTokens(tokens, (token) => {\n        tokensSeen.push([token.type, (token.raw || '').replace(/\\n/g, '')]);\n      });\n\n      assert.deepEqual(tokensSeen, [\n        ['space', ''],\n        ['paragraph', 'paragraph'],\n        ['text', 'paragraph'],\n        ['space', ''],\n        ['hr', '---'],\n        ['space', ''],\n        ['heading', '# heading'],\n        ['text', 'heading'],\n        ['code', '```code```'],\n        ['space', ''],\n        ['table', '| a | b ||---|---|| 1 | 2 || 3 | 4 |'],\n        ['text', 'a'],\n        ['text', 'b'],\n        ['text', '1'],\n        ['text', '2'],\n        ['text', '3'],\n        ['text', '4'],\n        ['blockquote', '> blockquote'],\n        ['paragraph', 'blockquote'],\n        ['text', 'blockquote'],\n        ['space', ''],\n        ['list', '- list'],\n        ['list_item', '- list'],\n        ['text', 'list'],\n        ['text', 'list'],\n        ['space', ''],\n        ['html', '<div>html</div>'],\n        ['paragraph', '[link](https://example.com)'],\n        ['link', '[link](https://example.com)'],\n        ['text', 'link'],\n        ['space', ''],\n        ['paragraph', '![image](https://example.com/image.jpg)'],\n        ['image', '![image](https://example.com/image.jpg)'],\n        ['text', 'image'],\n        ['space', ''],\n        ['paragraph', '**strong**'],\n        ['strong', '**strong**'],\n        ['text', 'strong'],\n        ['space', ''],\n        ['paragraph', '*em*'],\n        ['em', '*em*'],\n        ['text', 'em'],\n        ['space', ''],\n        ['paragraph', '`codespan`'],\n        ['codespan', '`codespan`'],\n        ['space', ''],\n        ['paragraph', '~~del~~'],\n        ['del', '~~del~~'],\n        ['text', 'del'],\n        ['space', ''],\n        ['paragraph', 'brbr'],\n        ['text', 'br'],\n        ['br', ''],\n        ['text', 'br'],\n      ]);\n    });\n\n    it('should assign marked to `this`', () => {\n      marked.use({\n        walkTokens(token) {\n          if (token.type === 'em') {\n            token.text += ' walked';\n            token.tokens = this.Lexer.lexInline(token.text);\n          }\n        },\n      });\n      assert.strictEqual(marked.parse('*text*').trim(), '<p><em>text walked</em></p>');\n    });\n\n    it('should wait for async `walkTokens` function', async() => {\n      marked.use({\n        async: true,\n        async walkTokens(token) {\n          if (token.type === 'em') {\n            await timeout();\n            token.text += ' walked';\n            token.tokens = this.Lexer.lexInline(token.text);\n          }\n        },\n      });\n      const promise = marked.parse('*text*');\n      assert.ok(promise instanceof Promise);\n      const html = await promise;\n      assert.strictEqual(html.trim(), '<p><em>text walked</em></p>');\n    });\n\n    it('should return promise if async and no walkTokens function', async() => {\n      marked.use({\n        async: true,\n      });\n      const promise = marked.parse('*text*');\n      assert.ok(promise instanceof Promise);\n      const html = await promise;\n      assert.strictEqual(html.trim(), '<p><em>text</em></p>');\n    });\n  });\n});\n"
  },
  {
    "path": "test/unit/utils.js",
    "content": "export async function timeout(ms = 1) {\n  return new Promise(resolve => {\n    setTimeout(resolve, ms);\n  });\n}\n"
  },
  {
    "path": "test/update-specs.js",
    "content": "import { readdirSync, unlinkSync, writeFileSync } from 'node:fs';\nimport { join, resolve, dirname } from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport { load } from 'cheerio';\nimport { htmlIsEqual } from '@markedjs/testutils';\nimport { Marked } from '../lib/marked.esm.js';\n\nconst __dirname = dirname(fileURLToPath(import.meta.url));\n\nfunction removeFiles(dir) {\n  readdirSync(dir).forEach(file => {\n    unlinkSync(join(dir, file));\n  });\n}\n\nasync function updateCommonmark(dir, options) {\n  try {\n    const res = await fetch('https://raw.githubusercontent.com/commonmark/commonmark.js/master/package.json');\n    const pkg = await res.json();\n    const { version } = pkg;\n    const res2 = await fetch(`https://spec.commonmark.org/${version}/spec.json`);\n    const json = await res2.json();\n    const specs = await Promise.all(json.map(async(spec) => {\n      const marked = new Marked();\n      const html = marked.parse(spec.markdown, options);\n      const isEqual = await htmlIsEqual(html, spec.html);\n      if (!isEqual) {\n        spec.shouldFail = true;\n      }\n      return spec;\n    }));\n    writeFileSync(resolve(dir, `./commonmark.${version}.json`), JSON.stringify(specs, null, 2) + '\\n');\n    console.log(`Saved CommonMark v${version} specs`);\n  } catch(ex) {\n    console.log(ex);\n  }\n}\n\nasync function updateGfm(dir) {\n  try {\n    const res = await fetch('https://github.github.com/gfm/');\n    const html = await res.text();\n    const $ = load(html);\n    const version = $('.version').text().match(/\\d+\\.\\d+/)[0];\n    if (!version) {\n      throw new Error('No version found');\n    }\n    let specs = [];\n    $('.extension').each((i, ext) => {\n      const section = $('.definition', ext).text().trim().replace(/^\\d+\\.\\d+(.*?) \\(extension\\)[\\s\\S]*$/, '$1');\n      $('.example', ext).each((j, exa) => {\n        const example = +$(exa).attr('id').replace(/\\D/g, '');\n        const markdown = $('.language-markdown', exa).text().trim();\n        const html = $('.language-html', exa).text().trim();\n        specs.push({\n          section: `[extension] ${section}`,\n          html,\n          markdown,\n          example,\n        });\n      });\n    });\n\n    specs = await Promise.all(specs.map(async(spec) => {\n      const marked = new Marked();\n      const html = marked.parse(spec.markdown, { gfm: true, pedantic: false });\n      const isEqual = await htmlIsEqual(html, spec.html);\n      if (!isEqual) {\n        spec.shouldFail = true;\n      }\n      return spec;\n    }));\n    writeFileSync(resolve(dir, `./gfm.${version}.json`), JSON.stringify(specs, null, 2) + '\\n');\n    console.log(`Saved GFM v${version} specs.`);\n  } catch(ex) {\n    console.log(ex);\n  }\n}\n\nconst commonmarkDir = resolve(__dirname, './specs/commonmark');\nconst gfmDir = resolve(__dirname, './specs/gfm');\nremoveFiles(commonmarkDir);\nremoveFiles(gfmDir);\nupdateCommonmark(commonmarkDir, { gfm: false, pedantic: false });\nupdateCommonmark(gfmDir, { gfm: true, pedantic: false });\nupdateGfm(gfmDir);\n"
  },
  {
    "path": "tsconfig-type-test.json",
    "content": "{\n  \"extends\": \"./tsconfig.json\",\n  \"compilerOptions\": {\n    \"baseUrl\": \".\",\n    \"paths\": {\n      \"marked\": [\n        \"lib/marked.d.ts\"\n      ]\n    }\n  },\n  \"include\": [\n    \"test/types/*.ts\"\n  ]\n}\n"
  },
  {
    "path": "tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"target\": \"es2022\",\n    \"module\": \"NodeNext\",\n    \"isolatedModules\": true,\n    \"strict\": true,\n    \"verbatimModuleSyntax\": true,\n    \"noEmit\": true,\n    \"allowSyntheticDefaultImports\": true,\n    \"moduleResolution\": \"NodeNext\",\n    \"allowImportingTsExtensions\": true,\n    \"sourceMap\": false\n  },\n  \"include\": [\n    \"src/*.ts\"\n  ]\n}\n"
  },
  {
    "path": "vercel.json",
    "content": "{\n  \"cleanUrls\": true\n}\n"
  }
]